1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
package storage
import (
"io"
"github.com/git-lfs/gitobj/v2/errors"
)
// Storage implements an interface for reading, but not writing, objects in an
// object database.
type multiStorage struct {
impls []Storage
}
func MultiStorage(args ...Storage) Storage {
return &multiStorage{impls: args}
}
// Open returns a handle on an existing object keyed by the given object
// ID. It returns an error if that file does not already exist.
func (m *multiStorage) Open(oid []byte) (f io.ReadCloser, err error) {
for _, s := range m.impls {
f, err := s.Open(oid)
if err != nil {
if errors.IsNoSuchObject(err) {
continue
}
return nil, err
}
if s.IsCompressed() {
return newDecompressingReadCloser(f)
}
return f, nil
}
return nil, errors.NoSuchObject(oid)
}
// Close closes the filesystem, after which no more operations are
// allowed.
func (m *multiStorage) Close() error {
for _, s := range m.impls {
if err := s.Close(); err != nil {
return err
}
}
return nil
}
// Compressed indicates whether data read from this storage source will
// be zlib-compressed.
func (m *multiStorage) IsCompressed() bool {
// To ensure we can read from any Storage type, we automatically
// decompress items if they need it.
return false
}
|