@@ -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
2327type 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.
6968type 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\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-
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\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 }
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.
199182func (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.
261244type 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.
273255func (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 }
0 commit comments