@@ -16,18 +16,17 @@ type CommitNode interface {
16
16
ID () plumbing.Hash
17
17
Tree () (* Tree , error )
18
18
CommitTime () time.Time
19
+ NumParents () int
20
+ ParentNodes () CommitNodeIter
21
+ ParentNode (i int ) (CommitNode , error )
22
+ ParentHashes () []plumbing.Hash
19
23
}
20
24
21
25
// CommitNodeIndex is generic interface encapsulating an index of CommitNode objects
22
26
// and accessor methods for walking it as a directed graph
23
27
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
29
29
Get (hash plumbing.Hash ) (CommitNode , error )
30
-
31
30
// Commit returns the full commit object from the node
32
31
Commit (node CommitNode ) (* Commit , error )
33
32
}
@@ -67,7 +66,8 @@ type graphCommitNodeIndex struct {
67
66
//
68
67
// objectCommitNode implements the CommitNode interface.
69
68
type objectCommitNode struct {
70
- commit * Commit
69
+ nodeIndex CommitNodeIndex
70
+ commit * Commit
71
71
}
72
72
73
73
// objectCommitNodeIndex is an index that can load CommitNode objects only from the
@@ -93,68 +93,50 @@ func (c *graphCommitNode) CommitTime() time.Time {
93
93
return c .node .When
94
94
}
95
95
96
- func (c * graphCommitNode ) String () string {
97
- return fmt .Sprintf (
98
- "%s %s\n Date: %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
-
108
96
// 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 )
115
99
}
116
100
117
101
// 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 )
120
104
}
121
105
122
106
// 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
140
110
}
141
111
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
145
115
}
146
116
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
149
123
}
150
124
151
125
// 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\n Date: %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 }
158
140
}
159
141
160
142
// NodeFromHash looks up a commit node by it's object hash
@@ -181,7 +163,10 @@ func (gci *graphCommitNodeIndex) Get(hash plumbing.Hash) (CommitNode, error) {
181
163
return nil , err
182
164
}
183
165
184
- return & objectCommitNode {commit : commit }, nil
166
+ return & objectCommitNode {
167
+ nodeIndex : gci ,
168
+ commit : commit ,
169
+ }, nil
185
170
}
186
171
187
172
// Commit returns the full Commit object representing the commit graph node.
@@ -194,8 +179,6 @@ func (gci *graphCommitNodeIndex) Commit(node CommitNode) (*Commit, error) {
194
179
}
195
180
196
181
// CommitTime returns the time when the commit was performed.
197
- //
198
- // CommitTime is present to fulfill the CommitNode interface.
199
182
func (c * objectCommitNode ) CommitTime () time.Time {
200
183
return c .commit .Committer .When
201
184
}
@@ -210,35 +193,32 @@ func (c *objectCommitNode) Tree() (*Tree, error) {
210
193
return c .commit .Tree ()
211
194
}
212
195
213
- func NewObjectCommitNodeIndex (s storer.EncodedObjectStorer ) CommitNodeIndex {
214
- return & objectCommitNodeIndex {s }
215
- }
216
-
217
196
// 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 ()
221
199
}
222
200
223
201
// 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 )
226
204
}
227
205
228
206
// 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
234
210
}
235
- return & objectCommitNode {commit : parent }, nil
211
+
212
+ return c .nodeIndex .Get (c .commit .ParentHashes [i ])
236
213
}
237
214
238
215
// 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 }
242
222
}
243
223
244
224
// NodeFromHash looks up a commit node by it's object hash
@@ -248,7 +228,10 @@ func (oci *objectCommitNodeIndex) Get(hash plumbing.Hash) (CommitNode, error) {
248
228
return nil , err
249
229
}
250
230
251
- return & objectCommitNode {commit : commit }, nil
231
+ return & objectCommitNode {
232
+ nodeIndex : oci ,
233
+ commit : commit ,
234
+ }, nil
252
235
}
253
236
254
237
// Commit returns the full Commit object representing the commit graph node.
@@ -259,19 +242,18 @@ func (oci *objectCommitNodeIndex) Commit(node CommitNode) (*Commit, error) {
259
242
260
243
// parentCommitNodeIter provides an iterator for parent commits from associated CommitNodeIndex.
261
244
type parentCommitNodeIter struct {
262
- gci CommitNodeIndex
263
245
node CommitNode
264
246
i int
265
247
}
266
248
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 }
269
251
}
270
252
271
253
// Next moves the iterator to the next commit and returns a pointer to it. If
272
254
// there are no more commits, it returns io.EOF.
273
255
func (iter * parentCommitNodeIter ) Next () (CommitNode , error ) {
274
- obj , err := iter .gci .ParentNode (iter . node , iter .i )
256
+ obj , err := iter .node .ParentNode (iter .i )
275
257
if err == ErrParentNotFound {
276
258
return nil , io .EOF
277
259
}
0 commit comments