diff options
author | Stefan Haller <stefan@haller-berlin.de> | 2023-03-18 08:17:47 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-18 18:17:47 +1100 |
commit | 4b4dccfd7d01bf24af80223efca224cb76e2f51e (patch) | |
tree | a4c4a06a25df729a466ec64723a34367deba70c9 /pkg/integration | |
parent | 81ea3107ed981c5013c586a4a3794c6b26e876a3 (diff) |
Fix "move patch into new commit" for partial hunk (#2507)
Diffstat (limited to 'pkg/integration')
8 files changed, 479 insertions, 10 deletions
diff --git a/pkg/integration/components/shell.go b/pkg/integration/components/shell.go index 3c5177949..d55fa8303 100644 --- a/pkg/integration/components/shell.go +++ b/pkg/integration/components/shell.go @@ -94,6 +94,16 @@ func (self *Shell) CreateFile(path string, content string) *Shell { return self } +func (self *Shell) DeleteFile(path string) *Shell { + fullPath := filepath.Join(self.dir, path) + err := os.Remove(fullPath) + if err != nil { + self.fail(fmt.Sprintf("error deleting file: %s\n%s", fullPath, err)) + } + + return self +} + func (self *Shell) CreateDir(path string) *Shell { fullPath := filepath.Join(self.dir, path) if err := os.MkdirAll(fullPath, 0o755); err != nil { @@ -171,6 +181,13 @@ func (self *Shell) UpdateFileAndAdd(fileName string, fileContents string) *Shell GitAdd(fileName) } +// convenience method for deleting a file and adding it +func (self *Shell) DeleteFileAndAdd(fileName string) *Shell { + return self. + DeleteFile(fileName). + GitAdd(fileName) +} + // creates commits 01, 02, 03, ..., n with a new file in each // The reason for padding with zeroes is so that it's easier to do string // matches on the commit messages when there are many of them diff --git a/pkg/integration/tests/patch_building/move_to_earlier_commit.go b/pkg/integration/tests/patch_building/move_to_earlier_commit.go new file mode 100644 index 000000000..5803737f0 --- /dev/null +++ b/pkg/integration/tests/patch_building/move_to_earlier_commit.go @@ -0,0 +1,88 @@ +package patch_building + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var MoveToEarlierCommit = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Move a patch from a commit to an earlier commit", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateDir("dir") + shell.CreateFileAndAdd("dir/file1", "file1 content") + shell.CreateFileAndAdd("dir/file2", "file2 content") + shell.Commit("first commit") + + shell.CreateFileAndAdd("unrelated-file", "") + shell.Commit("destination commit") + + shell.UpdateFileAndAdd("dir/file1", "file1 content with old changes") + shell.DeleteFileAndAdd("dir/file2") + shell.CreateFileAndAdd("dir/file3", "file3 content") + shell.Commit("commit to move from") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Commits(). + Focus(). + Lines( + Contains("commit to move from").IsSelected(), + Contains("destination commit"), + Contains("first commit"), + ). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("dir").IsSelected(), + Contains(" M file1"), + Contains(" D file2"), + Contains(" A file3"), + ). + PressPrimaryAction(). + PressEscape() + + t.Views().Information().Content(Contains("building patch")) + + t.Views().Commits(). + IsFocused(). + SelectNextItem() + + t.Common().SelectPatchOption(Contains("move patch to selected commit")) + + t.Views().Commits(). + IsFocused(). + Lines( + Contains("commit to move from"), + Contains("destination commit").IsSelected(), + Contains("first commit"), + ). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("dir").IsSelected(), + Contains(" M file1"), + Contains(" D file2"), + Contains(" A file3"), + Contains("A unrelated-file"), + ). + PressEscape() + + t.Views().Commits(). + IsFocused(). + SelectPreviousItem(). + PressEnter() + + // the original commit has no more files in it + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("(none)"), + ) + }, +}) diff --git a/pkg/integration/tests/patch_building/move_to_index_part_of_adjacent_added_lines.go b/pkg/integration/tests/patch_building/move_to_index_part_of_adjacent_added_lines.go new file mode 100644 index 000000000..c307ae432 --- /dev/null +++ b/pkg/integration/tests/patch_building/move_to_index_part_of_adjacent_added_lines.go @@ -0,0 +1,70 @@ +package patch_building + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var MoveToIndexPartOfAdjacentAddedLines = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Move a patch from a commit to the index, with only some lines of a range of adjacent added lines in the patch", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateFileAndAdd("file1", "") + shell.Commit("first commit") + + shell.UpdateFileAndAdd("file1", "1st line\n2nd line\n") + shell.Commit("commit to move from") + + shell.UpdateFileAndAdd("unrelated-file", "") + shell.Commit("third commit") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Commits(). + Focus(). + Lines( + Contains("third commit").IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + SelectNextItem(). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + PressEnter() + + t.Views().PatchBuilding(). + IsFocused(). + PressEnter(). + PressPrimaryAction() + + t.Views().Information().Content(Contains("building patch")) + + t.Common().SelectPatchOption(Contains("move patch out into index")) + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + Tap(func() { + t.Views().Main(). + Content(Contains("+2nd line"). + DoesNotContain("1st line")) + }) + + t.Views().Files(). + Focus(). + ContainsLines( + Contains("M").Contains("file1"), + ) + + t.Views().Main(). + Content(Contains("+1st line\n 2nd line\n")) + }, +}) diff --git a/pkg/integration/tests/patch_building/move_to_later_commit.go b/pkg/integration/tests/patch_building/move_to_later_commit.go new file mode 100644 index 000000000..f80293e72 --- /dev/null +++ b/pkg/integration/tests/patch_building/move_to_later_commit.go @@ -0,0 +1,89 @@ +package patch_building + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var MoveToLaterCommit = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Move a patch from a commit to a later commit", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateDir("dir") + shell.CreateFileAndAdd("dir/file1", "file1 content") + shell.CreateFileAndAdd("dir/file2", "file2 content") + shell.Commit("first commit") + + shell.UpdateFileAndAdd("dir/file1", "file1 content with old changes") + shell.DeleteFileAndAdd("dir/file2") + shell.CreateFileAndAdd("dir/file3", "file3 content") + shell.Commit("commit to move from") + + shell.CreateFileAndAdd("unrelated-file", "") + shell.Commit("destination commit") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Commits(). + Focus(). + Lines( + Contains("destination commit").IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + SelectNextItem(). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("dir").IsSelected(), + Contains(" M file1"), + Contains(" D file2"), + Contains(" A file3"), + ). + PressPrimaryAction(). + PressEscape() + + t.Views().Information().Content(Contains("building patch")) + + t.Views().Commits(). + IsFocused(). + SelectPreviousItem() + + t.Common().SelectPatchOption(Contains("move patch to selected commit")) + + t.Views().Commits(). + IsFocused(). + Lines( + Contains("destination commit").IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("dir").IsSelected(), + Contains(" M file1"), + Contains(" D file2"), + Contains(" A file3"), + Contains("A unrelated-file"), + ). + PressEscape() + + t.Views().Commits(). + IsFocused(). + SelectNextItem(). + PressEnter() + + // the original commit has no more files in it + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("(none)"), + ) + }, +}) diff --git a/pkg/integration/tests/patch_building/move_to_later_commit_partial_hunk.go b/pkg/integration/tests/patch_building/move_to_later_commit_partial_hunk.go new file mode 100644 index 000000000..3ebf4a886 --- /dev/null +++ b/pkg/integration/tests/patch_building/move_to_later_commit_partial_hunk.go @@ -0,0 +1,96 @@ +package patch_building + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var MoveToLaterCommitPartialHunk = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Move a patch from a commit to a later commit, with only parts of a hunk in the patch", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateFileAndAdd("file1", "") + shell.Commit("first commit") + + shell.UpdateFileAndAdd("file1", "1st line\n2nd line\n") + shell.Commit("commit to move from") + + shell.UpdateFileAndAdd("unrelated-file", "") + shell.Commit("destination commit") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Commits(). + Focus(). + Lines( + Contains("destination commit").IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + SelectNextItem(). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + PressEnter() + + t.Views().PatchBuilding(). + IsFocused(). + PressEnter(). + PressPrimaryAction(). + PressEscape() + + t.Views().Information().Content(Contains("building patch")) + + t.Views().CommitFiles(). + IsFocused(). + PressEscape() + + t.Views().Commits(). + IsFocused(). + SelectPreviousItem() + + t.Common().SelectPatchOption(Contains("move patch to selected commit")) + + t.Views().Commits(). + IsFocused(). + Lines( + Contains("destination commit").IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + Contains("unrelated-file"), + ). + Tap(func() { + t.Views().Main(). + Content(Contains("+1st line\n 2nd line")) + }). + PressEscape() + + t.Views().Commits(). + IsFocused(). + SelectNextItem(). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + Tap(func() { + t.Views().Main(). + Content(Contains("+2nd line"). + DoesNotContain("1st line")) + }) + }, +}) diff --git a/pkg/integration/tests/patch_building/move_to_new_commit.go b/pkg/integration/tests/patch_building/move_to_new_commit.go index 483a1ab53..491a8c9c5 100644 --- a/pkg/integration/tests/patch_building/move_to_new_commit.go +++ b/pkg/integration/tests/patch_building/move_to_new_commit.go @@ -11,13 +11,17 @@ var MoveToNewCommit = NewIntegrationTest(NewIntegrationTestArgs{ Skip: false, SetupConfig: func(config *config.AppConfig) {}, SetupRepo: func(shell *Shell) { - shell.CreateFileAndAdd("file1", "file1 content") + shell.CreateDir("dir") + shell.CreateFileAndAdd("dir/file1", "file1 content") + shell.CreateFileAndAdd("dir/file2", "file2 content") shell.Commit("first commit") - shell.UpdateFileAndAdd("file1", "file1 content with old changes") - shell.Commit("second commit") + shell.UpdateFileAndAdd("dir/file1", "file1 content with old changes") + shell.DeleteFileAndAdd("dir/file2") + shell.CreateFileAndAdd("dir/file3", "file3 content") + shell.Commit("commit to move from") - shell.UpdateFileAndAdd("file1", "file1 content with new changes") + shell.UpdateFileAndAdd("dir/file1", "file1 content with new changes") shell.Commit("third commit") }, Run: func(t *TestDriver, keys config.KeybindingConfig) { @@ -25,7 +29,7 @@ var MoveToNewCommit = NewIntegrationTest(NewIntegrationTestArgs{ Focus(). Lines( Contains("third commit").IsSelected(), - Contains("second commit"), + Contains("commit to move from"), Contains("first commit"), ). SelectNextItem(). @@ -34,18 +38,35 @@ var MoveToNewCommit = NewIntegrationTest(NewIntegrationTestArgs{ t.Views().CommitFiles(). IsFocused(). Lines( - Contains("file1").IsSelected(), + Contains("dir").IsSelected(), + Contains(" M file1"), + Contains(" D file2"), + Contains(" A file3"), ). - PressPrimaryAction() + PressPrimaryAction(). + PressEscape() t.Views().Information().Content(Contains("building patch")) t.Common().SelectPatchOption(Contains("move patch into new commit")) + t.Views().Commits(). + IsFocused(). + Lines( + Contains("third commit"), + Contains(`Split from "commit to move from"`).IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + PressEnter() + t.Views().CommitFiles(). IsFocused(). Lines( - Contains("file1").IsSelected(), + Contains("dir").IsSelected(), + Contains(" M file1"), + Contains(" D file2"), + Contains(" A file3"), ). PressEscape() @@ -53,8 +74,8 @@ var MoveToNewCommit = NewIntegrationTest(NewIntegrationTestArgs{ IsFocused(). Lines( Contains("third commit"), - Contains(`Split from "second commit"`).IsSelected(), - Contains("second commit"), + Contains(`Split from "commit to move from"`).IsSelected(), + Contains("commit to move from"), Contains("first commit"), ). SelectNextItem(). diff --git a/pkg/integration/tests/patch_building/move_to_new_commit_partial_hunk.go b/pkg/integration/tests/patch_building/move_to_new_commit_partial_hunk.go new file mode 100644 index 000000000..2e3c59f77 --- /dev/null +++ b/pkg/integration/tests/patch_building/move_to_new_commit_partial_hunk.go @@ -0,0 +1,83 @@ +package patch_building + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var MoveToNewCommitPartialHunk = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Move a patch from a commit to a new commit, with only parts of a hunk in the patch", + ExtraCmdArgs: "", + Skip: false, + SetupConfig: func(config *config.AppConfig) {}, + SetupRepo: func(shell *Shell) { + shell.CreateFileAndAdd("file1", "") + shell.Commit("first commit") + + shell.UpdateFileAndAdd("file1", "1st line\n2nd line\n") + shell.Commit("commit to move from") + + shell.UpdateFileAndAdd("file1", "1st line\n2nd line\n3rd line\n") + shell.Commit("third commit") + }, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Commits(). + Focus(). + Lines( + Contains("third commit").IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + SelectNextItem(). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + PressEnter() + + t.Views().PatchBuilding(). + IsFocused(). + PressEnter(). + PressPrimaryAction() + + t.Views().Information().Content(Contains("building patch")) + + t.Common().SelectPatchOption(Contains("move patch into new commit")) + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + Tap(func() { + t.Views().Main(). + Content(Contains("+1st line\n 2nd line")) + }). + PressEscape() + + t.Views().Commits(). + IsFocused(). + Lines( + Contains("third commit"), + Contains(`Split from "commit to move from"`).IsSelected(), + Contains("commit to move from"), + Contains("first commit"), + ). + SelectNextItem(). + PressEnter() + + t.Views().CommitFiles(). + IsFocused(). + Lines( + Contains("file1").IsSelected(), + ). + Tap(func() { + t.Views().Main(). + Content(Contains("+2nd line"). + DoesNotContain("1st line")) + }) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index 3a0fa8269..807c5810d 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -101,10 +101,15 @@ var tests = []*components.IntegrationTest{ patch_building.ApplyInReverse, patch_building.ApplyInReverseWithConflict, patch_building.CopyPatchToClipboard, + patch_building.MoveToEarlierCommit, patch_building.MoveToIndex, + patch_building.MoveToIndexPartOfAdjacentAddedLines, patch_building.MoveToIndexPartial, patch_building.MoveToIndexWithConflict, + patch_building.MoveToLaterCommit, + patch_building.MoveToLaterCommitPartialHunk, patch_building.MoveToNewCommit, + patch_building.MoveToNewCommitPartialHunk, patch_building.RemoveFromCommit, patch_building.ResetWithEscape, patch_building.SelectAllFiles, |