diff --git a/src/gitGraphView.ts b/src/gitGraphView.ts index dcff538b..5e1543fa 100644 --- a/src/gitGraphView.ts +++ b/src/gitGraphView.ts @@ -294,10 +294,18 @@ export class GitGraphView extends Disposable { break; case 'deleteBranch': errorInfos = [await this.dataSource.deleteBranch(msg.repo, msg.branchName, msg.forceDelete)]; - for (let i = 0; i < msg.deleteOnRemotes.length; i++) { - errorInfos.push(await this.dataSource.deleteRemoteBranch(msg.repo, msg.branchName, msg.deleteOnRemotes[i])); + if (errorInfos[0] === null) { + for (let i = 0; i < msg.deleteOnRemotes.length; i++) { + errorInfos.push(await this.dataSource.deleteRemoteBranch(msg.repo, msg.branchName, msg.deleteOnRemotes[i])); + } } - this.sendMessage({ command: 'deleteBranch', errors: errorInfos }); + this.sendMessage({ + command: 'deleteBranch', + repo: msg.repo, + branchName: msg.branchName, + deleteOnRemotes: msg.deleteOnRemotes, + errors: errorInfos + }); break; case 'deleteRemote': this.sendMessage({ diff --git a/src/types.ts b/src/types.ts index e7c82c2a..b4d2a90b 100644 --- a/src/types.ts +++ b/src/types.ts @@ -713,6 +713,9 @@ export interface RequestDeleteBranch extends RepoRequest { } export interface ResponseDeleteBranch extends ResponseWithMultiErrorInfo { readonly command: 'deleteBranch'; + readonly repo: string; + readonly branchName: string; + readonly deleteOnRemotes: ReadonlyArray; } export interface RequestDeleteRemote extends RepoRequest { diff --git a/web/main.ts b/web/main.ts index e6ac997e..16e22dc5 100644 --- a/web/main.ts +++ b/web/main.ts @@ -934,7 +934,7 @@ class GitGraphView { value: false }); } - dialog.showForm('Are you sure you want to delete the branch ' + escapeHtml(refName) + '?', inputs, 'Delete Branch', (values) => { + dialog.showForm('Are you sure you want to delete the branch ' + escapeHtml(refName) + '?', inputs, 'Yes, delete', (values) => { runAction({ command: 'deleteBranch', repo: this.currentRepo, branchName: refName, forceDelete: values[0], deleteOnRemotes: remotesWithBranch.length > 0 && values[1] ? remotesWithBranch : [] }, 'Deleting Branch'); }, target); } @@ -2889,7 +2889,7 @@ window.addEventListener('load', () => { }, true); break; case 'deleteBranch': - refreshAndDisplayErrors(msg.errors, 'Unable to Delete Branch'); + handleResponseDeleteBranch(msg); break; case 'deleteRemote': refreshOrDisplayError(msg.error, 'Unable to Delete Remote'); @@ -3032,6 +3032,16 @@ window.addEventListener('load', () => { } }); + function handleResponseDeleteBranch(msg: GG.ResponseDeleteBranch) { + if (msg.errors.length > 0 && msg.errors[0] !== null && msg.errors[0].includes('git branch -D')) { + dialog.showConfirmation('The branch ' + escapeHtml(msg.branchName) + ' is not fully merged. Would you like to force delete it?', 'Yes, force delete branch', () => { + runAction({ command: 'deleteBranch', repo: msg.repo, branchName: msg.branchName, forceDelete: true, deleteOnRemotes: msg.deleteOnRemotes }, 'Deleting Branch'); + }, { type: TargetType.Repo }); + } else { + refreshAndDisplayErrors(msg.errors, 'Unable to Delete Branch'); + } + } + function refreshOrDisplayError(error: GG.ErrorInfo, errorMessage: string) { if (error === null) { gitGraph.refresh(false);