Skip to content

Commit 2a30c66

Browse files
authored
Merge pull request #1760 from github/koesie10/filter-export-copy
Add filtering and sorting to exported repo list
2 parents 435fc0a + 53c1a58 commit 2a30c66

19 files changed

+119
-40
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -123,6 +123,7 @@ import { VSCodeMockGitHubApiServer } from './mocks/vscode-mock-gh-api-server';
123123
import { VariantAnalysisResultsManager } from './remote-queries/variant-analysis-results-manager';
124124
import { initializeDbModule } from './databases/db-module';
125125
import { ExtensionApp } from './common/vscode/vscode-app';
126+
import { RepositoriesFilterSortState } from './pure/variant-analysis-filter-sort';
126127

127128
/**
128129
* extension.ts
@@ -962,8 +963,8 @@ async function activateWithInstalledDistribution(
962963
);
963964

964965
ctx.subscriptions.push(
965-
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number) => {
966-
await variantAnalysisManager.copyRepoListToClipboard(variantAnalysisId);
966+
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number, filterSort?: RepositoriesFilterSortState) => {
967+
await variantAnalysisManager.copyRepoListToClipboard(variantAnalysisId, filterSort);
967968
})
968969
);
969970

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

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

1112
/**
1213
* This module contains types and code that are shared between
@@ -474,6 +475,7 @@ export interface OpenQueryTextMessage {
474475

475476
export interface CopyRepositoryListMessage {
476477
t: 'copyRepositoryList';
478+
filterSort?: RepositoriesFilterSortState;
477479
}
478480

479481
export interface ExportResultsMessage {

extensions/ql-vscode/src/view/variant-analysis/filterSort.ts renamed to extensions/ql-vscode/src/pure/variant-analysis-filter-sort.ts

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
import { Repository, RepositoryWithMetadata } from '../../remote-queries/shared/repository';
2-
import { parseDate } from '../../pure/date';
1+
import { Repository, RepositoryWithMetadata } from '../remote-queries/shared/repository';
2+
import { parseDate } from './date';
33

44
export enum SortKey {
55
Name = 'name',
@@ -71,3 +71,17 @@ export function compareWithResults(filterSortState: RepositoriesFilterSortState
7171
return fallbackSort(left.repository, right.repository);
7272
};
7373
}
74+
75+
// 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;
78+
79+
export function filterAndSortRepositoriesWithResults<T extends SortableResult>(repositories: T[] | undefined, filterSortState: RepositoriesFilterSortState | undefined): T[] | undefined {
80+
if (!repositories) {
81+
return undefined;
82+
}
83+
84+
return repositories
85+
.filter(repo => matchesFilter(repo.repository, filterSortState))
86+
.sort(compareWithResults(filterSortState));
87+
}

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,11 @@ import * as os from 'os';
3232
import { cancelVariantAnalysis } from './gh-api/gh-actions-api-client';
3333
import { ProgressCallback, UserCancellationException } from '../commandRunner';
3434
import { CodeQLCliServer } from '../cli';
35+
import {
36+
defaultFilterSortState,
37+
filterAndSortRepositoriesWithResults,
38+
RepositoriesFilterSortState,
39+
} from '../pure/variant-analysis-filter-sort';
3540

3641
export class VariantAnalysisManager extends DisposableObject implements VariantAnalysisViewManager<VariantAnalysisView> {
3742
private static readonly REPO_STATES_FILENAME = 'repo_states.json';
@@ -368,13 +373,15 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
368373
await cancelVariantAnalysis(credentials, variantAnalysis);
369374
}
370375

371-
public async copyRepoListToClipboard(variantAnalysisId: number) {
376+
public async copyRepoListToClipboard(variantAnalysisId: number, filterSort: RepositoriesFilterSortState = defaultFilterSortState) {
372377
const variantAnalysis = this.variantAnalyses.get(variantAnalysisId);
373378
if (!variantAnalysis) {
374379
throw new Error(`No variant analysis with id: ${variantAnalysisId}`);
375380
}
376381

377-
const fullNames = variantAnalysis.scannedRepos?.filter(a => a.resultCount && a.resultCount > 0).map(a => a.repository.fullName);
382+
const filteredRepositories = filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, filterSort);
383+
384+
const fullNames = filteredRepositories?.filter(a => a.resultCount && a.resultCount > 0).map(a => a.repository.fullName);
378385
if (!fullNames || fullNames.length === 0) {
379386
return;
380387
}

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
104104
await this.openQueryText();
105105
break;
106106
case 'copyRepositoryList':
107-
void commands.executeCommand('codeQL.copyVariantAnalysisRepoList', this.variantAnalysisId);
107+
void commands.executeCommand('codeQL.copyVariantAnalysisRepoList', this.variantAnalysisId, msg.filterSort);
108108
break;
109109
case 'exportResults':
110110
void commands.executeCommand('codeQL.exportVariantAnalysisResults', this.variantAnalysisId);

extensions/ql-vscode/src/stories/variant-analysis/RepositoriesSearchSortRow.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React, { useState } from 'react';
33
import { ComponentMeta } from '@storybook/react';
44

55
import { RepositoriesSearchSortRow as RepositoriesSearchSortRowComponent } from '../../view/variant-analysis/RepositoriesSearchSortRow';
6-
import { defaultFilterSortState } from '../../view/variant-analysis/filterSort';
6+
import { defaultFilterSortState } from '../../pure/variant-analysis-filter-sort';
77

88
export default {
99
title: 'Variant Analysis/Repositories Search and Sort Row',

extensions/ql-vscode/src/stories/variant-analysis/RepositoriesSort.stories.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ import React, { useState } from 'react';
33
import { ComponentMeta } from '@storybook/react';
44

55
import { RepositoriesSort as RepositoriesSortComponent } from '../../view/variant-analysis/RepositoriesSort';
6-
import { SortKey } from '../../view/variant-analysis/filterSort';
6+
import { SortKey } from '../../pure/variant-analysis-filter-sort';
77

88
export default {
99
title: 'Variant Analysis/Repositories Sort',

extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisOutcomePanels.stories.tsx

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import React from 'react';
1+
import React, { useState } from 'react';
22

33
import { ComponentMeta, ComponentStory } from '@storybook/react';
44

@@ -8,6 +8,7 @@ import { VariantAnalysisRepoStatus, VariantAnalysisStatus } from '../../remote-q
88
import { createMockScannedRepo } from '../../vscode-tests/factories/remote-queries/shared/scanned-repositories';
99
import { createMockVariantAnalysis } from '../../vscode-tests/factories/remote-queries/shared/variant-analysis';
1010
import { createMockRepositoryWithMetadata } from '../../vscode-tests/factories/remote-queries/shared/repository';
11+
import { defaultFilterSortState, RepositoriesFilterSortState } from '../../pure/variant-analysis-filter-sort';
1112

1213
export default {
1314
title: 'Variant Analysis/Variant Analysis Outcome Panels',
@@ -21,9 +22,13 @@ export default {
2122
],
2223
} as ComponentMeta<typeof VariantAnalysisOutcomePanels>;
2324

24-
const Template: ComponentStory<typeof VariantAnalysisOutcomePanels> = (args) => (
25-
<VariantAnalysisOutcomePanels {...args} />
26-
);
25+
const Template: ComponentStory<typeof VariantAnalysisOutcomePanels> = (args) => {
26+
const [filterSortState, setFilterSortState] = useState<RepositoriesFilterSortState>(defaultFilterSortState);
27+
28+
return (
29+
<VariantAnalysisOutcomePanels {...args} filterSortState={filterSortState} setFilterSortState={setFilterSortState} />
30+
);
31+
};
2732

2833
export const WithoutSkippedRepos = Template.bind({});
2934
WithoutSkippedRepos.args = {

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as React from 'react';
22
import { Dispatch, SetStateAction, useCallback } from 'react';
33
import styled from 'styled-components';
4-
import { RepositoriesFilterSortState, SortKey } from './filterSort';
4+
import { RepositoriesFilterSortState, SortKey } from '../../pure/variant-analysis-filter-sort';
55
import { RepositoriesSearch } from './RepositoriesSearch';
66
import { RepositoriesSort } from './RepositoriesSort';
77

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import * as React from 'react';
22
import { useCallback } from 'react';
33
import styled from 'styled-components';
44
import { VSCodeDropdown, VSCodeOption } from '@vscode/webview-ui-toolkit/react';
5-
import { SortKey } from './filterSort';
5+
import { SortKey } from '../../pure/variant-analysis-filter-sort';
66
import { Codicon } from '../common';
77

88
const Dropdown = styled(VSCodeDropdown)`

0 commit comments

Comments
 (0)