@@ -16,6 +16,7 @@ import {
16
16
ThemeIcon ,
17
17
ThemeColor ,
18
18
workspace ,
19
+ FileType ,
19
20
} from "vscode" ;
20
21
import { pathExists , stat , readdir , remove } from "fs-extra" ;
21
22
@@ -36,6 +37,7 @@ import {
36
37
import {
37
38
showAndLogExceptionWithTelemetry ,
38
39
showAndLogErrorMessage ,
40
+ showAndLogInformationMessage ,
39
41
} from "../common/logging" ;
40
42
import type { DatabaseFetcher } from "./database-fetcher" ;
41
43
import { asError , asyncFilter , getErrorMessage } from "../common/helpers-pure" ;
@@ -267,6 +269,8 @@ export class DatabaseUI extends DisposableObject {
267
269
"codeQL.getCurrentDatabase" : this . handleGetCurrentDatabase . bind ( this ) ,
268
270
"codeQL.chooseDatabaseFolder" :
269
271
this . handleChooseDatabaseFolderFromPalette . bind ( this ) ,
272
+ "codeQL.chooseMultipleDatabaseFolder" :
273
+ this . handleChooseMultipleDatabaseFolderFromPalette . bind ( this ) ,
270
274
"codeQL.chooseDatabaseArchive" :
271
275
this . handleChooseDatabaseArchiveFromPalette . bind ( this ) ,
272
276
"codeQL.chooseDatabaseInternet" :
@@ -322,10 +326,11 @@ export class DatabaseUI extends DisposableObject {
322
326
}
323
327
324
328
private async chooseDatabaseFolder (
329
+ subFolder : boolean ,
325
330
progress : ProgressCallback ,
326
331
) : Promise < void > {
327
332
try {
328
- await this . chooseAndSetDatabase ( true , progress ) ;
333
+ await this . chooseAndSetDatabase ( true , subFolder , progress ) ;
329
334
} catch ( e ) {
330
335
void showAndLogExceptionWithTelemetry (
331
336
this . app . logger ,
@@ -340,7 +345,7 @@ export class DatabaseUI extends DisposableObject {
340
345
private async handleChooseDatabaseFolder ( ) : Promise < void > {
341
346
return withProgress (
342
347
async ( progress ) => {
343
- await this . chooseDatabaseFolder ( progress ) ;
348
+ await this . chooseDatabaseFolder ( false , progress ) ;
344
349
} ,
345
350
{
346
351
title : "Adding database from folder" ,
@@ -351,14 +356,25 @@ export class DatabaseUI extends DisposableObject {
351
356
private async handleChooseDatabaseFolderFromPalette ( ) : Promise < void > {
352
357
return withProgress (
353
358
async ( progress ) => {
354
- await this . chooseDatabaseFolder ( progress ) ;
359
+ await this . chooseDatabaseFolder ( false , progress ) ;
355
360
} ,
356
361
{
357
362
title : "Choose a Database from a Folder" ,
358
363
} ,
359
364
) ;
360
365
}
361
366
367
+ private async handleChooseMultipleDatabaseFolderFromPalette ( ) : Promise < void > {
368
+ return withProgress (
369
+ async ( progress ) => {
370
+ await this . chooseDatabaseFolder ( true , progress ) ;
371
+ } ,
372
+ {
373
+ title : "Choose a Folder contains all Database Folders" ,
374
+ } ,
375
+ ) ;
376
+ }
377
+
362
378
private async handleSetDefaultTourDatabase ( ) : Promise < void > {
363
379
return withProgress (
364
380
async ( ) => {
@@ -494,7 +510,7 @@ export class DatabaseUI extends DisposableObject {
494
510
progress : ProgressCallback ,
495
511
) : Promise < void > {
496
512
try {
497
- await this . chooseAndSetDatabase ( false , progress ) ;
513
+ await this . chooseAndSetDatabase ( false , false , progress ) ;
498
514
} catch ( e : unknown ) {
499
515
void showAndLogExceptionWithTelemetry (
500
516
this . app . logger ,
@@ -962,27 +978,67 @@ export class DatabaseUI extends DisposableObject {
962
978
*/
963
979
private async chooseAndSetDatabase (
964
980
byFolder : boolean ,
981
+ subFolder : boolean ,
965
982
progress : ProgressCallback ,
966
- ) : Promise < DatabaseItem | undefined > {
983
+ ) : Promise < DatabaseItem [ ] | DatabaseItem | undefined > {
967
984
const uri = await chooseDatabaseDir ( byFolder ) ;
968
985
if ( ! uri ) {
969
986
return undefined ;
970
987
}
971
988
972
- if ( byFolder && ! uri . fsPath . endsWith ( "testproj" ) ) {
973
- const fixedUri = await this . fixDbUri ( uri ) ;
974
- // we are selecting a database folder
975
- return await this . databaseManager . openDatabase ( fixedUri , {
976
- type : "folder" ,
977
- } ) ;
989
+ if ( subFolder ) {
990
+ if ( ! byFolder ) {
991
+ return undefined ;
992
+ }
993
+
994
+ const databases : DatabaseItem [ ] = [ ] ;
995
+ const failures : string [ ] = [ ] ;
996
+ const entries = await workspace . fs . readDirectory ( uri ) ;
997
+ for ( const entry of entries ) {
998
+ if ( entry [ 1 ] === FileType . Directory ) {
999
+ try {
1000
+ const fixedUri = await this . fixDbUri ( Uri . joinPath ( uri , entry [ 0 ] ) ) ;
1001
+ const database = await this . databaseManager . openDatabase ( fixedUri , {
1002
+ type : "folder" ,
1003
+ } ) ;
1004
+ databases . push ( database ) ;
1005
+ } catch ( e ) {
1006
+ failures . push ( entry [ 0 ] ) ;
1007
+ }
1008
+ }
1009
+ }
1010
+
1011
+ if ( failures . length ) {
1012
+ void showAndLogErrorMessage (
1013
+ this . app . logger ,
1014
+ `Failed to import ${ failures . length } database(s) (${ failures . join (
1015
+ ", " ,
1016
+ ) } ), successfully imported ${ databases . length } database(s).`,
1017
+ ) ;
1018
+ } else {
1019
+ void showAndLogInformationMessage (
1020
+ this . app . logger ,
1021
+ `Successfully imported ${ databases . length } database(s).` ,
1022
+ ) ;
1023
+ }
1024
+
1025
+ return databases ;
978
1026
} else {
979
- // we are selecting a database archive or a testproj.
980
- // Unzip archives (if an archive) and copy into a workspace-controlled area
981
- // before importing.
982
- return await this . databaseFetcher . importLocalDatabase (
983
- uri . toString ( true ) ,
984
- progress ,
985
- ) ;
1027
+ if ( byFolder && ! uri . fsPath . endsWith ( "testproj" ) ) {
1028
+ const fixedUri = await this . fixDbUri ( uri ) ;
1029
+ // we are selecting a database folder
1030
+ return await this . databaseManager . openDatabase ( fixedUri , {
1031
+ type : "folder" ,
1032
+ } ) ;
1033
+ } else {
1034
+ // we are selecting a database archive or a testproj.
1035
+ // Unzip archives (if an archive) and copy into a workspace-controlled area
1036
+ // before importing.
1037
+ return await this . databaseFetcher . importLocalDatabase (
1038
+ uri . toString ( true ) ,
1039
+ progress ,
1040
+ ) ;
1041
+ }
986
1042
}
987
1043
}
988
1044
0 commit comments