Skip to content

Commit a8921a1

Browse files
committed
Add command "Rebase onto base branch" to rebase menu
1 parent 837f745 commit a8921a1

File tree

4 files changed

+98
-4
lines changed

4 files changed

+98
-4
lines changed

pkg/gui/controllers/helpers/merge_and_rebase_helper.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -234,11 +234,22 @@ func (self *MergeAndRebaseHelper) PromptToContinueRebase() error {
234234
}
235235

236236
func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
237-
checkedOutBranch := self.refsHelper.GetCheckedOutRef().Name
238-
var disabledReason *types.DisabledReason
239-
if checkedOutBranch == ref {
237+
checkedOutBranch := self.refsHelper.GetCheckedOutRef()
238+
checkedOutBranchName := self.refsHelper.GetCheckedOutRef().Name
239+
var disabledReason, baseBranchDisabledReason *types.DisabledReason
240+
if checkedOutBranchName == ref {
240241
disabledReason = &types.DisabledReason{Text: self.c.Tr.CantRebaseOntoSelf}
241242
}
243+
244+
baseBranch, err := self.c.Git().Loaders.BranchLoader.GetBaseBranch(checkedOutBranch, self.refsHelper.c.Model().MainBranches)
245+
if err != nil {
246+
return err
247+
}
248+
if baseBranch == "" {
249+
baseBranch = self.c.Tr.CouldNotDetermineBaseBranch
250+
baseBranchDisabledReason = &types.DisabledReason{Text: self.c.Tr.CouldNotDetermineBaseBranch}
251+
}
252+
242253
menuItems := []*types.MenuItem{
243254
{
244255
Label: utils.ResolvePlaceholderString(self.c.Tr.SimpleRebase,
@@ -289,14 +300,39 @@ func (self *MergeAndRebaseHelper) RebaseOntoRef(ref string) error {
289300
return self.c.PushContext(self.c.Contexts().LocalCommits)
290301
},
291302
},
303+
{
304+
Label: utils.ResolvePlaceholderString(self.c.Tr.RebaseOntoBaseBranch,
305+
map[string]string{"baseBranch": ShortBranchName(baseBranch)},
306+
),
307+
Key: 'b',
308+
DisabledReason: baseBranchDisabledReason,
309+
Tooltip: self.c.Tr.RebaseOntoBaseBranchTooltip,
310+
OnPress: func() error {
311+
self.c.LogAction(self.c.Tr.Actions.RebaseBranch)
312+
return self.c.WithWaitingStatus(self.c.Tr.RebasingStatus, func(task gocui.Task) error {
313+
baseCommit := self.c.Modes().MarkedBaseCommit.GetHash()
314+
var err error
315+
if baseCommit != "" {
316+
err = self.c.Git().Rebase.RebaseBranchFromBaseCommit(baseBranch, baseCommit)
317+
} else {
318+
err = self.c.Git().Rebase.RebaseBranch(baseBranch)
319+
}
320+
err = self.CheckMergeOrRebase(err)
321+
if err == nil {
322+
return self.ResetMarkedBaseCommit()
323+
}
324+
return err
325+
})
326+
},
327+
},
292328
}
293329

294330
title := utils.ResolvePlaceholderString(
295331
lo.Ternary(self.c.Modes().MarkedBaseCommit.GetHash() != "",
296332
self.c.Tr.RebasingFromBaseCommitTitle,
297333
self.c.Tr.RebasingTitle),
298334
map[string]string{
299-
"checkedOutBranch": checkedOutBranch,
335+
"checkedOutBranch": checkedOutBranchName,
300336
},
301337
)
302338

pkg/i18n/english.go

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -289,7 +289,9 @@ type TranslationSet struct {
289289
RebasingFromBaseCommitTitle string
290290
SimpleRebase string
291291
InteractiveRebase string
292+
RebaseOntoBaseBranch string
292293
InteractiveRebaseTooltip string
294+
RebaseOntoBaseBranchTooltip string
293295
MustSelectTodoCommits string
294296
ConfirmMerge string
295297
FwdNoUpstream string
@@ -1257,7 +1259,9 @@ func EnglishTranslationSet() TranslationSet {
12571259
RebasingFromBaseCommitTitle: "Rebase '{{.checkedOutBranch}}' from marked base",
12581260
SimpleRebase: "Simple rebase onto '{{.ref}}'",
12591261
InteractiveRebase: "Interactive rebase onto '{{.ref}}'",
1262+
RebaseOntoBaseBranch: "Rebase onto base branch ({{.baseBranch}})",
12601263
InteractiveRebaseTooltip: "Begin an interactive rebase with a break at the start, so you can update the TODO commits before continuing.",
1264+
RebaseOntoBaseBranchTooltip: "Rebase the checked out branch onto its base branch (i.e. the closest main branch).",
12611265
MustSelectTodoCommits: "When rebasing, this action only works on a selection of TODO commits.",
12621266
ConfirmMerge: "Are you sure you want to merge '{{.selectedBranch}}' into '{{.checkedOutBranch}}'?",
12631267
FwdNoUpstream: "Cannot fast-forward a branch with no upstream",
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
package branch
2+
3+
import (
4+
"github.com/jesseduffield/lazygit/pkg/config"
5+
. "github.com/jesseduffield/lazygit/pkg/integration/components"
6+
)
7+
8+
var RebaseOntoBaseBranch = NewIntegrationTest(NewIntegrationTestArgs{
9+
Description: "Rebase the current branch onto its base branch",
10+
ExtraCmdArgs: []string{},
11+
Skip: false,
12+
SetupConfig: func(config *config.AppConfig) {
13+
config.UserConfig.Gui.ShowDivergenceFromBaseBranch = "arrowAndNumber"
14+
},
15+
SetupRepo: func(shell *Shell) {
16+
shell.
17+
EmptyCommit("master 1").
18+
EmptyCommit("master 2").
19+
EmptyCommit("master 3").
20+
NewBranchFrom("feature", "master^").
21+
EmptyCommit("feature 1").
22+
EmptyCommit("feature 2")
23+
},
24+
Run: func(t *TestDriver, keys config.KeybindingConfig) {
25+
t.Views().Commits().Lines(
26+
Contains("feature 2"),
27+
Contains("feature 1"),
28+
Contains("master 2"),
29+
Contains("master 1"),
30+
)
31+
32+
t.Views().Branches().
33+
Focus().
34+
Lines(
35+
Contains("feature ↓1").IsSelected(),
36+
Contains("master"),
37+
).
38+
Press(keys.Branches.RebaseBranch)
39+
40+
t.ExpectPopup().Menu().
41+
Title(Equals("Rebase 'feature'")).
42+
Select(Contains("Rebase onto base branch (master)")).
43+
Confirm()
44+
45+
t.Views().Commits().Lines(
46+
Contains("feature 2"),
47+
Contains("feature 1"),
48+
Contains("master 3"),
49+
Contains("master 2"),
50+
Contains("master 1"),
51+
)
52+
},
53+
})

pkg/integration/tests/test_list.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ var tests = []*components.IntegrationTest{
5151
branch.RebaseCopiedBranch,
5252
branch.RebaseDoesNotAutosquash,
5353
branch.RebaseFromMarkedBase,
54+
branch.RebaseOntoBaseBranch,
5455
branch.RebaseToUpstream,
5556
branch.Rename,
5657
branch.Reset,

0 commit comments

Comments
 (0)