From be21328c69a2436d99f80c9247852641b20a08cc Mon Sep 17 00:00:00 2001 From: Martin Kock Date: Sat, 6 Jul 2024 21:59:10 +1000 Subject: [PATCH] Allow cycling between multiple log commands - Introduced a new optional user config command, allBranchesLogCmds - When pressing 'a' in the Status view, cycle between non-empty, non-identical log commands - There will always be at least one command to run, since allBranhesLogCmd has a default - Update documentation & write an integration test - Update translation string --- docs/Config.md | 3 ++- docs/keybindings/Keybindings_en.md | 2 +- pkg/commands/git_commands/branch.go | 16 +++++++++++- pkg/config/user_config.go | 5 +++- pkg/i18n/english.go | 2 +- pkg/integration/tests/status/log_cmd.go | 33 +++++++++++++++++++++++++ pkg/integration/tests/test_list.go | 1 + schema/config.json | 9 ++++++- 8 files changed, 65 insertions(+), 6 deletions(-) create mode 100644 pkg/integration/tests/status/log_cmd.go diff --git a/docs/Config.md b/docs/Config.md index 8506f7aed..03501e8c2 100644 --- a/docs/Config.md +++ b/docs/Config.md @@ -306,7 +306,8 @@ git: # Command used when displaying the current branch git log in the main window branchLogCmd: git log --graph --color=always --abbrev-commit --decorate --date=relative --pretty=medium {{branchName}} -- - # Command used to display git log of all branches in the main window + # Command used to display git log of all branches in the main window. + # Deprecated: User `allBranchesLogCmds` instead. allBranchesLogCmd: git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium # If true, do not spawn a separate process when using GPG diff --git a/docs/keybindings/Keybindings_en.md b/docs/keybindings/Keybindings_en.md index 73104e994..eb88cb182 100644 --- a/docs/keybindings/Keybindings_en.md +++ b/docs/keybindings/Keybindings_en.md @@ -309,7 +309,7 @@ If you would instead like to start an interactive rebase from the selected commi | `` e `` | Edit config file | Open file in external editor. | | `` u `` | Check for update | | | `` `` | Switch to a recent repo | | -| `` a `` | Show all branch logs | | +| `` a `` | Show/cycle all branch logs | | ## Sub-commits diff --git a/pkg/commands/git_commands/branch.go b/pkg/commands/git_commands/branch.go index bb065605c..6c9aa8740 100644 --- a/pkg/commands/git_commands/branch.go +++ b/pkg/commands/git_commands/branch.go @@ -7,10 +7,12 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/oscommands" "github.com/jesseduffield/lazygit/pkg/utils" "github.com/mgutz/str" + "github.com/samber/lo" ) type BranchCommands struct { *GitCommon + allBranchesLogCmdIndex uint8 // keeps track of current all branches log command } func NewBranchCommands(gitCommon *GitCommon) *BranchCommands { @@ -244,5 +246,17 @@ func (self *BranchCommands) Merge(branchName string, opts MergeOpts) error { } func (self *BranchCommands) AllBranchesLogCmdObj() oscommands.ICmdObj { - return self.cmd.New(str.ToArgv(self.UserConfig.Git.AllBranchesLogCmd)).DontLog() + // Only choose between non-empty, non-identical commands + candidates := lo.Uniq(lo.WithoutEmpty(append([]string{ + self.UserConfig.Git.AllBranchesLogCmd, + }, + self.UserConfig.Git.AllBranchesLogCmds..., + ))) + + n := len(candidates) + + i := self.allBranchesLogCmdIndex + self.allBranchesLogCmdIndex = uint8((int(i) + 1) % n) + + return self.cmd.New(str.ToArgv(candidates[i])).DontLog() } diff --git a/pkg/config/user_config.go b/pkg/config/user_config.go index c0613865e..fbf513ea6 100644 --- a/pkg/config/user_config.go +++ b/pkg/config/user_config.go @@ -226,8 +226,11 @@ type GitConfig struct { FetchAll bool `yaml:"fetchAll"` // Command used when displaying the current branch git log in the main window BranchLogCmd string `yaml:"branchLogCmd"` - // Command used to display git log of all branches in the main window + // Command used to display git log of all branches in the main window. + // Deprecated: User `allBranchesLogCmds` instead. AllBranchesLogCmd string `yaml:"allBranchesLogCmd"` + // Commands used to display git log of all branches in the main window, they will be cycled in order of appearance + AllBranchesLogCmds []string `yaml:"allBranchesLogCmds"` // If true, do not spawn a separate process when using GPG OverrideGpg bool `yaml:"overrideGpg"` // If true, do not allow force pushes diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 62f429cde..d4c656202 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -1208,7 +1208,7 @@ func EnglishTranslationSet() *TranslationSet { MergeBranchTooltip: "View options for merging the selected item into the current branch (regular merge, squash merge)", ConfirmQuit: `Are you sure you want to quit?`, SwitchRepo: `Switch to a recent repo`, - AllBranchesLogGraph: `Show all branch logs`, + AllBranchesLogGraph: `Show/cycle all branch logs`, UnsupportedGitService: `Unsupported git service`, CreatePullRequest: `Create pull request`, CopyPullRequestURL: `Copy pull request URL to clipboard`, diff --git a/pkg/integration/tests/status/log_cmd.go b/pkg/integration/tests/status/log_cmd.go new file mode 100644 index 000000000..7928cb1b6 --- /dev/null +++ b/pkg/integration/tests/status/log_cmd.go @@ -0,0 +1,33 @@ +package status + +import ( + "github.com/jesseduffield/lazygit/pkg/config" + . "github.com/jesseduffield/lazygit/pkg/integration/components" +) + +var LogCmd = NewIntegrationTest(NewIntegrationTestArgs{ + Description: "Cycle between two different log commands in the Status view", + ExtraCmdArgs: []string{}, + Skip: false, + SetupConfig: func(config *config.AppConfig) { + config.UserConfig.Git.AllBranchesLogCmd = `echo "view1"` + config.UserConfig.Git.AllBranchesLogCmds = []string{`echo "view2"`} + }, + SetupRepo: func(shell *Shell) {}, + Run: func(t *TestDriver, keys config.KeybindingConfig) { + t.Views().Status(). + Focus(). + Press(keys.Status.AllBranchesLogGraph) + t.Views().Main().Content(Contains("view1")) + + t.Views().Status(). + Focus(). + Press(keys.Status.AllBranchesLogGraph) + t.Views().Main().Content(Contains("view2").DoesNotContain("view1")) + + t.Views().Status(). + Focus(). + Press(keys.Status.AllBranchesLogGraph) + t.Views().Main().Content(Contains("view1").DoesNotContain("view2")) + }, +}) diff --git a/pkg/integration/tests/test_list.go b/pkg/integration/tests/test_list.go index bfc0fe786..ec24b9f5a 100644 --- a/pkg/integration/tests/test_list.go +++ b/pkg/integration/tests/test_list.go @@ -286,6 +286,7 @@ var tests = []*components.IntegrationTest{ status.ClickRepoNameToOpenReposMenu, status.ClickToFocus, status.ClickWorkingTreeStateToOpenRebaseOptionsMenu, + status.LogCmd, status.ShowDivergenceFromBaseBranch, submodule.Add, submodule.Enter, diff --git a/schema/config.json b/schema/config.json index cf67f78c8..23e052f69 100644 --- a/schema/config.json +++ b/schema/config.json @@ -580,9 +580,16 @@ }, "allBranchesLogCmd": { "type": "string", - "description": "Command used to display git log of all branches in the main window", + "description": "Command used to display git log of all branches in the main window.\nDeprecated: User `allBranchesLogCmds` instead.", "default": "git log --graph --all --color=always --abbrev-commit --decorate --date=relative --pretty=medium" }, + "allBranchesLogCmds": { + "items": { + "type": "string" + }, + "type": "array", + "description": "Commands used to display git log of all branches in the main window, they will be cycled in order of appearance" + }, "overrideGpg": { "type": "boolean", "description": "If true, do not spawn a separate process when using GPG",