Skip to content

Commit 4ed409d

Browse files
committed
Use selected repositories for copying repo lists
This will use the selected repositories to limit which repositories are included in the copied repo list. If there are both selected repositories and a search filter (on the full name), the search filter will be ignored and the selected repositories will be used in full.
1 parent 73ff057 commit 4ed409d

File tree

6 files changed

+133
-16
lines changed

6 files changed

+133
-16
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ import { createVariantAnalysisContentProvider } from './remote-queries/variant-a
116116
import { VSCodeMockGitHubApiServer } from './mocks/vscode-mock-gh-api-server';
117117
import { VariantAnalysisResultsManager } from './remote-queries/variant-analysis-results-manager';
118118
import { initializeDbModule } from './databases/db-module';
119-
import { RepositoriesFilterSortState } from './pure/variant-analysis-filter-sort';
119+
import { RepositoriesFilterSortStateWithIds } from './pure/variant-analysis-filter-sort';
120120

121121
/**
122122
* extension.ts
@@ -946,7 +946,7 @@ async function activateWithInstalledDistribution(
946946
);
947947

948948
ctx.subscriptions.push(
949-
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number, filterSort?: RepositoriesFilterSortState) => {
949+
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number, filterSort?: RepositoriesFilterSortStateWithIds) => {
950950
await variantAnalysisManager.copyRepoListToClipboard(variantAnalysisId, filterSort);
951951
})
952952
);

extensions/ql-vscode/src/pure/interface-types.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@ import {
77
VariantAnalysisScannedRepositoryResult,
88
VariantAnalysisScannedRepositoryState,
99
} from '../remote-queries/shared/variant-analysis';
10-
import { RepositoriesFilterSortState } from './variant-analysis-filter-sort';
10+
import { RepositoriesFilterSortStateWithIds } from './variant-analysis-filter-sort';
1111

1212
/**
1313
* This module contains types and code that are shared between
@@ -475,7 +475,7 @@ export interface OpenQueryTextMessage {
475475

476476
export interface CopyRepositoryListMessage {
477477
t: 'copyRepositoryList';
478-
filterSort?: RepositoriesFilterSortState;
478+
filterSort?: RepositoriesFilterSortStateWithIds;
479479
}
480480

481481
export interface OpenLogsMessage {

extensions/ql-vscode/src/pure/variant-analysis-filter-sort.ts

Lines changed: 25 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ export type RepositoriesFilterSortState = {
1313
sortKey: SortKey;
1414
}
1515

16+
export type RepositoriesFilterSortStateWithIds = RepositoriesFilterSortState & {
17+
repositoryIds?: number[];
18+
}
19+
1620
export const defaultFilterSortState: RepositoriesFilterSortState = {
1721
searchValue: '',
1822
sortKey: SortKey.Name,
@@ -52,7 +56,7 @@ export function compareRepository(filterSortState: RepositoriesFilterSortState |
5256
}
5357

5458
type SortableResult = {
55-
repository: SortableRepository;
59+
repository: SortableRepository & Pick<Repository, 'id'>;
5660
resultCount?: number;
5761
}
5862

@@ -72,16 +76,30 @@ export function compareWithResults(filterSortState: RepositoriesFilterSortState
7276
};
7377
}
7478

79+
function hasRepositoryIds(filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): filterSortState is RepositoriesFilterSortStateWithIds {
80+
if (!filterSortState) {
81+
return false;
82+
}
83+
84+
return 'repositoryIds' in filterSortState;
85+
}
86+
87+
function isFilterOnRepositoryIds(filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): filterSortState is RepositoriesFilterSortStateWithIds & Required<Pick<RepositoriesFilterSortStateWithIds, 'repositoryIds'>> {
88+
return hasRepositoryIds(filterSortState) && filterSortState.repositoryIds !== undefined && filterSortState.repositoryIds.length > 0;
89+
}
90+
7591
// These define the behavior for undefined input values
76-
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[], filterSortState: RepositoriesFilterSortState | undefined): T[];
77-
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | undefined): T[] | undefined;
92+
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[], filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): T[];
93+
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): T[] | undefined;
7894

79-
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | undefined): T[] | undefined {
95+
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | RepositoriesFilterSortStateWithIds | undefined): T[] | undefined {
8096
if (!repositories) {
8197
return undefined;
8298
}
8399

84-
return repositories
85-
.filter(repo => matchesFilter(repo.repository, filterSortState))
86-
.sort(compareWithResults(filterSortState));
100+
const filteredRepositories = isFilterOnRepositoryIds(filterSortState) ?
101+
repositories.filter(repo => filterSortState.repositoryIds.includes(repo.repository.id)) :
102+
repositories.filter(repo => matchesFilter(repo.repository, filterSortState));
103+
104+
return filteredRepositories.sort(compareWithResults(filterSortState));
87105
}

extensions/ql-vscode/src/remote-queries/variant-analysis-manager.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ import { CodeQLCliServer } from '../cli';
3535
import {
3636
defaultFilterSortState,
3737
filterAndSortRepositoriesWithResults,
38-
RepositoriesFilterSortState,
38+
RepositoriesFilterSortStateWithIds,
3939
} from '../pure/variant-analysis-filter-sort';
4040

4141
export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager<VariantAnalysisView> {
@@ -373,7 +373,7 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
373373
await cancelVariantAnalysis(credentials, variantAnalysis);
374374
}
375375

376-
public async copyRepoListToClipboard(variantAnalysisId: number, filterSort: RepositoriesFilterSortState = defaultFilterSortState) {
376+
public async copyRepoListToClipboard(variantAnalysisId: number, filterSort: RepositoriesFilterSortStateWithIds = defaultFilterSortState) {
377377
const variantAnalysis = this.variantAnalyses.get(variantAnalysisId);
378378
if (!variantAnalysis) {
379379
throw new Error(`No variant analysis with id: ${variantAnalysisId}`);

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysis.tsx

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,9 +91,12 @@ export function VariantAnalysis({
9191
const copyRepositoryList = useCallback(() => {
9292
vscode.postMessage({
9393
t: 'copyRepositoryList',
94-
filterSort: filterSortState,
94+
filterSort: {
95+
...filterSortState,
96+
repositoryIds: selectedRepositoryIds,
97+
},
9598
});
96-
}, [filterSortState]);
99+
}, [filterSortState, selectedRepositoryIds]);
97100

98101
if (variantAnalysis?.actionsWorkflowRunId === undefined) {
99102
return <VariantAnalysisLoading />;

extensions/ql-vscode/src/view/variant-analysis/__tests__/filterSort.spec.ts

Lines changed: 97 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,11 @@
1-
import { compareRepository, compareWithResults, defaultFilterSortState, matchesFilter, SortKey } from '../../../pure/variant-analysis-filter-sort';
1+
import {
2+
compareRepository,
3+
compareWithResults,
4+
defaultFilterSortState,
5+
filterAndSortRepositoriesWithResults,
6+
matchesFilter,
7+
SortKey,
8+
} from '../../../pure/variant-analysis-filter-sort';
29

310
// TODO: Move this file to the "pure" tests once it has been switched to Jest
411
describe(matchesFilter.name, () => {
@@ -170,11 +177,13 @@ describe(compareWithResults.name, () => {
170177

171178
const left = {
172179
repository: {
180+
id: 10,
173181
fullName: 'github/galaxy',
174182
},
175183
};
176184
const right = {
177185
repository: {
186+
id: 12,
178187
fullName: 'github/world',
179188
},
180189
};
@@ -192,12 +201,14 @@ describe(compareWithResults.name, () => {
192201

193202
const left = {
194203
repository: {
204+
id: 11,
195205
fullName: 'github/galaxy',
196206
stargazersCount: 1,
197207
},
198208
};
199209
const right = {
200210
repository: {
211+
id: 12,
201212
fullName: 'github/world',
202213
stargazersCount: 10,
203214
},
@@ -216,12 +227,14 @@ describe(compareWithResults.name, () => {
216227

217228
const left = {
218229
repository: {
230+
id: 11,
219231
fullName: 'github/galaxy',
220232
updatedAt: '2020-01-01T00:00:00Z',
221233
},
222234
};
223235
const right = {
224236
repository: {
237+
id: 12,
225238
fullName: 'github/world',
226239
updatedAt: '2021-01-01T00:00:00Z',
227240
},
@@ -240,12 +253,14 @@ describe(compareWithResults.name, () => {
240253

241254
const left = {
242255
repository: {
256+
id: 11,
243257
fullName: 'github/galaxy',
244258
},
245259
resultCount: 10,
246260
};
247261
const right = {
248262
repository: {
263+
id: 12,
249264
fullName: 'github/world',
250265
},
251266
resultCount: 100,
@@ -278,3 +293,84 @@ describe(compareWithResults.name, () => {
278293
});
279294
});
280295
});
296+
297+
describe(filterAndSortRepositoriesWithResults.name, () => {
298+
const repositories = [
299+
{
300+
repository: {
301+
id: 10,
302+
fullName: 'github/galaxy',
303+
},
304+
resultCount: 10,
305+
},
306+
{
307+
repository: {
308+
id: 11,
309+
fullName: 'github/world',
310+
},
311+
resultCount: undefined,
312+
},
313+
{
314+
repository: {
315+
id: 13,
316+
fullName: 'github/planet',
317+
},
318+
resultCount: 500,
319+
},
320+
{
321+
repository: {
322+
id: 783532,
323+
fullName: 'github/stars',
324+
},
325+
resultCount: 8000,
326+
}
327+
];
328+
329+
describe('when sort key is given without filter', () => {
330+
it('returns the correct results', () => {
331+
expect(filterAndSortRepositoriesWithResults(repositories, {
332+
...defaultFilterSortState,
333+
sortKey: SortKey.ResultsCount,
334+
})).toEqual([repositories[3], repositories[2], repositories[0], repositories[1]]);
335+
});
336+
});
337+
338+
describe('when sort key and search filter are given', () => {
339+
it('returns the correct results', () => {
340+
expect(filterAndSortRepositoriesWithResults(repositories, {
341+
...defaultFilterSortState,
342+
sortKey: SortKey.ResultsCount,
343+
searchValue: 'la',
344+
})).toEqual([repositories[2], repositories[0]]);
345+
});
346+
});
347+
348+
describe('when sort key, search filter, and repository ids are given', () => {
349+
it('returns the correct results', () => {
350+
expect(filterAndSortRepositoriesWithResults(repositories, {
351+
...defaultFilterSortState,
352+
sortKey: SortKey.ResultsCount,
353+
searchValue: 'la',
354+
repositoryIds: [repositories[1].repository.id, repositories[3].repository.id],
355+
})).toEqual([repositories[3], repositories[1]]);
356+
});
357+
});
358+
359+
describe('when repository ids are given', () => {
360+
it('returns the correct results', () => {
361+
expect(filterAndSortRepositoriesWithResults(repositories, {
362+
...defaultFilterSortState,
363+
repositoryIds: [repositories[0].repository.id, repositories[3].repository.id],
364+
})).toEqual([repositories[0], repositories[3]]);
365+
});
366+
});
367+
368+
describe('when empty repository ids are given', () => {
369+
it('returns the correct results', () => {
370+
expect(filterAndSortRepositoriesWithResults(repositories, {
371+
...defaultFilterSortState,
372+
repositoryIds: [],
373+
})).toEqual([repositories[0], repositories[2], repositories[3], repositories[1]]);
374+
});
375+
});
376+
});

0 commit comments

Comments
 (0)