Skip to content

Commit bd24d22

Browse files
authored
git: Add references relation (#34)
1 parent a23d4c8 commit bd24d22

File tree

4 files changed

+138
-7
lines changed

4 files changed

+138
-7
lines changed

git/commits.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -50,19 +50,19 @@ func (r commitsRelation) RowIter() (sql.RowIter, error) {
5050
if err != nil {
5151
return nil, err
5252
}
53-
iter := &iter{i: cIter}
53+
iter := &commitIter{i: cIter}
5454
return iter, nil
5555
}
5656

5757
func (commitsRelation) Children() []sql.Node {
5858
return []sql.Node{}
5959
}
6060

61-
type iter struct {
61+
type commitIter struct {
6262
i *git.CommitIter
6363
}
6464

65-
func (i *iter) Next() (sql.Row, error) {
65+
func (i *commitIter) Next() (sql.Row, error) {
6666
commit, err := i.i.Next()
6767
if err == io.EOF {
6868
return nil, io.EOF

git/database.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,20 +7,23 @@ import (
77
)
88

99
const (
10-
commitsRelationName = "commits"
11-
tagsRelationName = "tags"
10+
referencesRelationName = "references"
11+
commitsRelationName = "commits"
12+
tagsRelationName = "tags"
1213
)
1314

1415
type Database struct {
1516
name string
1617
cr sql.PhysicalRelation
1718
tr sql.PhysicalRelation
19+
rr sql.PhysicalRelation
1820
}
1921

2022
func NewDatabase(name string, r *git.Repository) sql.Database {
2123
return &Database{
2224
name: name,
2325
cr: newCommitsRelation(r),
26+
rr: newReferencesRelation(r),
2427
tr: newTagsRelation(r),
2528
}
2629
}
@@ -31,7 +34,8 @@ func (d *Database) Name() string {
3134

3235
func (d *Database) Relations() map[string]sql.PhysicalRelation {
3336
return map[string]sql.PhysicalRelation{
34-
commitsRelationName: d.cr,
35-
tagsRelationName: d.tr,
37+
commitsRelationName: d.cr,
38+
tagsRelationName: d.tr,
39+
referencesRelationName: d.rr,
3640
}
3741
}

git/references.go

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
package git
2+
3+
import (
4+
"github.com/gitql/gitql/sql"
5+
6+
"gopkg.in/src-d/go-git.v4"
7+
"gopkg.in/src-d/go-git.v4/core"
8+
)
9+
10+
type referencesRelation struct {
11+
r *git.Repository
12+
}
13+
14+
func newReferencesRelation(r *git.Repository) sql.PhysicalRelation {
15+
return &referencesRelation{r: r}
16+
}
17+
18+
func (referencesRelation) Resolved() bool {
19+
return true
20+
}
21+
22+
func (referencesRelation) Name() string {
23+
return referencesRelationName
24+
}
25+
26+
func (referencesRelation) Schema() sql.Schema {
27+
return sql.Schema{
28+
sql.Field{"hash", sql.String},
29+
sql.Field{"name", sql.String},
30+
sql.Field{"is_branch", sql.Boolean},
31+
sql.Field{"is_note", sql.Boolean},
32+
sql.Field{"is_remote", sql.Boolean},
33+
sql.Field{"is_tag", sql.Boolean},
34+
sql.Field{"target", sql.String},
35+
}
36+
}
37+
38+
func (r *referencesRelation) TransformUp(f func(sql.Node) sql.Node) sql.Node {
39+
return f(r)
40+
}
41+
42+
func (r *referencesRelation) TransformExpressionsUp(f func(sql.Expression) sql.Expression) sql.Node {
43+
return r
44+
}
45+
46+
func (r referencesRelation) RowIter() (sql.RowIter, error) {
47+
rIter, err := r.r.Refs()
48+
if err != nil {
49+
return nil, err
50+
}
51+
iter := &referenceIter{i: rIter}
52+
return iter, nil
53+
}
54+
55+
func (referencesRelation) Children() []sql.Node {
56+
return []sql.Node{}
57+
}
58+
59+
type referenceIter struct {
60+
i core.ReferenceIter
61+
}
62+
63+
func (i *referenceIter) Next() (sql.Row, error) {
64+
reference, err := i.i.Next()
65+
if err != nil {
66+
return nil, err
67+
}
68+
69+
return referenceToRow(reference), nil
70+
}
71+
72+
func referenceToRow(c *core.Reference) sql.Row {
73+
return sql.NewMemoryRow(
74+
c.Hash().String(),
75+
c.Name().String(),
76+
c.IsBranch(),
77+
c.IsNote(),
78+
c.IsRemote(),
79+
c.IsTag(),
80+
c.Target().String(),
81+
)
82+
}

git/references_test.go

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
package git
2+
3+
import (
4+
"testing"
5+
6+
"github.com/stretchr/testify/assert"
7+
"gopkg.in/src-d/go-git.v4"
8+
"gopkg.in/src-d/go-git.v4/fixtures"
9+
)
10+
11+
func TestRefsRelation(t *testing.T) {
12+
assert := assert.New(t)
13+
14+
f := fixtures.Basic().One()
15+
r, err := git.NewFilesystemRepository(f.DotGit().Base())
16+
assert.Nil(err)
17+
18+
db := NewDatabase("foo", r)
19+
assert.NotNil(db)
20+
21+
relations := db.Relations()
22+
rel, ok := relations[referencesRelationName]
23+
assert.True(ok)
24+
assert.NotNil(rel)
25+
assert.Equal(referencesRelationName, rel.Name())
26+
assert.Equal(0, len(rel.Children()))
27+
28+
iter, err := rel.RowIter()
29+
assert.Nil(err)
30+
assert.NotNil(iter)
31+
32+
row, err := iter.Next()
33+
assert.Nil(err)
34+
assert.NotNil(row)
35+
36+
fields := row.Fields()
37+
assert.NotNil(fields)
38+
assert.IsType("", fields[0])
39+
assert.IsType("", fields[1])
40+
assert.IsType(true, fields[2])
41+
assert.IsType(true, fields[3])
42+
assert.IsType(true, fields[4])
43+
assert.IsType(true, fields[5])
44+
assert.IsType("", fields[6])
45+
}

0 commit comments

Comments
 (0)