summaryrefslogtreecommitdiffstats
path: root/pkg/integration
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2023-03-18 08:17:47 +0100
committerGitHub <noreply@github.com>2023-03-18 18:17:47 +1100
commit4b4dccfd7d01bf24af80223efca224cb76e2f51e (patch)
treea4c4a06a25df729a466ec64723a34367deba70c9 /pkg/integration
parent81ea3107ed981c5013c586a4a3794c6b26e876a3 (diff)
Fix "move patch into new commit" for partial hunk (#2507)
Diffstat (limited to 'pkg/integration')
-rw-r--r--pkg/integration/components/shell.go17
-rw-r--r--pkg/integration/tests/patch_building/move_to_earlier_commit.go88
-rw-r--r--pkg/integration/tests/patch_building/move_to_index_part_of_adjacent_added_lines.go70
-rw-r--r--pkg/integration/tests/patch_building/move_to_later_commit.go89
-rw-r--r--pkg/integration/tests/patch_building/move_to_later_commit_partial_hunk.go96
-rw-r--r--pkg/integration/tests/patch_building/move_to_new_commit.go41
-rw-r--r--pkg/integration/tests/patch_building/move_to_new_commit_partial_hunk.go83
-rw-r--r--pkg/integration/tests/test_list.go5
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,