diff --git a/pkg/gui/controllers/global_controller.go b/pkg/gui/controllers/global_controller.go index e59231739..dac1bbc08 100644 --- a/pkg/gui/controllers/global_controller.go +++ b/pkg/gui/controllers/global_controller.go @@ -1,6 +1,8 @@ package controllers import ( + "strings" + "github.com/jesseduffield/generics/slices" "github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" "github.com/jesseduffield/lazygit/pkg/gui/types" @@ -37,10 +39,12 @@ func (self *GlobalController) customCommand() error { Title: self.c.Tr.CustomCommand, FindSuggestionsFunc: self.GetCustomCommandsHistorySuggestionsFunc(), HandleConfirm: func(command string) error { - self.c.GetAppState().CustomCommandsHistory = utils.Limit( - lo.Uniq(append(self.c.GetAppState().CustomCommandsHistory, command)), - 1000, - ) + if self.shouldSaveCommand(command) { + self.c.GetAppState().CustomCommandsHistory = utils.Limit( + lo.Uniq(append(self.c.GetAppState().CustomCommandsHistory, command)), + 1000, + ) + } err := self.c.SaveAppState() if err != nil { @@ -55,6 +59,12 @@ func (self *GlobalController) customCommand() error { }) } +// this mimics the shell functionality `ignorespace` +// which doesn't save a command to history if it starts with a space +func (self *GlobalController) shouldSaveCommand(command string) bool { + return !strings.HasPrefix(command, " ") +} + func (self *GlobalController) GetCustomCommandsHistorySuggestionsFunc() func(string) []*types.Suggestion { // reversing so that we display the latest command first history := slices.Reverse(self.c.GetAppState().CustomCommandsHistory) diff --git a/pkg/integration/tests/custom_commands/basic_at_runtime.go b/pkg/integration/tests/custom_commands/basic_at_runtime.go new file mode 100644 index 000000000..96b9b9174 --- /dev/null +++ b/pkg/integration/tests/custom_commands/basic_at_runtime.go @@ -0,0 +1,35 @@ +package custom_commands + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var BasicCmdAtRuntime = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Using a custom command provided at runtime to create a new file", + ExtraCmdArgs: "", + Skip: false, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("blah") + }, + SetupConfig: func(cfg *config.AppConfig) {}, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Files(). + IsEmpty(). + IsFocused(). + Press(keys.Universal.ExecuteCustomCommand) + + t.ExpectPopup().Prompt(). + Title(Equals("Custom Command:")). + Type("touch file.txt"). + Confirm() + + t.GlobalPress(keys.Files.RefreshFiles) + + t.Views().Files(). + IsFocused(). + Lines( + Contains("file.txt"), + ) + }, +}) diff --git a/pkg/integration/tests/custom_commands/basic_at_runtime_history.go b/pkg/integration/tests/custom_commands/basic_at_runtime_history.go new file mode 100644 index 000000000..40cf5b328 --- /dev/null +++ b/pkg/integration/tests/custom_commands/basic_at_runtime_history.go @@ -0,0 +1,38 @@ +package custom_commands + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var OmitFromHistory = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Omitting a runtime custom command from history if it begins with space", + ExtraCmdArgs: "", + Skip: false, + SetupRepo: func(shell *Shell) { + shell.EmptyCommit("blah") + }, + SetupConfig: func(cfg *config.AppConfig) {}, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.GlobalPress(keys.Universal.ExecuteCustomCommand) + t.ExpectPopup().Prompt(). + Title(Equals("Custom Command:")). + Type("echo aubergine"). + Confirm() + + t.GlobalPress(keys.Universal.ExecuteCustomCommand) + t.ExpectPopup().Prompt(). + Title(Equals("Custom Command:")). + SuggestionLines(Contains("aubergine")). + SuggestionLines(DoesNotContain("tangerine")). + Type(" echo tangerine"). + Confirm() + + t.GlobalPress(keys.Universal.ExecuteCustomCommand) + t.ExpectPopup().Prompt(). + Title(Equals("Custom Command:")). + SuggestionLines(Contains("aubergine")). + SuggestionLines(DoesNotContain("tangerine")). + Cancel() + }, +}) diff --git a/pkg/integration/tests/custom_commands/basic.go b/pkg/integration/tests/custom_commands/basic_from_config.go similarity index 90% rename from pkg/integration/tests/custom_commands/basic.go rename to pkg/integration/tests/custom_commands/basic_from_config.go index ce500b9a6..0f15183d9 100644 --- a/pkg/integration/tests/custom_commands/basic.go +++ b/pkg/integration/tests/custom_commands/basic_from_config.go @@ -5,7 +5,7 @@ import ( . "github.com/jesseduffield/lazygit/pkg/integration/components" ) -var Basic = NewIntegrationTest(NewIntegrationTestArgs{ +var BasicCmdFromConfig = NewIntegrationTest(NewIntegrationTestArgs{ Description: "Using a custom command to create a new file", ExtraCmdArgs: "", Skip: false, diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index fae655cbc..b44246abf 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -64,7 +64,9 @@ var tests = []*components.IntegrationTest{ conflicts.ResolveExternally, conflicts.ResolveMultipleFiles, conflicts.UndoChooseHunk, - custom_commands.Basic, + custom_commands.BasicCmdFromConfig, + custom_commands.BasicCmdAtRuntime, + custom_commands.OmitFromHistory, custom_commands.FormPrompts, custom_commands.MenuFromCommand, custom_commands.MenuFromCommandsOutput,