Skip to content

Commit 615dd69

Browse files
robertbrignullshati-patel
authored andcommitted
offer option to rerun on subset of valid repositories
1 parent 64ba2ca commit 615dd69

File tree

1 file changed

+32
-5
lines changed

1 file changed

+32
-5
lines changed

extensions/ql-vscode/src/run-remote-query.ts

Lines changed: 32 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { QuickPickItem, Uri, window } from 'vscode';
22
import * as yaml from 'js-yaml';
33
import * as fs from 'fs-extra';
4-
import { findLanguage, showAndLogErrorMessage, showAndLogInformationMessage } from './helpers';
4+
import { findLanguage, showAndLogErrorMessage, showAndLogInformationMessage, showInformationMessageWithAction } from './helpers';
55
import { Credentials } from './authentication';
66
import * as cli from './cli';
77
import { logger } from './logging';
@@ -76,9 +76,6 @@ export async function runRemoteQuery(cliServer: cli.CodeQLCliServer, credentials
7676
return;
7777
}
7878

79-
const octokit = await credentials.getOctokit();
80-
const token = await credentials.getToken();
81-
8279
const queryFile = uri.fsPath;
8380
const query = await fs.readFile(queryFile, 'utf8');
8481

@@ -110,6 +107,13 @@ export async function runRemoteQuery(cliServer: cli.CodeQLCliServer, credentials
110107
return; // No error message needed, since `getRepositories` already displays one.
111108
}
112109

110+
await runRemoteQueriesApiRequest(credentials, ref, language, repositories, query);
111+
}
112+
113+
async function runRemoteQueriesApiRequest(credentials: Credentials, ref: string, language: string, repositories: string[], query: string) {
114+
const octokit = await credentials.getOctokit();
115+
const token = await credentials.getToken();
116+
113117
try {
114118
await octokit.request(
115119
'POST /repos/:owner/:repo/code-scanning/codeql/queries',
@@ -128,6 +132,29 @@ export async function runRemoteQuery(cliServer: cli.CodeQLCliServer, credentials
128132
void showAndLogInformationMessage(`Successfully scheduled runs. [Click here to see the progress](https://github.com/${OWNER}/${REPO}/actions).`);
129133

130134
} catch (error) {
131-
void showAndLogErrorMessage(error);
135+
if (typeof error.message === 'string' && error.message.includes('Some repositories were invalid')) {
136+
const invalidRepos = error?.response?.data?.invalid_repos || [];
137+
const reposWithoutDbUploads = error?.response?.data?.repos_without_db_uploads || [];
138+
void logger.log('Unable to run query on all repositories');
139+
void logger.log('invalidRepos = ' + JSON.stringify(invalidRepos));
140+
void logger.log('reposWithoutDbUploads = ' + JSON.stringify(reposWithoutDbUploads));
141+
142+
if (invalidRepos.length + reposWithoutDbUploads.length === repositories.length) {
143+
// Every repo is invalid in some way
144+
void showAndLogErrorMessage('Unable to run query on the specified repositories.');
145+
return;
146+
}
147+
148+
const popupMessage = 'Unable to run query on the specified repositories. See logs for more details.';
149+
const rerunQuery = await showInformationMessageWithAction(popupMessage, 'Rerun on the valid repositories only');
150+
if (rerunQuery) {
151+
const validRepositories = repositories.filter(r => !invalidRepos.includes(r) && !reposWithoutDbUploads.includes(r));
152+
void logger.log('Rerunning query on set of valid repositories: ' + JSON.stringify(validRepositories));
153+
await runRemoteQueriesApiRequest(credentials, ref, language, validRepositories, query);
154+
}
155+
156+
} else {
157+
void showAndLogErrorMessage(error);
158+
}
132159
}
133160
}

0 commit comments

Comments
 (0)