diff --git a/pkg/commands/git.go b/pkg/commands/git.go index db5585172..3a9e434cb 100644 --- a/pkg/commands/git.go +++ b/pkg/commands/git.go @@ -84,6 +84,13 @@ func NewGitCommand(log *logrus.Entry, osCommand *oscommands.OSCommand, tr *i18n. } func (c *GitCommand) WithSpan(span string) *GitCommand { + // sometimes .WithSpan(span) will be called where span actually is empty, in + // which case we don't need to log anything so we can just return early here + // with the original struct + if span == "" { + return c + } + newGitCommand := &GitCommand{} *newGitCommand = *c newGitCommand.OSCommand = c.OSCommand.WithSpan(span) diff --git a/pkg/commands/oscommands/os.go b/pkg/commands/oscommands/os.go index 2c85cfc5a..55592692f 100644 --- a/pkg/commands/oscommands/os.go +++ b/pkg/commands/oscommands/os.go @@ -94,6 +94,13 @@ func NewOSCommand(log *logrus.Entry, config config.AppConfigurer) *OSCommand { } func (c *OSCommand) WithSpan(span string) *OSCommand { + // sometimes .WithSpan(span) will be called where span actually is empty, in + // which case we don't need to log anything so we can just return early here + // with the original struct + if span == "" { + return c + } + newOSCommand := &OSCommand{} *newOSCommand = *c newOSCommand.CmdLogSpan = span diff --git a/pkg/gui/branches_panel.go b/pkg/gui/branches_panel.go index a24c6a7e9..99923a91e 100644 --- a/pkg/gui/branches_panel.go +++ b/pkg/gui/branches_panel.go @@ -146,6 +146,7 @@ type handleCheckoutRefOptions struct { WaitingStatus string EnvVars []string onRefNotFound func(ref string) error + span string } func (gui *Gui) handleCheckoutRef(ref string, options handleCheckoutRefOptions) error { @@ -163,8 +164,10 @@ func (gui *Gui) handleCheckoutRef(ref string, options handleCheckoutRefOptions) gui.State.Panels.Commits.LimitCommits = true } + gitCommand := gui.GitCommand.WithSpan(options.span) + return gui.WithWaitingStatus(waitingStatus, func() error { - if err := gui.GitCommand.Checkout(ref, cmdOptions); err != nil { + if err := gitCommand.Checkout(ref, cmdOptions); err != nil { // note, this will only work for english-language git commands. If we force git to use english, and the error isn't this one, then the user will receive an english command they may not understand. I'm not sure what the best solution to this is. Running the command once in english and a second time in the native language is one option if options.onRefNotFound != nil && strings.Contains(err.Error(), "did not match any file(s) known to git") { @@ -178,15 +181,15 @@ func (gui *Gui) handleCheckoutRef(ref string, options handleCheckoutRefOptions) title: gui.Tr.AutoStashTitle, prompt: gui.Tr.AutoStashPrompt, handleConfirm: func() error { - if err := gui.GitCommand.StashSave(gui.Tr.StashPrefix + ref); err != nil { + if err := gitCommand.StashSave(gui.Tr.StashPrefix + ref); err != nil { return gui.surfaceError(err) } - if err := gui.GitCommand.Checkout(ref, cmdOptions); err != nil { + if err := gitCommand.Checkout(ref, cmdOptions); err != nil { return gui.surfaceError(err) } onSuccess() - if err := gui.GitCommand.StashDo(0, "pop"); err != nil { + if err := gitCommand.StashDo(0, "pop"); err != nil { if err := gui.refreshSidePanels(refreshOptions{mode: BLOCK_UI}); err != nil { return err } diff --git a/pkg/gui/reset_menu_panel.go b/pkg/gui/reset_menu_panel.go index f3506f4c3..f1736e2c2 100644 --- a/pkg/gui/reset_menu_panel.go +++ b/pkg/gui/reset_menu_panel.go @@ -7,8 +7,8 @@ import ( "github.com/jesseduffield/lazygit/pkg/commands/oscommands" ) -func (gui *Gui) resetToRef(ref string, strength string, options oscommands.RunCommandOptions) error { - if err := gui.GitCommand.ResetToCommit(ref, strength, options); err != nil { +func (gui *Gui) resetToRef(ref string, strength string, span string, options oscommands.RunCommandOptions) error { + if err := gui.GitCommand.WithSpan(span).ResetToCommit(ref, strength, options); err != nil { return gui.surfaceError(err) } @@ -41,7 +41,7 @@ func (gui *Gui) createResetMenu(ref string) error { ), }, onPress: func() error { - return gui.resetToRef(ref, strength, oscommands.RunCommandOptions{}) + return gui.resetToRef(ref, strength, "Reset", oscommands.RunCommandOptions{}) }, } } diff --git a/pkg/gui/undoing.go b/pkg/gui/undoing.go index f055ef11a..d39372f89 100644 --- a/pkg/gui/undoing.go +++ b/pkg/gui/undoing.go @@ -93,6 +93,8 @@ func (gui *Gui) reflogUndo() error { return gui.createErrorPanel(gui.Tr.LcCantUndoWhileRebasing) } + span := "Undo" + return gui.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { if counter != 0 { return false, nil @@ -103,11 +105,13 @@ func (gui *Gui) reflogUndo() error { return true, gui.handleHardResetWithAutoStash(action.from, handleHardResetWithAutoStashOptions{ EnvVars: undoEnvVars, WaitingStatus: undoingStatus, + span: span, }) case CHECKOUT: return true, gui.handleCheckoutRef(action.from, handleCheckoutRefOptions{ EnvVars: undoEnvVars, WaitingStatus: undoingStatus, + span: span, }) } @@ -124,6 +128,8 @@ func (gui *Gui) reflogRedo() error { return gui.createErrorPanel(gui.Tr.LcCantRedoWhileRebasing) } + span := "Redo" + return gui.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { // if we're redoing and the counter is zero, we just return if counter == 0 { @@ -137,11 +143,13 @@ func (gui *Gui) reflogRedo() error { return true, gui.handleHardResetWithAutoStash(action.to, handleHardResetWithAutoStashOptions{ EnvVars: redoEnvVars, WaitingStatus: redoingStatus, + span: span, }) case CHECKOUT: return true, gui.handleCheckoutRef(action.to, handleCheckoutRefOptions{ EnvVars: redoEnvVars, WaitingStatus: redoingStatus, + span: span, }) } @@ -153,19 +161,22 @@ func (gui *Gui) reflogRedo() error { type handleHardResetWithAutoStashOptions struct { WaitingStatus string EnvVars []string + span string } // only to be used in the undo flow for now func (gui *Gui) handleHardResetWithAutoStash(commitSha string, options handleHardResetWithAutoStashOptions) error { + gitCommand := gui.GitCommand.WithSpan(options.span) + reset := func() error { - if err := gui.resetToRef(commitSha, "hard", oscommands.RunCommandOptions{EnvVars: options.EnvVars}); err != nil { + if err := gui.resetToRef(commitSha, "hard", options.span, oscommands.RunCommandOptions{EnvVars: options.EnvVars}); err != nil { return gui.surfaceError(err) } return nil } // if we have any modified tracked files we need to ask the user if they want us to stash for them - dirtyWorkingTree := len(gui.trackedFiles()) > 0 + dirtyWorkingTree := len(gui.trackedFiles()) > 0 || len(gui.stagedFiles()) > 0 if dirtyWorkingTree { // offer to autostash changes return gui.ask(askOpts{ @@ -173,17 +184,18 @@ func (gui *Gui) handleHardResetWithAutoStash(commitSha string, options handleHar prompt: gui.Tr.AutoStashPrompt, handleConfirm: func() error { return gui.WithWaitingStatus(options.WaitingStatus, func() error { - if err := gui.GitCommand.StashSave(gui.Tr.StashPrefix + commitSha); err != nil { + if err := gitCommand.StashSave(gui.Tr.StashPrefix + commitSha); err != nil { return gui.surfaceError(err) } if err := reset(); err != nil { return err } - if err := gui.GitCommand.StashDo(0, "pop"); err != nil { - if err := gui.refreshSidePanels(refreshOptions{}); err != nil { - return err - } + err := gitCommand.StashDo(0, "pop") + if err := gui.refreshSidePanels(refreshOptions{}); err != nil { + return err + } + if err != nil { return gui.surfaceError(err) } return nil