Skip to content

Commit bb4307e

Browse files
committed
Add filtering and sorting to exported repo list
This will pass the filter and sort parameters in the export repo list message so it can be used by the command to filter and sort the repositories which are placed in the repo list.
1 parent 82a7fc5 commit bb4307e

File tree

11 files changed

+109
-30
lines changed

11 files changed

+109
-30
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +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';
119120

120121
/**
121122
* extension.ts
@@ -945,8 +946,8 @@ async function activateWithInstalledDistribution(
945946
);
946947

947948
ctx.subscriptions.push(
948-
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number) => {
949-
await variantAnalysisManager.copyRepoListToClipboard(variantAnalysisId);
949+
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number, filterSort?: RepositoriesFilterSortState) => {
950+
await variantAnalysisManager.copyRepoListToClipboard(variantAnalysisId, filterSort);
950951
})
951952
);
952953

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 OpenLogsMessage {

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

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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 'openLogs':
110110
await this.openLogs();

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/VariantAnalysis.tsx

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { useEffect, useState } from 'react';
2+
import { useCallback, useEffect, useState } from 'react';
33

44
import {
55
VariantAnalysis as VariantAnalysisDomainModel,
@@ -11,6 +11,7 @@ import { VariantAnalysisOutcomePanels } from './VariantAnalysisOutcomePanels';
1111
import { VariantAnalysisLoading } from './VariantAnalysisLoading';
1212
import { ToVariantAnalysisMessage } from '../../pure/interface-types';
1313
import { vscode } from '../vscode-api';
14+
import { defaultFilterSortState, RepositoriesFilterSortState } from '../../pure/variant-analysis-filter-sort';
1415

1516
type Props = {
1617
variantAnalysis?: VariantAnalysisDomainModel;
@@ -36,12 +37,6 @@ const stopQuery = () => {
3637
});
3738
};
3839

39-
const copyRepositoryList = () => {
40-
vscode.postMessage({
41-
t: 'copyRepositoryList',
42-
});
43-
};
44-
4540
const openLogs = () => {
4641
vscode.postMessage({
4742
t: 'openLogs',
@@ -57,6 +52,8 @@ export function VariantAnalysis({
5752
const [repoStates, setRepoStates] = useState<VariantAnalysisScannedRepositoryState[]>(initialRepoStates);
5853
const [repoResults, setRepoResults] = useState<VariantAnalysisScannedRepositoryResult[]>(initialRepoResults);
5954

55+
const [filterSortState, setFilterSortState] = useState<RepositoriesFilterSortState>(defaultFilterSortState);
56+
6057
useEffect(() => {
6158
const listener = (evt: MessageEvent) => {
6259
if (evt.origin === window.origin) {
@@ -90,6 +87,13 @@ export function VariantAnalysis({
9087
};
9188
}, []);
9289

90+
const copyRepositoryList = useCallback(() => {
91+
vscode.postMessage({
92+
t: 'copyRepositoryList',
93+
filterSort: filterSortState,
94+
});
95+
}, [filterSortState]);
96+
9397
if (variantAnalysis?.actionsWorkflowRunId === undefined) {
9498
return <VariantAnalysisLoading />;
9599
}
@@ -109,6 +113,8 @@ export function VariantAnalysis({
109113
variantAnalysis={variantAnalysis}
110114
repositoryStates={repoStates}
111115
repositoryResults={repoResults}
116+
filterSortState={filterSortState}
117+
setFilterSortState={setFilterSortState}
112118
/>
113119
</>
114120
);

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

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ import {
77
VariantAnalysisScannedRepositoryResult,
88
VariantAnalysisScannedRepositoryState
99
} from '../../remote-queries/shared/variant-analysis';
10-
import { compareWithResults, matchesFilter, RepositoriesFilterSortState } from '../../pure/variant-analysis-filter-sort';
10+
import {
11+
filterAndSortRepositoriesWithResults,
12+
RepositoriesFilterSortState,
13+
} from '../../pure/variant-analysis-filter-sort';
1114

1215
const Container = styled.div`
1316
display: flex;
@@ -47,9 +50,7 @@ export const VariantAnalysisAnalyzedRepos = ({
4750
}, [repositoryResults]);
4851

4952
const repositories = useMemo(() => {
50-
return variantAnalysis.scannedRepos?.filter((repoTask) => {
51-
return matchesFilter(repoTask.repository, filterSortState);
52-
})?.sort(compareWithResults(filterSortState));
53+
return filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, filterSortState);
5354
}, [filterSortState, variantAnalysis.scannedRepos]);
5455

5556
return (

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

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as React from 'react';
2-
import { useState } from 'react';
2+
import { Dispatch, SetStateAction } from 'react';
33
import styled from 'styled-components';
44
import { VSCodeBadge, VSCodePanels, VSCodePanelTab, VSCodePanelView } from '@vscode/webview-ui-toolkit/react';
55
import { formatDecimal } from '../../pure/number';
@@ -12,14 +12,17 @@ import {
1212
import { VariantAnalysisAnalyzedRepos } from './VariantAnalysisAnalyzedRepos';
1313
import { Alert } from '../common';
1414
import { VariantAnalysisSkippedRepositoriesTab } from './VariantAnalysisSkippedRepositoriesTab';
15-
import { defaultFilterSortState, RepositoriesFilterSortState } from '../../pure/variant-analysis-filter-sort';
15+
import { RepositoriesFilterSortState } from '../../pure/variant-analysis-filter-sort';
1616
import { RepositoriesSearchSortRow } from './RepositoriesSearchSortRow';
1717
import { FailureReasonAlert } from './FailureReasonAlert';
1818

1919
export type VariantAnalysisOutcomePanelProps = {
2020
variantAnalysis: VariantAnalysis;
2121
repositoryStates?: VariantAnalysisScannedRepositoryState[];
2222
repositoryResults?: VariantAnalysisScannedRepositoryResult[];
23+
24+
filterSortState: RepositoriesFilterSortState;
25+
setFilterSortState: Dispatch<SetStateAction<RepositoriesFilterSortState>>;
2326
};
2427

2528
const Tab = styled(VSCodePanelTab)`
@@ -46,9 +49,9 @@ export const VariantAnalysisOutcomePanels = ({
4649
variantAnalysis,
4750
repositoryStates,
4851
repositoryResults,
52+
filterSortState,
53+
setFilterSortState,
4954
}: VariantAnalysisOutcomePanelProps) => {
50-
const [filterSortState, setFilterSortState] = useState<RepositoriesFilterSortState>(defaultFilterSortState);
51-
5255
const scannedReposCount = variantAnalysis.scannedRepos?.length ?? 0;
5356
const noCodeqlDbRepos = variantAnalysis.skippedRepos?.noCodeqlDbRepos;
5457
const notFoundRepos = variantAnalysis.skippedRepos?.notFoundRepos;

extensions/ql-vscode/src/view/variant-analysis/__tests__/VariantAnalysisOutcomePanels.spec.tsx

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ import {
1212
createMockScannedRepo,
1313
createMockScannedRepos
1414
} from '../../../vscode-tests/factories/remote-queries/shared/scanned-repositories';
15+
import { defaultFilterSortState } from '../../../pure/variant-analysis-filter-sort';
1516

1617
describe(VariantAnalysisOutcomePanels.name, () => {
1718
const defaultVariantAnalysis = {
@@ -81,6 +82,8 @@ describe(VariantAnalysisOutcomePanels.name, () => {
8182
...defaultVariantAnalysis,
8283
...variantAnalysis,
8384
}}
85+
filterSortState={defaultFilterSortState}
86+
setFilterSortState={jest.fn()}
8487
{...props}
8588
/>
8689
);

0 commit comments

Comments
 (0)