Skip to content

Commit 1c213ee

Browse files
authored
Merge pull request #6 from bk2204/alternates
Handle alternates
2 parents bda7989 + fd34b43 commit 1c213ee

File tree

1 file changed

+40
-4
lines changed

1 file changed

+40
-4
lines changed

backend.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,10 @@
11
package gitobj
22

33
import (
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

2965
type filesystemBackend struct {
30-
fs *fileStorer
31-
packs *pack.Storage
66+
fs *fileStorer
67+
backends []storage.Storage
3268
}
3369

3470
func (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

3874
type memoryBackend struct {

0 commit comments

Comments
 (0)