Skip to content

Commit d3d4e0c

Browse files
authored
Merge pull request #19 from jfontan/add-remotes-table
Add remotes table
2 parents c30dd76 + b9359bd commit d3d4e0c

File tree

4 files changed

+209
-0
lines changed

4 files changed

+209
-0
lines changed

database.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ const (
1313
treeEntriesTableName = "tree_entries"
1414
objectsTableName = "objects"
1515
repositoriesTableName = "repositories"
16+
remotesTableName = "remotes"
1617
)
1718

1819
type Database struct {
@@ -24,6 +25,7 @@ type Database struct {
2425
br sql.Table
2526
or sql.Table
2627
rer sql.Table
28+
rmr sql.Table
2729
}
2830

2931
func NewDatabase(name string, pool *RepositoryPool) sql.Database {
@@ -36,6 +38,7 @@ func NewDatabase(name string, pool *RepositoryPool) sql.Database {
3638
ter: newTreeEntriesTable(pool),
3739
or: newObjectsTable(pool),
3840
rer: newRepositoriesTable(pool),
41+
rmr: newRemotesTable(pool),
3942
}
4043
}
4144

@@ -52,5 +55,6 @@ func (d *Database) Tables() map[string]sql.Table {
5255
treeEntriesTableName: d.ter,
5356
objectsTableName: d.or,
5457
repositoriesTableName: d.rer,
58+
remotesTableName: d.rmr,
5559
}
5660
}

database_test.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ func TestDatabase_Tables(t *testing.T) {
4242
blobsTableName,
4343
objectsTableName,
4444
repositoriesTableName,
45+
remotesTableName,
4546
}
4647
sort.Strings(expected)
4748

remotes.go

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
1+
package gitquery
2+
3+
import (
4+
"io"
5+
6+
git "gopkg.in/src-d/go-git.v4"
7+
gitconfig "gopkg.in/src-d/go-git.v4/config"
8+
"gopkg.in/src-d/go-mysql-server.v0/sql"
9+
)
10+
11+
type remotesTable struct {
12+
pool *RepositoryPool
13+
}
14+
15+
func newRemotesTable(pool *RepositoryPool) sql.Table {
16+
return &remotesTable{pool: pool}
17+
}
18+
19+
func (remotesTable) Resolved() bool {
20+
return true
21+
}
22+
23+
func (remotesTable) Name() string {
24+
return remotesTableName
25+
}
26+
27+
func (remotesTable) Schema() sql.Schema {
28+
return sql.Schema{
29+
{Name: "repository_id", Type: sql.Text, Nullable: false},
30+
{Name: "name", Type: sql.Text, Nullable: false},
31+
{Name: "push_url", Type: sql.Text, Nullable: false},
32+
{Name: "fetch_url", Type: sql.Text, Nullable: false},
33+
{Name: "push_refspec", Type: sql.Text, Nullable: false},
34+
{Name: "fetch_refspec", Type: sql.Text, Nullable: false},
35+
}
36+
}
37+
38+
func (r *remotesTable) TransformUp(f func(sql.Node) sql.Node) sql.Node {
39+
return f(r)
40+
}
41+
42+
func (r *remotesTable) TransformExpressionsUp(f func(sql.Expression) sql.Expression) sql.Node {
43+
return r
44+
}
45+
46+
func (r remotesTable) RowIter() (sql.RowIter, error) {
47+
iter := &remotesIter{}
48+
49+
rowRepoIter, err := NewRowRepoIter(r.pool, iter)
50+
if err != nil {
51+
return nil, err
52+
}
53+
54+
return rowRepoIter, nil
55+
}
56+
57+
func (remotesTable) Children() []sql.Node {
58+
return []sql.Node{}
59+
}
60+
61+
type remotesIter struct {
62+
repository_id string
63+
remotes []*git.Remote
64+
conf *gitconfig.RemoteConfig
65+
remotePos int
66+
urlPos int
67+
}
68+
69+
func (i *remotesIter) NewIterator(
70+
repo *Repository) (RowRepoIter, error) {
71+
72+
remotes, err := repo.Repo.Remotes()
73+
if err != nil {
74+
return nil, err
75+
}
76+
77+
return &remotesIter{
78+
repository_id: repo.ID,
79+
remotes: remotes,
80+
remotePos: 0,
81+
urlPos: 0}, nil
82+
}
83+
84+
func (i *remotesIter) Next() (sql.Row, error) {
85+
if i.remotePos >= len(i.remotes) {
86+
return nil, io.EOF
87+
}
88+
89+
remote := i.remotes[i.remotePos]
90+
config := remote.Config()
91+
92+
if i.urlPos >= len(config.URLs) {
93+
i.remotePos++
94+
if i.remotePos >= len(i.remotes) {
95+
return nil, io.EOF
96+
}
97+
98+
remote = i.remotes[i.remotePos]
99+
config = remote.Config()
100+
i.urlPos = 0
101+
}
102+
103+
row := sql.NewRow(
104+
i.repository_id,
105+
config.Name,
106+
config.URLs[i.urlPos],
107+
config.URLs[i.urlPos],
108+
config.Fetch[i.urlPos],
109+
config.Fetch[i.urlPos],
110+
)
111+
112+
i.urlPos++
113+
114+
return row, nil
115+
}
116+
117+
func (i *remotesIter) Close() error {
118+
return nil
119+
}

remotes_test.go

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
package gitquery
2+
3+
import (
4+
"fmt"
5+
"testing"
6+
7+
"gopkg.in/src-d/go-mysql-server.v0/sql"
8+
9+
"github.com/stretchr/testify/require"
10+
"gopkg.in/src-d/go-git-fixtures.v3"
11+
gitconfig "gopkg.in/src-d/go-git.v4/config"
12+
)
13+
14+
func TestRemotesTable_Name(t *testing.T) {
15+
require := require.New(t)
16+
17+
f := fixtures.Basic().One()
18+
table := getTable(require, f, remotesTableName)
19+
require.Equal(remotesTableName, table.Name())
20+
}
21+
22+
func TestRemotesTable_Children(t *testing.T) {
23+
require := require.New(t)
24+
25+
f := fixtures.Basic().One()
26+
table := getTable(require, f, remotesTableName)
27+
require.Equal(0, len(table.Children()))
28+
}
29+
30+
func TestRemotesTable_RowIter(t *testing.T) {
31+
require := require.New(t)
32+
33+
f := fixtures.Basic().One()
34+
table := getTable(require, f, remotesTableName)
35+
36+
remotes, ok := table.(*remotesTable)
37+
require.True(ok)
38+
39+
pool := remotes.pool
40+
repository, ok := pool.GetPos(0)
41+
require.True(ok)
42+
43+
repo := repository.Repo
44+
45+
config := gitconfig.RemoteConfig{
46+
Name: "my_remote",
47+
URLs: []string{"url1", "url2"},
48+
Fetch: []gitconfig.RefSpec{
49+
"refs/heads/*:refs/remotes/fetch1/*",
50+
"refs/heads/*:refs/remotes/fetch2/*",
51+
},
52+
}
53+
54+
_, err := repo.CreateRemote(&config)
55+
require.Nil(err)
56+
57+
rows, err := sql.NodeToRows(table)
58+
require.Nil(err)
59+
require.Len(rows, 3)
60+
61+
schema := table.Schema()
62+
for idx, row := range rows {
63+
err := schema.CheckRow(row)
64+
require.Nil(err, "row %d doesn't conform to schema", idx)
65+
66+
if row[1] == "my_remote" {
67+
urlstring, ok := row[2].(string)
68+
require.True(ok)
69+
70+
num := urlstring[len(urlstring)-1:]
71+
72+
require.Equal(repository.ID, row[0])
73+
74+
url := fmt.Sprintf("url%v", num)
75+
require.Equal(url, row[2]) // push
76+
require.Equal(url, row[3]) // fetch
77+
78+
ref := fmt.Sprintf("refs/heads/*:refs/remotes/fetch%v/*", num)
79+
require.Equal(gitconfig.RefSpec(ref), row[4]) // push
80+
require.Equal(gitconfig.RefSpec(ref), row[5]) // fetch
81+
} else {
82+
require.Equal("origin", row[1])
83+
}
84+
}
85+
}

0 commit comments

Comments
 (0)