diff options
author | Federico <federicogerardi94@gmail.com> | 2023-08-10 09:39:26 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-08-10 17:39:26 +1000 |
commit | 0df5cb1286a1f6fb442789ea8afacf7cdcd53735 (patch) | |
tree | ad63ebac448f657320a1dcfb2b6adf8bc93d7aa2 | |
parent | c43830b0271374ab42e83771479bf757ba34839c (diff) |
Allow deleting remote tags/branches from local tag/branch views (#2738)
35 files changed, 486 insertions, 157 deletions
diff --git a/docs/keybindings/Keybindings_en.md b/docs/keybindings/Keybindings_en.md index a0e811f66..718c2d2be 100644 --- a/docs/keybindings/Keybindings_en.md +++ b/docs/keybindings/Keybindings_en.md @@ -148,7 +148,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd><c-y></kbd>: Copy pull request URL to clipboard <kbd>c</kbd>: Checkout by name <kbd>F</kbd>: Force checkout - <kbd>d</kbd>: Delete branch + <kbd>d</kbd>: View delete options <kbd>r</kbd>: Rebase checked-out branch onto this branch <kbd>M</kbd>: Merge into currently checked out branch <kbd>f</kbd>: Fast-forward this branch from its upstream @@ -255,7 +255,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd>n</kbd>: New branch <kbd>M</kbd>: Merge into currently checked out branch <kbd>r</kbd>: Rebase checked-out branch onto this branch - <kbd>d</kbd>: Delete branch + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: Set as upstream of checked-out branch <kbd>g</kbd>: View reset options <kbd>w</kbd>: View worktree options @@ -332,7 +332,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <pre> <kbd><space></kbd>: Checkout - <kbd>d</kbd>: Delete tag + <kbd>d</kbd>: View delete options <kbd>P</kbd>: Push tag <kbd>n</kbd>: Create tag <kbd>g</kbd>: View reset options diff --git a/docs/keybindings/Keybindings_ja.md b/docs/keybindings/Keybindings_ja.md index d34463b81..02e6af23f 100644 --- a/docs/keybindings/Keybindings_ja.md +++ b/docs/keybindings/Keybindings_ja.md @@ -172,7 +172,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <pre> <kbd><space></kbd>: チェックアウト - <kbd>d</kbd>: タグを削除 + <kbd>d</kbd>: View delete options <kbd>P</kbd>: タグをpush <kbd>n</kbd>: タグを作成 <kbd>g</kbd>: View reset options @@ -220,7 +220,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd><c-y></kbd>: Pull RequestのURLをクリップボードにコピー <kbd>c</kbd>: Checkout by name <kbd>F</kbd>: Force checkout - <kbd>d</kbd>: ブランチを削除 + <kbd>d</kbd>: View delete options <kbd>r</kbd>: Rebase checked-out branch onto this branch <kbd>M</kbd>: 現在のブランチにマージ <kbd>f</kbd>: Fast-forward this branch from its upstream @@ -320,7 +320,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd>n</kbd>: 新しいブランチを作成 <kbd>M</kbd>: 現在のブランチにマージ <kbd>r</kbd>: Rebase checked-out branch onto this branch - <kbd>d</kbd>: ブランチを削除 + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: Set as upstream of checked-out branch <kbd>g</kbd>: View reset options <kbd>w</kbd>: View worktree options diff --git a/docs/keybindings/Keybindings_ko.md b/docs/keybindings/Keybindings_ko.md index 5446c24aa..4af5fb1a3 100644 --- a/docs/keybindings/Keybindings_ko.md +++ b/docs/keybindings/Keybindings_ko.md @@ -183,7 +183,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd><c-y></kbd>: 풀 리퀘스트 URL을 클립보드에 복사 <kbd>c</kbd>: 이름으로 체크아웃 <kbd>F</kbd>: 강제 체크아웃 - <kbd>d</kbd>: 브랜치 삭제 + <kbd>d</kbd>: View delete options <kbd>r</kbd>: 체크아웃된 브랜치를 이 브랜치에 리베이스 <kbd>M</kbd>: 현재 브랜치에 병합 <kbd>f</kbd>: Fast-forward this branch from its upstream @@ -239,7 +239,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd>n</kbd>: 새 브랜치 생성 <kbd>M</kbd>: 현재 브랜치에 병합 <kbd>r</kbd>: 체크아웃된 브랜치를 이 브랜치에 리베이스 - <kbd>d</kbd>: 브랜치 삭제 + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: Set as upstream of checked-out branch <kbd>g</kbd>: View reset options <kbd>w</kbd>: View worktree options @@ -309,7 +309,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <pre> <kbd><space></kbd>: 체크아웃 - <kbd>d</kbd>: 태그 삭제 + <kbd>d</kbd>: View delete options <kbd>P</kbd>: 태그를 push <kbd>n</kbd>: 태그를 생성 <kbd>g</kbd>: View reset options diff --git a/docs/keybindings/Keybindings_nl.md b/docs/keybindings/Keybindings_nl.md index 1593fc56d..7d366fcda 100644 --- a/docs/keybindings/Keybindings_nl.md +++ b/docs/keybindings/Keybindings_nl.md @@ -90,7 +90,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd><c-y></kbd>: Kopieer de URL van het pull-verzoek naar het klembord <kbd>c</kbd>: Uitchecken bij naam <kbd>F</kbd>: Forceer checkout - <kbd>d</kbd>: Verwijder branch + <kbd>d</kbd>: View delete options <kbd>r</kbd>: Rebase branch <kbd>M</kbd>: Merge in met huidige checked out branch <kbd>f</kbd>: Fast-forward deze branch vanaf zijn upstream @@ -233,7 +233,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd>n</kbd>: Nieuwe branch <kbd>M</kbd>: Merge in met huidige checked out branch <kbd>r</kbd>: Rebase branch - <kbd>d</kbd>: Verwijder branch + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: Stel in als upstream van uitgecheckte branch <kbd>g</kbd>: Bekijk reset opties <kbd>w</kbd>: View worktree options @@ -332,7 +332,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <pre> <kbd><space></kbd>: Uitchecken - <kbd>d</kbd>: Verwijder tag + <kbd>d</kbd>: View delete options <kbd>P</kbd>: Push tag <kbd>n</kbd>: Creëer tag <kbd>g</kbd>: Bekijk reset opties diff --git a/docs/keybindings/Keybindings_pl.md b/docs/keybindings/Keybindings_pl.md index 01a7a621c..f4f59228e 100644 --- a/docs/keybindings/Keybindings_pl.md +++ b/docs/keybindings/Keybindings_pl.md @@ -106,7 +106,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd><c-y></kbd>: Skopiuj adres URL żądania pobrania do schowka <kbd>c</kbd>: Przełącz używając nazwy <kbd>F</kbd>: Wymuś przełączenie - <kbd>d</kbd>: Usuń gałąź + <kbd>d</kbd>: View delete options <kbd>r</kbd>: Zmiana bazy gałęzi <kbd>M</kbd>: Scal do obecnej gałęzi <kbd>f</kbd>: Fast-forward this branch from its upstream @@ -232,7 +232,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd>n</kbd>: Nowa gałąź <kbd>M</kbd>: Scal do obecnej gałęzi <kbd>r</kbd>: Zmiana bazy gałęzi - <kbd>d</kbd>: Usuń gałąź + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: Set as upstream of checked-out branch <kbd>g</kbd>: Wyświetl opcje resetu <kbd>w</kbd>: View worktree options @@ -325,7 +325,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <pre> <kbd><space></kbd>: Przełącz - <kbd>d</kbd>: Delete tag + <kbd>d</kbd>: View delete options <kbd>P</kbd>: Push tag <kbd>n</kbd>: Create tag <kbd>g</kbd>: Wyświetl opcje resetu diff --git a/docs/keybindings/Keybindings_ru.md b/docs/keybindings/Keybindings_ru.md index 6ae627bc9..9a03d2935 100644 --- a/docs/keybindings/Keybindings_ru.md +++ b/docs/keybindings/Keybindings_ru.md @@ -181,7 +181,7 @@ _Связки клавиш_ <kbd><c-y></kbd>: Скопировать URL запроса на принятие изменений в буфер обмена <kbd>c</kbd>: Переключить по названию <kbd>F</kbd>: Принудительное переключение - <kbd>d</kbd>: Удалить ветку + <kbd>d</kbd>: View delete options <kbd>r</kbd>: Перебазировать переключённую ветку на эту ветку <kbd>M</kbd>: Слияние с текущей переключённой веткой <kbd>f</kbd>: Перемотать эту ветку вперёд из её upstream-ветки @@ -277,7 +277,7 @@ _Связки клавиш_ <pre> <kbd><space></kbd>: Переключить - <kbd>d</kbd>: Удалить тег + <kbd>d</kbd>: View delete options <kbd>P</kbd>: Отправить тег <kbd>n</kbd>: Создать тег <kbd>g</kbd>: Просмотреть параметры сброса @@ -294,7 +294,7 @@ _Связки клавиш_ <kbd>n</kbd>: Новая ветка <kbd>M</kbd>: Слияние с текущей переключённой веткой <kbd>r</kbd>: Перебазировать переключённую ветку на эту ветку - <kbd>d</kbd>: Удалить ветку + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: Установить как upstream-ветку переключённую ветку <kbd>g</kbd>: Просмотреть параметры сброса <kbd>w</kbd>: View worktree options diff --git a/docs/keybindings/Keybindings_zh-CN.md b/docs/keybindings/Keybindings_zh-CN.md index 924607639..6f60cb644 100644 --- a/docs/keybindings/Keybindings_zh-CN.md +++ b/docs/keybindings/Keybindings_zh-CN.md @@ -84,7 +84,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd><c-y></kbd>: 将抓取请求 URL 复制到剪贴板 <kbd>c</kbd>: 按名称检出 <kbd>F</kbd>: 强制检出 - <kbd>d</kbd>: 删除分支 + <kbd>d</kbd>: View delete options <kbd>r</kbd>: 将已检出的分支变基到该分支 <kbd>M</kbd>: 合并到当前检出的分支 <kbd>f</kbd>: 从上游快进此分支 @@ -234,7 +234,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <pre> <kbd><space></kbd>: 检出 - <kbd>d</kbd>: 删除标签 + <kbd>d</kbd>: View delete options <kbd>P</kbd>: 推送标签 <kbd>n</kbd>: 创建标签 <kbd>g</kbd>: 查看重置选项 @@ -334,7 +334,7 @@ _Legend: `<c-b>` means ctrl+b, `<a-b>` means alt+b, `B` means shift+b_ <kbd>n</kbd>: 新分支 <kbd>M</kbd>: 合并到当前检出的分支 <kbd>r</kbd>: 将已检出的分支变基到该分支 - <kbd>d</kbd>: 删除分支 + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: 设置为检出分支的上游 <kbd>g</kbd>: 查看重置选项 <kbd>w</kbd>: View worktree options diff --git a/docs/keybindings/Keybindings_zh-TW.md b/docs/keybindings/Keybindings_zh-TW.md index 4103a88ec..eb82367b5 100644 --- a/docs/keybindings/Keybindings_zh-TW.md +++ b/docs/keybindings/Keybindings_zh-TW.md @@ -256,7 +256,7 @@ _說明:`<c-b>` 表示 Ctrl+B、`<a-b>` 表示 Alt+B,`B`表示 Shift+B_ <kbd><c-y></kbd>: 複製拉取請求的 URL 到剪貼板 <kbd>c</kbd>: 根據名稱檢出 <kbd>F</kbd>: 強制檢出 - <kbd>d</kbd>: 刪除分支 + <kbd>d</kbd>: View delete options <kbd>r</kbd>: 將已檢出的分支變基至此分支 <kbd>M</kbd>: 合併到當前檢出的分支 <kbd>f</kbd>: 從上游快進此分支 @@ -273,7 +273,7 @@ _說明:`<c-b>` 表示 Ctrl+B、`<a-b>` 表示 Alt+B,`B`表示 Shift+B_ <pre> <kbd><space></kbd>: 檢出 - <kbd>d</kbd>: 刪除標籤 + <kbd>d</kbd>: View delete options <kbd>P</kbd>: 推送標籤 <kbd>n</kbd>: 建立標籤 <kbd>g</kbd>: 檢視重設選項 @@ -344,7 +344,7 @@ _說明:`<c-b>` 表示 Ctrl+B、`<a-b>` 表示 Alt+B,`B`表示 Shift+B_ <kbd>n</kbd>: 新分支 <kbd>M</kbd>: 合併到當前檢出的分支 <kbd>r</kbd>: 將已檢出的分支變基至此分支 - <kbd>d</kbd>: 刪除分支 + <kbd>d</kbd>: Delete remote tag <kbd>u</kbd>: 將此分支設為當前分支之上游 <kbd>g</kbd>: 檢視重設選項 <kbd>w</kbd>: View worktree options diff --git a/pkg/commands/git_commands/branch.go b/pkg/commands/git_commands/branch.go index 24244080b..b8d562dae 100644 --- a/pkg/commands/git_commands/branch.go +++ b/pkg/commands/git_commands/branch.go @@ -85,8 +85,8 @@ func (self *BranchCommands) CurrentBranchName() (string, error) { return "", err } -// Delete delete branch -func (self *BranchCommands) Delete(branch string, force bool) error { +// LocalDelete delete branch locally +func (self *BranchCommands) LocalDelete(branch string, force bool) error { cmdArgs := NewGitCmd("branch"). ArgIfElse(force, "-D", "-d"). Arg(branch). diff --git a/pkg/commands/git_commands/branch_test.go b/pkg/commands/git_commands/branch_test.go index dee2b03c8..b94f700cc 100644 --- a/pkg/commands/git_commands/branch_test.go +++ b/pkg/commands/git_commands/branch_test.go @@ -93,7 +93,7 @@ func TestBranchDeleteBranch(t *testing.T) { t.Run(s.testName, func(t *testing.T) { instance := buildBranchCommands(commonDeps{runner: s.runner}) - s.test(instance.Delete("test", s.force)) + s.test(instance.LocalDelete("test", s.force)) s.runner.CheckForMissingCalls() }) } diff --git a/pkg/commands/git_commands/remote.go b/pkg/commands/git_commands/remote.go index b9f20fb3a..ce8f79442 100644 --- a/pkg/commands/git_commands/remote.go +++ b/pkg/commands/git_commands/remote.go @@ -56,6 +56,14 @@ func (self *RemoteCommands) DeleteRemoteBranch(task gocui.Task, remoteName strin return self.cmd.New(cmdArgs).PromptOnCredentialRequest(task).WithMutex(self.syncMutex).Run() } +func (self *RemoteCommands) DeleteRemoteTag(task gocui.Task, remoteName string, tagName string) error { + cmdArgs := NewGitCmd("push"). + Arg(remoteName, "--delete", tagName). + ToArgv() + + return self.cmd.New(cmdArgs).PromptOnCredentialRequest(task).WithMutex(self.syncMutex).Run() +} + // CheckRemoteBranchExists Returns remote branch func (self *RemoteCommands) CheckRemoteBranchExists(branchName string) bool { cmdArgs := NewGitCmd("show-ref"). diff --git a/pkg/commands/git_commands/tag.go b/pkg/commands/git_commands/tag.go index 2517ce380..0656e1e19 100644 --- a/pkg/commands/git_commands/tag.go +++ b/pkg/commands/git_commands/tag.go @@ -41,7 +41,7 @@ func (self *TagCommands) HasTag(tagName string) bool { return self.cmd.New(cmdArgs).Run() == nil } -func (self *TagCommands) Delete(tagName string) error { +func (self *TagCommands) LocalDelete(tagName string) error { cmdArgs := NewGitCmd("tag").Arg("-d", tagName). ToArgv() diff --git a/pkg/gui/controllers.go b/pkg/gui/controllers.go index cc45d833a..1430ad239 100644 --- a/pkg/gui/controllers.go +++ b/pkg/gui/controllers.go @@ -86,6 +86,7 @@ func (gui *Gui) resetHelpersAndControllers() { Files: helpers.NewFilesHelper(helperCommon), WorkingTree: helpers.NewWorkingTreeHelper(helperCommon, refsHelper, commitsHelper, gpgHelper), Tags: helpers.NewTagsHelper(helperCommon, commitsHelper), + BranchesHelper: helpers.NewBranchesHelper(helperCommon), GPG: helpers.NewGpgHelper(helperCommon), MergeAndRebase: rebaseHelper, MergeConflicts: mergeConflictsHelper, diff --git a/pkg/gui/controllers/branches_controller.go b/pkg/gui/controllers/branches_controller.go index e7023959f..84d9e838e 100644 --- a/pkg/gui/controllers/branches_controller.go +++ b/pkg/gui/controllers/branches_controller.go @@ -70,7 +70,8 @@ func (self *BranchesController) GetKeybindings(opts types.KeybindingsOpts) []*ty { Key: opts.GetKey(opts.Config.Universal.Remove), Handler: self.checkSelectedAndReal(self.delete), - Description: self.c.Tr.DeleteBranch, + Description: self.c.Tr.ViewDeleteOptions, + OpensMenu: true, }, { Key: opts.GetKey(opts.Config.Branches.RebaseBranch), @@ -316,19 +317,6 @@ func (self *BranchesController) createNewBranchWithName(newBranchName string) er return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC}) } -func (self *BranchesController) delete(branch *models.Branch) error { - checkedOutBranch := self.c.Helpers().Refs.GetCheckedOutRef() - if checkedOutBranch.Name == branch.Name { - return self.c.ErrorMsg(self.c.Tr.CantDeleteCheckOutBranch) - } - - if self.checkedOutByOtherWorktree(branch) { - return self.promptWorktreeBranchDelete(branch) - } - - return self.deleteWithForce(branch, false) -} - func (self *BranchesController) checkedOutByOtherWorktree(branch *models.Branch) bool { return git_commands.CheckedOutByOtherWorktree(branch, self.c.Model().Worktrees) } @@ -371,18 +359,34 @@ func (self *BranchesController) promptWorktreeBranchDelete(selectedBranch *model }) } -func (self *BranchesController) deleteWithForce(selectedBranch *models.Branch, force bool) error { - title := self.c.Tr.DeleteBranch - var templateStr string - if force { - templateStr = self.c.Tr.ForceDeleteBranchMessage - } else { - templateStr = self.c.Tr.DeleteBranchMessage +func (self *BranchesController) localDelete(branch *models.Branch) error { + if self.checkedOutByOtherWorktree(branch) { + return self.promptWorktreeBranchDelete(branch) } + + return self.c.WithWaitingStatus(self.c.Tr.DeletingStatus, func(_ gocui.Task) error { + self.c.LogAction(self.c.Tr.Actions.DeleteLocalBranch) + err := self.c.Git().Branch.LocalDelete(branch.Name, false) + if err != nil && strings.Contains(err.Error(), "git branch -D ") { + return self.forceDelete(branch) + } + if err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) + }) +} + +func (self *BranchesController) remoteDelete(branch *models.Branch) error { + return self.c.Helpers().BranchesHelper.ConfirmDeleteRemote(branch.UpstreamRemote, branch.Name) +} + +func (self *BranchesController) forceDelete(branch *models.Branch) error { + title := self.c.Tr.ForceDeleteBranchTitle message := utils.ResolvePlaceholderString( - templateStr, + self.c.Tr.ForceDeleteBranchMessage, map[string]string{ - "selectedBranchName": selectedBranch.Name, + "selectedBranchName": branch.Name, }, ) @@ -390,19 +394,60 @@ func (self *BranchesController) deleteWithForce(selectedBranch *models.Branch, f Title: title, Prompt: message, HandleConfirm: func() error { - self.c.LogAction(self.c.Tr.Actions.DeleteBranch) - if err := self.c.Git().Branch.Delete(selectedBranch.Name, force); err != nil { - errMessage := err.Error() - if !force && strings.Contains(errMessage, "git branch -D ") { - return self.deleteWithForce(selectedBranch, true) - } - return self.c.ErrorMsg(errMessage) + if err := self.c.Git().Branch.LocalDelete(branch.Name, true); err != nil { + return self.c.ErrorMsg(err.Error()) } return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES}}) }, }) } +func (self *BranchesController) delete(branch *models.Branch) error { + menuItems := []*types.MenuItem{} + checkedOutBranch := self.c.Helpers().Refs.GetCheckedOutRef() + + localDeleteItem := &types.MenuItem{ + Label: self.c.Tr.DeleteLocalBranch, + Key: 'c', + OnPress: func() error { + return self.localDelete(branch) + }, + } + if checkedOutBranch.Name == branch.Name { + localDeleteItem = &types.MenuItem{ + Label: self.c.Tr.DeleteLocalBranch, + Key: 'c', + Tooltip: self.c.Tr.CantDeleteCheckOutBranch, + OnPress: func() error { + return self.c.ErrorMsg(self.c.Tr.CantDeleteCheckOutBranch) + }, + } + } + menuItems = append(menuItems, localDeleteItem) + + if branch.IsTrackingRemote() && !branch.UpstreamGone { + menuItems = append(menuItems, &types.MenuItem{ + Label: self.c.Tr.DeleteRemoteBranch, + Key: 'r', + OnPress: func() error { + return self.remoteDelete(branch) + }, + }) + } + + menuTitle := utils.ResolvePlaceholderString( + self.c.Tr.DeleteBranchTitle, + map[string]string{ + "selectedBranchName": branch.Name, + }, + ) + + return self.c.Menu(types.CreateMenuOptions{ + Title: menuTitle, + Items: menuItems, + }) +} + func (self *BranchesController) merge() error { selectedBranchName := self.context().GetSelected().Name return self.c.Helpers().MergeAndRebase.MergeRefIntoCheckedOutBranch(selectedBranchName) diff --git a/pkg/gui/controllers/helpers/branches_helper.go b/pkg/gui/controllers/helpers/branches_helper.go new file mode 100644 index 000000000..6bc336e8e --- /dev/null +++ b/pkg/gui/controllers/helpers/branches_helper.go @@ -0,0 +1,46 @@ +package helpers + +import ( + "github.com/jesseduffield/gocui" + "github.com/jesseduffield/lazygit/pkg/gui/types" + "github.com/jesseduffield/lazygit/pkg/utils" +) + +type BranchesHelper struct { + c *HelperCommon +} + +func NewBranchesHelper(c *HelperCommon) *BranchesHelper { + return &BranchesHelper{ + c: c, + } +} + +func (self *BranchesHelper) ConfirmDeleteRemote(remoteName string, branchName string) error { + title := utils.ResolvePlaceholderString( + self.c.Tr.DeleteBranchTitle, + map[string]string{ + "selectedBranchName": branchName, + }, + ) + prompt := utils.ResolvePlaceholderString( + self.c.Tr.DeleteRemoteBranchPrompt, + map[string]string{ + "selectedBranchName": branchName, + "upstream": remoteName, + }, + ) + return self.c.Confirm(types.ConfirmOpts{ + Title: title, + Prompt: prompt, + HandleConfirm: func() error { + return self.c.WithWaitingStatus(self.c.Tr.DeletingStatus, func(task gocui.Task) error { + self.c.LogAction(self.c.Tr.Actions.DeleteRemoteBranch) + if err := self.c.Git().Remote.DeleteRemoteBranch(task, remoteName, branchName); err != nil { + return self.c.Error(err) + } + return self.c.Refresh(types.RefreshOptions{Mode: types.ASYNC, Scope: []types.RefreshableView{types.BRANCHES, types.REMOTES}}) + }) + }, + }) +} diff --git a/pkg/gui/controllers/helpers/helpers.go b/pkg/gui/controllers/helpers/helpers.go index e87b57eb0..22a7ea91b 100644 --- a/pkg/gui/controllers/helpers/helpers.go +++ b/pkg/gui/controllers/helpers/helpers.go @@ -22,6 +22,7 @@ type Helpers struct { Suggestions *SuggestionsHelper Files *FilesHelper WorkingTree *WorkingTreeHelper + BranchesHelper *BranchesHelper Tags *TagsHelper MergeAndRebase *MergeAndRebaseHelper MergeConflicts *MergeConflictsHelper diff --git a/pkg/gui/controllers/remote_branches_controller.go b/pkg/gui/controllers/remote_branches_controller.go index 529b00a90..ffb55d5ca 100644 --- a/pkg/gui/controllers/remote_branches_controller.go +++ b/pkg |