summaryrefslogtreecommitdiffstats
path: root/pkg/gui/controllers/tags_controller.go
diff options
context:
space:
mode:
authorFederico <federicogerardi94@gmail.com>2023-08-10 09:39:26 +0200
committerGitHub <noreply@github.com>2023-08-10 17:39:26 +1000
commit0df5cb1286a1f6fb442789ea8afacf7cdcd53735 (patch)
treead63ebac448f657320a1dcfb2b6adf8bc93d7aa2 /pkg/gui/controllers/tags_controller.go
parentc43830b0271374ab42e83771479bf757ba34839c (diff)
Allow deleting remote tags/branches from local tag/branch views (#2738)
Diffstat (limited to 'pkg/gui/controllers/tags_controller.go')
-rw-r--r--pkg/gui/controllers/tags_controller.go91
1 files changed, 79 insertions, 12 deletions
diff --git a/pkg/gui/controllers/tags_controller.go b/pkg/gui/controllers/tags_controller.go
index 80248391e..91d590c32 100644
--- a/pkg/gui/controllers/tags_controller.go
+++ b/pkg/gui/controllers/tags_controller.go
@@ -34,7 +34,8 @@ func (self *TagsController) GetKeybindings(opts types.KeybindingsOpts) []*types.
{
Key: opts.GetKey(opts.Config.Universal.Remove),
Handler: self.withSelectedTag(self.delete),
- Description: self.c.Tr.DeleteTag,
+ Description: self.c.Tr.ViewDeleteOptions,
+ OpensMenu: true,
},
{
Key: opts.GetKey(opts.Config.Branches.PushTag),
@@ -88,24 +89,90 @@ func (self *TagsController) checkout(tag *models.Tag) error {
return self.c.PushContext(self.c.Contexts().Branches)
}
+func (self *TagsController) localDelete(tag *models.Tag) error {
+ return self.c.WithWaitingStatus(self.c.Tr.DeletingStatus, func(gocui.Task) error {
+ self.c.LogAction(self.c.Tr.Actions.DeleteLocalTag)
+ if err := self.c.Git().Tag.LocalDelete(tag.Name); err != nil {
+ return self.c.Error(err)
+ }
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS}})
+ })
+}
+
+func (self *TagsController) remoteDelete(tag *models.Tag) error {
+ title := utils.ResolvePlaceholderString(
+ self.c.Tr.SelectRemoteTagUpstream,
+ map[string]string{
+ "tagName": tag.Name,
+ },
+ )
+
+ return self.c.Prompt(types.PromptOpts{
+ Title: title,
+ InitialContent: "origin",
+ FindSuggestionsFunc: self.c.Helpers().Suggestions.GetRemoteSuggestionsFunc(),
+ HandleConfirm: func(upstream string) error {
+ confirmTitle := utils.ResolvePlaceholderString(
+ self.c.Tr.DeleteTagTitle,
+ map[string]string{
+ "tagName": tag.Name,
+ },
+ )
+ confirmPrompt := utils.ResolvePlaceholderString(
+ self.c.Tr.DeleteRemoteTagPrompt,
+ map[string]string{
+ "tagName": tag.Name,
+ "upstream": upstream,
+ },
+ )
+
+ return self.c.Confirm(types.ConfirmOpts{
+ Title: confirmTitle,
+ Prompt: confirmPrompt,
+ HandleConfirm: func() error {
+ return self.c.WithWaitingStatus(self.c.Tr.DeletingStatus, func(t gocui.Task) error {
+ self.c.LogAction(self.c.Tr.Actions.DeleteRemoteTag)
+ if err := self.c.Git().Remote.DeleteRemoteTag(t, upstream, tag.Name); err != nil {
+ return self.c.Error(err)
+ }
+ self.c.Toast(self.c.Tr.RemoteTagDeletedMessage)
+ return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS}})
+ })
+ },
+ })
+ },
+ })
+}
+
func (self *TagsController) delete(tag *models.Tag) error {
- prompt := utils.ResolvePlaceholderString(
- self.c.Tr.DeleteTagPrompt,
+ menuTitle := utils.ResolvePlaceholderString(
+ self.c.Tr.DeleteTagTitle,
map[string]string{
"tagName": tag.Name,
},
)
- return self.c.Confirm(types.ConfirmOpts{
- Title: self.c.Tr.DeleteTagTitle,
- Prompt: prompt,
- HandleConfirm: func() error {
- self.c.LogAction(self.c.Tr.Actions.DeleteTag)
- if err := self.c.Git().Tag.Delete(tag.Name); err != nil {
- return self.c.Error(err)
- }
- return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.COMMITS, types.TAGS}})
+ menuItems := []*types.MenuItem{
+ {
+ Label: self.c.Tr.DeleteLocalTag,
+ Key: 'c',
+ OnPress: func() error {
+ return self.localDelete(tag)
+ },
},
+ {
+ Label: self.c.Tr.DeleteRemoteTag,
+ Key: 'r',
+ OpensMenu: true,
+ OnPress: func() error {
+ return self.remoteDelete(tag)
+ },
+ },
+ }
+
+ return self.c.Menu(types.CreateMenuOptions{
+ Title: menuTitle,
+ Items: menuItems,
})
}