Skip to content

gitbase/repository_pool: change repository to be an interface #384

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
Jul 12, 2018
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion blobs.go
Original file line number Diff line number Diff line change
Expand Up @@ -369,7 +369,7 @@ func (i *blobsKeyValueIter) Next() ([]interface{}, []byte, error) {
}

repo := i.pool.repositories[i.repo.ID]
i.idx, err = newRepositoryIndex(repo.path, repo.kind)
i.idx, err = newRepositoryIndex(repo)
if err != nil {
return nil, nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion commit_files.go
Original file line number Diff line number Diff line change
Expand Up @@ -399,7 +399,7 @@ func (i *commitFilesKeyValueIter) Next() ([]interface{}, []byte, error) {
}

repo := i.pool.repositories[i.repo.ID]
i.idx, err = newRepositoryIndex(repo.path, repo.kind)
i.idx, err = newRepositoryIndex(repo)
if err != nil {
return nil, nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion commits.go
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ func (i *commitsKeyValueIter) Next() ([]interface{}, []byte, error) {
}

r := i.pool.repositories[i.repo.ID]
i.idx, err = newRepositoryIndex(r.path, r.kind)
i.idx, err = newRepositoryIndex(r)
if err != nil {
return nil, nil, err
}
Expand Down
2 changes: 1 addition & 1 deletion files.go
Original file line number Diff line number Diff line change
Expand Up @@ -412,7 +412,7 @@ func (i *filesKeyValueIter) Next() ([]interface{}, []byte, error) {
}

repo := i.pool.repositories[i.repo.ID]
i.idx, err = newRepositoryIndex(repo.path, repo.kind)
i.idx, err = newRepositoryIndex(repo)
if err != nil {
return nil, nil, err
}
Expand Down
62 changes: 47 additions & 15 deletions fs_error_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,17 +58,17 @@ func setupErrorRepos(t *testing.T) (*sql.Context, CleanupFunc) {

pool := NewRepositoryPool()

repo, err := brokenRepo(brokenPackfile, baseFS)
fs, err := brokenFS(brokenPackfile, baseFS)
require.NoError(err)
pool.AddInitialized("packfile", repo)
pool.Add(billyRepo("packfile", fs))

repo, err = brokenRepo(brokenIndex, baseFS)
fs, err = brokenFS(brokenIndex, baseFS)
require.NoError(err)
pool.AddInitialized("index", repo)
pool.Add(billyRepo("index", fs))

repo, err = brokenRepo(0, baseFS)
fs, err = brokenFS(0, baseFS)
require.NoError(err)
pool.AddInitialized("ok", repo)
pool.Add(billyRepo("ok", fs))

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

func brokenRepo(
func brokenFS(
brokenType brokenType,
fs billy.Filesystem,
) (*git.Repository, error) {
) (billy.Filesystem, error) {
dotFS, err := fs.Chroot(".git")
if err != nil {
return nil, err
}

var brokenFS billy.Filesystem
if brokenType == 0 {
if brokenType == brokenNone {
brokenFS = dotFS
} else {
brokenFS = NewBrokenFS(brokenType, dotFS)
}

storage, err := filesystem.NewStorage(brokenFS)
if err != nil {
return nil, err
}

return git.Open(storage, fs)
return brokenFS, nil
}

func testTable(t *testing.T, tableName string, number int) {
Expand All @@ -122,9 +117,46 @@ func testTable(t *testing.T, tableName string, number int) {
}
}

type billyRepository struct {
id string
fs billy.Filesystem
}

func billyRepo(id string, fs billy.Filesystem) repository {
return &billyRepository{id, fs}
}

func (r *billyRepository) ID() string {
return r.id
}

func (r *billyRepository) Repo() (*Repository, error) {
storage, err := filesystem.NewStorage(r.fs)
if err != nil {
return nil, err
}

repo, err := git.Open(storage, r.fs)
if err != nil {
return nil, err
}

return NewRepository(r.id, repo), nil
}

func (r *billyRepository) FS() (billy.Filesystem, error) {
return r.fs, nil
}

func (r *billyRepository) Path() string {
return r.id
}

type brokenType uint64

const (
// no errors
brokenNone brokenType = 0
// packfile has read errors
brokenPackfile brokenType = 1 << iota
// there's no index for one packfile
Expand Down
35 changes: 7 additions & 28 deletions packfiles.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,7 @@ package gitbase

import (
"io"
stdioutil "io/ioutil"
"os"
"path/filepath"

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

"gopkg.in/src-d/go-billy-siva.v4"
billy "gopkg.in/src-d/go-billy.v4"
"gopkg.in/src-d/go-billy.v4/osfs"
"gopkg.in/src-d/go-git.v4/plumbing"
"gopkg.in/src-d/go-git.v4/plumbing/format/idxfile"
"gopkg.in/src-d/go-git.v4/plumbing/format/objfile"
Expand All @@ -26,8 +22,8 @@ type packRepository struct {
packs map[plumbing.Hash]packfile.Index
}

func repositoryPackfiles(path string, kind repoKind) (*dotgit.DotGit, []plumbing.Hash, error) {
fs, err := repoFilesystem(path, kind)
func repositoryPackfiles(repo repository) (*dotgit.DotGit, []plumbing.Hash, error) {
fs, err := repo.FS()
if err != nil {
return nil, nil, err
}
Expand Down Expand Up @@ -56,8 +52,8 @@ type repositoryIndex struct {
indexes []*packfileIndex
}

func newRepositoryIndex(path string, kind repoKind) (*repositoryIndex, error) {
dot, packfiles, err := repositoryPackfiles(path, kind)
func newRepositoryIndex(repo repository) (*repositoryIndex, error) {
dot, packfiles, err := repositoryPackfiles(repo)
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -126,23 +122,6 @@ func (i *repositoryIndex) isUnpacked(hash plumbing.Hash) (bool, error) {
return true, nil
}

func repoFilesystem(path string, kind repoKind) (billy.Filesystem, error) {
if kind == sivaRepo {
localfs := osfs.New(filepath.Dir(path))

tmpDir, err := stdioutil.TempDir(os.TempDir(), "gitbase-siva")
if err != nil {
return nil, err
}

tmpfs := osfs.New(tmpDir)

return sivafs.NewFilesystem(localfs, filepath.Base(path), tmpfs)
}

return osfs.New(path), nil
}

func findDotGit(fs billy.Filesystem) (billy.Filesystem, error) {
fi, err := fs.Stat(".git")
if err != nil && !os.IsNotExist(err) {
Expand All @@ -157,7 +136,7 @@ func findDotGit(fs billy.Filesystem) (billy.Filesystem, error) {
}

func getUnpackedObject(repo repository, hash plumbing.Hash) (o object.Object, err error) {
fs, err := repoFilesystem(repo.path, repo.kind)
fs, err := repo.FS()
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -222,7 +201,7 @@ func newRepoObjectDecoder(
repo repository,
hash plumbing.Hash,
) (*repoObjectDecoder, error) {
fs, err := repoFilesystem(repo.path, repo.kind)
fs, err := repo.FS()
if err != nil {
return nil, err
}
Expand Down Expand Up @@ -251,7 +230,7 @@ func newRepoObjectDecoder(
}

return &repoObjectDecoder{
repo: repo.path,
repo: repo.Path(),
packfile: hash,
decoder: decoder,
storage: storage,
Expand Down
4 changes: 2 additions & 2 deletions packfiles_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ var testSivaFilePath = filepath.Join("_testdata", "fff7062de8474d10a67d417ccea87
func TestRepositoryPackfiles(t *testing.T) {
require := require.New(t)

fs, packfiles, err := repositoryPackfiles(testSivaFilePath, sivaRepo)
fs, packfiles, err := repositoryPackfiles(sivaRepo("siva", testSivaFilePath))

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

func TestRepositoryIndex(t *testing.T) {
idx, err := newRepositoryIndex(testSivaFilePath, sivaRepo)
idx, err := newRepositoryIndex(sivaRepo("siva", testSivaFilePath))
require.NoError(t, err)

testCases := []struct {
Expand Down
2 changes: 1 addition & 1 deletion repositories_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ func TestRepositoriesTable_RowIter(t *testing.T) {
pool := NewRepositoryPool()

for _, id := range repoIDs {
pool.Add(id, "", gitRepo)
pool.Add(gitRepo(id, ""))
}

session := NewSession(pool)
Expand Down
Loading