Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 23 additions & 2 deletions pkg/commands/models/commit.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,8 +8,18 @@ import (
"github.com/stefanhaller/git-todo-parser/todo"
)

// Special commit hash for empty tree object
// Empty tree object hashes for SHA-1 and SHA-256 repos.
const EmptyTreeCommitHash = "4b825dc642cb6eb9a060e54bf8d69288fbee4904"
const EmptyTreeCommitHashSHA256 = "6ef19b41225c5369f1c104d45d8d85efa9b057b53b14b4b9b939dd74decc5321"

// EmptyTreeHashForFormat returns the empty tree hash for the given object
// format ("sha1" or "sha256"). Falls back to SHA-1 for unknown formats.
func EmptyTreeHashForFormat(objectFormat string) string {
if objectFormat == "sha256" {
return EmptyTreeCommitHashSHA256
}
return EmptyTreeCommitHash
}

type CommitStatus uint8

Expand Down Expand Up @@ -122,11 +132,22 @@ func (c *Commit) ShortRefName() string {

func (c *Commit) ParentRefName() string {
if c.IsFirstCommit() {
return EmptyTreeCommitHash
return c.emptyTreeHash()
}
return c.RefName() + "^"
}

// emptyTreeHash returns the empty tree object hash matching this repo's
// object format. This is only called when IsFirstCommit() is true, so the
// commit comes from git log with a full-length hash (40 for SHA-1, 64 for
// SHA-256).
func (c *Commit) emptyTreeHash() string {
if len(c.Hash()) == len(EmptyTreeCommitHashSHA256) {
return EmptyTreeCommitHashSHA256
}
return EmptyTreeCommitHash
}

func (c *Commit) Parents() []string {
return lo.Map(c.parents, func(s *string, _ int) string { return *s })
}
Expand Down
13 changes: 9 additions & 4 deletions pkg/gui/presentation/graph/graph.go
Original file line number Diff line number Diff line change
Expand Up @@ -32,9 +32,10 @@ type Pipe struct {
}

var (
highlightStyle = style.FgLightWhite.SetBold()
EmptyTreeCommitHash = models.EmptyTreeCommitHash
StartCommitHash = "START"
highlightStyle = style.FgLightWhite.SetBold()
EmptyTreeCommitHash = models.EmptyTreeCommitHash
EmptyTreeCommitHashSHA256 = models.EmptyTreeCommitHashSHA256
StartCommitHash = "START"
)

func (self Pipe) left() int16 {
Expand Down Expand Up @@ -142,7 +143,11 @@ func getNextPipes(prevPipes []Pipe, commit *models.Commit, getStyle func(c *mode

var toHash *string
if commit.IsFirstCommit() {
toHash = &EmptyTreeCommitHash
if len(commit.Hash()) == len(EmptyTreeCommitHashSHA256) {
toHash = &EmptyTreeCommitHashSHA256
} else {
toHash = &EmptyTreeCommitHash
}
} else {
toHash = commit.ParentPtrs()[0]
}
Expand Down
13 changes: 13 additions & 0 deletions pkg/gui/presentation/graph/graph_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -531,6 +531,19 @@ func TestGetNextPipes(t *testing.T) {
{fromPos: 1, toPos: 1, fromHash: pool("root"), toHash: pool(models.EmptyTreeCommitHash), kind: STARTS, style: &style.FgDefault},
},
},
// SHA-256 repo: first commit with a 64-char hash should use the SHA-256 empty tree hash
{
prevPipes: []Pipe{
{fromPos: 0, toPos: 0, fromHash: pool("a"), toHash: pool("ba741fcd02b3cd42187ee46d4bdbfed10bf8fdbb15ccf739cb9ce583aefe5cae"), kind: TERMINATES, style: &style.FgDefault},
},
commit: models.NewCommit(hashPool, models.NewCommitOpts{
Hash: "ba741fcd02b3cd42187ee46d4bdbfed10bf8fdbb15ccf739cb9ce583aefe5cae",
Parents: []string{},
}),
expected: []Pipe{
{fromPos: 1, toPos: 1, fromHash: pool("ba741fcd02b3cd42187ee46d4bdbfed10bf8fdbb15ccf739cb9ce583aefe5cae"), toHash: pool(models.EmptyTreeCommitHashSHA256), kind: STARTS, style: &style.FgDefault},
},
},
}

oldColorLevel := color.ForceSetColorLevel(terminfo.ColorLevelMillions)
Expand Down