Skip to content

Commit 5e164e6

Browse files
committed
Even better recursion and error messages.
1 parent 98c7a45 commit 5e164e6

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

subtrac.go

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,10 @@ func (c *Cache) tracByRef(refname string) (*Trac, error) {
9090
// any cycles when traversing the commit+submodule hierarchy, although the
9191
// same sub-objects may occur many times at different points in the tree.
9292
func (c *Cache) tracCommit(path string, commit *object.Commit) (*Trac, error) {
93+
// debugf("commit %.10v %v\n", commit.Hash, path)
9394
trac := c.tracs[commit.Hash]
9495
if trac != nil {
96+
// debugf(" found: %v\n", trac)
9597
return trac, nil
9698
}
9799
trac = &Trac{
@@ -113,8 +115,11 @@ func (c *Cache) tracCommit(path string, commit *object.Commit) (*Trac, error) {
113115
}
114116
np := commitPath(path, i+1)
115117
_, err = c.tracCommit(np, pc)
118+
if err != nil {
119+
return nil, err
120+
}
116121
}
117-
c.tracs[commit.Hash] = trac
122+
c.add(trac)
118123
return trac, nil
119124
}
120125

@@ -140,12 +145,21 @@ func (c *Cache) tracTree(path string, tree *object.Tree) (*Trac, error) {
140145
}
141146
for _, e := range tree.Entries {
142147
if e.Mode == filemode.Submodule {
143-
debugf("submodule: %v/\n", e.Name)
148+
sc, err := c.repo.CommitObject(e.Hash)
149+
subpath := fmt.Sprintf("%s%s@%.10v", path, e.Name, e.Hash)
150+
if err != nil {
151+
return nil, fmt.Errorf("%v: %v (maybe fetch it?)",
152+
subpath, err)
153+
}
154+
_, err = c.tracCommit(subpath, sc)
155+
if err != nil {
156+
return nil, err
157+
}
144158
} else if e.Mode == filemode.Dir {
145159
t, err := c.repo.TreeObject(e.Hash)
146160
if err != nil {
147161
return nil, fmt.Errorf("%v:%.10v: %v",
148-
path, e.Hash, err)
162+
path+e.Name, e.Hash, err)
149163
}
150164
_, err = c.tracTree(path+e.Name+"/", t)
151165
if err != nil {
@@ -157,10 +171,15 @@ func (c *Cache) tracTree(path string, tree *object.Tree) (*Trac, error) {
157171
name: path,
158172
hash: tree.Hash,
159173
}
160-
c.tracs[tree.Hash] = trac
174+
c.add(trac)
161175
return trac, nil
162176
}
163177

178+
func (c *Cache) add(trac *Trac) {
179+
debugf(" add %.10v %v\n", trac.hash, trac.name)
180+
c.tracs[trac.hash] = trac
181+
}
182+
164183
func main() {
165184
log.SetFlags(0)
166185
r, err := git.PlainOpen(".")
@@ -171,7 +190,7 @@ func main() {
171190
refname := "junk"
172191
_, err = c.tracByRef(refname)
173192
if err != nil {
174-
fatalf("AddByRef: %v\n", err)
193+
fatalf("%v\n", err)
175194
}
176195
fmt.Printf("%v\n", c)
177196
}

0 commit comments

Comments
 (0)