From 188773511e0c94a4ec338328865e824402ec8b00 Mon Sep 17 00:00:00 2001 From: Stefan Haller Date: Mon, 3 Apr 2023 12:40:29 +0200 Subject: Store commit.Status as an enum instead of a string This is unrelated to the changes in this PR, but since we are doing the same thing for the commit.Action field in the next commit, it makes sense to do it for Status too for consistency. Modelling this as an enum feels more natural than modelling it as a string, since there's a finite set of possible values. And it saves a little bit of memory (not very much, since none of the strings were heap-allocated, but still). --- pkg/commands/git_commands/commit_loader.go | 10 +++++----- pkg/commands/git_commands/commit_loader_test.go | 16 ++++++++-------- pkg/commands/git_commands/reflog_commit_loader.go | 2 +- pkg/commands/git_commands/reflog_commit_loader_test.go | 18 +++++++++--------- pkg/commands/models/commit.go | 14 +++++++++++++- 5 files changed, 36 insertions(+), 24 deletions(-) (limited to 'pkg/commands') diff --git a/pkg/commands/git_commands/commit_loader.go b/pkg/commands/git_commands/commit_loader.go index 119566f08..8c85de402 100644 --- a/pkg/commands/git_commands/commit_loader.go +++ b/pkg/commands/git_commands/commit_loader.go @@ -89,7 +89,7 @@ func (self *CommitLoader) GetCommits(opts GetCommitsOptions) ([]*models.Commit, if commit.Sha == firstPushedCommit { passedFirstPushedCommit = true } - commit.Status = map[bool]string{true: "unpushed", false: "pushed"}[!passedFirstPushedCommit] + commit.Status = map[bool]models.CommitStatus{true: models.StatusUnpushed, false: models.StatusPushed}[!passedFirstPushedCommit] commits = append(commits, commit) return false, nil }) @@ -312,7 +312,7 @@ func (self *CommitLoader) getInteractiveRebasingCommits() ([]*models.Commit, err commits = slices.Prepend(commits, &models.Commit{ Sha: t.Commit, Name: t.Msg, - Status: "rebasing", + Status: models.StatusRebasing, Action: t.Command.String(), }) } @@ -332,7 +332,7 @@ func (self *CommitLoader) commitFromPatch(content string) *models.Commit { return &models.Commit{ Sha: sha, Name: name, - Status: "rebasing", + Status: models.StatusRebasing, } } @@ -349,11 +349,11 @@ func (self *CommitLoader) setCommitMergedStatuses(refName string, commits []*mod if strings.HasPrefix(ancestor, commit.Sha) { passedAncestor = true } - if commit.Status != "pushed" { + if commit.Status != models.StatusPushed { continue } if passedAncestor { - commits[i].Status = "merged" + commits[i].Status = models.StatusMerged } } return commits, nil diff --git a/pkg/commands/git_commands/commit_loader_test.go b/pkg/commands/git_commands/commit_loader_test.go index 8ba3e6649..dab321753 100644 --- a/pkg/commands/git_commands/commit_loader_test.go +++ b/pkg/commands/git_commands/commit_loader_test.go @@ -78,7 +78,7 @@ func TestGetCommits(t *testing.T) { { Sha: "0eea75e8c631fba6b58135697835d58ba4c18dbc", Name: "better typing for rebase mode", - Status: "unpushed", + Status: models.StatusUnpushed, Action: "", Tags: []string{}, ExtraInfo: "(HEAD -> better-tests)", @@ -92,7 +92,7 @@ func TestGetCommits(t *testing.T) { { Sha: "b21997d6b4cbdf84b149d8e6a2c4d06a8e9ec164", Name: "fix logging", - Status: "pushed", + Status: models.StatusPushed, Action: "", Tags: []string{}, ExtraInfo: "(origin/better-tests)", @@ -106,7 +106,7 @@ func TestGetCommits(t *testing.T) { { Sha: "e94e8fc5b6fab4cb755f29f1bdb3ee5e001df35c", Name: "refactor", - Status: "pushed", + Status: models.StatusPushed, Action: "", Tags: []string{}, ExtraInfo: "", @@ -120,7 +120,7 @@ func TestGetCommits(t *testing.T) { { Sha: "d8084cd558925eb7c9c38afeed5725c21653ab90", Name: "WIP", - Status: "pushed", + Status: models.StatusPushed, Action: "", Tags: []string{}, ExtraInfo: "", @@ -134,7 +134,7 @@ func TestGetCommits(t *testing.T) { { Sha: "65f910ebd85283b5cce9bf67d03d3f1a9ea3813a", Name: "WIP", - Status: "pushed", + Status: models.StatusPushed, Action: "", Tags: []string{}, ExtraInfo: "", @@ -148,7 +148,7 @@ func TestGetCommits(t *testing.T) { { Sha: "26c07b1ab33860a1a7591a0638f9925ccf497ffa", Name: "WIP", - Status: "merged", + Status: models.StatusMerged, Action: "", Tags: []string{}, ExtraInfo: "", @@ -162,7 +162,7 @@ func TestGetCommits(t *testing.T) { { Sha: "3d4470a6c072208722e5ae9a54bcb9634959a1c5", Name: "WIP", - Status: "merged", + Status: models.StatusMerged, Action: "", Tags: []string{}, ExtraInfo: "", @@ -176,7 +176,7 @@ func TestGetCommits(t *testing.T) { { Sha: "053a66a7be3da43aacdc7aa78e1fe757b82c4dd2", Name: "refactoring the config struct", - Status: "merged", + Status: models.StatusMerged, Action: "", Tags: []string{}, ExtraInfo: "", diff --git a/pkg/commands/git_commands/reflog_commit_loader.go b/pkg/commands/git_commands/reflog_commit_loader.go index e2d3a7dad..c5c14fb72 100644 --- a/pkg/commands/git_commands/reflog_commit_loader.go +++ b/pkg/commands/git_commands/reflog_commit_loader.go @@ -52,7 +52,7 @@ func (self *ReflogCommitLoader) GetReflogCommits(lastReflogCommit *models.Commit Sha: fields[0], Name: fields[2], UnixTimestamp: int64(unixTimestamp), - Status: "reflog", + Status: models.StatusReflog, Parents: parents, } diff --git a/pkg/commands/git_commands/reflog_commit_loader_test.go b/pkg/commands/git_commands/reflog_commit_loader_test.go index 7170196e9..a51a40e69 100644 --- a/pkg/commands/git_commands/reflog_commit_loader_test.go +++ b/pkg/commands/git_commands/reflog_commit_loader_test.go @@ -51,35 +51,35 @@ func TestGetReflogCommits(t *testing.T) { { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from A to B", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from A to B", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from master to A", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, { Sha: "f4ddf2f0d4be4ccc7efa", Name: "checkout: moving from A to master", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643149435, Parents: []string{"51baa8c1"}, }, @@ -95,7 +95,7 @@ func TestGetReflogCommits(t *testing.T) { lastReflogCommit: &models.Commit{ Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, @@ -103,7 +103,7 @@ func TestGetReflogCommits(t *testing.T) { { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from A to B", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, @@ -119,7 +119,7 @@ func TestGetReflogCommits(t *testing.T) { lastReflogCommit: &models.Commit{ Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from B to A", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, @@ -128,7 +128,7 @@ func TestGetReflogCommits(t *testing.T) { { Sha: "c3c4b66b64c97ffeecde", Name: "checkout: moving from A to B", - Status: "reflog", + Status: models.StatusReflog, UnixTimestamp: 1643150483, Parents: []string{"51baa8c1"}, }, diff --git a/pkg/commands/models/commit.go b/pkg/commands/models/commit.go index b3a171934..adc7a5a51 100644 --- a/pkg/commands/models/commit.go +++ b/pkg/commands/models/commit.go @@ -9,11 +9,23 @@ import ( // Special commit hash for empty tree object const EmptyTreeCommitHash = "4b825dc642cb6eb9a060e54bf8d69288fbee4904" +type CommitStatus int + +const ( + StatusNone CommitStatus = iota + StatusUnpushed + StatusPushed + StatusMerged + StatusRebasing + StatusSelected + StatusReflog +) + // Commit : A git commit type Commit struct { Sha string Name string - Status string // one of "unpushed", "pushed", "merged", "rebasing" or "selected" + Status CommitStatus Action string // one of "", "pick", "edit", "squash", "reword", "drop", "fixup" Tags []string ExtraInfo string // something like 'HEAD -> master, tag: v0.15.2' -- cgit v1.2.3