@@ -17,7 +17,7 @@ import { PullRequestModel } from './pullRequestModel';
1717import { getDefaultMergeMethod } from './pullRequestOverview' ;
1818import { getAssigneesQuickPickItems , getLabelOptions , getMilestoneFromQuickPick , getProjectFromQuickPick , reviewersQuickPick } from './quickPicks' ;
1919import { getIssueNumberLabelFromParsed , ISSUE_EXPRESSION , ISSUE_OR_URL_EXPRESSION , parseIssueExpressionOutput , variableSubstitution } from './utils' ;
20- import { DisplayLabel , PreReviewState } from './views' ;
20+ import { ChangeTemplateReply , DisplayLabel , PreReviewState } from './views' ;
2121import { RemoteInfo } from '../../common/types' ;
2222import { ChooseBaseRemoteAndBranchResult , ChooseCompareRemoteAndBranchResult , ChooseRemoteAndBranchArgs , CreateParamsNew , CreatePullRequestNew , TitleAndDescriptionArgs } from '../../common/views' ;
2323import type { Branch , Ref } from '../api/api' ;
@@ -245,7 +245,9 @@ export abstract class BaseCreatePullRequestViewProvider<T extends BasePullReques
245245 }
246246 commands . setContext ( contexts . CREATE_PR_PERMISSIONS , viewerPermission ) ;
247247
248- const useCopilot : boolean = ! ! this . getTitleAndDescriptionProvider ( 'Copilot' ) && ( vscode . workspace . getConfiguration ( PR_SETTINGS_NAMESPACE ) . get < 'commit' | 'template' | 'branchName' | 'none' | 'Copilot' > ( PULL_REQUEST_DESCRIPTION ) === 'Copilot' ) ;
248+ const descriptionSource = vscode . workspace . getConfiguration ( PR_SETTINGS_NAMESPACE ) . get < 'commit' | 'template' | 'none' | 'Copilot' > ( PULL_REQUEST_DESCRIPTION ) ;
249+ const useCopilot : boolean = ! ! this . getTitleAndDescriptionProvider ( 'Copilot' ) && ( descriptionSource === 'Copilot' ) ;
250+ const usingTemplate : boolean = descriptionSource === 'template' ;
249251 const defaultTitleAndDescriptionProvider = this . getTitleAndDescriptionProvider ( ) ?. title ;
250252 if ( defaultTitleAndDescriptionProvider ) {
251253 /* __GDPR__
@@ -282,7 +284,8 @@ export abstract class BaseCreatePullRequestViewProvider<T extends BasePullReques
282284 initializeWithGeneratedTitleAndDescription : useCopilot ,
283285 preReviewState : PreReviewState . None ,
284286 preReviewer : preReviewer ?. title ,
285- reviewing : false
287+ reviewing : false ,
288+ usingTemplate
286289 } ;
287290
288291 return params ;
@@ -799,6 +802,46 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
799802 return this . _folderRepositoryManager . getPullRequestTemplateBody ( this . model . baseOwner ) ;
800803 }
801804
805+ private async changeTemplate ( message : IRequestMessage < any > ) : Promise < void > {
806+ const templates = await this . _folderRepositoryManager . getAllPullRequestTemplates ( this . model . baseOwner ) ;
807+
808+ if ( ! templates || templates . length === 0 ) {
809+ vscode . window . showInformationMessage ( vscode . l10n . t ( 'No pull request templates found' ) ) ;
810+ return this . _replyMessage ( message , undefined ) ;
811+ }
812+
813+ if ( templates . length === 1 ) {
814+ vscode . window . showInformationMessage ( vscode . l10n . t ( 'Only one template is available' ) ) ;
815+ return this . _replyMessage ( message , undefined ) ;
816+ }
817+
818+ // Multiple templates exist - show quick pick
819+ const selectedTemplate = await vscode . window . showQuickPick (
820+ templates . map ( ( template , index ) => {
821+ // Try to extract a meaningful name from the template (first line or first few chars)
822+ const firstLine = template . split ( '\n' ) [ 0 ] . trim ( ) ;
823+ const label = firstLine || `Template ${ index + 1 } ` ;
824+ return {
825+ label : label . substring ( 0 , 50 ) + ( label . length > 50 ? '...' : '' ) ,
826+ description : `${ template . length } characters` ,
827+ template : template
828+ } ;
829+ } ) ,
830+ {
831+ placeHolder : vscode . l10n . t ( 'Select a pull request template' ) ,
832+ ignoreFocusOut : true
833+ }
834+ ) ;
835+
836+ if ( selectedTemplate ) {
837+ const reply : ChangeTemplateReply = {
838+ description : selectedTemplate . template
839+ } ;
840+ return this . _replyMessage ( message , reply ) ;
841+ }
842+ return this . _replyMessage ( message , undefined ) ;
843+ }
844+
802845 protected async detectBaseMetadata ( defaultCompareBranch : Branch ) : Promise < BaseBranchMetadata | undefined > {
803846 const owner = this . model . compareOwner ;
804847 const repositoryName = this . model . repositoryName ;
@@ -1413,6 +1456,9 @@ export class CreatePullRequestViewProvider extends BaseCreatePullRequestViewProv
14131456 case 'pr.cancelGenerateTitleAndDescription' :
14141457 return this . cancelGenerateTitleAndDescription ( ) ;
14151458
1459+ case 'pr.changeTemplate' :
1460+ return this . changeTemplate ( message ) ;
1461+
14161462 case 'pr.preReview' :
14171463 return this . preReview ( message ) ;
14181464
0 commit comments