Skip to content
This repository was archived by the owner on Sep 11, 2020. It is now read-only.

Commit 9eb627f

Browse files
committed
Simplify the CommitNode API, make it look more like Commit
Signed-off-by: Filip Navara <filip.navara@gmail.com>
1 parent ec65d90 commit 9eb627f

File tree

3 files changed

+65
-87
lines changed

3 files changed

+65
-87
lines changed

plumbing/object/commitnode.go

+63-81
Original file line numberDiff line numberDiff line change
@@ -16,18 +16,17 @@ type CommitNode interface {
1616
ID() plumbing.Hash
1717
Tree() (*Tree, error)
1818
CommitTime() time.Time
19+
NumParents() int
20+
ParentNodes() CommitNodeIter
21+
ParentNode(i int) (CommitNode, error)
22+
ParentHashes() []plumbing.Hash
1923
}
2024

2125
// CommitNodeIndex is generic interface encapsulating an index of CommitNode objects
2226
// and accessor methods for walking it as a directed graph
2327
type CommitNodeIndex interface {
24-
NumParents(node CommitNode) int
25-
ParentNodes(node CommitNode) CommitNodeIter
26-
ParentNode(node CommitNode, i int) (CommitNode, error)
27-
ParentHashes(node CommitNode) []plumbing.Hash
28-
28+
// Get returns a commit node from a commit hash
2929
Get(hash plumbing.Hash) (CommitNode, error)
30-
3130
// Commit returns the full commit object from the node
3231
Commit(node CommitNode) (*Commit, error)
3332
}
@@ -67,7 +66,8 @@ type graphCommitNodeIndex struct {
6766
//
6867
// objectCommitNode implements the CommitNode interface.
6968
type objectCommitNode struct {
70-
commit *Commit
69+
nodeIndex CommitNodeIndex
70+
commit *Commit
7171
}
7272

7373
// objectCommitNodeIndex is an index that can load CommitNode objects only from the
@@ -93,68 +93,50 @@ func (c *graphCommitNode) CommitTime() time.Time {
9393
return c.node.When
9494
}
9595

96-
func (c *graphCommitNode) String() string {
97-
return fmt.Sprintf(
98-
"%s %s\nDate: %s",
99-
plumbing.CommitObject, c.ID(),
100-
c.CommitTime().Format(DateFormat),
101-
)
102-
}
103-
104-
func NewGraphCommitNodeIndex(commitGraph commitgraph.Index, s storer.EncodedObjectStorer) CommitNodeIndex {
105-
return &graphCommitNodeIndex{commitGraph, s}
106-
}
107-
10896
// NumParents returns the number of parents in a commit.
109-
func (gci *graphCommitNodeIndex) NumParents(node CommitNode) int {
110-
if cgn, ok := node.(*graphCommitNode); ok {
111-
return len(cgn.node.ParentIndexes)
112-
}
113-
co := node.(*objectCommitNode)
114-
return co.commit.NumParents()
97+
func (c *graphCommitNode) NumParents() int {
98+
return len(c.node.ParentIndexes)
11599
}
116100

117101
// ParentNodes return a CommitNodeIter for parents of specified node.
118-
func (gci *graphCommitNodeIndex) ParentNodes(node CommitNode) CommitNodeIter {
119-
return newParentgraphCommitNodeIter(gci, node)
102+
func (c *graphCommitNode) ParentNodes() CommitNodeIter {
103+
return newParentgraphCommitNodeIter(c)
120104
}
121105

122106
// ParentNode returns the ith parent of a commit.
123-
func (gci *graphCommitNodeIndex) ParentNode(node CommitNode, i int) (CommitNode, error) {
124-
if cgn, ok := node.(*graphCommitNode); ok {
125-
if len(cgn.node.ParentIndexes) == 0 || i >= len(cgn.node.ParentIndexes) {
126-
return nil, ErrParentNotFound
127-
}
128-
129-
parent, err := gci.commitGraph.GetNodeByIndex(cgn.node.ParentIndexes[i])
130-
if err != nil {
131-
return nil, err
132-
}
133-
134-
return &graphCommitNode{
135-
hash: cgn.node.ParentHashes[i],
136-
index: cgn.node.ParentIndexes[i],
137-
node: parent,
138-
gci: gci,
139-
}, nil
107+
func (c *graphCommitNode) ParentNode(i int) (CommitNode, error) {
108+
if i < 0 || i >= len(c.node.ParentIndexes) {
109+
return nil, ErrParentNotFound
140110
}
141111

142-
co := node.(*objectCommitNode)
143-
if len(co.commit.ParentHashes) == 0 || i >= len(co.commit.ParentHashes) {
144-
return nil, ErrParentNotFound
112+
parent, err := c.gci.commitGraph.GetNodeByIndex(c.node.ParentIndexes[i])
113+
if err != nil {
114+
return nil, err
145115
}
146116

147-
parentHash := co.commit.ParentHashes[i]
148-
return gci.Get(parentHash)
117+
return &graphCommitNode{
118+
hash: c.node.ParentHashes[i],
119+
index: c.node.ParentIndexes[i],
120+
node: parent,
121+
gci: c.gci,
122+
}, nil
149123
}
150124

151125
// ParentHashes returns hashes of the parent commits for a specified node
152-
func (gci *graphCommitNodeIndex) ParentHashes(node CommitNode) []plumbing.Hash {
153-
if cgn, ok := node.(*graphCommitNode); ok {
154-
return cgn.node.ParentHashes
155-
}
156-
co := node.(*objectCommitNode)
157-
return co.commit.ParentHashes
126+
func (c *graphCommitNode) ParentHashes() []plumbing.Hash {
127+
return c.node.ParentHashes
128+
}
129+
130+
func (c *graphCommitNode) String() string {
131+
return fmt.Sprintf(
132+
"%s %s\nDate: %s",
133+
plumbing.CommitObject, c.ID(),
134+
c.CommitTime().Format(DateFormat),
135+
)
136+
}
137+
138+
func NewGraphCommitNodeIndex(commitGraph commitgraph.Index, s storer.EncodedObjectStorer) CommitNodeIndex {
139+
return &graphCommitNodeIndex{commitGraph, s}
158140
}
159141

160142
// NodeFromHash looks up a commit node by it's object hash
@@ -181,7 +163,10 @@ func (gci *graphCommitNodeIndex) Get(hash plumbing.Hash) (CommitNode, error) {
181163
return nil, err
182164
}
183165

184-
return &objectCommitNode{commit: commit}, nil
166+
return &objectCommitNode{
167+
nodeIndex: gci,
168+
commit: commit,
169+
}, nil
185170
}
186171

187172
// Commit returns the full Commit object representing the commit graph node.
@@ -194,8 +179,6 @@ func (gci *graphCommitNodeIndex) Commit(node CommitNode) (*Commit, error) {
194179
}
195180

196181
// CommitTime returns the time when the commit was performed.
197-
//
198-
// CommitTime is present to fulfill the CommitNode interface.
199182
func (c *objectCommitNode) CommitTime() time.Time {
200183
return c.commit.Committer.When
201184
}
@@ -210,35 +193,32 @@ func (c *objectCommitNode) Tree() (*Tree, error) {
210193
return c.commit.Tree()
211194
}
212195

213-
func NewObjectCommitNodeIndex(s storer.EncodedObjectStorer) CommitNodeIndex {
214-
return &objectCommitNodeIndex{s}
215-
}
216-
217196
// NumParents returns the number of parents in a commit.
218-
func (oci *objectCommitNodeIndex) NumParents(node CommitNode) int {
219-
co := node.(*objectCommitNode)
220-
return co.commit.NumParents()
197+
func (c *objectCommitNode) NumParents() int {
198+
return c.commit.NumParents()
221199
}
222200

223201
// ParentNodes return a CommitNodeIter for parents of specified node.
224-
func (oci *objectCommitNodeIndex) ParentNodes(node CommitNode) CommitNodeIter {
225-
return newParentgraphCommitNodeIter(oci, node)
202+
func (c *objectCommitNode) ParentNodes() CommitNodeIter {
203+
return newParentgraphCommitNodeIter(c)
226204
}
227205

228206
// ParentNode returns the ith parent of a commit.
229-
func (oci *objectCommitNodeIndex) ParentNode(node CommitNode, i int) (CommitNode, error) {
230-
co := node.(*objectCommitNode)
231-
parent, err := co.commit.Parent(i)
232-
if err != nil {
233-
return nil, err
207+
func (c *objectCommitNode) ParentNode(i int) (CommitNode, error) {
208+
if i < 0 || i >= len(c.commit.ParentHashes) {
209+
return nil, ErrParentNotFound
234210
}
235-
return &objectCommitNode{commit: parent}, nil
211+
212+
return c.nodeIndex.Get(c.commit.ParentHashes[i])
236213
}
237214

238215
// ParentHashes returns hashes of the parent commits for a specified node
239-
func (oci *objectCommitNodeIndex) ParentHashes(node CommitNode) []plumbing.Hash {
240-
co := node.(*objectCommitNode)
241-
return co.commit.ParentHashes
216+
func (c *objectCommitNode) ParentHashes() []plumbing.Hash {
217+
return c.commit.ParentHashes
218+
}
219+
220+
func NewObjectCommitNodeIndex(s storer.EncodedObjectStorer) CommitNodeIndex {
221+
return &objectCommitNodeIndex{s}
242222
}
243223

244224
// NodeFromHash looks up a commit node by it's object hash
@@ -248,7 +228,10 @@ func (oci *objectCommitNodeIndex) Get(hash plumbing.Hash) (CommitNode, error) {
248228
return nil, err
249229
}
250230

251-
return &objectCommitNode{commit: commit}, nil
231+
return &objectCommitNode{
232+
nodeIndex: oci,
233+
commit: commit,
234+
}, nil
252235
}
253236

254237
// Commit returns the full Commit object representing the commit graph node.
@@ -259,19 +242,18 @@ func (oci *objectCommitNodeIndex) Commit(node CommitNode) (*Commit, error) {
259242

260243
// parentCommitNodeIter provides an iterator for parent commits from associated CommitNodeIndex.
261244
type parentCommitNodeIter struct {
262-
gci CommitNodeIndex
263245
node CommitNode
264246
i int
265247
}
266248

267-
func newParentgraphCommitNodeIter(gci CommitNodeIndex, node CommitNode) CommitNodeIter {
268-
return &parentCommitNodeIter{gci, node, 0}
249+
func newParentgraphCommitNodeIter(node CommitNode) CommitNodeIter {
250+
return &parentCommitNodeIter{node, 0}
269251
}
270252

271253
// Next moves the iterator to the next commit and returns a pointer to it. If
272254
// there are no more commits, it returns io.EOF.
273255
func (iter *parentCommitNodeIter) Next() (CommitNode, error) {
274-
obj, err := iter.gci.ParentNode(iter.node, iter.i)
256+
obj, err := iter.node.ParentNode(iter.i)
275257
if err == ErrParentNotFound {
276258
return nil, io.EOF
277259
}

plumbing/object/commitnode_test.go

-1
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ func testWalker(c *C, nodeIndex CommitNodeIndex) {
2525

2626
iter := NewCommitNodeIterCTime(
2727
head,
28-
nodeIndex,
2928
nil,
3029
nil,
3130
)

plumbing/object/commitnode_walker_ctime.go

+2-5
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@ type commitNodeIteratorByCTime struct {
1313
heap *binaryheap.Heap
1414
seenExternal map[plumbing.Hash]bool
1515
seen map[plumbing.Hash]bool
16-
nodeIndex CommitNodeIndex
1716
}
1817

1918
// NewCommitNodeIterCTime returns a CommitNodeIter that walks the commit history,
@@ -26,7 +25,6 @@ type commitNodeIteratorByCTime struct {
2625
// commits from being iterated.
2726
func NewCommitNodeIterCTime(
2827
c CommitNode,
29-
nodeIndex CommitNodeIndex,
3028
seenExternal map[plumbing.Hash]bool,
3129
ignore []plumbing.Hash,
3230
) CommitNodeIter {
@@ -48,7 +46,6 @@ func NewCommitNodeIterCTime(
4846
heap: heap,
4947
seenExternal: seenExternal,
5048
seen: seen,
51-
nodeIndex: nodeIndex,
5249
}
5350
}
5451

@@ -68,11 +65,11 @@ func (w *commitNodeIteratorByCTime) Next() (CommitNode, error) {
6865

6966
w.seen[cID] = true
7067

71-
for i, h := range w.nodeIndex.ParentHashes(c) {
68+
for i, h := range c.ParentHashes() {
7269
if w.seen[h] || w.seenExternal[h] {
7370
continue
7471
}
75-
pc, err := w.nodeIndex.ParentNode(c, i)
72+
pc, err := c.ParentNode(i)
7673
if err != nil {
7774
return nil, err
7875
}

0 commit comments

Comments
 (0)