@@ -9,6 +9,7 @@ import { FolderRepositoryManager } from './folderRepositoryManager';
99import { IAccount , isITeam , ITeam , MergeMethod , PullRequestMergeability , reviewerId , ReviewState } from './interface' ;
1010import { PullRequestModel } from './pullRequestModel' ;
1111import { PullRequest , ReadyForReviewReply , ReviewType , SubmitReviewReply } from './views' ;
12+ import Logger from '../common/logger' ;
1213import { DEFAULT_DELETION_METHOD , PR_SETTINGS_NAMESPACE , SELECT_LOCAL_BRANCH , SELECT_REMOTE } from '../common/settingKeys' ;
1314import { ReviewEvent , TimelineEvent } from '../common/timelineEvent' ;
1415import { 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