diff --git a/extensions/ql-vscode/src/databases/local-databases-ui.ts b/extensions/ql-vscode/src/databases/local-databases-ui.ts index 353259b5d..d4f3ff0d0 100644 --- a/extensions/ql-vscode/src/databases/local-databases-ui.ts +++ b/extensions/ql-vscode/src/databases/local-databases-ui.ts @@ -326,11 +326,10 @@ export class DatabaseUI extends DisposableObject { } private async chooseDatabaseFolder( - subFolder: boolean, progress: ProgressCallback, ): Promise { try { - await this.chooseAndSetDatabase(true, subFolder, progress); + await this.chooseAndSetDatabase(true, progress); } catch (e) { void showAndLogExceptionWithTelemetry( this.app.logger, @@ -345,7 +344,7 @@ export class DatabaseUI extends DisposableObject { private async handleChooseDatabaseFolder(): Promise { return withProgress( async (progress) => { - await this.chooseDatabaseFolder(false, progress); + await this.chooseDatabaseFolder(progress); }, { title: "Adding database from folder", @@ -356,7 +355,7 @@ export class DatabaseUI extends DisposableObject { private async handleChooseDatabaseFolderFromPalette(): Promise { return withProgress( async (progress) => { - await this.chooseDatabaseFolder(false, progress); + await this.chooseDatabaseFolder(progress); }, { title: "Choose a Database from a Folder", @@ -367,7 +366,7 @@ export class DatabaseUI extends DisposableObject { private async handleChooseMultipleDatabaseFolderFromPalette(): Promise { return withProgress( async (progress) => { - await this.chooseDatabaseFolder(true, progress); + await this.chooseDatabasesParentFolder(progress); }, { title: "Choose a Folder contains all Database Folders", @@ -510,7 +509,7 @@ export class DatabaseUI extends DisposableObject { progress: ProgressCallback, ): Promise { try { - await this.chooseAndSetDatabase(false, false, progress); + await this.chooseAndSetDatabase(false, progress); } catch (e: unknown) { void showAndLogExceptionWithTelemetry( this.app.logger, @@ -978,7 +977,6 @@ export class DatabaseUI extends DisposableObject { */ private async chooseAndSetDatabase( byFolder: boolean, - subFolder: boolean, progress: ProgressCallback, ): Promise { const uri = await chooseDatabaseDir(byFolder); @@ -986,60 +984,72 @@ export class DatabaseUI extends DisposableObject { return undefined; } - if (subFolder) { - if (!byFolder) { - return undefined; - } + if (byFolder && !uri.fsPath.endsWith("testproj")) { + const fixedUri = await this.fixDbUri(uri); + // we are selecting a database folder + return await this.databaseManager.openDatabase(fixedUri, { + type: "folder", + }); + } else { + // we are selecting a database archive or a testproj. + // Unzip archives (if an archive) and copy into a workspace-controlled area + // before importing. + return await this.databaseFetcher.importLocalDatabase( + uri.toString(true), + progress, + ); + } + } - const databases: DatabaseItem[] = []; - const failures: string[] = []; - const entries = await workspace.fs.readDirectory(uri); - for (const entry of entries) { - if (entry[1] === FileType.Directory) { - try { - const fixedUri = await this.fixDbUri(Uri.joinPath(uri, entry[0])); - const database = await this.databaseManager.openDatabase(fixedUri, { - type: "folder", - }); - databases.push(database); - } catch (e) { - failures.push(entry[0]); - } + /** + * Ask the user for a parent directory that contains all databases. + * Returns all valid databases, or `undefined` if the operation was canceled. + */ + private async chooseDatabasesParentFolder( + progress: ProgressCallback, + ): Promise { + const uri = await chooseDatabaseDir(true); + if (!uri) { + return undefined; + } + + const databases: DatabaseItem[] = []; + const failures: string[] = []; + const entries = await workspace.fs.readDirectory(uri); + for (const [index, entry] of entries.entries()) { + progress({ + step: index + 1, + maxStep: entries.length, + message: `Importing ${entry[0]}`, + }); + + if (entry[1] === FileType.Directory) { + try { + const fixedUri = await this.fixDbUri(Uri.joinPath(uri, entry[0])); + const database = await this.databaseManager.openDatabase(fixedUri, { + type: "folder", + }); + databases.push(database); + } catch (e) { + failures.push(entry[0]); } } - - if (failures.length) { - void showAndLogErrorMessage( - this.app.logger, - `Failed to import ${failures.length} database(s) (${failures.join( - ", ", - )}), successfully imported ${databases.length} database(s).`, - ); - } else { - void showAndLogInformationMessage( - this.app.logger, - `Successfully imported ${databases.length} database(s).`, - ); - } - - return databases; - } else { - if (byFolder && !uri.fsPath.endsWith("testproj")) { - const fixedUri = await this.fixDbUri(uri); - // we are selecting a database folder - return await this.databaseManager.openDatabase(fixedUri, { - type: "folder", - }); - } else { - // we are selecting a database archive or a testproj. - // Unzip archives (if an archive) and copy into a workspace-controlled area - // before importing. - return await this.databaseFetcher.importLocalDatabase( - uri.toString(true), - progress, - ); - } } + + if (failures.length) { + void showAndLogErrorMessage( + this.app.logger, + `Failed to import ${failures.length} database(s), successfully imported ${databases.length} database(s).`, + { fullMessage: `Failed imports: \n${failures.join("\n")}` }, + ); + } else { + void showAndLogInformationMessage( + this.app.logger, + `Successfully imported ${databases.length} database(s).`, + ); + } + + return databases; } /**