Skip to content

Commit d7859a3

Browse files
Copilotalexr00
andcommitted
Add autoDeleteBranchesAfterMerge function for silent branch deletion
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent 2b4989f commit d7859a3

File tree

3 files changed

+67
-2
lines changed

3 files changed

+67
-2
lines changed

src/github/activityBarViewProvider.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -415,7 +415,7 @@ export class PullRequestViewProvider extends WebviewViewBase implements vscode.W
415415
const deleteBranchAfterMerge = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<boolean>(DELETE_BRANCH_AFTER_MERGE, false);
416416
if (deleteBranchAfterMerge) {
417417
// Automatically delete the branch after successful merge
418-
await PullRequestReviewCommon.deleteBranch(this._folderRepositoryManager, this._item);
418+
await PullRequestReviewCommon.autoDeleteBranchesAfterMerge(this._folderRepositoryManager, this._item);
419419
}
420420
}
421421

src/github/pullRequestOverview.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -631,7 +631,7 @@ export class PullRequestOverviewPanel extends IssueOverviewPanel<PullRequestMode
631631
const deleteBranchAfterMerge = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<boolean>(DELETE_BRANCH_AFTER_MERGE, false);
632632
if (deleteBranchAfterMerge) {
633633
// Automatically delete the branch after successful merge
634-
await PullRequestReviewCommon.deleteBranch(this._folderRepositoryManager, this._item);
634+
await PullRequestReviewCommon.autoDeleteBranchesAfterMerge(this._folderRepositoryManager, this._item);
635635
}
636636
}
637637

src/github/pullRequestReviewCommon.ts

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ import { FolderRepositoryManager } from './folderRepositoryManager';
99
import { IAccount, isITeam, ITeam, MergeMethod, PullRequestMergeability, reviewerId, ReviewState } from './interface';
1010
import { PullRequestModel } from './pullRequestModel';
1111
import { PullRequest, ReadyForReviewReply, ReviewType, SubmitReviewReply } from './views';
12+
import Logger from '../common/logger';
1213
import { DEFAULT_DELETION_METHOD, PR_SETTINGS_NAMESPACE, SELECT_LOCAL_BRANCH, SELECT_REMOTE } from '../common/settingKeys';
1314
import { ReviewEvent, TimelineEvent } from '../common/timelineEvent';
1415
import { Schemes } from '../common/uri';
@@ -403,4 +404,68 @@ export namespace PullRequestReviewCommon {
403404
};
404405
}
405406
}
407+
408+
/**
409+
* Automatically delete branches after merge based on user preferences.
410+
* This function does not show any prompts - it uses the default deletion method preferences.
411+
*/
412+
export async function autoDeleteBranchesAfterMerge(folderRepositoryManager: FolderRepositoryManager, item: PullRequestModel): Promise<void> {
413+
const branchInfo = await folderRepositoryManager.getBranchNameForPullRequest(item);
414+
const defaultBranch = await folderRepositoryManager.getPullRequestRepositoryDefaultBranch(item);
415+
416+
// Get user preferences for automatic deletion
417+
const deleteLocalBranch = vscode.workspace
418+
.getConfiguration(PR_SETTINGS_NAMESPACE)
419+
.get<boolean>(`${DEFAULT_DELETION_METHOD}.${SELECT_LOCAL_BRANCH}`, true);
420+
421+
const deleteRemote = vscode.workspace
422+
.getConfiguration(PR_SETTINGS_NAMESPACE)
423+
.get<boolean>(`${DEFAULT_DELETION_METHOD}.${SELECT_REMOTE}`, true);
424+
425+
const promises: Promise<void>[] = [];
426+
427+
// Delete remote head branch if it's not the default branch
428+
if (item.isResolved()) {
429+
const isDefaultBranch = defaultBranch === item.head.ref;
430+
if (!isDefaultBranch && !item.isRemoteHeadDeleted) {
431+
promises.push(
432+
folderRepositoryManager.deleteBranch(item).then(() => {
433+
return folderRepositoryManager.repository.fetch({ prune: true });
434+
}).catch(e => {
435+
Logger.warn(`Failed to delete remote branch for PR #${item.number}: ${e}`, 'PullRequestReviewCommon');
436+
})
437+
);
438+
}
439+
}
440+
441+
// Delete local branch if preference is set
442+
if (branchInfo && deleteLocalBranch) {
443+
const isBranchActive = item.equals(folderRepositoryManager.activePullRequest) ||
444+
(folderRepositoryManager.repository.state.HEAD?.name && folderRepositoryManager.repository.state.HEAD.name === branchInfo.branch);
445+
446+
promises.push(
447+
(async () => {
448+
if (isBranchActive) {
449+
// Checkout default branch before deleting the active branch
450+
await folderRepositoryManager.checkoutDefaultBranch(defaultBranch);
451+
}
452+
await folderRepositoryManager.repository.deleteBranch(branchInfo.branch, true);
453+
})().catch(e => {
454+
Logger.warn(`Failed to delete local branch ${branchInfo.branch} for PR #${item.number}: ${e}`, 'PullRequestReviewCommon');
455+
})
456+
);
457+
}
458+
459+
// Delete remote if it's no longer used and preference is set
460+
if (branchInfo && branchInfo.remote && branchInfo.createdForPullRequest && !branchInfo.remoteInUse && deleteRemote) {
461+
promises.push(
462+
folderRepositoryManager.repository.removeRemote(branchInfo.remote).catch(e => {
463+
Logger.warn(`Failed to delete remote ${branchInfo.remote} for PR #${item.number}: ${e}`, 'PullRequestReviewCommon');
464+
})
465+
);
466+
}
467+
468+
// Execute all deletions in parallel
469+
await Promise.all(promises);
470+
}
406471
}

0 commit comments

Comments
 (0)