Skip to content

Commit 6219b43

Browse files
authored
Merge pull request #1766 from github/koesie10/export-results-sorting-filtering
Add filtering and sorting to exported results
2 parents 5838f1b + 4729780 commit 6219b43

File tree

5 files changed

+40
-21
lines changed

5 files changed

+40
-21
lines changed

extensions/ql-vscode/src/extension.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1015,8 +1015,8 @@ async function activateWithInstalledDistribution(
10151015
);
10161016

10171017
ctx.subscriptions.push(
1018-
commandRunner('codeQL.exportVariantAnalysisResults', async (variantAnalysisId: number) => {
1019-
await exportVariantAnalysisResults(ctx, variantAnalysisManager, variantAnalysisId);
1018+
commandRunner('codeQL.exportVariantAnalysisResults', async (variantAnalysisId: number, filterSort?: RepositoriesFilterSortStateWithIds) => {
1019+
await exportVariantAnalysisResults(ctx, variantAnalysisManager, variantAnalysisId, filterSort);
10201020
})
10211021
);
10221022

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ export interface CopyRepositoryListMessage {
480480

481481
export interface ExportResultsMessage {
482482
t: 'exportResults';
483+
filterSort?: RepositoriesFilterSortStateWithIds;
483484
}
484485

485486
export interface OpenLogsMessage {

extensions/ql-vscode/src/remote-queries/export-results.ts

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ import {
2424
VariantAnalysisScannedRepository,
2525
VariantAnalysisScannedRepositoryResult
2626
} from './shared/variant-analysis';
27+
import {
28+
filterAndSortRepositoriesWithResults,
29+
RepositoriesFilterSortStateWithIds,
30+
} from '../pure/variant-analysis-filter-sort';
2731

2832
/**
2933
* Exports the results of the currently-selected remote query or variant analysis.
@@ -73,21 +77,22 @@ export async function exportRemoteQueryResults(
7377
}
7478

7579
const exportDirectory = await queryHistoryManager.getQueryHistoryItemDirectory(queryHistoryItem);
80+
const exportedResultsDirectory = path.join(exportDirectory, 'exported-results');
7681

77-
await exportRemoteQueryAnalysisResults(ctx, exportDirectory, query, analysesResults, exportFormat);
82+
await exportRemoteQueryAnalysisResults(ctx, exportedResultsDirectory, query, analysesResults, exportFormat);
7883
}
7984

8085
export async function exportRemoteQueryAnalysisResults(
8186
ctx: ExtensionContext,
82-
exportDirectory: string,
87+
exportedResultsPath: string,
8388
query: RemoteQuery,
8489
analysesResults: AnalysisResults[],
8590
exportFormat: 'gist' | 'local',
8691
) {
8792
const description = buildGistDescription(query, analysesResults);
8893
const markdownFiles = generateMarkdown(query, analysesResults, exportFormat);
8994

90-
await exportResults(ctx, exportDirectory, description, markdownFiles, exportFormat);
95+
await exportResults(ctx, exportedResultsPath, description, markdownFiles, exportFormat);
9196
}
9297

9398
/**
@@ -98,6 +103,7 @@ export async function exportVariantAnalysisResults(
98103
ctx: ExtensionContext,
99104
variantAnalysisManager: VariantAnalysisManager,
100105
variantAnalysisId: number,
106+
filterSort?: RepositoriesFilterSortStateWithIds,
101107
): Promise<void> {
102108
const variantAnalysis = await variantAnalysisManager.getVariantAnalysis(variantAnalysisId);
103109
if (!variantAnalysis) {
@@ -113,11 +119,16 @@ export async function exportVariantAnalysisResults(
113119
}
114120

115121
async function* getAnalysesResults(): AsyncGenerator<[VariantAnalysisScannedRepository, VariantAnalysisScannedRepositoryResult]> {
116-
if (!variantAnalysis?.scannedRepos) {
122+
if (!variantAnalysis) {
117123
return;
118124
}
119125

120-
for (const repo of variantAnalysis.scannedRepos) {
126+
const repositories = filterAndSortRepositoriesWithResults(variantAnalysis.scannedRepos, filterSort);
127+
if (!repositories) {
128+
return;
129+
}
130+
131+
for (const repo of repositories) {
121132
if (repo.resultCount == 0) {
122133
yield [repo, {
123134
variantAnalysisId: variantAnalysis.id,
@@ -136,20 +147,24 @@ export async function exportVariantAnalysisResults(
136147

137148
const exportDirectory = variantAnalysisManager.getVariantAnalysisStorageLocation(variantAnalysis.id);
138149

139-
await exportVariantAnalysisAnalysisResults(ctx, exportDirectory, variantAnalysis, getAnalysesResults(), exportFormat);
150+
// The date will be formatted like the following: 20221115T123456Z. The time is in UTC.
151+
const formattedDate = (new Date()).toISOString().replace(/[-:]/g, '').replace(/\.\d+Z$/, 'Z');
152+
const exportedResultsDirectory = path.join(exportDirectory, 'exported-results', `results_${formattedDate}`);
153+
154+
await exportVariantAnalysisAnalysisResults(ctx, exportedResultsDirectory, variantAnalysis, getAnalysesResults(), exportFormat);
140155
}
141156

142157
export async function exportVariantAnalysisAnalysisResults(
143158
ctx: ExtensionContext,
144-
exportDirectory: string,
159+
exportedResultsPath: string,
145160
variantAnalysis: VariantAnalysis,
146161
analysesResults: AsyncIterable<[VariantAnalysisScannedRepository, VariantAnalysisScannedRepositoryResult]>,
147162
exportFormat: 'gist' | 'local',
148163
) {
149164
const description = buildVariantAnalysisGistDescription(variantAnalysis);
150165
const markdownFiles = await generateVariantAnalysisMarkdown(variantAnalysis, analysesResults, 'gist');
151166

152-
await exportResults(ctx, exportDirectory, description, markdownFiles, exportFormat);
167+
await exportResults(ctx, exportedResultsPath, description, markdownFiles, exportFormat);
153168
}
154169

155170
/**
@@ -190,15 +205,15 @@ async function determineExportFormat(): Promise<'gist' | 'local' | undefined> {
190205

191206
export async function exportResults(
192207
ctx: ExtensionContext,
193-
exportDirectory: string,
208+
exportedResultsPath: string,
194209
description: string,
195210
markdownFiles: MarkdownFile[],
196211
exportFormat: 'gist' | 'local',
197212
) {
198213
if (exportFormat === 'gist') {
199214
await exportToGist(ctx, description, markdownFiles);
200215
} else if (exportFormat === 'local') {
201-
await exportToLocalMarkdown(exportDirectory, markdownFiles);
216+
await exportToLocalMarkdown(exportedResultsPath, markdownFiles);
202217
}
203218
}
204219

@@ -254,10 +269,9 @@ const buildVariantAnalysisGistDescription = (variantAnalysis: VariantAnalysis) =
254269
* Saves the results of an exported query to local markdown files.
255270
*/
256271
async function exportToLocalMarkdown(
257-
exportDirectory: string,
272+
exportedResultsPath: string,
258273
markdownFiles: MarkdownFile[],
259274
) {
260-
const exportedResultsPath = path.join(exportDirectory, 'exported-results');
261275
await fs.ensureDir(exportedResultsPath);
262276
for (const markdownFile of markdownFiles) {
263277
const filePath = path.join(exportedResultsPath, `${markdownFile.fileName}.md`);

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
107107
void commands.executeCommand('codeQL.copyVariantAnalysisRepoList', this.variantAnalysisId, msg.filterSort);
108108
break;
109109
case 'exportResults':
110-
void commands.executeCommand('codeQL.exportVariantAnalysisResults', this.variantAnalysisId);
110+
void commands.executeCommand('codeQL.exportVariantAnalysisResults', this.variantAnalysisId, msg.filterSort);
111111
break;
112112
case 'openLogs':
113113
await this.openLogs();

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

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,6 @@ const stopQuery = () => {
3737
});
3838
};
3939

40-
const exportResults = () => {
41-
vscode.postMessage({
42-
t: 'exportResults',
43-
});
44-
};
45-
4640
const openLogs = () => {
4741
vscode.postMessage({
4842
t: 'openLogs',
@@ -104,6 +98,16 @@ export function VariantAnalysis({
10498
});
10599
}, [filterSortState, selectedRepositoryIds]);
106100

101+
const exportResults = useCallback(() => {
102+
vscode.postMessage({
103+
t: 'exportResults',
104+
filterSort: {
105+
...filterSortState,
106+
repositoryIds: selectedRepositoryIds,
107+
},
108+
});
109+
}, [filterSortState, selectedRepositoryIds]);
110+
107111
if (variantAnalysis?.actionsWorkflowRunId === undefined) {
108112
return <VariantAnalysisLoading />;
109113
}

0 commit comments

Comments
 (0)