diff --git a/pkg/commands/git_test.go b/pkg/commands/git_test.go index 03e84d204..3358be054 100644 --- a/pkg/commands/git_test.go +++ b/pkg/commands/git_test.go @@ -801,6 +801,7 @@ func TestGitCommandCommit(t *testing.T) { command func(string, ...string) *exec.Cmd getGlobalGitConfig func(string) (string, error) test func(*exec.Cmd, error) + flags string } scenarios := []scenario{ @@ -808,7 +809,7 @@ func TestGitCommandCommit(t *testing.T) { "Commit using gpg", func(cmd string, args ...string) *exec.Cmd { assert.EqualValues(t, "bash", cmd) - assert.EqualValues(t, []string{"-c", `git commit -m 'test'`}, args) + assert.EqualValues(t, []string{"-c", `git commit -m 'test'`}, args) return exec.Command("echo") }, @@ -819,6 +820,7 @@ func TestGitCommandCommit(t *testing.T) { assert.NotNil(t, cmd) assert.Nil(t, err) }, + "", }, { "Commit without using gpg", @@ -835,6 +837,24 @@ func TestGitCommandCommit(t *testing.T) { assert.Nil(t, cmd) assert.Nil(t, err) }, + "", + }, + { + "Commit with --no-verify flag", + func(cmd string, args ...string) *exec.Cmd { + assert.EqualValues(t, "git", cmd) + assert.EqualValues(t, []string{"commit", "--no-verify", "-m", "test"}, args) + + return exec.Command("echo") + }, + func(string) (string, error) { + return "false", nil + }, + func(cmd *exec.Cmd, err error) { + assert.Nil(t, cmd) + assert.Nil(t, err) + }, + "--no-verify", }, { "Commit without using gpg with an error", @@ -851,6 +871,7 @@ func TestGitCommandCommit(t *testing.T) { assert.Nil(t, cmd) assert.Error(t, err) }, + "", }, } @@ -859,7 +880,7 @@ func TestGitCommandCommit(t *testing.T) { gitCmd := NewDummyGitCommand() gitCmd.getGlobalGitConfig = s.getGlobalGitConfig gitCmd.OSCommand.command = s.command - s.test(gitCmd.Commit("test")) + s.test(gitCmd.Commit("test", s.flags)) }) } } diff --git a/pkg/gui/files_panel.go b/pkg/gui/files_panel.go index b0b2db156..caab1bede 100644 --- a/pkg/gui/files_panel.go +++ b/pkg/gui/files_panel.go @@ -274,6 +274,22 @@ func (gui *Gui) handleIgnoreFile(g *gocui.Gui, v *gocui.View) error { return gui.refreshFiles() } +func (gui *Gui) handleWIPCommitPress(g *gocui.Gui, filesView *gocui.View) error { + skipHookPreifx := gui.Config.GetUserConfig().GetString("git.skipHookPrefix") + if skipHookPreifx == "" { + return gui.createErrorPanel(gui.g, gui.Tr.SLocalize("SkipHookPrefixNotConfigured")) + } + + if err := gui.renderString(g, "commitMessage", skipHookPreifx); err != nil { + return err + } + if err := gui.getCommitMessageView().SetCursor(len(skipHookPreifx), 0); err != nil { + return err + } + + return gui.handleCommitPress(g, filesView) +} + func (gui *Gui) handleCommitPress(g *gocui.Gui, filesView *gocui.View) error { if len(gui.stagedFiles()) == 0 && gui.State.WorkingTreeState == "normal" { return gui.createErrorPanel(g, gui.Tr.SLocalize("NoStagedFilesToCommit")) diff --git a/pkg/gui/gui.go b/pkg/gui/gui.go index 0990779a7..8eacd3cf3 100644 --- a/pkg/gui/gui.go +++ b/pkg/gui/gui.go @@ -408,7 +408,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { if gui.getCommitMessageView() == nil { // doesn't matter where this view starts because it will be hidden - if commitMessageView, err := g.SetView("commitMessage", 0, 0, width/2, height/2, 0); err != nil { + if commitMessageView, err := g.SetView("commitMessage", width, height, width*2, height*2, 0); err != nil { if err.Error() != "unknown view" { return err } @@ -422,7 +422,7 @@ func (gui *Gui) layout(g *gocui.Gui) error { if check, _ := g.View("credentials"); check == nil { // doesn't matter where this view starts because it will be hidden - if credentialsView, err := g.SetView("credentials", 0, 0, width/2, height/2, 0); err != nil { + if credentialsView, err := g.SetView("credentials", width, height, width*2, height*2, 0); err != nil { if err.Error() != "unknown view" { return err } diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go index 0387b6028..6bb32ea59 100644 --- a/pkg/gui/keybindings.go +++ b/pkg/gui/keybindings.go @@ -154,6 +154,13 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Modifier: gocui.ModNone, Handler: gui.handleCommitPress, Description: gui.Tr.SLocalize("CommitChanges"), + }, + { + ViewName: "files", + Key: 'w', + Modifier: gocui.ModNone, + Handler: gui.handleWIPCommitPress, + Description: gui.Tr.SLocalize("commitChangesWithoutHook"), }, { ViewName: "files", Key: 'A', diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go index 3b61ac3a7..733325540 100644 --- a/pkg/i18n/english.go +++ b/pkg/i18n/english.go @@ -750,6 +750,12 @@ func addEnglish(i18nObject *i18n.Bundle) error { }, &i18n.Message{ ID: "CustomCommand", Other: "Custom Command:", + }, &i18n.Message{ + ID: "commitChangesWithoutHook", + Other: "commit changes without pre-commit hook", + }, &i18n.Message{ + ID: "SkipHookPrefixNotConfigured", + Other: "You have not configured a commit message prefix for skipping hooks. Set `git.skipHookPrefix = 'WIP'` in your config", }, ) }