mirror of
https://github.com/jesseduffield/lazygit.git
synced 2025-04-23 12:18:51 +02:00
Several custom patch commands on parts of an added file would fail with the confusing error message "error: new file XXX depends on old contents". These were dropping the custom patch from the original commit, moving the patch to a new commit, moving it to a later commit, or moving it to the index. We fix this by converting the patch header from an added file to a diff against an empty file. We do this not just for the purpose of applying the patch, but also for rendering it and copying it to the clip board. I'm not sure it matters much in these cases, but it does feel more correct for a filtered patch to be presented this way.
164 lines
4.6 KiB
Go
164 lines
4.6 KiB
Go
package patch_building
|
|
|
|
import (
|
|
"github.com/jesseduffield/lazygit/pkg/config"
|
|
. "github.com/jesseduffield/lazygit/pkg/integration/components"
|
|
)
|
|
|
|
var SpecificSelection = NewIntegrationTest(NewIntegrationTestArgs{
|
|
Description: "Build a custom patch with a specific selection of lines, adding individual lines, as well as a range and hunk, and adding a file directly",
|
|
ExtraCmdArgs: []string{},
|
|
Skip: false,
|
|
SetupConfig: func(config *config.AppConfig) {},
|
|
SetupRepo: func(shell *Shell) {
|
|
shell.CreateFileAndAdd("hunk-file", "1a\n1b\n1c\n1d\n1e\n1f\n1g\n1h\n1i\n1j\n1k\n1l\n1m\n1n\n1o\n1p\n1q\n1r\n1s\n1t\n1u\n1v\n1w\n1x\n1y\n1z\n")
|
|
shell.Commit("first commit")
|
|
|
|
// making changes in two separate places for the sake of having two hunks
|
|
shell.UpdateFileAndAdd("hunk-file", "aa\n1b\ncc\n1d\n1e\n1f\n1g\n1h\n1i\n1j\n1k\n1l\n1m\n1n\n1o\n1p\n1q\n1r\n1s\ntt\nuu\nvv\n1w\n1x\n1y\n1z\n")
|
|
|
|
shell.CreateFileAndAdd("line-file", "2a\n2b\n2c\n2d\n2e\n2f\n2g\n2h\n2i\n2j\n2k\n2l\n2m\n2n\n2o\n2p\n2q\n2r\n2s\n2t\n2u\n2v\n2w\n2x\n2y\n2z\n")
|
|
shell.CreateFileAndAdd("direct-file", "direct file content")
|
|
shell.Commit("second commit")
|
|
},
|
|
Run: func(t *TestDriver, keys config.KeybindingConfig) {
|
|
t.Views().Commits().
|
|
Focus().
|
|
Lines(
|
|
Contains("second commit").IsSelected(),
|
|
Contains("first commit"),
|
|
).
|
|
PressEnter()
|
|
|
|
t.Views().CommitFiles().
|
|
IsFocused().
|
|
Lines(
|
|
Contains("direct-file").IsSelected(),
|
|
Contains("hunk-file"),
|
|
Contains("line-file"),
|
|
).
|
|
PressPrimaryAction().
|
|
Tap(func() {
|
|
t.Views().Information().Content(Contains("Building patch"))
|
|
|
|
t.Views().Secondary().Content(Contains("direct file content"))
|
|
}).
|
|
NavigateToLine(Contains("hunk-file")).
|
|
PressEnter()
|
|
|
|
t.Views().PatchBuilding().
|
|
IsFocused().
|
|
SelectedLines(
|
|
Contains("-1a"),
|
|
).
|
|
Press(keys.Main.ToggleSelectHunk).
|
|
SelectedLines(
|
|
Contains(`@@ -1,6 +1,6 @@`),
|
|
Contains(`-1a`),
|
|
Contains(`+aa`),
|
|
Contains(` 1b`),
|
|
Contains(`-1c`),
|
|
Contains(`+cc`),
|
|
Contains(` 1d`),
|
|
Contains(` 1e`),
|
|
Contains(` 1f`),
|
|
).
|
|
PressPrimaryAction().
|
|
// unlike in the staging panel, we don't remove lines from the patch building panel
|
|
// upon 'adding' them. So the same lines will be selected
|
|
SelectedLines(
|
|
Contains(`@@ -1,6 +1,6 @@`),
|
|
Contains(`-1a`),
|
|
Contains(`+aa`),
|
|
Contains(` 1b`),
|
|
Contains(`-1c`),
|
|
Contains(`+cc`),
|
|
Contains(` 1d`),
|
|
Contains(` 1e`),
|
|
Contains(` 1f`),
|
|
).
|
|
Tap(func() {
|
|
t.Views().Information().Content(Contains("Building patch"))
|
|
|
|
t.Views().Secondary().Content(
|
|
// when we're inside the patch building panel, we only show the patch
|
|
// in the secondary panel that relates to the selected file
|
|
DoesNotContain("direct file content").
|
|
Contains("@@ -1,6 +1,6 @@").
|
|
Contains(" 1f"),
|
|
)
|
|
}).
|
|
// Cancel hunk select
|
|
PressEscape().
|
|
// Escape the view
|
|
PressEscape()
|
|
|
|
t.Views().CommitFiles().
|
|
IsFocused().
|
|
NavigateToLine(Contains("line-file")).
|
|
PressEnter()
|
|
|
|
t.Views().PatchBuilding().
|
|
IsFocused().
|
|
SelectedLines(
|
|
Contains("+2a"),
|
|
).
|
|
PressPrimaryAction().
|
|
NavigateToLine(Contains("+2c")).
|
|
Press(keys.Universal.ToggleRangeSelect).
|
|
NavigateToLine(Contains("+2e")).
|
|
PressPrimaryAction().
|
|
NavigateToLine(Contains("+2g")).
|
|
PressPrimaryAction().
|
|
Tap(func() {
|
|
t.Views().Information().Content(Contains("Building patch"))
|
|
|
|
t.Views().Secondary().ContainsLines(
|
|
Contains("+2a"),
|
|
Contains("+2c"),
|
|
Contains("+2d"),
|
|
Contains("+2e"),
|
|
Contains("+2g"),
|
|
)
|
|
}).
|
|
PressEscape().
|
|
Tap(func() {
|
|
t.Views().Secondary().ContainsLines(
|
|
// direct-file patch
|
|
Contains(`diff --git a/direct-file b/direct-file`),
|
|
Contains(`index`),
|
|
Contains(`--- a/direct-file`),
|
|
Contains(`+++ b/direct-file`),
|
|
Contains(`@@ -0,0 +1 @@`),
|
|
Contains(`+direct file content`),
|
|
Contains(`\ No newline at end of file`),
|
|
// hunk-file patch
|
|
Contains(`diff --git a/hunk-file b/hunk-file`),
|
|
Contains(`index`),
|
|
Contains(`--- a/hunk-file`),
|
|
Contains(`+++ b/hunk-file`),
|
|
Contains(`@@ -1,6 +1,6 @@`),
|
|
Contains(`-1a`),
|
|
Contains(`+aa`),
|
|
Contains(` 1b`),
|
|
Contains(`-1c`),
|
|
Contains(`+cc`),
|
|
Contains(` 1d`),
|
|
Contains(` 1e`),
|
|
Contains(` 1f`),
|
|
// line-file patch
|
|
Contains(`diff --git a/line-file b/line-file`),
|
|
Contains(`index`),
|
|
Contains(`--- a/line-file`),
|
|
Contains(`+++ b/line-file`),
|
|
Contains(`@@ -0,0 +1,5 @@`),
|
|
Contains(`+2a`),
|
|
Contains(`+2c`),
|
|
Contains(`+2d`),
|
|
Contains(`+2e`),
|
|
Contains(`+2g`),
|
|
)
|
|
})
|
|
},
|
|
})
|