Skip to content

Commit 824075c

Browse files
authored
Merge pull request #384 from jfontan/improvement/rework-repositoy-implementation
gitbase/repository_pool: change repository to be an interface
2 parents 8e3241a + 15124da commit 824075c

12 files changed

+141
-102
lines changed

blobs.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ func (i *blobsKeyValueIter) Next() ([]interface{}, []byte, error) {
369369
}
370370

371371
repo := i.pool.repositories[i.repo.ID]
372-
i.idx, err = newRepositoryIndex(repo.path, repo.kind)
372+
i.idx, err = newRepositoryIndex(repo)
373373
if err != nil {
374374
return nil, nil, err
375375
}

commit_files.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,7 @@ func (i *commitFilesKeyValueIter) Next() ([]interface{}, []byte, error) {
399399
}
400400

401401
repo := i.pool.repositories[i.repo.ID]
402-
i.idx, err = newRepositoryIndex(repo.path, repo.kind)
402+
i.idx, err = newRepositoryIndex(repo)
403403
if err != nil {
404404
return nil, nil, err
405405
}

commits.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -334,7 +334,7 @@ func (i *commitsKeyValueIter) Next() ([]interface{}, []byte, error) {
334334
}
335335

336336
r := i.pool.repositories[i.repo.ID]
337-
i.idx, err = newRepositoryIndex(r.path, r.kind)
337+
i.idx, err = newRepositoryIndex(r)
338338
if err != nil {
339339
return nil, nil, err
340340
}

files.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -412,7 +412,7 @@ func (i *filesKeyValueIter) Next() ([]interface{}, []byte, error) {
412412
}
413413

414414
repo := i.pool.repositories[i.repo.ID]
415-
i.idx, err = newRepositoryIndex(repo.path, repo.kind)
415+
i.idx, err = newRepositoryIndex(repo)
416416
if err != nil {
417417
return nil, nil, err
418418
}

fs_error_test.go

Lines changed: 47 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -58,17 +58,17 @@ func setupErrorRepos(t *testing.T) (*sql.Context, CleanupFunc) {
5858

5959
pool := NewRepositoryPool()
6060

61-
repo, err := brokenRepo(brokenPackfile, baseFS)
61+
fs, err := brokenFS(brokenPackfile, baseFS)
6262
require.NoError(err)
63-
pool.AddInitialized("packfile", repo)
63+
pool.Add(billyRepo("packfile", fs))
6464

65-
repo, err = brokenRepo(brokenIndex, baseFS)
65+
fs, err = brokenFS(brokenIndex, baseFS)
6666
require.NoError(err)
67-
pool.AddInitialized("index", repo)
67+
pool.Add(billyRepo("index", fs))
6868

69-
repo, err = brokenRepo(0, baseFS)
69+
fs, err = brokenFS(0, baseFS)
7070
require.NoError(err)
71-
pool.AddInitialized("ok", repo)
71+
pool.Add(billyRepo("ok", fs))
7272

7373
session := NewSession(pool, WithSkipGitErrors(true))
7474
ctx := sql.NewContext(context.TODO(), sql.WithSession(session))
@@ -81,28 +81,23 @@ func setupErrorRepos(t *testing.T) (*sql.Context, CleanupFunc) {
8181
return ctx, cleanup
8282
}
8383

84-
func brokenRepo(
84+
func brokenFS(
8585
brokenType brokenType,
8686
fs billy.Filesystem,
87-
) (*git.Repository, error) {
87+
) (billy.Filesystem, error) {
8888
dotFS, err := fs.Chroot(".git")
8989
if err != nil {
9090
return nil, err
9191
}
9292

9393
var brokenFS billy.Filesystem
94-
if brokenType == 0 {
94+
if brokenType == brokenNone {
9595
brokenFS = dotFS
9696
} else {
9797
brokenFS = NewBrokenFS(brokenType, dotFS)
9898
}
9999

100-
storage, err := filesystem.NewStorage(brokenFS)
101-
if err != nil {
102-
return nil, err
103-
}
104-
105-
return git.Open(storage, fs)
100+
return brokenFS, nil
106101
}
107102

108103
func testTable(t *testing.T, tableName string, number int) {
@@ -122,9 +117,46 @@ func testTable(t *testing.T, tableName string, number int) {
122117
}
123118
}
124119

120+
type billyRepository struct {
121+
id string
122+
fs billy.Filesystem
123+
}
124+
125+
func billyRepo(id string, fs billy.Filesystem) repository {
126+
return &billyRepository{id, fs}
127+
}
128+
129+
func (r *billyRepository) ID() string {
130+
return r.id
131+
}
132+
133+
func (r *billyRepository) Repo() (*Repository, error) {
134+
storage, err := filesystem.NewStorage(r.fs)
135+
if err != nil {
136+
return nil, err
137+
}
138+
139+
repo, err := git.Open(storage, r.fs)
140+
if err != nil {
141+
return nil, err
142+
}
143+
144+
return NewRepository(r.id, repo), nil
145+
}
146+
147+
func (r *billyRepository) FS() (billy.Filesystem, error) {
148+
return r.fs, nil
149+
}
150+
151+
func (r *billyRepository) Path() string {
152+
return r.id
153+
}
154+
125155
type brokenType uint64
126156

127157
const (
158+
// no errors
159+
brokenNone brokenType = 0
128160
// packfile has read errors
129161
brokenPackfile brokenType = 1 << iota
130162
// there's no index for one packfile

packfiles.go

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,7 @@ package gitbase
22

33
import (
44
"io"
5-
stdioutil "io/ioutil"
65
"os"
7-
"path/filepath"
86

97
errors "gopkg.in/src-d/go-errors.v1"
108
"gopkg.in/src-d/go-git.v4/plumbing/object"
@@ -13,9 +11,7 @@ import (
1311
"gopkg.in/src-d/go-git.v4/storage/filesystem/dotgit"
1412
"gopkg.in/src-d/go-git.v4/utils/ioutil"
1513

16-
"gopkg.in/src-d/go-billy-siva.v4"
1714
billy "gopkg.in/src-d/go-billy.v4"
18-
"gopkg.in/src-d/go-billy.v4/osfs"
1915
"gopkg.in/src-d/go-git.v4/plumbing"
2016
"gopkg.in/src-d/go-git.v4/plumbing/format/idxfile"
2117
"gopkg.in/src-d/go-git.v4/plumbing/format/objfile"
@@ -26,8 +22,8 @@ type packRepository struct {
2622
packs map[plumbing.Hash]packfile.Index
2723
}
2824

29-
func repositoryPackfiles(path string, kind repoKind) (*dotgit.DotGit, []plumbing.Hash, error) {
30-
fs, err := repoFilesystem(path, kind)
25+
func repositoryPackfiles(repo repository) (*dotgit.DotGit, []plumbing.Hash, error) {
26+
fs, err := repo.FS()
3127
if err != nil {
3228
return nil, nil, err
3329
}
@@ -56,8 +52,8 @@ type repositoryIndex struct {
5652
indexes []*packfileIndex
5753
}
5854

59-
func newRepositoryIndex(path string, kind repoKind) (*repositoryIndex, error) {
60-
dot, packfiles, err := repositoryPackfiles(path, kind)
55+
func newRepositoryIndex(repo repository) (*repositoryIndex, error) {
56+
dot, packfiles, err := repositoryPackfiles(repo)
6157
if err != nil {
6258
return nil, err
6359
}
@@ -126,23 +122,6 @@ func (i *repositoryIndex) isUnpacked(hash plumbing.Hash) (bool, error) {
126122
return true, nil
127123
}
128124

129-
func repoFilesystem(path string, kind repoKind) (billy.Filesystem, error) {
130-
if kind == sivaRepo {
131-
localfs := osfs.New(filepath.Dir(path))
132-
133-
tmpDir, err := stdioutil.TempDir(os.TempDir(), "gitbase-siva")
134-
if err != nil {
135-
return nil, err
136-
}
137-
138-
tmpfs := osfs.New(tmpDir)
139-
140-
return sivafs.NewFilesystem(localfs, filepath.Base(path), tmpfs)
141-
}
142-
143-
return osfs.New(path), nil
144-
}
145-
146125
func findDotGit(fs billy.Filesystem) (billy.Filesystem, error) {
147126
fi, err := fs.Stat(".git")
148127
if err != nil && !os.IsNotExist(err) {
@@ -157,7 +136,7 @@ func findDotGit(fs billy.Filesystem) (billy.Filesystem, error) {
157136
}
158137

159138
func getUnpackedObject(repo repository, hash plumbing.Hash) (o object.Object, err error) {
160-
fs, err := repoFilesystem(repo.path, repo.kind)
139+
fs, err := repo.FS()
161140
if err != nil {
162141
return nil, err
163142
}
@@ -222,7 +201,7 @@ func newRepoObjectDecoder(
222201
repo repository,
223202
hash plumbing.Hash,
224203
) (*repoObjectDecoder, error) {
225-
fs, err := repoFilesystem(repo.path, repo.kind)
204+
fs, err := repo.FS()
226205
if err != nil {
227206
return nil, err
228207
}
@@ -251,7 +230,7 @@ func newRepoObjectDecoder(
251230
}
252231

253232
return &repoObjectDecoder{
254-
repo: repo.path,
233+
repo: repo.Path(),
255234
packfile: hash,
256235
decoder: decoder,
257236
storage: storage,

packfiles_test.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ var testSivaFilePath = filepath.Join("_testdata", "fff7062de8474d10a67d417ccea87
1313
func TestRepositoryPackfiles(t *testing.T) {
1414
require := require.New(t)
1515

16-
fs, packfiles, err := repositoryPackfiles(testSivaFilePath, sivaRepo)
16+
fs, packfiles, err := repositoryPackfiles(sivaRepo("siva", testSivaFilePath))
1717

1818
require.NoError(err)
1919
require.Equal([]plumbing.Hash{
@@ -24,7 +24,7 @@ func TestRepositoryPackfiles(t *testing.T) {
2424
}
2525

2626
func TestRepositoryIndex(t *testing.T) {
27-
idx, err := newRepositoryIndex(testSivaFilePath, sivaRepo)
27+
idx, err := newRepositoryIndex(sivaRepo("siva", testSivaFilePath))
2828
require.NoError(t, err)
2929

3030
testCases := []struct {

repositories_test.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ func TestRepositoriesTable_RowIter(t *testing.T) {
3939
pool := NewRepositoryPool()
4040

4141
for _, id := range repoIDs {
42-
pool.Add(id, "", gitRepo)
42+
pool.Add(gitRepo(id, ""))
4343
}
4444

4545
session := NewSession(pool)

0 commit comments

Comments
 (0)