From 5df27c61ed27afeffda50e527c8845ccb7570aca Mon Sep 17 00:00:00 2001
From: Jesse Duffield <jessedduffield@gmail.com>
Date: Thu, 1 Jun 2023 21:38:16 +1000
Subject: [PATCH] Apply correct styling to root commit in graph

The root commit is special in that it has no parents. So we need to add a pipe that's headed for a commit
that doesn't actually exist i.e. the mythical empty tree commit. We're using the actual hash of that
pseudo-commit, but it's not being read anywhere.
---
 pkg/gui/presentation/graph/graph.go      | 11 ++++++++++-
 pkg/gui/presentation/graph/graph_test.go | 12 ++++++++++++
 2 files changed, 22 insertions(+), 1 deletion(-)

diff --git a/pkg/gui/presentation/graph/graph.go b/pkg/gui/presentation/graph/graph.go
index 392af8984..65141946c 100644
--- a/pkg/gui/presentation/graph/graph.go
+++ b/pkg/gui/presentation/graph/graph.go
@@ -139,7 +139,7 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
 	// a traversed spot is one where a current pipe is starting on, ending on, or passing through
 	traversedSpots := set.New[int]()
 
-	if len(commit.Parents) > 0 {
+	if len(commit.Parents) > 0 { // merge commit
 		newPipes = append(newPipes, &Pipe{
 			fromPos: pos,
 			toPos:   pos,
@@ -148,6 +148,15 @@ func getNextPipes(prevPipes []*Pipe, commit *models.Commit, getStyle func(c *mod
 			kind:    STARTS,
 			style:   getStyle(commit),
 		})
+	} else if len(commit.Parents) == 0 { // root commit
+		newPipes = append(newPipes, &Pipe{
+			fromPos: pos,
+			toPos:   pos,
+			fromSha: commit.Sha,
+			toSha:   models.EmptyTreeCommitHash,
+			kind:    STARTS,
+			style:   getStyle(commit),
+		})
 	}
 
 	traversedSpotsForContinuingPipes := set.New[int]()
diff --git a/pkg/gui/presentation/graph/graph_test.go b/pkg/gui/presentation/graph/graph_test.go
index 27ec8652b..834575d7b 100644
--- a/pkg/gui/presentation/graph/graph_test.go
+++ b/pkg/gui/presentation/graph/graph_test.go
@@ -509,6 +509,18 @@ func TestGetNextPipes(t *testing.T) {
 				{fromPos: 1, toPos: 1, fromSha: "d", toSha: "e", kind: STARTS, style: style.FgDefault},
 			},
 		},
+		{
+			prevPipes: []*Pipe{
+				{fromPos: 0, toPos: 0, fromSha: "a", toSha: "root", kind: TERMINATES, style: style.FgDefault},
+			},
+			commit: &models.Commit{
+				Sha:     "root",
+				Parents: []string{},
+			},
+			expected: []*Pipe{
+				{fromPos: 1, toPos: 1, fromSha: "root", toSha: models.EmptyTreeCommitHash, kind: STARTS, style: style.FgDefault},
+			},
+		},
 	}
 
 	for _, test := range tests {