summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJesse Duffield <jessedduffield@gmail.com>2019-11-17 13:47:47 +1100
committerJesse Duffield <jessedduffield@gmail.com>2019-11-21 21:15:49 +1100
commit2feb187a6c6bf713598fdddab8e0b168ff0cada8 (patch)
treec0327f30ec6ab244a14c07003dfce65c135017ee
parentcb9aa6083072f1dbc2d06a619f4910b7bdf356d0 (diff)
support deleting remote branches
-rw-r--r--pkg/commands/git.go4
-rw-r--r--pkg/gui/keybindings.go8
-rw-r--r--pkg/gui/remote_branches_panel.go17
-rw-r--r--pkg/gui/remotes_panel.go20
-rw-r--r--pkg/i18n/english.go6
5 files changed, 53 insertions, 2 deletions
diff --git a/pkg/commands/git.go b/pkg/commands/git.go
index e385d6159..912483b84 100644
--- a/pkg/commands/git.go
+++ b/pkg/commands/git.go
@@ -1085,3 +1085,7 @@ func (c *GitCommand) IsHeadDetached() bool {
err := c.OSCommand.RunCommand("git symbolic-ref -q HEAD")
return err != nil
}
+
+func (c *GitCommand) DeleteRemoteBranch(remoteName string, branchName string) error {
+ return c.OSCommand.RunCommand(fmt.Sprintf("git push %s --delete %s", remoteName, branchName))
+}
diff --git a/pkg/gui/keybindings.go b/pkg/gui/keybindings.go
index 19d2191f5..88e35bc5c 100644
--- a/pkg/gui/keybindings.go
+++ b/pkg/gui/keybindings.go
@@ -1074,6 +1074,14 @@ func (gui *Gui) GetInitialKeybindings() []*Binding {
Description: gui.Tr.SLocalize("mergeIntoCurrentBranch"),
},
{
+ ViewName: "branches",
+ Contexts: []string{"remote-branches"},
+ Key: 'd',
+ Modifier: gocui.ModNone,
+ Handler: gui.handleDeleteRemoteBranch,
+ Description: gui.Tr.SLocalize("deleteBranch"),
+ },
+ {
ViewName: "commits",
Key: gocui.MouseLeft,
Modifier: gocui.ModNone,
diff --git a/pkg/gui/remote_branches_panel.go b/pkg/gui/remote_branches_panel.go
index b8959e12f..e53e716c5 100644
--- a/pkg/gui/remote_branches_panel.go
+++ b/pkg/gui/remote_branches_panel.go
@@ -97,3 +97,20 @@ func (gui *Gui) handleMergeRemoteBranch(g *gocui.Gui, v *gocui.View) error {
selectedBranchName := gui.getSelectedRemoteBranch().Name
return gui.mergeBranchIntoCheckedOutBranch(selectedBranchName)
}
+
+func (gui *Gui) handleDeleteRemoteBranch(g *gocui.Gui, v *gocui.View) error {
+ remoteBranch := gui.getSelectedRemoteBranch()
+ if remoteBranch == nil {
+ return nil
+ }
+ message := fmt.Sprintf("%s '%s/%s'?", gui.Tr.SLocalize("DeleteRemoteBranchMessage"), remoteBranch.RemoteName, remoteBranch.Name)
+ return gui.createConfirmationPanel(g, v, true, gui.Tr.SLocalize("DeleteRemoteBranch"), message, func(*gocui.Gui, *gocui.View) error {
+ return gui.WithWaitingStatus(gui.Tr.SLocalize("DeletingStatus"), func() error {
+ if err := gui.GitCommand.DeleteRemoteBranch(remoteBranch.RemoteName, remoteBranch.Name); err != nil {
+ return err
+ }
+
+ return gui.refreshRemotes()
+ })
+ }, nil)
+}
diff --git a/pkg/gui/remotes_panel.go b/pkg/gui/remotes_panel.go
index 1402cfd0f..a562202b3 100644
--- a/pkg/gui/remotes_panel.go
+++ b/pkg/gui/remotes_panel.go
@@ -14,7 +14,7 @@ import (
func (gui *Gui) getSelectedRemote() *commands.Remote {
selectedLine := gui.State.Panels.Remotes.SelectedLine
- if selectedLine == -1 {
+ if selectedLine == -1 || len(gui.State.Remotes) == 0 {
return nil
}
@@ -53,6 +53,8 @@ func (gui *Gui) handleRemoteSelect(g *gocui.Gui, v *gocui.View) error {
// gui.refreshStatus is called at the end of this because that's when we can
// be sure there is a state.Remotes array to pick the current remote from
func (gui *Gui) refreshRemotes() error {
+ prevSelectedRemote := gui.getSelectedRemote()
+
remotes, err := gui.GitCommand.GetRemotes()
if err != nil {
return gui.createErrorPanel(gui.g, err.Error())
@@ -60,8 +62,22 @@ func (gui *Gui) refreshRemotes() error {
gui.State.Remotes = remotes
- if gui.getBranchesView().Context == "remotes" {
+ // we need to ensure our selected remote branches aren't now outdated
+ if prevSelectedRemote != nil && gui.State.RemoteBranches != nil {
+ // find remote now
+ for _, remote := range remotes {
+ if remote.Name == prevSelectedRemote.Name {
+ gui.State.RemoteBranches = remote.Branches
+ }
+ }
+ }
+
+ // TODO: see if this works for deleting remote branches
+ switch gui.getBranchesView().Context {
+ case "remotes":
return gui.renderRemotesWithSelection()
+ case "remote-branches":
+ return gui.renderRemoteBranchesWithSelection()
}
return nil
diff --git a/pkg/i18n/english.go b/pkg/i18n/english.go
index 135c52bda..a41eb2fc1 100644
--- a/pkg/i18n/english.go
+++ b/pkg/i18n/english.go
@@ -864,6 +864,12 @@ func addEnglish(i18nObject *i18n.Bundle) error {
}, &i18n.Message{
ID: "removeRemotePrompt",
Other: "Are you sure you want to remove remote",
+ }, &i18n.Message{
+ ID: "DeleteRemoteBranch",
+ Other: "Delete Remote Branch",
+ }, &i18n.Message{
+ ID: "DeleteRemoteBranchMessage",
+ Other: "Are you sure you want to delete remote branch",
},
)
}