Skip to content

Commit

Permalink
Merge pull request jesseduffield#1980 from ajhynes7/stash-untracked-c…
Browse files Browse the repository at this point in the history
…hanges
  • Loading branch information
jesseduffield authored Nov 14, 2022
2 parents fbfec75 + 684d1e9 commit b33ec5a
Show file tree
Hide file tree
Showing 47 changed files with 182 additions and 22 deletions.
4 changes: 4 additions & 0 deletions pkg/commands/git_commands/stash.go
Original file line number Diff line number Diff line change
Expand Up @@ -123,6 +123,10 @@ func (self *StashCommands) SaveStagedChanges(message string) error {
return nil
}

func (self *StashCommands) StashIncludeUntrackedChanges(message string) error {
return self.cmd.New(fmt.Sprintf("git stash save %s --include-untracked", self.cmd.Quote(message))).Run()
}

func (self *StashCommands) Rename(index int, message string) error {
sha, err := self.Sha(index)
if err != nil {
Expand Down
34 changes: 23 additions & 11 deletions pkg/gui/controllers/files_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -758,37 +758,53 @@ func (self *FilesController) createStashMenu() error {
{
Label: self.c.Tr.LcStashAllChanges,
OnPress: func() error {
return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashAllChanges, self.c.Tr.NoFilesToStash)
if !self.helpers.WorkingTree.IsWorkingTreeDirty() {
return self.c.ErrorMsg(self.c.Tr.NoFilesToStash)
}
return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashAllChanges)
},
Key: 'a',
},
{
Label: self.c.Tr.LcStashAllChangesKeepIndex,
OnPress: func() error {
if !self.helpers.WorkingTree.IsWorkingTreeDirty() {
return self.c.ErrorMsg(self.c.Tr.NoFilesToStash)
}
// if there are no staged files it behaves the same as Stash.Save
return self.handleStashSave(self.git.Stash.StashAndKeepIndex, self.c.Tr.Actions.StashAllChangesKeepIndex, self.c.Tr.NoFilesToStash)
return self.handleStashSave(self.git.Stash.StashAndKeepIndex, self.c.Tr.Actions.StashAllChangesKeepIndex)
},
Key: 'i',
},
{
Label: self.c.Tr.LcStashIncludeUntrackedChanges,
OnPress: func() error {
return self.handleStashSave(self.git.Stash.StashIncludeUntrackedChanges, self.c.Tr.Actions.StashIncludeUntrackedChanges)
},
Key: 'U',
},
{
Label: self.c.Tr.LcStashStagedChanges,
OnPress: func() error {
// there must be something in staging otherwise the current implementation mucks the stash up
if !self.helpers.WorkingTree.AnyStagedFiles() {
return self.c.ErrorMsg(self.c.Tr.NoTrackedStagedFilesStash)
}
return self.handleStashSave(self.git.Stash.SaveStagedChanges, self.c.Tr.Actions.StashStagedChanges, self.c.Tr.NoTrackedStagedFilesStash)
return self.handleStashSave(self.git.Stash.SaveStagedChanges, self.c.Tr.Actions.StashStagedChanges)
},
Key: 's',
},
{
Label: self.c.Tr.LcStashUnstagedChanges,
OnPress: func() error {
if !self.helpers.WorkingTree.IsWorkingTreeDirty() {
return self.c.ErrorMsg(self.c.Tr.NoFilesToStash)
}
if self.helpers.WorkingTree.AnyStagedFiles() {
return self.handleStashSave(self.git.Stash.StashUnstagedChanges, self.c.Tr.Actions.StashUnstagedChanges, self.c.Tr.NoFilesToStash)
return self.handleStashSave(self.git.Stash.StashUnstagedChanges, self.c.Tr.Actions.StashUnstagedChanges)
}
// ordinary stash
return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashUnstagedChanges, self.c.Tr.NoFilesToStash)
return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashUnstagedChanges)
},
Key: 'u',
},
Expand All @@ -797,7 +813,7 @@ func (self *FilesController) createStashMenu() error {
}

func (self *FilesController) stash() error {
return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashAllChanges, self.c.Tr.NoTrackedStagedFilesStash)
return self.handleStashSave(self.git.Stash.Save, self.c.Tr.Actions.StashAllChanges)
}

func (self *FilesController) createResetToUpstreamMenu() error {
Expand Down Expand Up @@ -825,11 +841,7 @@ func (self *FilesController) toggleTreeView() error {
return self.c.PostRefreshUpdate(self.context())
}

func (self *FilesController) handleStashSave(stashFunc func(message string) error, action string, errorMsg string) error {
if !self.helpers.WorkingTree.IsWorkingTreeDirty() {
return self.c.ErrorMsg(errorMsg)
}

func (self *FilesController) handleStashSave(stashFunc func(message string) error, action string) error {
return self.c.Prompt(types.PromptOpts{
Title: self.c.Tr.StashChanges,
HandleConfirm: func(stashComment string) error {
Expand Down
4 changes: 4 additions & 0 deletions pkg/i18n/english.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,6 +295,7 @@ type TranslationSet struct {
LcStashStagedChanges string
LcStashAllChangesKeepIndex string
LcStashUnstagedChanges string
LcStashIncludeUntrackedChanges string
LcStashOptions string
NotARepository string
LcJump string
Expand Down Expand Up @@ -588,6 +589,7 @@ type Actions struct {
StashAllChangesKeepIndex string
StashStagedChanges string
StashUnstagedChanges string
StashIncludeUntrackedChanges string
GitFlowFinish string
GitFlowStart string
CopyToClipboard string
Expand Down Expand Up @@ -940,6 +942,7 @@ func EnglishTranslationSet() TranslationSet {
LcStashStagedChanges: "stash staged changes",
LcStashAllChangesKeepIndex: "stash all changes and keep index",
LcStashUnstagedChanges: "stash unstaged changes",
LcStashIncludeUntrackedChanges: "stash all changes including untracked files",
LcStashOptions: "Stash options",
NotARepository: "Error: must be run inside a git repository",
LcJump: "jump to panel",
Expand Down Expand Up @@ -1216,6 +1219,7 @@ func EnglishTranslationSet() TranslationSet {
StashAllChangesKeepIndex: "Stash all changes and keep index",
StashStagedChanges: "Stash staged changes",
StashUnstagedChanges: "Stash unstaged changes",
StashIncludeUntrackedChanges: "Stash all changes including untracked files",
GitFlowFinish: "Git flow finish",
GitFlowStart: "Git Flow start",
CopyToClipboard: "Copy to clipboard",
Expand Down
11 changes: 11 additions & 0 deletions pkg/integration/components/assert.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,17 @@ func (self *Assert) CommitCount(expectedCount int) {
})
}

func (self *Assert) StashCount(expectedCount int) {
self.assertWithRetries(func() (bool, string) {
actualCount := len(self.gui.Model().StashEntries)

return actualCount == expectedCount, fmt.Sprintf(
"Expected %d stash entries, but got %d",
expectedCount, actualCount,
)
})
}

func (self *Assert) AtLeastOneCommit() {
self.assertWithRetries(func() (bool, string) {
actualCount := len(self.gui.Model().Commits)
Expand Down
34 changes: 34 additions & 0 deletions pkg/integration/tests/stash/stash.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package stash

import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var Stash = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Stashing files",
ExtraCmdArgs: "",
Skip: false,
SetupConfig: func(config *config.AppConfig) {},
SetupRepo: func(shell *Shell) {
shell.EmptyCommit("initial commit")
shell.CreateFile("file", "content")
shell.GitAddAll()
},
Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) {
assert.StashCount(0)
assert.WorkingTreeFileCount(1)

input.PressKeys(keys.Files.ViewStashOptions)
assert.InMenu()

input.PressKeys("a")
assert.InPrompt()
assert.MatchCurrentViewTitle(Equals("Stash changes"))

input.Type("my stashed file")
input.Confirm()
assert.StashCount(1)
assert.WorkingTreeFileCount(0)
},
})
35 changes: 35 additions & 0 deletions pkg/integration/tests/stash/stash_including_untracked_files.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package stash

import (
"github.com/jesseduffield/lazygit/pkg/config"
. "github.com/jesseduffield/lazygit/pkg/integration/components"
)

var StashIncludingUntrackedFiles = NewIntegrationTest(NewIntegrationTestArgs{
Description: "Stashing all files including untracked ones",
ExtraCmdArgs: "",
Skip: false,
SetupConfig: func(config *config.AppConfig) {},
SetupRepo: func(shell *Shell) {
shell.EmptyCommit("initial commit")
shell.CreateFile("file_1", "content")
shell.CreateFile("file_2", "content")
shell.GitAdd("file_1")
},
Run: func(shell *Shell, input *Input, assert *Assert, keys config.KeybindingConfig) {
assert.StashCount(0)
assert.WorkingTreeFileCount(2)

input.PressKeys(keys.Files.ViewStashOptions)
assert.InMenu()

input.PressKeys("U")
assert.InPrompt()
assert.MatchCurrentViewTitle(Equals("Stash changes"))

input.Type("my stashed file")
input.Confirm()
assert.StashCount(1)
assert.WorkingTreeFileCount(0)
},
})
24 changes: 13 additions & 11 deletions pkg/integration/tests/tests.go
Original file line number Diff line number Diff line change
Expand Up @@ -24,24 +24,26 @@ import (
// be sure to add it to this list.

var tests = []*components.IntegrationTest{
commit.Commit,
commit.NewBranch,
branch.Suggestions,
bisect.Basic,
bisect.FromOtherBranch,
branch.Delete,
branch.Rebase,
branch.RebaseAndDrop,
interactive_rebase.One,
interactive_rebase.AmendMerge,
custom_commands.Basic,
custom_commands.MultiplePrompts,
custom_commands.MenuFromCommand,
bisect.Basic,
bisect.FromOtherBranch,
branch.Suggestions,
cherry_pick.CherryPick,
cherry_pick.CherryPickConflicts,
commit.Commit,
commit.NewBranch,
custom_commands.Basic,
custom_commands.FormPrompts,
stash.Rename,
custom_commands.MenuFromCommand,
custom_commands.MultiplePrompts,
file.DirWithUntrackedFile,
interactive_rebase.AmendMerge,
interactive_rebase.One,
stash.Rename,
stash.Stash,
stash.StashIncludingUntrackedFiles,
}

func GetTests() []*components.IntegrationTest {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
initial commit
Empty file.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ref: refs/heads/master
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
e6ed7d5c2198fa4791de9c66e8000da607eaf9a3
12 changes: 12 additions & 0 deletions test/integration_new/stash/stash/expected/repo/.git_keep/config
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
email = [email protected]
name = CI
[commit]
gpgSign = false
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
0000000000000000000000000000000000000000 e6ed7d5c2198fa4791de9c66e8000da607eaf9a3 CI <[email protected]> 1668288675 -0330 commit (initial): initial commit
e6ed7d5c2198fa4791de9c66e8000da607eaf9a3 e6ed7d5c2198fa4791de9c66e8000da607eaf9a3 CI <[email protected]> 1668288676 -0330 reset: moving to HEAD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000000000000000000 e6ed7d5c2198fa4791de9c66e8000da607eaf9a3 CI <[email protected]> 1668288675 -0330 commit (initial): initial commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000000000000000000 c86eeda485a49ca608cb2617bb027be66cd92bc3 CI <[email protected]> 1668288676 -0330 On master: my stashed file
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
x��Aj�0E��)� c�I��@V>�X3"��9~ ��l?�=^�Z���S�UA� H��drN�/)��r����a,s�X̃w];(���)Ák�DQ�0(����߷n|ߦ���=����@m����c=��~x7u}��B�߃������^y�?�yN�FY
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
e6ed7d5c2198fa4791de9c66e8000da607eaf9a3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
c86eeda485a49ca608cb2617bb027be66cd92bc3
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
initial commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
ref: refs/heads/master
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
364ac39500dfec09956626a513736d7602b4d64a
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
ignorecase = true
precomposeunicode = true
[user]
email = [email protected]
name = CI
[commit]
gpgSign = false
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Unnamed repository; edit this file 'description' to name the repository.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
# git ls-files --others --exclude-from=.git/info/exclude
# Lines that start with '#' are comments.
# For a project mostly in C, the following would be a good set of
# exclude patterns (uncomment them if you want to use them):
# *.[oa]
# *~
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
0000000000000000000000000000000000000000 364ac39500dfec09956626a513736d7602b4d64a CI <[email protected]> 1668288767 -0330 commit (initial): initial commit
364ac39500dfec09956626a513736d7602b4d64a 364ac39500dfec09956626a513736d7602b4d64a CI <[email protected]> 1668288768 -0330 reset: moving to HEAD
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000000000000000000 364ac39500dfec09956626a513736d7602b4d64a CI <[email protected]> 1668288767 -0330 commit (initial): initial commit
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
0000000000000000000000000000000000000000 03892119fb6b807d1c13c23f6baacdc4a170e694 CI <[email protected]> 1668288768 -0330 On master: my stashed file
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
x��=jA ���{��@��_2!\��F# <^��@r�L�>���__Ǹ�.��U'�����%KK>W&�����F˽=�6ÒZ��ĴQ.%��}��H-8�4O��S�$uK ���4C&4�5TC~z0�l�YEI�Q4��kK\s0��Ҿ���pǓ{?�>����U��:>�/b-�^!FX�:O��O�|��h��7~ݶ�����r�?��].
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
364ac39500dfec09956626a513736d7602b4d64a
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
03892119fb6b807d1c13c23f6baacdc4a170e694

0 comments on commit b33ec5a

Please sign in to comment.