Skip to content

Commit 0bb7f31

Browse files
Copilotalexr00
andcommitted
Add template count query and hide Change template button when <=1 template
Co-authored-by: alexr00 <38270282+alexr00@users.noreply.github.com>
1 parent eae2e78 commit 0bb7f31

6 files changed

Lines changed: 58 additions & 4 deletions

File tree

common/views.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@ export interface CreateParamsNew {
131131
creating: boolean;
132132
reviewing: boolean;
133133
usingTemplate: boolean;
134+
templateCount?: number;
134135
}
135136

136137
export interface ChooseRemoteAndBranchArgs {

src/github/createPRViewProvider.ts

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -210,12 +210,13 @@ export abstract class BaseCreatePullRequestViewProvider<T extends BasePullReques
210210

211211
const defaultBaseBranch = detectedBaseMetadata?.branch ?? this._pullRequestDefaults.base;
212212

213-
const [defaultTitleAndDescription, mergeConfiguration, viewerPermission, mergeQueueMethodForBranch, labels] = await Promise.all([
213+
const [defaultTitleAndDescription, mergeConfiguration, viewerPermission, mergeQueueMethodForBranch, labels, templateCount] = await Promise.all([
214214
this.getTitleAndDescription(defaultCompareBranch, defaultBaseBranch),
215215
this.getMergeConfiguration(defaultBaseRemote.owner, defaultBaseRemote.repositoryName),
216216
defaultOrigin.getViewerPermission(),
217217
this._folderRepositoryManager.mergeQueueMethodForBranch(defaultBaseBranch, defaultBaseRemote.owner, defaultBaseRemote.repositoryName),
218-
this.getPullRequestDefaultLabels(defaultBaseRemote)
218+
this.getPullRequestDefaultLabels(defaultBaseRemote),
219+
this._folderRepositoryManager.getPullRequestTemplateCount(defaultBaseRemote.owner)
219220
]);
220221

221222
const defaultCreateOption = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE).get<'lastUsed' | 'create' | 'createDraft' | 'createAutoMerge'>(DEFAULT_CREATE_OPTION, 'lastUsed');
@@ -279,7 +280,8 @@ export abstract class BaseCreatePullRequestViewProvider<T extends BasePullReques
279280
preReviewState: PreReviewState.None,
280281
preReviewer: preReviewer?.title,
281282
reviewing: false,
282-
usingTemplate
283+
usingTemplate,
284+
templateCount
283285
};
284286

285287
return params;

src/github/folderRepositoryManager.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1511,6 +1511,28 @@ export class FolderRepositoryManager extends Disposable {
15111511
}
15121512
}
15131513

1514+
async getPullRequestTemplateCount(owner: string): Promise<number> {
1515+
try {
1516+
const repository = this.gitHubRepositories.find(repo => repo.remote.owner === owner);
1517+
if (!repository) {
1518+
return 0;
1519+
}
1520+
let count = await repository.getPullRequestTemplateCount();
1521+
1522+
// If there's no local template, look for owner-wide templates
1523+
if (count === 0) {
1524+
const githubRepository = await this.createGitHubRepositoryFromOwnerName(owner, '.github');
1525+
if (githubRepository) {
1526+
count = await githubRepository.getPullRequestTemplateCount();
1527+
}
1528+
}
1529+
return count;
1530+
} catch (e) {
1531+
Logger.error(`Error fetching pull request template count for ${owner}: ${e instanceof Error ? e.message : e}`, this.id);
1532+
return 0;
1533+
}
1534+
}
1535+
15141536
private async getPullRequestTemplateWithCache(owner: string): Promise<string | undefined> {
15151537
const cacheLocation = `${CACHED_TEMPLATE_BODY}+${this.repository.rootUri.toString()}`;
15161538

src/github/githubRepository.ts

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -505,6 +505,27 @@ export class GitHubRepository extends Disposable {
505505
}
506506
}
507507

508+
async getPullRequestTemplateCount(): Promise<number> {
509+
try {
510+
Logger.debug('Fetch pull request template count - enter', this.id);
511+
const { query, remote, schema } = await this.ensure();
512+
513+
const result = await query<PullRequestTemplatesResponse>({
514+
query: schema.PullRequestTemplateCount,
515+
variables: {
516+
owner: remote.owner,
517+
name: remote.repositoryName,
518+
}
519+
});
520+
521+
Logger.debug('Fetch pull request template count - done', this.id);
522+
return result.data.repository.pullRequestTemplates?.length ?? 0;
523+
} catch (e) {
524+
Logger.debug('Failed to fetch pull request template count', this.id);
525+
return 0;
526+
}
527+
}
528+
508529
private _repoAccessAndMergeMethods: RepoAccessAndMergeMethods | undefined;
509530
async getRepoAccessAndMergeMethods(refetch: boolean = false): Promise<RepoAccessAndMergeMethods> {
510531
try {

src/github/queriesShared.gql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -720,6 +720,14 @@ query PullRequestTemplates($owner: String!, $name: String!) {
720720
}
721721
}
722722

723+
query PullRequestTemplateCount($owner: String!, $name: String!) {
724+
repository(owner: $owner, name: $name) {
725+
pullRequestTemplates {
726+
body
727+
}
728+
}
729+
}
730+
723731
fragment PullRequestNumberFragment on PullRequest {
724732
number
725733
title

webviews/createPullRequestViewNew/app.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -340,7 +340,7 @@ export function main() {
340340
<div className='description-title'>
341341
<label htmlFor='description' className='input-title'>Description</label>
342342
<div className='description-actions'>
343-
{ctx.createParams.usingTemplate ?
343+
{ctx.createParams.usingTemplate && (ctx.createParams.templateCount ?? 0) > 1 ?
344344
<a title='Change template' className={`title-action icon-button${isBusy || !ctx.initialized ? ' disabled' : ''}`} onClick={() => changeTemplate()} tabIndex={0}>{notebookTemplate}</a> : null}
345345
<a role='button' title='Open pull request description settings' aria-label='Open pull request description settings' className='icon-button' onClick={openDescriptionSettings} tabIndex={0}>{settingsIcon}</a>
346346
</div>

0 commit comments

Comments
 (0)