summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authordsolerhww <d.soler@whatwapp.com>2024-05-17 21:36:28 +0300
committerStefan Haller <stefan@haller-berlin.de>2024-05-18 09:59:00 +0200
commit5b80c0c7926da42e1126b817513f440513dc4e5c (patch)
tree2feda50e68deb380878e83cf5f6d2f40f9380b8e
parentd8b3c0e5681ff92a554a9ba81671e9ac10246d17 (diff)
Fix stashing partialy staged files for git version >= 2.35.0
Use `git stash push --staged` git feature available on git version > 2.35.0.
-rw-r--r--pkg/commands/git_commands/stash.go17
-rw-r--r--pkg/integration/tests/stash/stash_staged_partial_file.go70
-rw-r--r--pkg/integration/tests/test_list.go1
3 files changed, 86 insertions, 2 deletions
diff --git a/pkg/commands/git_commands/stash.go b/pkg/commands/git_commands/stash.go
index 906535fe5..5eeaa6a68 100644
--- a/pkg/commands/git_commands/stash.go
+++ b/pkg/commands/git_commands/stash.go
@@ -121,9 +121,22 @@ func (self *StashCommands) StashUnstagedChanges(message string) error {
return nil
}
-// SaveStagedChanges stashes only the currently staged changes. This takes a few steps
-// shoutouts to Joe on https://stackoverflow.com/questions/14759748/stashing-only-staged-changes-in-git-is-it-possible
+// SaveStagedChanges stashes only the currently staged changes.
func (self *StashCommands) SaveStagedChanges(message string) error {
+ if self.version.IsAtLeast(2, 35, 0) {
+ return self.cmd.New(NewGitCmd("stash").Arg("push").Arg("--staged").Arg("-m", message).ToArgv()).Run()
+ }
+
+ // Git versions older than 2.35.0 don't support the --staged flag, so we
+ // need to fall back to a more complex solution.
+ // Shoutouts to Joe on https://stackoverflow.com/questions/14759748/stashing-only-staged-changes-in-git-is-it-possible
+ //
+ // Note that this method has a few bugs:
+ // - it fails when there are *only* staged changes
+ // - it fails when staged and unstaged changes within a single file are too close together
+ // We don't bother fixing these, because users can simply update git when
+ // they are affected by these issues.
+
// wrap in 'writing', which uses a mutex
if err := self.cmd.New(
NewGitCmd("stash").Arg("--keep-index").ToArgv(),
diff --git a/pkg/integration/tests/stash/stash_staged_partial_file.go b/pkg/integration/tests/stash/stash_staged_partial_file.go
new file mode 100644
index 000000000..d9ac30e1b
--- /dev/null
+++ b/pkg/integration/tests/stash/stash_staged_partial_file.go
@@ -0,0 +1,70 @@
+package stash
+
+import (
+ "github.com/jesseduffield/lazygit/pkg/config"
+ . "github.com/jesseduffield/lazygit/pkg/integration/components"
+)
+
+var StashStagedPartialFile = NewIntegrationTest(NewIntegrationTestArgs{
+ Description: "Stash staged changes when a file is partially staged",
+ ExtraCmdArgs: []string{},
+ GitVersion: AtLeast("git version 2.35.0"),
+ Skip: false,
+ SetupConfig: func(config *config.AppConfig) {},
+ SetupRepo: func(shell *Shell) {
+ shell.CreateFileAndAdd("file-staged", "line1\nline2\nline3\nline4\n")
+ shell.Commit("initial commit")
+ shell.UpdateFile("file-staged", "line1\nline2 mod\nline3\nline4 mod\n")
+ },
+ Run: func(t *TestDriver, keys config.KeybindingConfig) {
+ t.Views().Files().
+ IsFocused().
+ PressEnter()
+
+ t.Views().Staging().
+ Content(
+ Contains(" line1\n-line2\n+line2 mod\n line3\n-line4\n+line4 mod\n"),
+ ).
+ PressPrimaryAction().
+ PressPrimaryAction().
+ Content(
+ Contains(" line1\n line2 mod\n line3\n-line4\n+line4 mod\n"),
+ ).
+ PressEscape()
+
+ t.Views().Files().
+ IsFocused().
+ Press(keys.Files.ViewStashOptions)
+
+ t.ExpectPopup().Menu().Title(Equals("Stash options")).Select(MatchesRegexp("Stash staged changes$")).Confirm()
+
+ t.ExpectPopup().Prompt().Title(Equals("Stash changes")).Type("my stashed file").Confirm()
+
+ t.Views().Stash().
+ Focus().
+ Lines(
+ Contains("my stashed file"),
+ ).
+ PressEnter()
+
+ t.Views().CommitFiles().
+ IsFocused().
+ Lines(
+ Contains("file-staged").IsSelected(),
+ )
+ t.Views().Main().
+ Content(
+ Contains(" line1\n-line2\n+line2 mod\n line3\n line4\n"),
+ )
+
+ t.Views().Files().
+ Lines(
+ Contains("file-staged"),
+ )
+
+ t.Views().Staging().
+ Content(
+ Contains(" line1\n line2\n line3\n-line4\n+line4 mod\n"),
+ )
+ },
+})
diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go
index bf6264cde..2548702e9 100644
--- a/pkg/integration/tests/test_list.go
+++ b/pkg/integration/tests/test_list.go
@@ -257,6 +257,7 @@ var tests = []*components.IntegrationTest{
stash.StashAndKeepIndex,
stash.StashIncludingUntrackedFiles,
stash.StashStaged,
+ stash.StashStagedPartialFile,
stash.StashUnstaged,
status.ClickRepoNameToOpenReposMenu,
status.ClickToFocus,