Skip to content

Commit a23d4c8

Browse files
authored
git: Add tags relation (#36)
1 parent c38b4bb commit a23d4c8

File tree

3 files changed

+132
-0
lines changed

3 files changed

+132
-0
lines changed

git/database.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,17 +8,20 @@ import (
88

99
const (
1010
commitsRelationName = "commits"
11+
tagsRelationName = "tags"
1112
)
1213

1314
type Database struct {
1415
name string
1516
cr sql.PhysicalRelation
17+
tr sql.PhysicalRelation
1618
}
1719

1820
func NewDatabase(name string, r *git.Repository) sql.Database {
1921
return &Database{
2022
name: name,
2123
cr: newCommitsRelation(r),
24+
tr: newTagsRelation(r),
2225
}
2326
}
2427

@@ -29,5 +32,6 @@ func (d *Database) Name() string {
2932
func (d *Database) Relations() map[string]sql.PhysicalRelation {
3033
return map[string]sql.PhysicalRelation{
3134
commitsRelationName: d.cr,
35+
tagsRelationName: d.tr,
3236
}
3337
}

git/tags.go

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
package git
2+
3+
import (
4+
"github.com/gitql/gitql/sql"
5+
6+
"gopkg.in/src-d/go-git.v4"
7+
)
8+
9+
type tagsRelation struct {
10+
r *git.Repository
11+
}
12+
13+
func newTagsRelation(r *git.Repository) sql.PhysicalRelation {
14+
return &tagsRelation{r: r}
15+
}
16+
17+
func (tagsRelation) Resolved() bool {
18+
return true
19+
}
20+
21+
func (tagsRelation) Name() string {
22+
return tagsRelationName
23+
}
24+
25+
func (tagsRelation) Schema() sql.Schema {
26+
return sql.Schema{
27+
sql.Field{"hash", sql.String},
28+
sql.Field{"name", sql.String},
29+
sql.Field{"tagger_email", sql.String},
30+
sql.Field{"tagger_name", sql.String},
31+
sql.Field{"tagger_when", sql.Timestamp},
32+
sql.Field{"message", sql.String},
33+
sql.Field{"target", sql.String},
34+
}
35+
}
36+
37+
func (r *tagsRelation) TransformUp(f func(sql.Node) sql.Node) sql.Node {
38+
return f(r)
39+
}
40+
41+
func (r *tagsRelation) TransformExpressionsUp(f func(sql.Expression) sql.Expression) sql.Node {
42+
return r
43+
}
44+
45+
func (r tagsRelation) RowIter() (sql.RowIter, error) {
46+
tIter, err := r.r.Tags()
47+
if err != nil {
48+
return nil, err
49+
}
50+
iter := &tagIter{i: tIter}
51+
return iter, nil
52+
}
53+
54+
func (tagsRelation) Children() []sql.Node {
55+
return []sql.Node{}
56+
}
57+
58+
type tagIter struct {
59+
i *git.TagIter
60+
}
61+
62+
func (i *tagIter) Next() (sql.Row, error) {
63+
tag, err := i.i.Next()
64+
if err != nil {
65+
return nil, err
66+
}
67+
68+
return tagToRow(tag), nil
69+
}
70+
71+
func tagToRow(c *git.Tag) sql.Row {
72+
return sql.NewMemoryRow(
73+
c.Hash.String(),
74+
c.Name,
75+
c.Tagger.Email,
76+
c.Tagger.Name,
77+
c.Tagger.When,
78+
c.Message,
79+
c.Target.String(),
80+
)
81+
}

git/tags_test.go

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

0 commit comments

Comments
 (0)