From e53d869d2b7e2e5435a496e3b9315262fe2a22d9 Mon Sep 17 00:00:00 2001 From: Damien Menanteau Date: Mon, 2 Jan 2023 17:01:34 +0100 Subject: [PATCH] [#200] Make file_diff and log_item VCS-generic --- src/engine/tcr.go | 4 +-- src/engine/tcr_test.go | 16 ++++----- src/vcs/{git_file_diff.go => file_diff.go} | 0 ...it_file_diff_test.go => file_diff_test.go} | 0 src/vcs/git.go | 2 +- src/vcs/git/git_impl.go | 4 +-- src/vcs/git/git_impl_test.go | 10 +++--- src/vcs/git/git_test_fake.go | 4 +-- src/vcs/{git_log_item.go => vcs_log_item.go} | 22 ++++++------ ..._log_item_test.go => vcs_log_item_test.go} | 36 +++++++++---------- 10 files changed, 49 insertions(+), 49 deletions(-) rename src/vcs/{git_file_diff.go => file_diff.go} (100%) rename src/vcs/{git_file_diff_test.go => file_diff_test.go} (100%) rename src/vcs/{git_log_item.go => vcs_log_item.go} (72%) rename src/vcs/{git_log_item_test.go => vcs_log_item_test.go} (60%) diff --git a/src/engine/tcr.go b/src/engine/tcr.go index d2f63e7f..5f8d596c 100644 --- a/src/engine/tcr.go +++ b/src/engine/tcr.go @@ -195,7 +195,7 @@ func (tcr *TcrEngine) PrintStats(p params.Params) { stats.Print(tcr.vcs.GetWorkingBranch(), tcrLogsToEvents(tcrLogs)) } -func tcrLogsToEvents(tcrLogs vcs.GitLogItems) (tcrEvents events.TcrEvents) { +func tcrLogsToEvents(tcrLogs vcs.LogItems) (tcrEvents events.TcrEvents) { tcrEvents = *events.NewTcrEvents() for _, log := range tcrLogs { tcrEvents.Add(log.Timestamp, parseCommitMessage(log.Message)) @@ -203,7 +203,7 @@ func tcrLogsToEvents(tcrLogs vcs.GitLogItems) (tcrEvents events.TcrEvents) { return tcrEvents } -func (tcr *TcrEngine) queryGitLogs(p params.Params) vcs.GitLogItems { +func (tcr *TcrEngine) queryGitLogs(p params.Params) vcs.LogItems { tcr.initSourceTree(p) tcr.initVcs() diff --git a/src/engine/tcr_test.go b/src/engine/tcr_test.go index c08e0027..aca07f10 100644 --- a/src/engine/tcr_test.go +++ b/src/engine/tcr_test.go @@ -337,7 +337,7 @@ func Test_tcr_cycle_end_state(t *testing.T) { } } -func initTcrEngineWithFakes(p *params.Params, toolchainFailures toolchain.Operations, gitFailures git.Commands, gitLogItems vcs.GitLogItems) (TcrInterface, *git.Fake) { +func initTcrEngineWithFakes(p *params.Params, toolchainFailures toolchain.Operations, gitFailures git.Commands, gitLogItems vcs.LogItems) (TcrInterface, *git.Fake) { tchn := registerFakeToolchain(toolchainFailures) lang := registerFakeLanguage(tchn) @@ -385,7 +385,7 @@ func registerFakeLanguage(toolchainName string) string { return fake.GetName() } -func replaceGitImplWithFake(tcr TcrInterface, failures git.Commands, gitLogItems vcs.GitLogItems) *git.Fake { +func replaceGitImplWithFake(tcr TcrInterface, failures git.Commands, gitLogItems vcs.LogItems) *git.Fake { fakeSettings := git.FakeSettings{ FailingCommands: failures, ChangedFiles: vcs.FileDiffs{vcs.NewFileDiff("fake-src", 1, 1)}, @@ -560,16 +560,16 @@ func Test_mob_timer_should_not_start_in_solo_mode(t *testing.T) { func Test_tcr_print_log(t *testing.T) { now := time.Now() - sampleItems := vcs.GitLogItems{ - vcs.NewGitLogItem("1111", now, "✅ TCR - tests passing"), - vcs.NewGitLogItem("2222", now, "❌ TCR - tests failing"), - vcs.NewGitLogItem("3333", now, "⏪ TCR - revert changes"), - vcs.NewGitLogItem("4444", now, "other commit message"), + sampleItems := vcs.LogItems{ + vcs.NewLogItem("1111", now, "✅ TCR - tests passing"), + vcs.NewLogItem("2222", now, "❌ TCR - tests failing"), + vcs.NewLogItem("3333", now, "⏪ TCR - revert changes"), + vcs.NewLogItem("4444", now, "other commit message"), } testFlags := []struct { desc string filter func(msg report.Message) bool - gitLogItems vcs.GitLogItems + gitLogItems vcs.LogItems expectedMatches int }{ { diff --git a/src/vcs/git_file_diff.go b/src/vcs/file_diff.go similarity index 100% rename from src/vcs/git_file_diff.go rename to src/vcs/file_diff.go diff --git a/src/vcs/git_file_diff_test.go b/src/vcs/file_diff_test.go similarity index 100% rename from src/vcs/git_file_diff_test.go rename to src/vcs/file_diff_test.go diff --git a/src/vcs/git.go b/src/vcs/git.go index bc4185ec..f8ce0869 100644 --- a/src/vcs/git.go +++ b/src/vcs/git.go @@ -44,7 +44,7 @@ type GitInterface interface { Stash(message string) error UnStash(keep bool) error Diff() (diffs FileDiffs, err error) - Log(msgFilter func(msg string) bool) (logs GitLogItems, err error) + Log(msgFilter func(msg string) bool) (logs LogItems, err error) EnablePush(flag bool) IsPushEnabled() bool IsRemoteEnabled() bool diff --git a/src/vcs/git/git_impl.go b/src/vcs/git/git_impl.go index 810255c6..46119b87 100644 --- a/src/vcs/git/git_impl.go +++ b/src/vcs/git/git_impl.go @@ -310,7 +310,7 @@ func (g *gitImpl) Diff() (diffs vcs.FileDiffs, err error) { // Log returns the list of git log items compliant with the provided msgFilter. // When no msgFilter is provided, returns all git log items unfiltered. // Current implementation uses go-git's Log() function -func (g *gitImpl) Log(msgFilter func(msg string) bool) (logs vcs.GitLogItems, err error) { +func (g *gitImpl) Log(msgFilter func(msg string) bool) (logs vcs.LogItems, err error) { plainOpenOptions := git.PlainOpenOptions{ DetectDotGit: true, EnableDotGitCommonDir: false, @@ -333,7 +333,7 @@ func (g *gitImpl) Log(msgFilter func(msg string) bool) (logs vcs.GitLogItems, er } _ = cIter.ForEach(func(c *object.Commit) error { if msgFilter == nil || msgFilter(c.Message) { - logs.Add(vcs.NewGitLogItem(c.Hash.String(), c.Committer.When.UTC(), c.Message)) + logs.Add(vcs.NewLogItem(c.Hash.String(), c.Committer.When.UTC(), c.Message)) } return nil }) diff --git a/src/vcs/git/git_impl_test.go b/src/vcs/git/git_impl_test.go index 277704c7..5bbb6921 100644 --- a/src/vcs/git/git_impl_test.go +++ b/src/vcs/git/git_impl_test.go @@ -600,7 +600,7 @@ func Test_git_unstash_command(t *testing.T) { func Test_git_log_command(t *testing.T) { // Note: this test may break if for any reason the TCR repository initial commit is altered - tcrInitialCommit := vcs.GitLogItem{ + tcrInitialCommit := vcs.LogItem{ Hash: "a823c098187455bade90ee44874d2b41c7ef96d9", Timestamp: time.Date(2021, time.June, 16, 15, 29, 41, 0, time.UTC), Message: "Initial commit", @@ -609,26 +609,26 @@ func Test_git_log_command(t *testing.T) { testFlags := []struct { desc string filter func(msg string) bool - asserter func(t *testing.T, items vcs.GitLogItems) + asserter func(t *testing.T, items vcs.LogItems) }{ { "filter matching no item", func(_ string) bool { return false }, - func(t *testing.T, items vcs.GitLogItems) { + func(t *testing.T, items vcs.LogItems) { assert.Equal(t, 0, items.Len()) }, }, { "filter matching all items", nil, - func(t *testing.T, items vcs.GitLogItems) { + func(t *testing.T, items vcs.LogItems) { assert.Greater(t, items.Len(), 100) }, }, { "filter matching one single item", func(msg string) bool { return tcrInitialCommit.Message == msg }, - func(t *testing.T, items vcs.GitLogItems) { + func(t *testing.T, items vcs.LogItems) { assert.Equal(t, 1, items.Len()) assert.Equal(t, tcrInitialCommit, items[0]) }, diff --git a/src/vcs/git/git_test_fake.go b/src/vcs/git/git_test_fake.go index fa49fc55..61e8b6d6 100644 --- a/src/vcs/git/git_test_fake.go +++ b/src/vcs/git/git_test_fake.go @@ -69,7 +69,7 @@ type ( FakeSettings struct { FailingCommands Commands ChangedFiles vcs.FileDiffs - Logs vcs.GitLogItems + Logs vcs.LogItems } // Fake provides a fake implementation of the git interface @@ -138,7 +138,7 @@ func (gf *Fake) Diff() (_ vcs.FileDiffs, err error) { } // Log returns the list of git logs configured at fake initialization -func (gf *Fake) Log(msgFilter func(msg string) bool) (logs vcs.GitLogItems, err error) { +func (gf *Fake) Log(msgFilter func(msg string) bool) (logs vcs.LogItems, err error) { err = gf.fakeCommand(LogCommand) if msgFilter == nil { diff --git a/src/vcs/git_log_item.go b/src/vcs/vcs_log_item.go similarity index 72% rename from src/vcs/git_log_item.go rename to src/vcs/vcs_log_item.go index 6f283149..52354df8 100644 --- a/src/vcs/git_log_item.go +++ b/src/vcs/vcs_log_item.go @@ -28,34 +28,34 @@ import ( ) type ( - // GitLogItem contains git log information for a commit - GitLogItem struct { + // LogItem contains VCS log information for a commit + LogItem struct { Hash string Timestamp time.Time Message string } - // GitLogItems contains a set of git log items in a slice - GitLogItems []GitLogItem + // LogItems contains a set of VCS log items in a slice + LogItems []LogItem ) -// NewGitLogItem creates a new git log item instance -func NewGitLogItem(hash string, timestamp time.Time, message string) GitLogItem { - return GitLogItem{hash, timestamp, message} +// NewLogItem creates a new git log item instance +func NewLogItem(hash string, timestamp time.Time, message string) LogItem { + return LogItem{hash, timestamp, message} } -func (items *GitLogItems) sortByDate() { +func (items *LogItems) sortByDate() { sort.Slice(*items, func(i, j int) bool { return (*items)[i].Timestamp.Before((*items)[j].Timestamp) }) } -// Add adds a GitLogItem to the GitLogItems collection -func (items *GitLogItems) Add(d GitLogItem) { +// Add adds a LogItem to the LogItems collection +func (items *LogItems) Add(d LogItem) { *items = append(*items, d) } // Len returns the length of the items array -func (items *GitLogItems) Len() int { +func (items *LogItems) Len() int { return len(*items) } diff --git a/src/vcs/git_log_item_test.go b/src/vcs/vcs_log_item_test.go similarity index 60% rename from src/vcs/git_log_item_test.go rename to src/vcs/vcs_log_item_test.go index 1e07e7a4..cb4c2b0f 100644 --- a/src/vcs/git_log_item_test.go +++ b/src/vcs/vcs_log_item_test.go @@ -28,41 +28,41 @@ import ( "time" ) -func Test_add_regular_git_log_item(t *testing.T) { - var items GitLogItems - item := NewGitLogItem("xxx", time.Now(), "some message") +func Test_add_regular_log_item(t *testing.T) { + var items LogItems + item := NewLogItem("xxx", time.Now(), "some message") items.Add(item) assert.Len(t, items, 1) assert.Contains(t, items, item) } -func Test_add_empty_git_log_item(t *testing.T) { - var items GitLogItems - item := NewGitLogItem("", time.Time{}, "") +func Test_add_empty_log_item(t *testing.T) { + var items LogItems + item := NewLogItem("", time.Time{}, "") items.Add(item) assert.Len(t, items, 1) } -func Test_sort_empty_git_log_items_does_not_panic(t *testing.T) { - var items GitLogItems +func Test_sort_empty_log_items_does_not_panic(t *testing.T) { + var items LogItems assert.NotPanics(t, func() { items.sortByDate() }) assert.Len(t, items, 0) } -func Test_sort_already_sorted_git_log_items(t *testing.T) { - item1 := NewGitLogItem("xxx1", time.Now(), "first commit") - item2 := NewGitLogItem("xxx2", time.Now().Add(1*time.Second), "second commit") - items := GitLogItems{item1, item2} +func Test_sort_already_sorted_log_items(t *testing.T) { + item1 := NewLogItem("xxx1", time.Now(), "first commit") + item2 := NewLogItem("xxx2", time.Now().Add(1*time.Second), "second commit") + items := LogItems{item1, item2} items.sortByDate() - assert.Equal(t, GitLogItems{item1, item2}, items) + assert.Equal(t, LogItems{item1, item2}, items) } -func Test_sort_unsorted_git_log_items(t *testing.T) { - item1 := NewGitLogItem("xxx1", time.Now(), "first commit") - item2 := NewGitLogItem("xxx2", time.Now().Add(1*time.Second), "second commit") - items := GitLogItems{item2, item1} +func Test_sort_unsorted_log_items(t *testing.T) { + item1 := NewLogItem("xxx1", time.Now(), "first commit") + item2 := NewLogItem("xxx2", time.Now().Add(1*time.Second), "second commit") + items := LogItems{item2, item1} items.sortByDate() - assert.Equal(t, GitLogItems{item1, item2}, items) + assert.Equal(t, LogItems{item1, item2}, items) }