mirror of
				https://github.com/jesseduffield/lazygit.git
				synced 2025-10-30 23:57:43 +02:00 
			
		
		
		
	Remove ErrorMsg
There is no reason any more for application code to show error messages in a panel. Just return an error instead.
This commit is contained in:
		| @@ -1,6 +1,8 @@ | ||||
| package context | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/keybindings" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/style" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/types" | ||||
| @@ -148,7 +150,7 @@ func (self *MenuContext) GetKeybindings(opts types.KeybindingsOpts) []*types.Bin | ||||
| func (self *MenuContext) OnMenuPress(selectedItem *types.MenuItem) error { | ||||
| 	if selectedItem != nil && selectedItem.DisabledReason != nil { | ||||
| 		if selectedItem.DisabledReason.ShowErrorInPanel { | ||||
| 			return self.c.ErrorMsg(selectedItem.DisabledReason.Text) | ||||
| 			return errors.New(selectedItem.DisabledReason.Text) | ||||
| 		} | ||||
|  | ||||
| 		self.c.ErrorToast(self.c.Tr.DisabledMenuItemPrefix + selectedItem.DisabledReason.Text) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/commands/git_commands" | ||||
| @@ -314,7 +315,7 @@ func (self *BasicCommitsController) handleOldCherryPickKey() error { | ||||
| 			"paste": keybindings.Label(self.c.UserConfig.Keybinding.Commits.PasteCommits), | ||||
| 		}) | ||||
|  | ||||
| 	return self.c.ErrorMsg(msg) | ||||
| 	return errors.New(msg) | ||||
| } | ||||
|  | ||||
| func (self *BasicCommitsController) openDiffTool(commit *models.Commit) error { | ||||
|   | ||||
| @@ -334,7 +334,7 @@ func (self *BranchesController) context() *context.BranchesContext { | ||||
|  | ||||
| func (self *BranchesController) press(selectedBranch *models.Branch) error { | ||||
| 	if selectedBranch == self.c.Helpers().Refs.GetCheckedOutRef() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.AlreadyCheckedOutBranch) | ||||
| 		return errors.New(self.c.Tr.AlreadyCheckedOutBranch) | ||||
| 	} | ||||
|  | ||||
| 	worktreeForRef, ok := self.worktreeForBranch(selectedBranch) | ||||
| @@ -378,7 +378,7 @@ func (self *BranchesController) promptToCheckoutWorktree(worktree *models.Worktr | ||||
|  | ||||
| func (self *BranchesController) handleCreatePullRequest(selectedBranch *models.Branch) error { | ||||
| 	if !selectedBranch.IsTrackingRemote() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.PullRequestNoUpstream) | ||||
| 		return errors.New(self.c.Tr.PullRequestNoUpstream) | ||||
| 	} | ||||
| 	return self.createPullRequest(selectedBranch.UpstreamBranch, "") | ||||
| } | ||||
| @@ -548,7 +548,7 @@ func (self *BranchesController) forceDelete(branch *models.Branch) error { | ||||
| 		Prompt: message, | ||||
| 		HandleConfirm: func() error { | ||||
| 			if err := self.c.Git().Branch.LocalDelete(branch.Name, true); err != nil { | ||||
| 				return self.c.ErrorMsg(err.Error()) | ||||
| 				return err | ||||
| 			} | ||||
| 			return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) | ||||
| 		}, | ||||
| @@ -615,13 +615,13 @@ func (self *BranchesController) notRebasingOntoSelf(branch *models.Branch) *type | ||||
|  | ||||
| func (self *BranchesController) fastForward(branch *models.Branch) error { | ||||
| 	if !branch.IsTrackingRemote() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.FwdNoUpstream) | ||||
| 		return errors.New(self.c.Tr.FwdNoUpstream) | ||||
| 	} | ||||
| 	if !branch.RemoteBranchStoredLocally() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.FwdNoLocalUpstream) | ||||
| 		return errors.New(self.c.Tr.FwdNoLocalUpstream) | ||||
| 	} | ||||
| 	if branch.HasCommitsToPush() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.FwdCommitsToPush) | ||||
| 		return errors.New(self.c.Tr.FwdCommitsToPush) | ||||
| 	} | ||||
|  | ||||
| 	action := self.c.Tr.Actions.FastForwardBranch | ||||
| @@ -766,7 +766,7 @@ func (self *BranchesController) createPullRequestMenu(selectedBranch *models.Bra | ||||
| 				LabelColumns: fromToLabelColumns(checkedOutBranch.Name, selectedBranch.Name), | ||||
| 				OnPress: func() error { | ||||
| 					if !checkedOutBranch.IsTrackingRemote() || !selectedBranch.IsTrackingRemote() { | ||||
| 						return self.c.ErrorMsg(self.c.Tr.PullRequestNoUpstream) | ||||
| 						return errors.New(self.c.Tr.PullRequestNoUpstream) | ||||
| 					} | ||||
| 					return self.createPullRequest(checkedOutBranch.UpstreamBranch, selectedBranch.UpstreamBranch) | ||||
| 				}, | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/commands/git_commands" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/context" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers" | ||||
| @@ -114,7 +116,7 @@ func (self *CommitMessageController) setCommitMessageAtIndex(index int) (bool, e | ||||
| 		if err == git_commands.ErrInvalidCommitIndex { | ||||
| 			return false, nil | ||||
| 		} | ||||
| 		return false, self.c.ErrorMsg(self.c.Tr.CommitWithoutMessageErr) | ||||
| 		return false, errors.New(self.c.Tr.CommitWithoutMessageErr) | ||||
| 	} | ||||
| 	if self.c.UserConfig.Git.Commit.AutoWrapCommitMessage { | ||||
| 		commitMessage = helpers.TryRemoveHardLineBreaks(commitMessage, self.c.UserConfig.Git.Commit.AutoWrapWidth) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| @@ -179,7 +180,7 @@ func (self *CommitFilesController) checkout(node *filetree.CommitFileNode) error | ||||
| func (self *CommitFilesController) discard(selectedNodes []*filetree.CommitFileNode) error { | ||||
| 	parentContext, ok := self.c.CurrentContext().GetParentContext() | ||||
| 	if !ok || parentContext.GetKey() != context.LOCAL_COMMITS_CONTEXT_KEY { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CanOnlyDiscardFromLocalCommits) | ||||
| 		return errors.New(self.c.Tr.CanOnlyDiscardFromLocalCommits) | ||||
| 	} | ||||
|  | ||||
| 	if ok, err := self.c.Helpers().PatchBuilding.ValidateNormalWorkingTreeState(); !ok { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| @@ -15,11 +16,11 @@ type CustomPatchOptionsMenuAction struct { | ||||
|  | ||||
| func (self *CustomPatchOptionsMenuAction) Call() error { | ||||
| 	if !self.c.Git().Patch.PatchBuilder.Active() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.NoPatchError) | ||||
| 		return errors.New(self.c.Tr.NoPatchError) | ||||
| 	} | ||||
|  | ||||
| 	if self.c.Git().Patch.PatchBuilder.IsEmpty() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.EmptyPatchError) | ||||
| 		return errors.New(self.c.Tr.EmptyPatchError) | ||||
| 	} | ||||
|  | ||||
| 	menuItems := []*types.MenuItem{ | ||||
| @@ -115,7 +116,7 @@ func (self *CustomPatchOptionsMenuAction) getPatchCommitIndex() int { | ||||
|  | ||||
| func (self *CustomPatchOptionsMenuAction) validateNormalWorkingTreeState() (bool, error) { | ||||
| 	if self.c.Git().Status.WorkingTreeState() != enums.REBASE_MODE_NONE { | ||||
| 		return false, self.c.ErrorMsg(self.c.Tr.CantPatchWhileRebasingError) | ||||
| 		return false, errors.New(self.c.Tr.CantPatchWhileRebasingError) | ||||
| 	} | ||||
| 	return true, nil | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| @@ -388,7 +389,7 @@ func (self *FilesController) pressWithLock(selectedNodes []*filetree.FileNode) e | ||||
| 		// if any files within have inline merge conflicts we can't stage or unstage, | ||||
| 		// or it'll end up with those >>>>>> lines actually staged | ||||
| 		if node.GetHasInlineMergeConflicts() { | ||||
| 			return self.c.ErrorMsg(self.c.Tr.ErrStageDirWithInlineMergeConflicts) | ||||
| 			return errors.New(self.c.Tr.ErrStageDirWithInlineMergeConflicts) | ||||
| 		} | ||||
| 	} | ||||
|  | ||||
| @@ -496,7 +497,7 @@ func (self *FilesController) EnterFile(opts types.OnFocusOpts) error { | ||||
| 		return self.switchToMerge() | ||||
| 	} | ||||
| 	if file.HasMergeConflicts { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.FileStagingRequirements) | ||||
| 		return errors.New(self.c.Tr.FileStagingRequirements) | ||||
| 	} | ||||
|  | ||||
| 	return self.c.PushContext(self.c.Contexts().Staging, opts) | ||||
| @@ -523,7 +524,7 @@ func (self *FilesController) toggleStagedAllWithLock() error { | ||||
| 	// if any files within have inline merge conflicts we can't stage or unstage, | ||||
| 	// or it'll end up with those >>>>>> lines actually staged | ||||
| 	if root.GetHasInlineMergeConflicts() { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.ErrStageDirWithInlineMergeConflicts) | ||||
| 		return errors.New(self.c.Tr.ErrStageDirWithInlineMergeConflicts) | ||||
| 	} | ||||
|  | ||||
| 	if root.GetHasUnstagedChanges() { | ||||
| @@ -606,14 +607,14 @@ func (self *FilesController) ignoreOrExcludeFile(node *filetree.FileNode, trText | ||||
|  | ||||
| func (self *FilesController) ignore(node *filetree.FileNode) error { | ||||
| 	if node.GetPath() == ".gitignore" { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.Actions.IgnoreFileErr) | ||||
| 		return errors.New(self.c.Tr.Actions.IgnoreFileErr) | ||||
| 	} | ||||
| 	return self.ignoreOrExcludeFile(node, self.c.Tr.IgnoreTracked, self.c.Tr.IgnoreTrackedPrompt, self.c.Tr.Actions.IgnoreExcludeFile, self.c.Git().WorkingTree.Ignore) | ||||
| } | ||||
|  | ||||
| func (self *FilesController) exclude(node *filetree.FileNode) error { | ||||
| 	if node.GetPath() == ".gitignore" { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.Actions.ExcludeGitIgnoreErr) | ||||
| 		return errors.New(self.c.Tr.Actions.ExcludeGitIgnoreErr) | ||||
| 	} | ||||
|  | ||||
| 	return self.ignoreOrExcludeFile(node, self.c.Tr.ExcludeTracked, self.c.Tr.ExcludeTrackedPrompt, self.c.Tr.Actions.ExcludeFile, self.c.Git().WorkingTree.Exclude) | ||||
| @@ -658,7 +659,7 @@ func (self *FilesController) handleAmendCommitPress() error { | ||||
| 		HandleConfirm: func() error { | ||||
| 			return self.c.Helpers().WorkingTree.WithEnsureCommitableFiles(func() error { | ||||
| 				if len(self.c.Model().Commits) == 0 { | ||||
| 					return self.c.ErrorMsg(self.c.Tr.NoCommitToAmend) | ||||
| 					return errors.New(self.c.Tr.NoCommitToAmend) | ||||
| 				} | ||||
|  | ||||
| 				return self.c.Helpers().AmendHelper.AmendHead() | ||||
| @@ -765,7 +766,7 @@ func (self *FilesController) createStashMenu() error { | ||||
| 				Label: self.c.Tr.StashAllChanges, | ||||
| 				OnPress: func() error { | ||||
| 					if !self.c.Helpers().WorkingTree.IsWorkingTreeDirty() { | ||||
| 						return self.c.ErrorMsg(self.c.Tr.NoFilesToStash) | ||||
| 						return errors.New(self.c.Tr.NoFilesToStash) | ||||
| 					} | ||||
| 					return self.handleStashSave(self.c.Git().Stash.Push, self.c.Tr.Actions.StashAllChanges) | ||||
| 				}, | ||||
| @@ -775,7 +776,7 @@ func (self *FilesController) createStashMenu() error { | ||||
| 				Label: self.c.Tr.StashAllChangesKeepIndex, | ||||
| 				OnPress: func() error { | ||||
| 					if !self.c.Helpers().WorkingTree.IsWorkingTreeDirty() { | ||||
| 						return self.c.ErrorMsg(self.c.Tr.NoFilesToStash) | ||||
| 						return errors.New(self.c.Tr.NoFilesToStash) | ||||
| 					} | ||||
| 					// if there are no staged files it behaves the same as Stash.Save | ||||
| 					return self.handleStashSave(self.c.Git().Stash.StashAndKeepIndex, self.c.Tr.Actions.StashAllChangesKeepIndex) | ||||
| @@ -794,7 +795,7 @@ func (self *FilesController) createStashMenu() error { | ||||
| 				OnPress: func() error { | ||||
| 					// there must be something in staging otherwise the current implementation mucks the stash up | ||||
| 					if !self.c.Helpers().WorkingTree.AnyStagedFiles() { | ||||
| 						return self.c.ErrorMsg(self.c.Tr.NoTrackedStagedFilesStash) | ||||
| 						return errors.New(self.c.Tr.NoTrackedStagedFilesStash) | ||||
| 					} | ||||
| 					return self.handleStashSave(self.c.Git().Stash.SaveStagedChanges, self.c.Tr.Actions.StashStagedChanges) | ||||
| 				}, | ||||
| @@ -804,7 +805,7 @@ func (self *FilesController) createStashMenu() error { | ||||
| 				Label: self.c.Tr.StashUnstagedChanges, | ||||
| 				OnPress: func() error { | ||||
| 					if !self.c.Helpers().WorkingTree.IsWorkingTreeDirty() { | ||||
| 						return self.c.ErrorMsg(self.c.Tr.NoFilesToStash) | ||||
| 						return errors.New(self.c.Tr.NoFilesToStash) | ||||
| 					} | ||||
| 					if self.c.Helpers().WorkingTree.AnyStagedFiles() { | ||||
| 						return self.handleStashSave(self.c.Git().Stash.StashUnstagedChanges, self.c.Tr.Actions.StashUnstagedChanges) | ||||
| @@ -986,7 +987,7 @@ func (self *FilesController) fetchAux(task gocui.Task) (err error) { | ||||
| 	err = self.c.Git().Sync.Fetch(task) | ||||
|  | ||||
| 	if err != nil && strings.Contains(err.Error(), "exit status 128") { | ||||
| 		_ = self.c.ErrorMsg(self.c.Tr.PassUnameWrong) | ||||
| 		return errors.New(self.c.Tr.PassUnameWrong) | ||||
| 	} | ||||
|  | ||||
| 	_ = self.c.Refresh(types.RefreshOptions{Scope: []types.RefreshableView{types.BRANCHES, types.COMMITS, types.REMOTES, types.TAGS}, Mode: types.ASYNC}) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/commands/models" | ||||
| @@ -46,7 +47,7 @@ func (self *GitFlowController) GetKeybindings(opts types.KeybindingsOpts) []*typ | ||||
|  | ||||
| func (self *GitFlowController) handleCreateGitFlowMenu(branch *models.Branch) error { | ||||
| 	if !self.c.Git().Flow.GitFlowEnabled() { | ||||
| 		return self.c.ErrorMsg("You need to install git-flow and enable it in this repo to use git-flow features") | ||||
| 		return errors.New("You need to install git-flow and enable it in this repo to use git-flow features") | ||||
| 	} | ||||
|  | ||||
| 	startHandler := func(branchType string) func() error { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"path/filepath" | ||||
| 	"strings" | ||||
| 	"time" | ||||
| @@ -167,7 +168,7 @@ func (self *CommitsHelper) HandleCommitConfirm() error { | ||||
| 	summary, description := self.getCommitSummary(), self.getCommitDescription() | ||||
|  | ||||
| 	if summary == "" { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CommitWithoutMessageErr) | ||||
| 		return errors.New(self.c.Tr.CommitWithoutMessageErr) | ||||
| 	} | ||||
|  | ||||
| 	err := self.c.Contexts().CommitMessage.OnConfirm(summary, description) | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"regexp" | ||||
| 	"strings" | ||||
| 	"sync" | ||||
| @@ -36,19 +38,19 @@ func (self *FixupHelper) HandleFindBaseCommitForFixupPress() error { | ||||
| 		return err | ||||
| 	} | ||||
| 	if diff == "" { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.NoChangedFiles) | ||||
| 		return errors.New(self.c.Tr.NoChangedFiles) | ||||
| 	} | ||||
|  | ||||
| 	deletedLineInfos, hasHunksWithOnlyAddedLines := self.parseDiff(diff) | ||||
| 	if len(deletedLineInfos) == 0 { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.NoDeletedLinesInDiff) | ||||
| 		return errors.New(self.c.Tr.NoDeletedLinesInDiff) | ||||
| 	} | ||||
|  | ||||
| 	hashes := self.blameDeletedLines(deletedLineInfos) | ||||
|  | ||||
| 	if len(hashes) == 0 { | ||||
| 		// This should never happen | ||||
| 		return self.c.ErrorMsg(self.c.Tr.NoBaseCommitsFound) | ||||
| 		return errors.New(self.c.Tr.NoBaseCommitsFound) | ||||
| 	} | ||||
| 	if len(hashes) > 1 { | ||||
| 		subjects, err := self.c.Git().Commit.GetHashesAndCommitMessagesFirstLine(hashes) | ||||
| @@ -58,7 +60,7 @@ func (self *FixupHelper) HandleFindBaseCommitForFixupPress() error { | ||||
| 		message := lo.Ternary(hasStagedChanges, | ||||
| 			self.c.Tr.MultipleBaseCommitsFoundStaged, | ||||
| 			self.c.Tr.MultipleBaseCommitsFoundUnstaged) | ||||
| 		return self.c.ErrorMsg(message + "\n\n" + subjects) | ||||
| 		return fmt.Errorf("%s\n\n%s", message, subjects) | ||||
| 	} | ||||
|  | ||||
| 	commit, index, ok := lo.FindIndexOf(self.c.Model().Commits, func(commit *models.Commit) bool { | ||||
| @@ -70,13 +72,13 @@ func (self *FixupHelper) HandleFindBaseCommitForFixupPress() error { | ||||
| 			// If the commit is not found, it's most likely because it's already | ||||
| 			// merged, and more than 300 commits away. Check if the last known | ||||
| 			// commit is already merged; if so, show the "already merged" error. | ||||
| 			return self.c.ErrorMsg(self.c.Tr.BaseCommitIsAlreadyOnMainBranch) | ||||
| 			return errors.New(self.c.Tr.BaseCommitIsAlreadyOnMainBranch) | ||||
| 		} | ||||
| 		// If we get here, the current branch must have more then 300 commits. Unlikely... | ||||
| 		return self.c.ErrorMsg(self.c.Tr.BaseCommitIsNotInCurrentView) | ||||
| 		return errors.New(self.c.Tr.BaseCommitIsNotInCurrentView) | ||||
| 	} | ||||
| 	if commit.Status == models.StatusMerged { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.BaseCommitIsAlreadyOnMainBranch) | ||||
| 		return errors.New(self.c.Tr.BaseCommitIsAlreadyOnMainBranch) | ||||
| 	} | ||||
|  | ||||
| 	doIt := func() error { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| @@ -78,7 +79,7 @@ func (self *MergeAndRebaseHelper) genericMergeCommand(command string) error { | ||||
| 	status := self.c.Git().Status.WorkingTreeState() | ||||
|  | ||||
| 	if status != enums.REBASE_MODE_MERGING && status != enums.REBASE_MODE_REBASING { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.NotMergingOrRebasing) | ||||
| 		return errors.New(self.c.Tr.NotMergingOrRebasing) | ||||
| 	} | ||||
|  | ||||
| 	self.c.LogAction(fmt.Sprintf("Merge/Rebase: %s", command)) | ||||
| @@ -169,9 +170,9 @@ func (self *MergeAndRebaseHelper) CheckForConflicts(result error) error { | ||||
|  | ||||
| 	if isMergeConflictErr(result.Error()) { | ||||
| 		return self.PromptForConflictHandling() | ||||
| 	} else { | ||||
| 		return self.c.ErrorMsg(result.Error()) | ||||
| 	} | ||||
|  | ||||
| 	return result | ||||
| } | ||||
|  | ||||
| func (self *MergeAndRebaseHelper) PromptForConflictHandling() error { | ||||
| @@ -298,11 +299,11 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error { | ||||
|  | ||||
| func (self *MergeAndRebaseHelper) MergeRefIntoCheckedOutBranch(refName string) error { | ||||
| 	if self.c.Git().Branch.IsHeadDetached() { | ||||
| 		return self.c.ErrorMsg("Cannot merge branch in detached head state. You might have checked out a commit directly or a remote branch, in which case you should checkout the local branch you want to be on") | ||||
| 		return errors.New("Cannot merge branch in detached head state. You might have checked out a commit directly or a remote branch, in which case you should checkout the local branch you want to be on") | ||||
| 	} | ||||
| 	checkedOutBranchName := self.refsHelper.GetCheckedOutRef().Name | ||||
| 	if checkedOutBranchName == refName { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CantMergeBranchIntoItself) | ||||
| 		return errors.New(self.c.Tr.CantMergeBranchIntoItself) | ||||
| 	} | ||||
| 	prompt := utils.ResolvePlaceholderString( | ||||
| 		self.c.Tr.ConfirmMerge, | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/commands/types/enums" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/patch_exploring" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/types" | ||||
| @@ -24,7 +26,7 @@ func NewPatchBuildingHelper( | ||||
|  | ||||
| func (self *PatchBuildingHelper) ValidateNormalWorkingTreeState() (bool, error) { | ||||
| 	if self.c.Git().Status.WorkingTreeState() != enums.REBASE_MODE_NONE { | ||||
| 		return false, self.c.ErrorMsg(self.c.Tr.CantPatchWhileRebasingError) | ||||
| 		return false, errors.New(self.c.Tr.CantPatchWhileRebasingError) | ||||
| 	} | ||||
| 	return true, nil | ||||
| } | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"os" | ||||
| 	"path/filepath" | ||||
| @@ -156,7 +157,7 @@ func (self *ReposHelper) DispatchSwitchTo(path string, errMsg string, contextKey | ||||
|  | ||||
| 		if err := os.Chdir(path); err != nil { | ||||
| 			if os.IsNotExist(err) { | ||||
| 				return self.c.ErrorMsg(errMsg) | ||||
| 				return errors.New(errMsg) | ||||
| 			} | ||||
| 			return err | ||||
| 		} | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| @@ -39,7 +40,7 @@ func (self *SnakeHelper) renderSnakeGame(cells [][]snake.CellType, alive bool) { | ||||
| 	view := self.c.Views().Snake | ||||
|  | ||||
| 	if !alive { | ||||
| 		_ = self.c.ErrorMsg(self.c.Tr.YouDied) | ||||
| 		self.c.OnUIThread(func() error { return errors.New(self.c.Tr.YouDied) }) | ||||
| 		return | ||||
| 	} | ||||
|  | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/types" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/updates" | ||||
| @@ -44,7 +46,7 @@ func (self *UpdateHelper) CheckForUpdateInForeground() error { | ||||
| 				return err | ||||
| 			} | ||||
| 			if newVersion == "" { | ||||
| 				return self.c.ErrorMsg(self.c.Tr.FailedToRetrieveLatestVersionErr) | ||||
| 				return errors.New(self.c.Tr.FailedToRetrieveLatestVersionErr) | ||||
| 			} | ||||
| 			return self.showUpdatePrompt(newVersion) | ||||
| 		}, true) | ||||
| @@ -71,7 +73,7 @@ func (self *UpdateHelper) onUpdateFinish(err error) error { | ||||
| 					"errMessage": err.Error(), | ||||
| 				}, | ||||
| 			) | ||||
| 			return self.c.ErrorMsg(errMessage) | ||||
| 			return errors.New(errMessage) | ||||
| 		} | ||||
| 		return self.c.Alert(self.c.Tr.UpdateCompletedTitle, self.c.Tr.UpdateCompleted) | ||||
| 	}) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"regexp" | ||||
|  | ||||
| @@ -137,7 +138,7 @@ func (self *WorkingTreeHelper) HandleCommitEditorPress() error { | ||||
| func (self *WorkingTreeHelper) HandleWIPCommitPress() error { | ||||
| 	skipHookPrefix := self.c.UserConfig.Git.SkipHookPrefix | ||||
| 	if skipHookPrefix == "" { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.SkipHookPrefixNotConfigured) | ||||
| 		return errors.New(self.c.Tr.SkipHookPrefixNotConfigured) | ||||
| 	} | ||||
|  | ||||
| 	return self.HandleCommitPressWithMessage(skipHookPrefix) | ||||
| @@ -153,7 +154,7 @@ func (self *WorkingTreeHelper) HandleCommitPress() error { | ||||
| 			prefixReplace := commitPrefixConfig.Replace | ||||
| 			rgx, err := regexp.Compile(prefixPattern) | ||||
| 			if err != nil { | ||||
| 				return self.c.ErrorMsg(fmt.Sprintf("%s: %s", self.c.Tr.CommitPrefixPatternError, err.Error())) | ||||
| 				return fmt.Errorf("%s: %s", self.c.Tr.CommitPrefixPatternError, err.Error()) | ||||
| 			} | ||||
| 			prefix := rgx.ReplaceAllString(self.refHelper.GetCheckedOutRef().Name, prefixReplace) | ||||
| 			message = prefix | ||||
| @@ -169,7 +170,7 @@ func (self *WorkingTreeHelper) WithEnsureCommitableFiles(handler func() error) e | ||||
| 	} | ||||
|  | ||||
| 	if len(self.c.Model().Files) == 0 { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.NoFilesStagedTitle) | ||||
| 		return errors.New(self.c.Tr.NoFilesStagedTitle) | ||||
| 	} | ||||
|  | ||||
| 	if !self.AnyStagedFiles() { | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package helpers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"strings" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| @@ -139,7 +140,7 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase boo | ||||
| 					Title: self.c.Tr.NewBranchName, | ||||
| 					HandleConfirm: func(branchName string) error { | ||||
| 						if branchName == "" { | ||||
| 							return self.c.ErrorMsg(self.c.Tr.BranchNameCannotBeBlank) | ||||
| 							return errors.New(self.c.Tr.BranchNameCannotBeBlank) | ||||
| 						} | ||||
|  | ||||
| 						opts.Branch = branchName | ||||
| @@ -154,7 +155,7 @@ func (self *WorktreeHelper) NewWorktreeCheckout(base string, canCheckoutBase boo | ||||
|  | ||||
| func (self *WorktreeHelper) Switch(worktree *models.Worktree, contextKey types.ContextKey) error { | ||||
| 	if worktree.IsCurrent { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.AlreadyInWorktree) | ||||
| 		return errors.New(self.c.Tr.AlreadyInWorktree) | ||||
| 	} | ||||
|  | ||||
| 	self.c.LogAction(self.c.Tr.SwitchToWorktree) | ||||
| @@ -192,7 +193,7 @@ func (self *WorktreeHelper) Remove(worktree *models.Worktree, force bool) error | ||||
| 					if !force { | ||||
| 						return self.Remove(worktree, true) | ||||
| 					} | ||||
| 					return self.c.ErrorMsg(errMessage) | ||||
| 					return err | ||||
| 				} | ||||
| 				return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.WORKTREES, types.BRANCHES, types.FILES}}) | ||||
| 			}) | ||||
|   | ||||
| @@ -1,6 +1,10 @@ | ||||
| package controllers | ||||
|  | ||||
| import "github.com/jesseduffield/lazygit/pkg/gui/types" | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/types" | ||||
| ) | ||||
|  | ||||
| // Embed this into your list controller to get some convenience methods for | ||||
| // ensuring a single item is selected, etc. | ||||
| @@ -106,7 +110,7 @@ func (self *ListControllerTrait[T]) withItem(callback func(T) error) func() erro | ||||
| 		var zeroValue T | ||||
| 		commit := self.getSelectedItem() | ||||
| 		if commit == zeroValue { | ||||
| 			return self.c.ErrorMsg(self.c.Tr.NoItemSelected) | ||||
| 			return errors.New(self.c.Tr.NoItemSelected) | ||||
| 		} | ||||
|  | ||||
| 		return callback(commit) | ||||
| @@ -117,7 +121,7 @@ func (self *ListControllerTrait[T]) withItems(callback func([]T) error) func() e | ||||
| 	return func() error { | ||||
| 		items, _, _ := self.getSelectedItems() | ||||
| 		if len(items) == 0 { | ||||
| 			return self.c.ErrorMsg(self.c.Tr.NoItemSelected) | ||||
| 			return errors.New(self.c.Tr.NoItemSelected) | ||||
| 		} | ||||
|  | ||||
| 		return callback(items) | ||||
| @@ -129,7 +133,7 @@ func (self *ListControllerTrait[T]) withItemsRange(callback func([]T, int, int) | ||||
| 	return func() error { | ||||
| 		items, startIdx, endIdx := self.getSelectedItems() | ||||
| 		if len(items) == 0 { | ||||
| 			return self.c.ErrorMsg(self.c.Tr.NoItemSelected) | ||||
| 			return errors.New(self.c.Tr.NoItemSelected) | ||||
| 		} | ||||
|  | ||||
| 		return callback(items, startIdx, endIdx) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
|  | ||||
| @@ -197,7 +198,7 @@ func (self *SyncController) pushAux(currentBranch *models.Branch, opts pushOpts) | ||||
| 			}) | ||||
| 		if err != nil { | ||||
| 			if strings.Contains(err.Error(), "Updates were rejected") { | ||||
| 				return self.c.ErrorMsg(self.c.Tr.UpdatesRejected) | ||||
| 				return errors.New(self.c.Tr.UpdatesRejected) | ||||
| 			} | ||||
| 			return err | ||||
| 		} | ||||
| @@ -208,7 +209,7 @@ func (self *SyncController) pushAux(currentBranch *models.Branch, opts pushOpts) | ||||
| func (self *SyncController) requestToForcePush(currentBranch *models.Branch, opts pushOpts) error { | ||||
| 	forcePushDisabled := self.c.UserConfig.Git.DisableForcePushing | ||||
| 	if forcePushDisabled { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.ForcePushDisabled) | ||||
| 		return errors.New(self.c.Tr.ForcePushDisabled) | ||||
| 	} | ||||
|  | ||||
| 	return self.c.Confirm(types.ConfirmOpts{ | ||||
|   | ||||
| @@ -1,6 +1,8 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
|  | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/context" | ||||
| 	"github.com/jesseduffield/lazygit/pkg/gui/types" | ||||
| 	"github.com/samber/lo" | ||||
| @@ -20,7 +22,7 @@ func (self *ToggleWhitespaceAction) Call() error { | ||||
| 	if lo.Contains(contextsThatDontSupportIgnoringWhitespace, self.c.CurrentContext().GetKey()) { | ||||
| 		// Ignoring whitespace is not supported in these views. Let the user | ||||
| 		// know that it's not going to work in case they try to turn it on. | ||||
| 		return self.c.ErrorMsg(self.c.Tr.IgnoreWhitespaceNotSupportedHere) | ||||
| 		return errors.New(self.c.Tr.IgnoreWhitespaceNotSupportedHere) | ||||
| 	} | ||||
|  | ||||
| 	self.c.GetAppState().IgnoreWhitespaceInDiffView = !self.c.GetAppState().IgnoreWhitespaceInDiffView | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| @@ -78,7 +79,7 @@ func (self *UndoController) reflogUndo() error { | ||||
| 	undoingStatus := self.c.Tr.UndoingStatus | ||||
|  | ||||
| 	if self.c.Git().Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CantUndoWhileRebasing) | ||||
| 		return errors.New(self.c.Tr.CantUndoWhileRebasing) | ||||
| 	} | ||||
|  | ||||
| 	return self.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { | ||||
| @@ -126,7 +127,7 @@ func (self *UndoController) reflogRedo() error { | ||||
| 	redoingStatus := self.c.Tr.RedoingStatus | ||||
|  | ||||
| 	if self.c.Git().Status.WorkingTreeState() == enums.REBASE_MODE_REBASING { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CantRedoWhileRebasing) | ||||
| 		return errors.New(self.c.Tr.CantRedoWhileRebasing) | ||||
| 	} | ||||
|  | ||||
| 	return self.parseReflogForActions(func(counter int, action reflogAction) (bool, error) { | ||||
|   | ||||
| @@ -2,6 +2,7 @@ package controllers | ||||
|  | ||||
| import ( | ||||
| 	"bytes" | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"math" | ||||
| 	"math/rand" | ||||
| @@ -88,7 +89,7 @@ func (self *FilesController) createResetMenu() error { | ||||
| 			OnPress: func() error { | ||||
| 				self.c.LogAction(self.c.Tr.Actions.RemoveStagedFiles) | ||||
| 				if !self.c.Helpers().WorkingTree.IsWorkingTreeDirty() { | ||||
| 					return self.c.ErrorMsg(self.c.Tr.NoTrackedStagedFilesStash) | ||||
| 					return errors.New(self.c.Tr.NoTrackedStagedFilesStash) | ||||
| 				} | ||||
| 				if err := self.c.Git().Stash.SaveStagedChanges("[lazygit] tmp stash"); err != nil { | ||||
| 					return err | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package controllers | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"text/tabwriter" | ||||
| @@ -117,11 +118,11 @@ func (self *WorktreesController) add() error { | ||||
|  | ||||
| func (self *WorktreesController) remove(worktree *models.Worktree) error { | ||||
| 	if worktree.IsMain { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CantDeleteMainWorktree) | ||||
| 		return errors.New(self.c.Tr.CantDeleteMainWorktree) | ||||
| 	} | ||||
|  | ||||
| 	if worktree.IsCurrent { | ||||
| 		return self.c.ErrorMsg(self.c.Tr.CantDeleteCurrentWorktree) | ||||
| 		return errors.New(self.c.Tr.CantDeleteCurrentWorktree) | ||||
| 	} | ||||
|  | ||||
| 	return self.c.Helpers().Worktree.Remove(worktree, false) | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package gui | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"log" | ||||
|  | ||||
| 	"github.com/jesseduffield/gocui" | ||||
| @@ -442,7 +443,7 @@ func (gui *Gui) callKeybindingHandler(binding *types.Binding) error { | ||||
| 	} | ||||
| 	if disabledReason != nil { | ||||
| 		if disabledReason.ShowErrorInPanel { | ||||
| 			return gui.c.ErrorMsg(disabledReason.Text) | ||||
| 			return errors.New(disabledReason.Text) | ||||
| 		} | ||||
|  | ||||
| 		gui.c.ErrorToast(gui.Tr.DisabledMenuItemPrefix + disabledReason.Text) | ||||
|   | ||||
| @@ -80,12 +80,8 @@ func (self *PopupHandler) WithWaitingStatusSync(message string, f func() error) | ||||
| } | ||||
|  | ||||
| func (self *PopupHandler) ErrorHandler(err error) error { | ||||
| 	return self.ErrorMsg(err.Error()) | ||||
| } | ||||
|  | ||||
| func (self *PopupHandler) ErrorMsg(message string) error { | ||||
| 	// Need to set bold here explicitly; otherwise it gets cancelled by the red colouring. | ||||
| 	coloredMessage := style.FgRed.SetBold().Sprint(strings.TrimSpace(message)) | ||||
| 	coloredMessage := style.FgRed.SetBold().Sprint(strings.TrimSpace(err.Error())) | ||||
| 	if err := self.onErrorFn(); err != nil { | ||||
| 		return err | ||||
| 	} | ||||
|   | ||||
| @@ -1,6 +1,7 @@ | ||||
| package custom_commands | ||||
|  | ||||
| import ( | ||||
| 	"errors" | ||||
| 	"fmt" | ||||
| 	"strings" | ||||
| 	"text/template" | ||||
| @@ -103,7 +104,7 @@ func (self *HandlerCreator) call(customCommand config.CustomCommand) func() erro | ||||
| 					return self.confirmPrompt(resolvedPrompt, g) | ||||
| 				} | ||||
| 			default: | ||||
| 				return self.c.ErrorMsg("custom command prompt must have a type of 'input', 'menu', 'menuFromCommand', or 'confirm'") | ||||
| 				return errors.New("custom command prompt must have a type of 'input', 'menu', 'menuFromCommand', or 'confirm'") | ||||
| 			} | ||||
| 		} | ||||
|  | ||||
|   | ||||
| @@ -131,10 +131,6 @@ type IModeMgr interface { | ||||
| } | ||||
|  | ||||
| type IPopupHandler interface { | ||||
| 	// Shows a popup with a (localized) "Error" caption and the given error message (in red). | ||||
| 	// | ||||
| 	// This is a convenience wrapper around Alert(). | ||||
| 	ErrorMsg(message string) error | ||||
| 	// The global error handler for gocui. Not to be used by application code. | ||||
| 	ErrorHandler(err error) error | ||||
| 	// Shows a notification popup with the given title and message to the user. | ||||
|   | ||||
		Reference in New Issue
	
	Block a user