11import { QuickPickItem , Uri , window } from 'vscode' ;
22import * as yaml from 'js-yaml' ;
33import * as fs from 'fs-extra' ;
4- import { findLanguage , showAndLogErrorMessage , showAndLogInformationMessage } from './helpers' ;
4+ import { findLanguage , showAndLogErrorMessage , showAndLogInformationMessage , showInformationMessageWithAction } from './helpers' ;
55import { Credentials } from './authentication' ;
66import * as cli from './cli' ;
77import { 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