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 @@ -1073,6 +1073,14 @@ func (gui *Gui) GetInitialKeybindings() []*Binding { Handler: gui.handleMergeRemoteBranch, 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, 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", }, ) }