summaryrefslogtreecommitdiffstats
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
parentc43830b0271374ab42e83771479bf757ba34839c (diff)
Allow deleting remote tags/branches from local tag/branch views (#2738)
-rw-r--r--docs/keybindings/Keybindings_en.md6
-rw-r--r--docs/keybindings/Keybindings_ja.md6
-rw-r--r--docs/keybindings/Keybindings_ko.md6
-rw-r--r--docs/keybindings/Keybindings_nl.md6
-rw-r--r--docs/keybindings/Keybindings_pl.md6
-rw-r--r--docs/keybindings/Keybindings_ru.md6
-rw-r--r--docs/keybindings/Keybindings_zh-CN.md6
-rw-r--r--docs/keybindings/Keybindings_zh-TW.md6
-rw-r--r--pkg/commands/git_commands/branch.go4
-rw-r--r--pkg/commands/git_commands/branch_test.go2
-rw-r--r--pkg/commands/git_commands/remote.go8
-rw-r--r--pkg/commands/git_commands/tag.go2
-rw-r--r--pkg/gui/controllers.go1
-rw-r--r--pkg/gui/controllers/branches_controller.go105
-rw-r--r--pkg/gui/controllers/helpers/branches_helper.go46
-rw-r--r--pkg/gui/controllers/helpers/helpers.go1
-rw-r--r--pkg/gui/controllers/remote_branches_controller.go22
-rw-r--r--pkg/gui/controllers/tags_controller.go91
-rw-r--r--pkg/i18n/chinese.go7
-rw-r--r--pkg/i18n/dutch.go7
-rw-r--r--pkg/i18n/english.go42
-rw-r--r--pkg/i18n/japanese.go7
-rw-r--r--pkg/i18n/korean.go7
-rw-r--r--pkg/i18n/polish.go2
-rw-r--r--pkg/i18n/russian.go5
-rw-r--r--pkg/i18n/traditional_chinese.go6
-rw-r--r--pkg/integration/components/git.go16
-rw-r--r--pkg/integration/components/menu_driver.go6
-rw-r--r--pkg/integration/components/shell.go4
-rw-r--r--pkg/integration/components/views.go4
-rw-r--r--pkg/integration/tests/branch/delete.go88
-rw-r--r--pkg/integration/tests/tag/crud_annotated.go49
-rw-r--r--pkg/integration/tests/tag/crud_lightweight.go49
-rw-r--r--pkg/integration/tests/worktree/detach_worktree_from_branch.go7
-rw-r--r--pkg/integration/tests/worktree/remove_worktree_from_branch.go7
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>&lt;c-y&gt;</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>&lt;space&gt;</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>&lt;space&gt;</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>&lt;c-y&gt;</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>&lt;c-y&gt;</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>&lt;space&gt;</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>&lt;c-y&gt;</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>&lt;space&gt;</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>&lt;c-y&gt;</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>&lt;space&gt;</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>&lt;c-y&gt;</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>&lt;space&gt;</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>&lt;c-y&gt;</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>&lt;space&gt;</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>&lt;c-y&gt;</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>&lt;space&gt;</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