Skip to content

Simplify the default set of queries #6983

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 3 commits into from
May 27, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 12 additions & 4 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -177,22 +177,30 @@
"type": "string",
"description": "%githubPullRequests.queries.query.description%"
}
},
"default": {
"label": "%githubPullRequests.queries.assignedToMe%",
"query": "repo:${owner}/${repository} is:open assignee:${user}"
}
},
"scope": "resource",
"markdownDescription": "%githubPullRequests.queries.markdownDescription%",
"default": [
{
"label": "%githubPullRequests.queries.waitingForMyReview%",
"query": "repo:${owner}/${repository} is:open review-requested:${user}"
"label": "Local Pull Request Branches",
"query": "default"
},
{
"label": "%githubPullRequests.queries.assignedToMe%",
"query": "repo:${owner}/${repository} is:open assignee:${user}"
"label": "%githubPullRequests.queries.waitingForMyReview%",
"query": "repo:${owner}/${repository} is:open review-requested:${user}"
},
{
"label": "%githubPullRequests.queries.createdByMe%",
"query": "repo:${owner}/${repository} is:open author:${user}"
},
{
"label": "All Open",
"query": "default"
}
]
},
Expand Down
59 changes: 50 additions & 9 deletions src/migrations.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,16 @@
import * as vscode from 'vscode';
import * as PersistentState from './common/persistentState';
import { BRANCH_PUBLISH, PR_SETTINGS_NAMESPACE, QUERIES } from './common/settingKeys';
import { DefaultQueries, isAllQuery, isLocalQuery } from './view/treeNodes/categoryNode';
import { IQueryInfo } from './view/treeNodes/workspaceFolderNode';

const PROMPTS_SCOPE = 'prompts';
const PROMPT_TO_CREATE_PR_ON_PUBLISH_KEY = 'createPROnPublish';

export async function migrate(context: vscode.ExtensionContext) {
await createOnPublish();
await makeQueriesScopedToRepo(context);
await addDefaultQueries(context);
}

async function createOnPublish() {
Expand All @@ -34,11 +37,7 @@ async function makeQueriesScopedToRepo(context: vscode.ExtensionContext) {
const configuration = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE);
const settingValue = configuration.inspect(QUERIES);

type Query = {
label: string,
query: string,
};
const addRepoScope = (queries: Query[]) => {
const addRepoScope = (queries: IQueryInfo[]) => {
return queries.map(query => {
return {
label: query.label,
Expand All @@ -49,13 +48,55 @@ async function makeQueriesScopedToRepo(context: vscode.ExtensionContext) {

// User setting
if (!hasMigratedUserQueries && settingValue?.globalValue) {
await configuration.update(QUERIES, addRepoScope(settingValue.globalValue as Query[]), vscode.ConfigurationTarget.Global);
context.globalState.update(HAS_MIGRATED_QUERIES, true);
await configuration.update(QUERIES, addRepoScope(settingValue.globalValue as IQueryInfo[]), vscode.ConfigurationTarget.Global);
}
context.globalState.update(HAS_MIGRATED_QUERIES, true);

// Workspace setting
if (!hasMigratedWorkspaceQueries && settingValue?.workspaceValue) {
await configuration.update(QUERIES, addRepoScope(settingValue.workspaceValue as IQueryInfo[]), vscode.ConfigurationTarget.Workspace);
}
context.workspaceState.update(HAS_MIGRATED_QUERIES, true);
}

const HAS_MIGRATED_DEFAULT_QUERIES = 'hasMigratedDefaultQueries4';
async function addDefaultQueries(context: vscode.ExtensionContext) {
const hasMigratedUserQueries = context.globalState.get<boolean>(HAS_MIGRATED_DEFAULT_QUERIES, false);
const hasMigratedWorkspaceQueries = context.workspaceState.get<boolean>(HAS_MIGRATED_DEFAULT_QUERIES, false);
if (hasMigratedUserQueries && hasMigratedWorkspaceQueries) {
return;
}

const configuration = vscode.workspace.getConfiguration(PR_SETTINGS_NAMESPACE);
const settingValue = configuration.inspect(QUERIES);

const addNewDefaultQueries = (queries: IQueryInfo[]) => {
const hasLocalQuery = queries.some(query => isLocalQuery(query));
const hasAllQuery = queries.some(query => isAllQuery(query));
if (!hasLocalQuery) {
queries.unshift({
label: DefaultQueries.Queries.LOCAL,
query: DefaultQueries.Values.DEFAULT,
});
}
if (!hasAllQuery) {
queries.push({
label: DefaultQueries.Queries.ALL,
query: DefaultQueries.Values.DEFAULT,
});
}
return queries;
};

// User setting
if (!hasMigratedUserQueries && settingValue?.globalValue) {
await configuration.update(QUERIES, addNewDefaultQueries(settingValue.globalValue as IQueryInfo[]), vscode.ConfigurationTarget.Global);
}
context.globalState.update(HAS_MIGRATED_DEFAULT_QUERIES, true);

// Workspace setting
if (!hasMigratedWorkspaceQueries && settingValue?.workspaceValue) {
await configuration.update(QUERIES, addRepoScope(settingValue.workspaceValue as Query[]), vscode.ConfigurationTarget.Workspace);
context.workspaceState.update(HAS_MIGRATED_QUERIES, true);
await configuration.update(QUERIES, addNewDefaultQueries(settingValue.workspaceValue as IQueryInfo[]), vscode.ConfigurationTarget.Workspace);
}
context.workspaceState.update(HAS_MIGRATED_DEFAULT_QUERIES, true);
}
2 changes: 1 addition & 1 deletion src/test/view/prsTree.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -124,7 +124,7 @@ describe('GitHub Pull Requests view', function () {
assert(treeItems[treeItems.length - 1].collapsibleState === vscode.TreeItemCollapsibleState.Expanded);
assert.deepStrictEqual(
treeItems.map(n => n.label),
['Local Pull Request Branches', 'Waiting For My Review', 'Assigned To Me', 'Created By Me', 'All Open'],
['Local Pull Request Branches', 'Waiting For My Review', 'Created By Me', 'All Open'],
);
});

Expand Down
19 changes: 19 additions & 0 deletions src/view/treeNodes/categoryNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { PullRequestModel } from '../../github/pullRequestModel';
import { PrsTreeModel } from '../prsTreeModel';
import { PRNode } from './pullRequestNode';
import { TreeNode, TreeNodeParent } from './treeNode';
import { IQueryInfo } from './workspaceFolderNode';

export enum PRCategoryActionType {
Empty,
Expand Down Expand Up @@ -101,6 +102,24 @@ interface PageInformation {
hasMorePages: boolean;
}

export namespace DefaultQueries {
export namespace Queries {
export const LOCAL = 'Local Pull Request Branches';
export const ALL = 'All Open';
}
export namespace Values {
export const DEFAULT = 'default';
}
}

export function isLocalQuery(queryInfo: IQueryInfo): boolean {
return queryInfo.label === DefaultQueries.Queries.LOCAL && queryInfo.query === DefaultQueries.Values.DEFAULT;
}

export function isAllQuery(queryInfo: IQueryInfo): boolean {
return queryInfo.label === DefaultQueries.Queries.ALL && queryInfo.query === DefaultQueries.Values.DEFAULT;
}

export class CategoryTreeNode extends TreeNode implements vscode.TreeItem {
public collapsibleState: vscode.TreeItemCollapsibleState;
public prs: Map<number, PullRequestModel>;
Expand Down
20 changes: 11 additions & 9 deletions src/view/treeNodes/workspaceFolderNode.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import { PRType } from '../../github/interface';
import { NotificationProvider } from '../../github/notifications';
import { PullRequestModel } from '../../github/pullRequestModel';
import { PrsTreeModel } from '../prsTreeModel';
import { CategoryTreeNode } from './categoryNode';
import { CategoryTreeNode, isAllQuery, isLocalQuery } from './categoryNode';
import { TreeNode, TreeNodeParent } from './treeNode';

export interface IQueryInfo {
Expand Down Expand Up @@ -58,7 +58,7 @@ export class WorkspaceFolderNode extends TreeNode implements vscode.TreeItem {
const defaultQueries = configuration.inspect(QUERIES)?.defaultValue as IQueryInfo[] | undefined;
if (queries.toString() === defaultQueries?.toString()) {
const assignableUsers = await folderManager.getAssignableUsers(false);
const hasCopilot = folderManager.gitHubRepositories.some(repo => assignableUsers[repo.remote.remoteName].some(user => COPILOT_ACCOUNTS[user.login]));
const hasCopilot = folderManager.gitHubRepositories.some(repo => assignableUsers[repo.remote.remoteName]?.some(user => COPILOT_ACCOUNTS[user.login]));
if (hasCopilot) {
queries.unshift({
label: vscode.l10n.t('Copilot on My Behalf'),
Expand Down Expand Up @@ -89,13 +89,15 @@ export class WorkspaceFolderNode extends TreeNode implements vscode.TreeItem {
prsTreeModel: PrsTreeModel,
) {
const queryCategories = (await WorkspaceFolderNode.getQueries(folderManager)).map(
queryInfo =>
new CategoryTreeNode(parent, folderManager, telemetry, PRType.Query, notificationProvider, prsTreeModel, queryInfo.label, queryInfo.query),
queryInfo => {
if (isLocalQuery(queryInfo)) {
return new CategoryTreeNode(parent, folderManager, telemetry, PRType.LocalPullRequest, notificationProvider, prsTreeModel);
} else if (isAllQuery(queryInfo)) {
return new CategoryTreeNode(parent, folderManager, telemetry, PRType.All, notificationProvider, prsTreeModel);
}
return new CategoryTreeNode(parent, folderManager, telemetry, PRType.Query, notificationProvider, prsTreeModel, queryInfo.label, queryInfo.query);
}
);
return [
new CategoryTreeNode(parent, folderManager, telemetry, PRType.LocalPullRequest, notificationProvider, prsTreeModel),
...queryCategories,
new CategoryTreeNode(parent, folderManager, telemetry, PRType.All, notificationProvider, prsTreeModel),
];
return queryCategories;
}
}