11package gitobj
22
33import (
4+ "bufio"
45 "io"
6+ "os"
7+ "path"
58
69 "github.com/git-lfs/gitobj/pack"
710 "github.com/git-lfs/gitobj/storage"
@@ -15,7 +18,40 @@ func NewFilesystemBackend(root, tmp string) (storage.Backend, error) {
1518 return nil , err
1619 }
1720
18- return & filesystemBackend {fs : fsobj , packs : packs }, nil
21+ storage , err := findAllBackends (fsobj , packs , root )
22+ if err != nil {
23+ return nil , err
24+ }
25+
26+ return & filesystemBackend {
27+ fs : fsobj ,
28+ backends : storage ,
29+ }, nil
30+ }
31+
32+ func findAllBackends (mainLoose * fileStorer , mainPacked * pack.Storage , root string ) ([]storage.Storage , error ) {
33+ storage := make ([]storage.Storage , 2 )
34+ storage [0 ] = mainLoose
35+ storage [1 ] = mainPacked
36+ f , err := os .Open (path .Join (root , "info" , "alternates" ))
37+ if err != nil {
38+ // No alternates file, no problem.
39+ if err != os .ErrNotExist {
40+ return storage , nil
41+ }
42+ return nil , err
43+ }
44+
45+ scanner := bufio .NewScanner (f )
46+ for scanner .Scan () {
47+ storage = append (storage , newFileStorer (scanner .Text (), "" ))
48+ pack , err := pack .NewStorage (scanner .Text ())
49+ if err != nil {
50+ return nil , err
51+ }
52+ storage = append (storage , pack )
53+ }
54+ return storage , nil
1955}
2056
2157// NewMemoryBackend initializes a new memory-based backend.
@@ -27,12 +63,12 @@ func NewMemoryBackend(m map[string]io.ReadWriter) (storage.Backend, error) {
2763}
2864
2965type filesystemBackend struct {
30- fs * fileStorer
31- packs * pack .Storage
66+ fs * fileStorer
67+ backends []storage .Storage
3268}
3369
3470func (b * filesystemBackend ) Storage () (storage.Storage , storage.WritableStorage ) {
35- return storage .MultiStorage (b .fs , b . packs ), b .fs
71+ return storage .MultiStorage (b .backends ... ), b .fs
3672}
3773
3874type memoryBackend struct {
0 commit comments