summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorStefan Haller <stefan@haller-berlin.de>2024-05-04 16:39:06 +0200
committerStefan Haller <stefan@haller-berlin.de>2024-05-16 21:06:58 +0200
commit5bb45d2f19a67d7a5ea4c2f59ca013d3d0e49594 (patch)
tree7dbadd0ab4c841277404c85a937d763af772d9a1
parente630771c7d8d5a831fa6c8c2bd6041c3f6be8254 (diff)
Add command "Rebase onto base branch" to rebase menurebase-onto-base-branch
-rw-r--r--pkg/gui/controllers/helpers/merge_and_rebase_helper.go44
-rw-r--r--pkg/i18n/english.go6
2 files changed, 46 insertions, 4 deletions
diff --git a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go
index 2ec315d62..e60173e4c 100644
--- a/pkg/gui/controllers/helpers/merge_and_rebase_helper.go
+++ b/pkg/gui/controllers/helpers/merge_and_rebase_helper.go
@@ -234,11 +234,22 @@ func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
}
func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
- checkedOutBranch := self.refsHelper.GetCheckedOutRef().Name
- var disabledReason *types.DisabledReason
- if checkedOutBranch == ref {
+ checkedOutBranch := self.refsHelper.GetCheckedOutRef()
+ checkedOutBranchName := self.refsHelper.GetCheckedOutRef().Name
+ var disabledReason, baseBranchDisabledReason *types.DisabledReason
+ if checkedOutBranchName == ref {
disabledReason = &types.DisabledReason{Text: self.c.Tr.CantRebaseOntoSelf}
}
+
+ baseBranch, err := self.c.Git().Loaders.BranchLoader.GetBaseBranch(checkedOutBranch, self.refsHelper.c.Model().ExistingMainBranches)
+ if err != nil {
+ return err
+ }
+ if baseBranch == "" {
+ baseBranch = self.c.Tr.CouldNotDetermineBaseBranch
+ baseBranchDisabledReason = &types.DisabledReason{Text: self.c.Tr.CouldNotDetermineBaseBranch}
+ }
+
menuItems := []*types.MenuItem{
{
Label: utils.ResolvePlaceholderString(self.c.Tr.SimpleRebase,
@@ -289,6 +300,31 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
return self.c.PushContext(self.c.Contexts().LocalCommits)
},
},
+ {
+ Label: utils.ResolvePlaceholderString(self.c.Tr.RebaseOntoBaseBranch,
+ map[string]string{"baseBranch": strings.TrimPrefix(baseBranch, "refs/remotes/")},
+ ),
+ Key: 'b',
+ DisabledReason: baseBranchDisabledReason,
+ Tooltip: self.c.Tr.RebaseOntoBaseBranchTooltip,
+ OnPress: func() error {
+ self.c.LogAction(self.c.Tr.Actions.RebaseBranch)
+ return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(task gocui.Task) error {
+ baseCommit := self.c.Modes().MarkedBaseCommit.GetHash()
+ var err error
+ if baseCommit != "" {
+ err = self.c.Git().Rebase.RebaseBranchFromBaseCommit(baseBranch, baseCommit)
+ } else {
+ err = self.c.Git().Rebase.RebaseBranch(baseBranch)
+ }
+ err = self.CheckMergeOrRebase(err)
+ if err == nil {
+ return self.ResetMarkedBaseCommit()
+ }
+ return err
+ })
+ },
+ },
}
title := utils.ResolvePlaceholderString(
@@ -296,7 +332,7 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
self.c.Tr.RebasingFromBaseCommitTitle,
self.c.Tr.RebasingTitle),
map[string]string{
- "checkedOutBranch": checkedOutBranch,
+ "checkedOutBranch": checkedOutBranchName,
},
)
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index eabd9f163..57d9bffb5 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -289,7 +289,9 @@ type TranslationSet struct {
RebasingFromBaseCommitTitle string
SimpleRebase string
InteractiveRebase string
+ RebaseOntoBaseBranch string
InteractiveRebaseTooltip string
+ RebaseOntoBaseBranchTooltip string
MustSelectTodoCommits string
ConfirmMerge string
FwdNoUpstream string
@@ -471,6 +473,7 @@ type TranslationSet struct {
ViewDivergenceFromBaseBranch string
NoMainBranches string
BaseBranch string
+ CouldNotDetermineBaseBranch string
DivergenceSectionHeaderLocal string
DivergenceSectionHeaderRemote string
ViewUpstreamResetOptions string
@@ -1257,7 +1260,9 @@ func EnglishTranslationSet() TranslationSet {
RebasingFromBaseCommitTitle: "Rebase '{{.checkedOutBranch}}' from marked base",
SimpleRebase: "Simple rebase onto '{{.ref}}'",
InteractiveRebase: "Interactive rebase onto '{{.ref}}'",
+ RebaseOntoBaseBranch: "Rebase onto base branch ({{.baseBranch}})",
InteractiveRebaseTooltip: "Begin an interactive rebase with a break at the start, so you can update the TODO commits before continuing.",
+ RebaseOntoBaseBranchTooltip: "Rebase the checked out branch onto its base branch (i.e. the closest main branch).",
MustSelectTodoCommits: "When rebasing, this action only works on a selection of TODO commits.",
ConfirmMerge: "Are you sure you want to merge '{{.selectedBranch}}' into '{{.checkedOutBranch}}'?",
FwdNoUpstream: "Cannot fast-forward a branch with no upstream",
@@ -1439,6 +1444,7 @@ func EnglishTranslationSet() TranslationSet {
ViewDivergenceFromBaseBranch: "View divergence from base branch ({{.baseBranch}})",
NoMainBranches: "There are no main branches",
BaseBranch: "base branch",
+ CouldNotDetermineBaseBranch: "couldn't determine base branch",
DivergenceSectionHeaderLocal: "Local",
DivergenceSectionHeaderRemote: "Remote",
ViewUpstreamResetOptions: "Reset checked-out branch onto {{.upstream}}",