1
0
mirror of https://github.com/jesseduffield/lazygit.git synced 2025-01-04 03:48:07 +02:00

Add fixup option into commits panel

This commit is contained in:
Ching-Hsuan Yen 2018-08-08 15:52:04 +08:00
parent 3f89b5bf71
commit d3abd9eab1
3 changed files with 55 additions and 0 deletions

View File

@ -65,6 +65,7 @@ func renderCommitsOptions(g *gocui.Gui) error {
"s": "squash down",
"r": "rename",
"g": "reset to this commit",
"f": "fixup commit",
"← → ↑ ↓": "navigate",
})
}
@ -105,6 +106,25 @@ func handleCommitSquashDown(g *gocui.Gui, v *gocui.View) error {
return handleCommitSelect(g, v)
}
func handleCommitFixup(g *gocui.Gui, v *gocui.View) error {
if len(state.Commits) == 1 {
return createErrorPanel(g, "You have no commits to squash with")
}
branch := state.Branches[0]
commit, err := getSelectedCommit(g)
if err != nil {
return err
}
if output, err := gitSquashFixupCommit(branch.Name, commit.Sha); err != nil {
return createErrorPanel(g, output)
}
if err := refreshCommits(g); err != nil {
panic(err)
}
refreshStatus(g)
return handleCommitSelect(g, v)
}
func handleRenameCommit(g *gocui.Gui, v *gocui.View) error {
if getItemPosition(v) != 0 {
return createErrorPanel(g, "Can only rename topmost commit")

View File

@ -491,6 +491,40 @@ func gitSquashPreviousTwoCommits(message string) (string, error) {
return runDirectCommand("git reset --soft HEAD^ && git commit --amend -m \"" + message + "\"")
}
func gitSquashFixupCommit(branchName string, shaValue string) (string, error) {
ret := ""
output, err := runDirectCommand("git checkout -q " + shaValue)
ret += output
if err != nil {
goto FIXUP_ERROR
}
output, err = runDirectCommand("git reset --soft " + shaValue + "^")
ret += output
if err != nil {
goto FIXUP_ERROR
}
output, err = runDirectCommand("git commit --amend -C " + shaValue + "^")
ret += output
if err != nil {
goto FIXUP_ERROR
}
output, err = runDirectCommand("git rebase --onto HEAD " + shaValue + " " + branchName)
ret += output
if err != nil {
goto FIXUP_ERROR
}
return ret, err
FIXUP_ERROR:
//Failed to perform rebase, back to the original branch
output2, err2 := runDirectCommand("git checkout " + branchName)
ret += output2
if err2 != nil {
return ret, err2
}
return ret, err
}
func gitRenameCommit(message string) (string, error) {
return runDirectCommand("git commit --allow-empty --amend -m \"" + message + "\"")
}

View File

@ -55,6 +55,7 @@ func keybindings(g *gocui.Gui) error {
Binding{ViewName: "commits", Key: 's', Modifier: gocui.ModNone, Handler: handleCommitSquashDown},
Binding{ViewName: "commits", Key: 'r', Modifier: gocui.ModNone, Handler: handleRenameCommit},
Binding{ViewName: "commits", Key: 'g', Modifier: gocui.ModNone, Handler: handleResetToCommit},
Binding{ViewName: "commits", Key: 'f', Modifier: gocui.ModNone, Handler: handleCommitFixup},
Binding{ViewName: "stash", Key: gocui.KeySpace, Modifier: gocui.ModNone, Handler: handleStashApply},
Binding{ViewName: "stash", Key: 'g', Modifier: gocui.ModNone, Handler: handleStashPop},
Binding{ViewName: "stash", Key: 'd', Modifier: gocui.ModNone, Handler: handleStashDrop},