Skip to content

Commit 922d212

Browse files
committed
Merge remote-tracking branch 'origin/main' into koesie10/export-results
2 parents 4caa1e2 + f485671 commit 922d212

File tree

12 files changed

+207
-8
lines changed

12 files changed

+207
-8
lines changed
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import { AppEventEmitter } from './events';
2+
3+
export interface App {
4+
createEventEmitter<T>(): AppEventEmitter<T>;
5+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
import { Disposable } from '../pure/disposable-object';
2+
3+
export interface AppEvent<T> {
4+
(listener: (event: T) => void): Disposable;
5+
}
6+
7+
export interface AppEventEmitter<T> {
8+
event: AppEvent<T>;
9+
fire(data: T): void;
10+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
import * as vscode from 'vscode';
2+
import { AppEventEmitter } from '../events';
3+
4+
export class VSCodeAppEventEmitter<T>
5+
extends vscode.EventEmitter<T>
6+
implements AppEventEmitter<T> {
7+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { App } from '../app';
2+
import { AppEventEmitter } from '../events';
3+
import { VSCodeAppEventEmitter } from './events';
4+
5+
export class ExtensionApp implements App {
6+
public createEventEmitter<T>(): AppEventEmitter<T> {
7+
return new VSCodeAppEventEmitter<T>();
8+
}
9+
}

extensions/ql-vscode/src/extension.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,12 @@ async function activateWithInstalledDistribution(
948948
})
949949
);
950950

951+
ctx.subscriptions.push(
952+
commandRunner('codeQL.copyVariantAnalysisRepoList', async (variantAnalysisId: number) => {
953+
await variantAnalysisManager.copyRepoListToClipboard(variantAnalysisId);
954+
})
955+
);
956+
951957
ctx.subscriptions.push(
952958
commandRunner('codeQL.monitorVariantAnalysis', async (
953959
variantAnalysis: VariantAnalysis,

extensions/ql-vscode/src/pure/disposable-object.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11

22
// Avoid explicitly referencing Disposable type in vscode.
33
// This file cannot have dependencies on the vscode API.
4-
interface Disposable {
4+
export interface Disposable {
55
dispose(): any;
66
}
77

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,10 @@ export interface OpenQueryTextMessage {
472472
t: 'openQueryText';
473473
}
474474

475+
export interface CopyRepositoryListMessage {
476+
t: 'copyRepositoryList';
477+
}
478+
475479
export interface OpenLogsMessage {
476480
t: 'openLogs';
477481
}
@@ -490,5 +494,6 @@ export type FromVariantAnalysisMessage =
490494
| RequestRepositoryResultsMessage
491495
| OpenQueryFileMessage
492496
| OpenQueryTextMessage
497+
| CopyRepositoryListMessage
493498
| OpenLogsMessage
494499
| CancelVariantAnalysisMessage;

extensions/ql-vscode/src/query-history.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,11 +1256,15 @@ export class QueryHistoryManager extends DisposableObject {
12561256
const { finalSingleItem, finalMultiSelect } = this.determineSelection(singleItem, multiSelect);
12571257

12581258
// Remote queries only
1259-
if (!this.assertSingleQuery(finalMultiSelect) || !finalSingleItem || finalSingleItem.t !== 'remote') {
1259+
if (!this.assertSingleQuery(finalMultiSelect) || !finalSingleItem) {
12601260
return;
12611261
}
12621262

1263-
await commands.executeCommand('codeQL.copyRepoList', finalSingleItem.queryId);
1263+
if (finalSingleItem.t === 'remote') {
1264+
await commands.executeCommand('codeQL.copyRepoList', finalSingleItem.queryId);
1265+
} else if (finalSingleItem.t === 'variant-analysis') {
1266+
await commands.executeCommand('codeQL.copyVariantAnalysisRepoList', finalSingleItem.variantAnalysis.id);
1267+
}
12641268
}
12651269

12661270
async handleExportResults(

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

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import * as path from 'path';
22

33
import * as ghApiClient from './gh-api/gh-api-client';
4-
import { CancellationToken, commands, EventEmitter, ExtensionContext, Uri, window } from 'vscode';
4+
import { CancellationToken, commands, env, EventEmitter, ExtensionContext, Uri, window } from 'vscode';
55
import { DisposableObject } from '../pure/disposable-object';
66
import { Credentials } from '../authentication';
77
import { VariantAnalysisMonitor } from './variant-analysis-monitor';
@@ -28,6 +28,7 @@ import {
2828
import PQueue from 'p-queue';
2929
import { createTimestampFile, showAndLogErrorMessage, showAndLogInformationMessage } from '../helpers';
3030
import * as fs from 'fs-extra';
31+
import * as os from 'os';
3132
import { cancelVariantAnalysis } from './gh-api/gh-actions-api-client';
3233
import { ProgressCallback, UserCancellationException } from '../commandRunner';
3334
import { CodeQLCliServer } from '../cli';
@@ -388,6 +389,27 @@ export class VariantAnalysisManager extends DisposableObject implements VariantA
388389
await cancelVariantAnalysis(credentials, variantAnalysis);
389390
}
390391

392+
public async copyRepoListToClipboard(variantAnalysisId: number) {
393+
const variantAnalysis = this.variantAnalyses.get(variantAnalysisId);
394+
if (!variantAnalysis) {
395+
throw new Error(`No variant analysis with id: ${variantAnalysisId}`);
396+
}
397+
398+
const fullNames = variantAnalysis.scannedRepos?.filter(a => a.resultCount && a.resultCount > 0).map(a => a.repository.fullName);
399+
if (!fullNames || fullNames.length === 0) {
400+
return;
401+
}
402+
403+
const text = [
404+
'"new-repo-list": [',
405+
...fullNames.slice(0, -1).map(repo => ` "${repo}",`),
406+
` "${fullNames[fullNames.length - 1]}"`,
407+
']'
408+
];
409+
410+
await env.clipboard.writeText(text.join(os.EOL));
411+
}
412+
391413
private getRepoStatesStoragePath(variantAnalysisId: number): string {
392414
return path.join(
393415
this.getVariantAnalysisStorageLocation(variantAnalysisId),

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,9 @@ export class VariantAnalysisView extends AbstractWebview<ToVariantAnalysisMessag
103103
case 'openQueryText':
104104
await this.openQueryText();
105105
break;
106+
case 'copyRepositoryList':
107+
void commands.executeCommand('codeQL.copyVariantAnalysisRepoList', this.variantAnalysisId);
108+
break;
106109
case 'openLogs':
107110
await this.openLogs();
108111
break;

0 commit comments

Comments
 (0)