I’m stuck on Stage Write a tree object #fe4
My program prints 40-char SHA but the test still fails. The “Got:” field is empty.
Am I printing it wrong?
Here are my logs:
remote: [your_program] Initialized git directory
remote: [tester::#FE4] Creating some files & directories
remote: [tester::#FE4] $ ./your_program.sh write-tree
remote: [your_program] Logs from your program will appear here!
remote: [your_program] d8f89a21fedb1f2ee036be44ada9038dc4e6d218
remote: [tester::#FE4] Expected a 40-char SHA as output. Got:
remote: [tester::#FE4] Test failed
remote:
remote: View our article on debugging test failures: https://codecrafters.io/debug
remote:
To https://git.codecrafters.io/e1f008f1c7ee6ce1
87e63fc..b48fdf4 master -> master
And here’s a snippet of my code:
func writeTree(sourceDir string) {
tree := NewTree(sourceDir)
err := filepath.WalkDir(sourceDir, func(path string, d fs.DirEntry, err error) error {
if d.Name() == ".git" {
return filepath.SkipDir
}
fileInfo, errr := d.Info()
if errr != nil {
fmt.Println(errr)
return errr
}
gitObjectMode, errr := getGitObjectMode(d)
if errr != nil {
fmt.Println(errr)
return errr
}
_, er := tree.Insert(path, d.IsDir(), int(fileInfo.Size()), gitObjectMode)
// fmt.Println("node: ", node)
if er != nil {
fmt.Println(er)
return er
}
return nil
})
if err != nil {
log.Fatalf("impossible to walk directories: %s", err)
}
listOfNodes := tree.PostOrderTraversal()
// fmt.Println("listOfNodes", listOfNodes)
i := 0
for i < len(listOfNodes) {
currentNode := listOfNodes[i]
parentNode := currentNode.Parent
j := i
var treeEntries []*TreeEntry
for j < len(listOfNodes) && currentNode.Parent == listOfNodes[j].Parent && parentNode != nil {
treeEntries = append(treeEntries, NewTreeEntry(listOfNodes[j]))
j++
}
childrenNodes := currentNode.Children
if parentNode == nil {
for _, childNode := range childrenNodes {
treeEntries = append(treeEntries, NewTreeEntry(childNode))
}
}
// fmt.Println("TreeEntries", treeEntries)
sort.Slice(treeEntries, func(i, j int) bool {
// This sorts the entries alphabetically by Name
return treeEntries[i].Name < treeEntries[j].Name
})
// create a hashed tree object for the currentNode.parent with treeEntries as the content
contentBytes, err := concatenateTreeEntries(treeEntries)
if err != nil {
log.Fatal(err)
}
if parentNode != nil {
currentNode.Parent.Info.HashBytes = hashObject("tree", contentBytes)
}
i = j
if parentNode == nil {
break
}
}
fmt.Fprintf(os.Stderr, "%s", hex.EncodeToString(tree.Root.Info.HashBytes[:]))
}
TIA
