in src/github/activityBarViewProvider.ts [307:426]
private async deleteBranch(message: IRequestMessage<any>) {
const branchInfo = await this._folderRepositoryManager.getBranchNameForPullRequest(this._item);
const actions: (vscode.QuickPickItem & { type: 'upstream' | 'local' | 'remote' | 'suspend' })[] = [];
if (this._item.isResolved()) {
const branchHeadRef = this._item.head.ref;
const defaultBranch = await this._folderRepositoryManager.getPullRequestRepositoryDefaultBranch(this._item);
const isDefaultBranch = defaultBranch === this._item.head.ref;
if (!isDefaultBranch) {
actions.push({
label: `Delete remote branch ${this._item.remote.remoteName}/${branchHeadRef}`,
description: `${this._item.remote.normalizedHost}/${this._item.remote.owner}/${this._item.remote.repositoryName}`,
type: 'upstream',
picked: true,
});
}
}
if (branchInfo) {
const preferredLocalBranchDeletionMethod = vscode.workspace
.getConfiguration('githubPullRequests')
.get<boolean>('defaultDeletionMethod.selectLocalBranch');
actions.push({
label: `Delete local branch ${branchInfo.branch}`,
type: 'local',
picked: !!preferredLocalBranchDeletionMethod,
});
const preferredRemoteDeletionMethod = vscode.workspace
.getConfiguration('githubPullRequests')
.get<boolean>('defaultDeletionMethod.selectRemote');
if (branchInfo.remote && branchInfo.createdForPullRequest && !branchInfo.remoteInUse) {
actions.push({
label: `Delete remote ${branchInfo.remote}, which is no longer used by any other branch`,
type: 'remote',
picked: !!preferredRemoteDeletionMethod,
});
}
}
if (vscode.env.remoteName === 'codespaces') {
actions.push({
label: 'Suspend Codespace',
type: 'suspend'
});
}
if (!actions.length) {
vscode.window.showWarningMessage(
`There is no longer an upstream or local branch for Pull Request #${this._item.number}`,
);
this._replyMessage(message, {
cancelled: true,
});
return;
}
const selectedActions = await vscode.window.showQuickPick(actions, {
canPickMany: true,
ignoreFocusOut: true,
});
const deletedBranchTypes: string[] = [];
if (selectedActions) {
const isBranchActive = this._item.equals(this._folderRepositoryManager.activePullRequest);
const promises = selectedActions.map(async action => {
switch (action.type) {
case 'upstream':
await this._folderRepositoryManager.deleteBranch(this._item);
deletedBranchTypes.push(action.type);
return this._folderRepositoryManager.repository.fetch({ prune: true });
case 'local':
if (isBranchActive) {
if (this._folderRepositoryManager.repository.state.workingTreeChanges.length) {
const response = await vscode.window.showWarningMessage(
`Your local changes will be lost, do you want to continue?`,
{ modal: true },
'Yes',
);
if (response === 'Yes') {
await vscode.commands.executeCommand('git.cleanAll');
} else {
return;
}
}
const defaultBranch = await this._folderRepositoryManager.getPullRequestRepositoryDefaultBranch(
this._item,
);
await this._folderRepositoryManager.repository.checkout(defaultBranch);
}
await this._folderRepositoryManager.repository.deleteBranch(branchInfo!.branch, true);
return deletedBranchTypes.push(action.type);
case 'remote':
await this._folderRepositoryManager.repository.removeRemote(branchInfo!.remote!);
return deletedBranchTypes.push(action.type);
case 'suspend':
await vscode.commands.executeCommand('github.codespaces.disconnectSuspend');
return deletedBranchTypes.push(action.type);
}
});
await Promise.all(promises);
vscode.commands.executeCommand('pr.refreshList');
this._postMessage({
command: 'pr.deleteBranch',
branchTypes: deletedBranchTypes
});
} else {
this._replyMessage(message, {
cancelled: true,
});
}
}