Skip to content

Commit 5d40d9a

Browse files
authored
git: add tree entries relation. (#40)
1 parent 326973d commit 5d40d9a

File tree

3 files changed

+146
-6
lines changed

3 files changed

+146
-6
lines changed

git/database.go

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -7,16 +7,18 @@ import (
77
)
88

99
const (
10-
referencesRelationName = "references"
11-
commitsRelationName = "commits"
12-
tagsRelationName = "tags"
10+
referencesRelationName = "references"
11+
commitsRelationName = "commits"
12+
tagsRelationName = "tags"
13+
treeEntriesRelationName = "tree_entries"
1314
)
1415

1516
type Database struct {
1617
name string
1718
cr sql.PhysicalRelation
1819
tr sql.PhysicalRelation
1920
rr sql.PhysicalRelation
21+
ter sql.PhysicalRelation
2022
}
2123

2224
func NewDatabase(name string, r *git.Repository) sql.Database {
@@ -25,6 +27,7 @@ func NewDatabase(name string, r *git.Repository) sql.Database {
2527
cr: newCommitsRelation(r),
2628
rr: newReferencesRelation(r),
2729
tr: newTagsRelation(r),
30+
ter: newTreeEntriesRelation(r),
2831
}
2932
}
3033

@@ -34,8 +37,9 @@ func (d *Database) Name() string {
3437

3538
func (d *Database) Relations() map[string]sql.PhysicalRelation {
3639
return map[string]sql.PhysicalRelation{
37-
commitsRelationName: d.cr,
38-
tagsRelationName: d.tr,
39-
referencesRelationName: d.rr,
40+
commitsRelationName: d.cr,
41+
tagsRelationName: d.tr,
42+
referencesRelationName: d.rr,
43+
treeEntriesRelationName: d.ter,
4044
}
4145
}

git/tree_entries.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package git
2+
3+
import (
4+
"strconv"
5+
6+
"github.com/gitql/gitql/sql"
7+
8+
"gopkg.in/src-d/go-git.v4"
9+
)
10+
11+
type treeEntriesRelation struct {
12+
r *git.Repository
13+
}
14+
15+
func newTreeEntriesRelation(r *git.Repository) sql.PhysicalRelation {
16+
return &treeEntriesRelation{r: r}
17+
}
18+
19+
func (treeEntriesRelation) Resolved() bool {
20+
return true
21+
}
22+
23+
func (treeEntriesRelation) Name() string {
24+
return treeEntriesRelationName
25+
}
26+
27+
func (treeEntriesRelation) Schema() sql.Schema {
28+
return sql.Schema{
29+
sql.Field{"tree_hash", sql.String},
30+
sql.Field{"entry_hash", sql.String},
31+
sql.Field{"mode", sql.String},
32+
sql.Field{"name", sql.String},
33+
}
34+
}
35+
36+
func (r *treeEntriesRelation) TransformUp(f func(sql.Node) sql.Node) sql.Node {
37+
return f(r)
38+
}
39+
40+
func (r *treeEntriesRelation) TransformExpressionsUp(f func(sql.Expression) sql.Expression) sql.Node {
41+
return r
42+
}
43+
44+
func (r treeEntriesRelation) RowIter() (sql.RowIter, error) {
45+
cIter, err := r.r.Trees()
46+
if err != nil {
47+
return nil, err
48+
}
49+
iter := &treeEntryIter{i: cIter}
50+
return iter, nil
51+
}
52+
53+
func (treeEntriesRelation) Children() []sql.Node {
54+
return []sql.Node{}
55+
}
56+
57+
type treeEntryIter struct {
58+
i *git.TreeIter
59+
t *git.Tree
60+
ei int
61+
}
62+
63+
func (i *treeEntryIter) Next() (sql.Row, error) {
64+
for {
65+
if i.t == nil {
66+
tree, err := i.i.Next()
67+
if err != nil {
68+
return nil, err
69+
}
70+
71+
i.t = tree
72+
i.ei = 0
73+
}
74+
75+
if i.ei >= len(i.t.Entries) {
76+
i.t = nil
77+
}
78+
79+
e := i.t.Entries[i.ei]
80+
i.ei++
81+
82+
return treeEntryToRow(i.t, e), nil
83+
}
84+
}
85+
86+
func treeEntryToRow(t *git.Tree, e git.TreeEntry) sql.Row {
87+
return sql.NewMemoryRow(
88+
t.ID().String(),
89+
e.Hash.String(),
90+
strconv.FormatInt(int64(e.Mode), 8),
91+
e.Name,
92+
)
93+
}

git/tree_entries_test.go

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
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 TestTreeEntriesRelation(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[treeEntriesRelationName]
23+
assert.True(ok)
24+
assert.NotNil(rel)
25+
assert.Equal(treeEntriesRelationName, 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.Len(fields, 4)
39+
assert.IsType("", fields[0])
40+
assert.IsType("", fields[1])
41+
assert.IsType("", fields[2])
42+
assert.IsType("", fields[3])
43+
}

0 commit comments

Comments
 (0)