Skip to content

Commit e1026d0

Browse files
committed
Store a list of repostories instead of instantiated repostitories
Signed-off-by: Javi Fontan <[email protected]>
1 parent b7734fd commit e1026d0

9 files changed

+111
-96
lines changed

blobs_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
func TestBlobsTable_Name(t *testing.T) {
1515
require := require.New(t)
1616

17-
f := fixtures.Basic().One()
17+
f := fixtures.ByTag("worktree").One()
1818
table := getTable(require, f, blobsTableName)
1919
require.Equal(blobsTableName, table.Name())
2020

@@ -27,15 +27,15 @@ func TestBlobsTable_Name(t *testing.T) {
2727
func TestBlobsTable_Children(t *testing.T) {
2828
require := require.New(t)
2929

30-
f := fixtures.Basic().One()
30+
f := fixtures.ByTag("worktree").One()
3131
table := getTable(require, f, blobsTableName)
3232
require.Equal(0, len(table.Children()))
3333
}
3434

3535
func TestBlobsTable_RowIter(t *testing.T) {
3636
require := require.New(t)
3737

38-
f := fixtures.Basic().One()
38+
f := fixtures.ByTag("worktree").One()
3939
table := getTable(require, f, blobsTableName)
4040

4141
rows, err := sql.NodeToRows(sql.NewBaseSession(context.TODO()), table)

commits_test.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ import (
1414
func TestCommitsTable_Name(t *testing.T) {
1515
require := require.New(t)
1616

17-
f := fixtures.Basic().One()
17+
f := fixtures.ByTag("worktree").One()
1818
table := getTable(require, f, commitsTableName)
1919
require.Equal(commitsTableName, table.Name())
2020

@@ -27,15 +27,15 @@ func TestCommitsTable_Name(t *testing.T) {
2727
func TestCommitsTable_Children(t *testing.T) {
2828
require := require.New(t)
2929

30-
f := fixtures.Basic().One()
30+
f := fixtures.ByTag("worktree").One()
3131
table := getTable(require, f, commitsTableName)
3232
require.Equal(0, len(table.Children()))
3333
}
3434

3535
func TestCommitsTable_RowIter(t *testing.T) {
3636
require := require.New(t)
3737

38-
f := fixtures.Basic().One()
38+
f := fixtures.ByTag("worktree").One()
3939
table := getTable(require, f, commitsTableName)
4040

4141
rows, err := sql.NodeToRows(sql.NewBaseSession(context.TODO()), table)

database_test.go

Lines changed: 9 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,7 @@ import (
77
"github.com/stretchr/testify/require"
88
"gopkg.in/src-d/go-mysql-server.v0/sql"
99

10-
"gopkg.in/src-d/go-billy.v4/memfs"
1110
"gopkg.in/src-d/go-git-fixtures.v3"
12-
"gopkg.in/src-d/go-git.v4"
13-
"gopkg.in/src-d/go-git.v4/storage/filesystem"
1411
)
1512

1613
func init() {
@@ -24,7 +21,7 @@ const (
2421
func TestDatabase_Tables(t *testing.T) {
2522
require := require.New(t)
2623

27-
f := fixtures.Basic().One()
24+
f := fixtures.ByTag("worktree").One()
2825
db := getDB(require, f, testDBName)
2926

3027
tables := db.Tables()
@@ -50,22 +47,21 @@ func TestDatabase_Tables(t *testing.T) {
5047
func TestDatabase_Name(t *testing.T) {
5148
require := require.New(t)
5249

53-
f := fixtures.Basic().One()
50+
f := fixtures.ByTag("worktree").One()
5451
db := getDB(require, f, testDBName)
5552
require.Equal(testDBName, db.Name())
5653
}
5754

58-
func getDB(require *require.Assertions, fixture *fixtures.Fixture,
59-
name string) sql.Database {
55+
func getDB(
56+
require *require.Assertions,
57+
fixture *fixtures.Fixture,
58+
name string,
59+
) sql.Database {
6060

61-
s, err := filesystem.NewStorage(fixture.DotGit())
62-
require.NoError(err)
63-
64-
r, err := git.Open(s, memfs.New())
65-
require.NoError(err)
61+
fixtures.Init()
6662

6763
pool := NewRepositoryPool()
68-
pool.Add("repo", r)
64+
pool.Add("repo", fixture.Worktree().Root())
6965

7066
db := NewDatabase(name, &pool)
7167
require.NotNil(db)

references_test.go

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515
func TestReferencesTable_Name(t *testing.T) {
1616
require := require.New(t)
1717

18-
f := fixtures.Basic().One()
18+
f := fixtures.ByTag("worktree").One()
1919
table := getTable(require, f, referencesTableName)
2020
require.Equal(referencesTableName, table.Name())
2121

@@ -28,15 +28,15 @@ func TestReferencesTable_Name(t *testing.T) {
2828
func TestReferencesTable_Children(t *testing.T) {
2929
require := require.New(t)
3030

31-
f := fixtures.Basic().One()
31+
f := fixtures.ByTag("worktree").One()
3232
table := getTable(require, f, referencesTableName)
3333
require.Equal(0, len(table.Children()))
3434
}
3535

3636
func TestReferencesTable_RowIter(t *testing.T) {
3737
require := require.New(t)
3838

39-
f := fixtures.Basic().One()
39+
f := fixtures.ByTag("worktree").One()
4040
table := getTable(require, f, referencesTableName)
4141

4242
rows, err := sql.NodeToRows(sql.NewBaseSession(context.TODO()), plan.NewSort(
@@ -46,11 +46,9 @@ func TestReferencesTable_RowIter(t *testing.T) {
4646

4747
expected := []sql.Row{
4848
sql.NewRow("repo", "HEAD", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
49-
sql.NewRow("repo", "refs/heads/branch", "e8d3ffab552895c19b9fcf7aa264d277cde33881"),
5049
sql.NewRow("repo", "refs/heads/master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
5150
sql.NewRow("repo", "refs/remotes/origin/branch", "e8d3ffab552895c19b9fcf7aa264d277cde33881"),
5251
sql.NewRow("repo", "refs/remotes/origin/master", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
53-
sql.NewRow("repo", "refs/tags/v1.0.0", "6ecf0ef2c2dffb796033e5a02219af86ec6584e5"),
5452
}
5553
require.ElementsMatch(expected, rows)
5654

remotes_test.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ import (
1616
func TestRemotesTable_Name(t *testing.T) {
1717
require := require.New(t)
1818

19-
f := fixtures.Basic().One()
19+
f := fixtures.ByTag("worktree").One()
2020
table := getTable(require, f, remotesTableName)
2121
require.Equal(remotesTableName, table.Name())
2222

@@ -29,23 +29,23 @@ func TestRemotesTable_Name(t *testing.T) {
2929
func TestRemotesTable_Children(t *testing.T) {
3030
require := require.New(t)
3131

32-
f := fixtures.Basic().One()
32+
f := fixtures.ByTag("worktree").One()
3333
table := getTable(require, f, remotesTableName)
3434
require.Equal(0, len(table.Children()))
3535
}
3636

3737
func TestRemotesTable_RowIter(t *testing.T) {
3838
require := require.New(t)
3939

40-
f := fixtures.Basic().One()
40+
f := fixtures.ByTag("worktree").One()
4141
table := getTable(require, f, remotesTableName)
4242

4343
remotes, ok := table.(*remotesTable)
4444
require.True(ok)
4545

4646
pool := remotes.pool
47-
repository, ok := pool.GetPos(0)
48-
require.True(ok)
47+
repository, err := pool.GetPos(0)
48+
require.Nil(err)
4949

5050
repo := repository.Repo
5151

@@ -58,7 +58,7 @@ func TestRemotesTable_RowIter(t *testing.T) {
5858
},
5959
}
6060

61-
_, err := repo.CreateRemote(&config)
61+
_, err = repo.CreateRemote(&config)
6262
require.Nil(err)
6363

6464
rows, err := sql.NodeToRows(sql.NewBaseSession(context.TODO()), table)

repositories_test.go

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package gitquery
22

33
import (
44
"context"
5+
"path/filepath"
56
"testing"
67

78
"github.com/stretchr/testify/require"
@@ -13,7 +14,7 @@ import (
1314
func TestRepositoriesTable_Name(t *testing.T) {
1415
require := require.New(t)
1516

16-
f := fixtures.Basic().One()
17+
f := fixtures.ByTag("worktree").One()
1718
table := getTable(require, f, repositoriesTableName)
1819
require.Equal(repositoriesTableName, table.Name())
1920

@@ -26,7 +27,7 @@ func TestRepositoriesTable_Name(t *testing.T) {
2627
func TestRepositoriesTable_Children(t *testing.T) {
2728
require := require.New(t)
2829

29-
f := fixtures.Basic().One()
30+
f := fixtures.ByTag("worktree").One()
3031
table := getTable(require, f, repositoriesTableName)
3132
require.Equal(0, len(table.Children()))
3233
}
@@ -42,7 +43,7 @@ func TestRepositoriesTable_RowIter(t *testing.T) {
4243
pool := NewRepositoryPool()
4344

4445
for _, id := range repoIDs {
45-
pool.Add(id, nil)
46+
pool.Add(id, "")
4647
}
4748

4849
db := NewDatabase(repositoriesTableName, &pool)
@@ -76,6 +77,8 @@ func TestRepositoriesPushdown(t *testing.T) {
7677
session, path, cleanup := setup(t)
7778
defer cleanup()
7879

80+
dirName := filepath.Base(path)
81+
7982
table := newRepositoriesTable(session.Pool).(sql.PushdownProjectionAndFiltersTable)
8083

8184
iter, err := table.WithProjectAndFilters(session, nil, nil)
@@ -100,7 +103,7 @@ func TestRepositoriesPushdown(t *testing.T) {
100103
iter, err = table.WithProjectAndFilters(session, nil, []sql.Expression{
101104
expression.NewEquals(
102105
expression.NewGetField(0, sql.Text, "id", false),
103-
expression.NewLiteral(path, sql.Text),
106+
expression.NewLiteral(dirName, sql.Text),
104107
),
105108
})
106109
require.NoError(err)

repository_pool.go

Lines changed: 50 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -25,34 +25,53 @@ func NewRepository(id string, repo *git.Repository) Repository {
2525
}
2626
}
2727

28-
// RepositoryPool holds a pool of initialized git repositories and
28+
// NewRepositoryFromPath creates and initializes a new Repository structure
29+
// and initializes a go-git repository
30+
func NewRepositoryFromPath(id, path string) (Repository, error) {
31+
repo, err := git.PlainOpen(path)
32+
if err != nil {
33+
return Repository{}, err
34+
}
35+
36+
return NewRepository(id, repo), nil
37+
}
38+
39+
// RepositoryPool holds a pool git repository paths and
2940
// functionality to open and iterate them.
3041
type RepositoryPool struct {
31-
repositories []Repository
42+
repositories map[string]string
43+
idOrder []string
3244
}
3345

3446
// NewRepositoryPool initializes a new RepositoryPool
3547
func NewRepositoryPool() RepositoryPool {
36-
return RepositoryPool{}
48+
return RepositoryPool{
49+
repositories: make(map[string]string),
50+
}
3751
}
3852

3953
// Add inserts a new repository in the pool
40-
func (p *RepositoryPool) Add(id string, repo *git.Repository) {
41-
repository := NewRepository(id, repo)
42-
p.repositories = append(p.repositories, repository)
54+
func (p *RepositoryPool) Add(id, path string) {
55+
_, ok := p.repositories[id]
56+
if !ok {
57+
p.idOrder = append(p.idOrder, id)
58+
}
59+
60+
p.repositories[id] = path
4361
}
4462

45-
// AddGit opens a new git repository and adds it to the pool. It
63+
// AddGit checks if a git repository can be opened and adds it to the pool. It
4664
// also sets its path as ID.
4765
func (p *RepositoryPool) AddGit(path string) (string, error) {
48-
repo, err := git.PlainOpen(path)
66+
_, err := git.PlainOpen(path)
4967
if err != nil {
5068
return "", err
5169
}
5270

53-
p.Add(path, repo)
71+
id := filepath.Base(path)
72+
p.Add(id, path)
5473

55-
return path, nil
74+
return id, nil
5675
}
5776

5877
// AddDir adds all direct subdirectories from path as repos
@@ -65,26 +84,33 @@ func (p *RepositoryPool) AddDir(path string) error {
6584
for _, f := range dirs {
6685
if f.IsDir() {
6786
name := filepath.Join(path, f.Name())
68-
repo, err := git.PlainOpen(name)
69-
if err != nil {
70-
// TODO: log that the repo could not be opened
71-
} else {
72-
p.Add(f.Name(), repo)
73-
}
87+
// TODO: log that the repo could not be opened
88+
p.AddGit(name)
7489
}
7590
}
7691

7792
return nil
7893
}
7994

80-
// GetPos retrieves a repository at a given position. It returns false
81-
// as second return value if the position is out of bounds.
82-
func (p *RepositoryPool) GetPos(pos int) (*Repository, bool) {
95+
// GetPos retrieves a repository at a given position. If the position is
96+
// out of bounds it returns io.EOF
97+
func (p *RepositoryPool) GetPos(pos int) (*Repository, error) {
8398
if pos >= len(p.repositories) {
84-
return nil, false
99+
return nil, io.EOF
100+
}
101+
102+
id := p.idOrder[pos]
103+
if id == "" {
104+
return nil, io.EOF
105+
}
106+
107+
path := p.repositories[id]
108+
repo, err := NewRepositoryFromPath(id, path)
109+
if err != nil {
110+
return nil, err
85111
}
86112

87-
return &p.repositories[pos], true
113+
return &repo, nil
88114
}
89115

90116
// RepoIter creates a new Repository iterator
@@ -106,9 +132,9 @@ type RepositoryIter struct {
106132
// Next retrieves the next Repository. It returns io.EOF as error
107133
// when there are no more Repositories to retrieve.
108134
func (i *RepositoryIter) Next() (*Repository, error) {
109-
r, ok := i.pool.GetPos(i.pos)
110-
if !ok {
111-
return nil, io.EOF
135+
r, err := i.pool.GetPos(i.pos)
136+
if err != nil {
137+
return nil, err
112138
}
113139

114140
i.pos++

0 commit comments

Comments
 (0)