summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/branches_controller.go
diff options
context:
space:
mode:
Diffstat (limited to 'pkg/gui/controllers/branches_controller.go')
-rw-r--r--pkg/gui/controllers/branches_controller.go218
1 files changed, 109 insertions, 109 deletions
diff --git a/pkg/gui/controllers/branches_controller.go b/pkg/gui/controllers/branches_controller.go
index 1dc1f77e8..3c18b955c 100644
--- a/pkg/gui/controllers/branches_controller.go
+++ b/pkg/gui/controllers/branches_controller.go
@@ -12,6 +12,7 @@ import (
"github.com/jesseduffield/lazygit/pkg/gui/controllers/helpers"
"github.com/jesseduffield/lazygit/pkg/gui/types"
"github.com/jesseduffield/lazygit/pkg/utils"
+ "github.com/samber/lo"
)
type BranchesController struct {
@@ -75,9 +76,10 @@ func (self *BranchesController) GetKeybindings(opts types.KeybindingsOpts) []*ty
OpensMenu: true,
},
{
- Key: opts.GetKey(opts.Config.Branches.RebaseBranch),
- Handler: opts.Guards.OutsideFilterMode(self.rebase),
- Description: self.c.Tr.RebaseBranch,
+ Key: opts.GetKey(opts.Config.Branches.RebaseBranch),
+ Handler: opts.Guards.OutsideFilterMode(self.rebase),
+ Description: self.c.Tr.RebaseBranch,
+ GetDisabledReason: self.getDisabledReasonForRebase,
},
{
Key: opts.GetKey(opts.Config.Branches.MergeIntoCurrentBranch),
@@ -140,32 +142,55 @@ func (self *BranchesController) GetOnRenderToMain() func() error {
}
func (self *BranchesController) setUpstream(selectedBranch *models.Branch) error {
- options := []*types.MenuItem{
- {
- LabelColumns: []string{self.c.Tr.ViewDivergenceFromUpstream},
- OnPress: func() error {
- branch := self.context().GetSelected()
- if branch == nil {
- return nil
- }
+ viewDivergenceItem := &types.MenuItem{
+ LabelColumns: []string{self.c.Tr.ViewDivergenceFromUpstream},
+ OnPress: func() error {
+ branch := self.context().GetSelected()
+ if branch == nil {
+ return nil
+ }
- if !branch.RemoteBranchStoredLocally() {
- return self.c.ErrorMsg(self.c.Tr.DivergenceNoUpstream)
- }
- return self.c.Helpers().SubCommits.ViewSubCommits(helpers.ViewSubCommitsOpts{
- Ref: branch,
- TitleRef: fmt.Sprintf("%s <-> %s", branch.RefName(), branch.ShortUpstreamRefName()),
- RefToShowDivergenceFrom: branch.FullUpstreamRefName(),
- Context: self.context(),
- ShowBranchHeads: false,
- })
- },
- Key: 'v',
+ return self.c.Helpers().SubCommits.ViewSubCommits(helpers.ViewSubCommitsOpts{
+ Ref: branch,
+ TitleRef: fmt.Sprintf("%s <-> %s", branch.RefName(), branch.ShortUpstreamRefName()),
+ RefToShowDivergenceFrom: branch.FullUpstreamRefName(),
+ Context: self.context(),
+ ShowBranchHeads: false,
+ })
},
- {
- LabelColumns: []string{self.c.Tr.UnsetUpstream},
- OnPress: func() error {
- if err := self.c.Git().Branch.UnsetUpstream(selectedBranch.Name); err != nil {
+ Key: 'v',
+ }
+
+ unsetUpstreamItem := &types.MenuItem{
+ LabelColumns: []string{self.c.Tr.UnsetUpstream},
+ OnPress: func() error {
+ if err := self.c.Git().Branch.UnsetUpstream(selectedBranch.Name); err != nil {
+ return self.c.Error(err)
+ }
+ if err := self.c.Refresh(types.RefreshOptions{
+ Mode: types.SYNC,
+ Scope: []types.RefreshableView{
+ types.BRANCHES,
+ types.COMMITS,
+ },
+ }); err != nil {
+ return self.c.Error(err)
+ }
+ return nil
+ },
+ Key: 'u',
+ }
+
+ setUpstreamItem := &types.MenuItem{
+ LabelColumns: []string{self.c.Tr.SetUpstream},
+ OnPress: func() error {
+ return self.c.Helpers().Upstream.PromptForUpstreamWithoutInitialContent(selectedBranch, func(upstream string) error {
+ upstreamRemote, upstreamBranch, err := self.c.Helpers().Upstream.ParseUpstream(upstream)
+ if err != nil {
+ return self.c.Error(err)
+ }
+
+ if err := self.c.Git().Branch.SetUpstream(upstreamRemote, upstreamBranch, selectedBranch.Name); err != nil {
return self.c.Error(err)
}
if err := self.c.Refresh(types.RefreshOptions{
@@ -178,75 +203,48 @@ func (self *BranchesController) setUpstream(selectedBranch *models.Branch) error
return self.c.Error(err)
}
return nil
- },
- Key: 'u',
+ })
},
- {
- LabelColumns: []string{self.c.Tr.SetUpstream},
- OnPress: func() error {
- return self.c.Helpers().Upstream.PromptForUpstreamWithoutInitialContent(selectedBranch, func(upstream string) error {
- upstreamRemote, upstreamBranch, err := self.c.Helpers().Upstream.ParseUpstream(upstream)
- if err != nil {
- return self.c.Error(err)
- }
+ Key: 's',
+ }
- if err := self.c.Git().Branch.SetUpstream(upstreamRemote, upstreamBranch, selectedBranch.Name); err != nil {
- return self.c.Error(err)
- }
- if err := self.c.Refresh(types.RefreshOptions{
- Mode: types.SYNC,
- Scope: []types.RefreshableView{
- types.BRANCHES,
- types.COMMITS,
- },
- }); err != nil {
- return self.c.Error(err)
- }
- return nil
- })
- },
- Key: 's',
+ upstream := lo.Ternary(selectedBranch.RemoteBranchStoredLocally(),
+ fmt.Sprintf("%s/%s", selectedBranch.UpstreamRemote, selectedBranch.Name),
+ self.c.Tr.UpstreamGenericName)
+ upstreamResetOptions := utils.ResolvePlaceholderString(
+ self.c.Tr.ViewUpstreamResetOptions,
+ map[string]string{"upstream": upstream},
+ )
+ upstreamResetTooltip := utils.ResolvePlaceholderString(
+ self.c.Tr.ViewUpstreamResetOptionsTooltip,
+ map[string]string{"upstream": upstream},
+ )
+
+ upstreamResetItem := &types.MenuItem{
+ LabelColumns: []string{upstreamResetOptions},
+ OpensMenu: true,
+ OnPress: func() error {
+ err := self.c.Helpers().Refs.CreateGitResetMenu(upstream)
+ if err != nil {
+ return self.c.Error(err)
+ }
+ return nil
},
+ Tooltip: upstreamResetTooltip,
+ Key: 'g',
}
- if selectedBranch.IsTrackingRemote() {
- upstream := fmt.Sprintf("%s/%s", selectedBranch.UpstreamRemote, selectedBranch.Name)
- upstreamResetOptions := utils.ResolvePlaceholderString(
- self.c.Tr.ViewUpstreamResetOptions,
- map[string]string{"upstream": upstream},
- )
- upstreamResetTooltip := utils.ResolvePlaceholderString(
- self.c.Tr.ViewUpstreamResetOptionsTooltip,
- map[string]string{"upstream": upstream},
- )
-
- options = append(options, &types.MenuItem{
- LabelColumns: []string{upstreamResetOptions},
- OpensMenu: true,
- OnPress: func() error {
- if selectedBranch.RemoteBranchNotStoredLocally() {
- return self.c.ErrorMsg(self.c.Tr.UpstreamNotStoredLocallyError)
- }
+ if !selectedBranch.RemoteBranchStoredLocally() {
+ viewDivergenceItem.DisabledReason = self.c.Tr.UpstreamNotSetError
+ unsetUpstreamItem.DisabledReason = self.c.Tr.UpstreamNotSetError
+ upstreamResetItem.DisabledReason = self.c.Tr.UpstreamNotSetError
+ }
- err := self.c.Helpers().Refs.CreateGitResetMenu(upstream)
- if err != nil {
- return self.c.Error(err)
- }
- return nil
- },
- Tooltip: upstreamResetTooltip,
- Key: 'g',
- })
- } else {
- options = append(options, &types.MenuItem{
- LabelColumns: []string{self.c.Tr.ViewUpstreamDisabledResetOptions},
- OpensMenu: true,
- OnPress: func() error {
- return self.c.ErrorMsg(self.c.Tr.UpstreamNotSetError)
- },
- Tooltip: self.c.Tr.UpstreamNotSetError,
- Key: 'g',
- })
+ options := []*types.MenuItem{
+ viewDivergenceItem,
+ unsetUpstreamItem,
+ setUpstreamItem,
+ upstreamResetItem,
}
return self.c.Menu(types.CreateMenuOptions{
@@ -468,7 +466,6 @@ func (self *BranchesController) forceDelete(branch *models.Branch) error {
}
func (self *BranchesController) delete(branch *models.Branch) error {
- menuItems := []*types.MenuItem{}
checkedOutBranch := self.c.Helpers().Refs.GetCheckedOutRef()
localDeleteItem := &types.MenuItem{
@@ -479,25 +476,18 @@ func (self *BranchesController) delete(branch *models.Branch) error {
},
}
if checkedOutBranch.Name == branch.Name {
- localDeleteItem = &types.MenuItem{
- Label: self.c.Tr.DeleteLocalBranch,
- Key: 'c',
- Tooltip: self.c.Tr.CantDeleteCheckOutBranch,
- OnPress: func() error {
- return self.c.ErrorMsg(self.c.Tr.CantDeleteCheckOutBranch)
- },
- }
+ localDeleteItem.DisabledReason = self.c.Tr.CantDeleteCheckOutBranch
}
- menuItems = append(menuItems, localDeleteItem)
- if branch.IsTrackingRemote() && !branch.UpstreamGone {
- menuItems = append(menuItems, &types.MenuItem{
- Label: self.c.Tr.DeleteRemoteBranch,
- Key: 'r',
- OnPress: func() error {
- return self.remoteDelete(branch)
- },
- })
+ remoteDeleteItem := &types.MenuItem{
+ Label: self.c.Tr.DeleteRemoteBranch,
+ Key: 'r',
+ OnPress: func() error {
+ return self.remoteDelete(branch)
+ },
+ }
+ if !branch.IsTrackingRemote() || branch.UpstreamGone {
+ remoteDeleteItem.DisabledReason = self.c.Tr.UpstreamNotSetError
}
menuTitle := utils.ResolvePlaceholderString(
@@ -509,7 +499,7 @@ func (self *BranchesController) delete(branch *models.Branch) error {
return self.c.Menu(types.CreateMenuOptions{
Title: menuTitle,
- Items: menuItems,
+ Items: []*types.MenuItem{localDeleteItem, remoteDeleteItem},
})
}
@@ -523,6 +513,16 @@ func (self *BranchesController) rebase() error {
return self.c.Helpers().MergeAndRebase.RebaseOntoRef(selectedBranchName)
}
+func (self *BranchesController) getDisabledReasonForRebase() string {
+ selectedBranchName := self.context().GetSelected().Name
+ checkedOutBranch := self.c.Helpers().Refs.GetCheckedOutRef().Name
+ if selectedBranchName == checkedOutBranch {
+ return self.c.Tr.CantRebaseOntoSelf
+ }
+
+ return ""
+}
+
func (self *BranchesController) fastForward(branch *models.Branch) error {
if !branch.IsTrackingRemote() {
return self.c.ErrorMsg(self.c.Tr.FwdNoUpstream)