Stuck at Write a tree object #fe4. The program is printing 40 char SHA yet the tester expects it

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

Hey @vardey, the tester expects the SHA to be printed to stdout.

Let me know if anything’s still unclear!

Thanks a lot!

1 Like

This topic was automatically closed 5 days after the last reply. New replies are no longer allowed.