diff --git a/extensions/ql-vscode/src/databases/database-fetcher.ts b/extensions/ql-vscode/src/databases/database-fetcher.ts index 995786dffa0..13f64e4f7fe 100644 --- a/extensions/ql-vscode/src/databases/database-fetcher.ts +++ b/extensions/ql-vscode/src/databases/database-fetcher.ts @@ -666,7 +666,9 @@ function isFile(databaseUrl: string) { * * @param databasePath The full path to the unzipped database */ -async function ensureZippedSourceLocation(databasePath: string): Promise { +export async function ensureZippedSourceLocation( + databasePath: string, +): Promise { const srcFolderPath = join(databasePath, "src"); const srcZipPath = `${srcFolderPath}.zip`; diff --git a/extensions/ql-vscode/src/databases/local-databases-ui.ts b/extensions/ql-vscode/src/databases/local-databases-ui.ts index 81edbda186e..3b6f8127162 100644 --- a/extensions/ql-vscode/src/databases/local-databases-ui.ts +++ b/extensions/ql-vscode/src/databases/local-databases-ui.ts @@ -995,14 +995,15 @@ export class DatabaseUI extends DisposableObject { return undefined; } - if (byFolder) { + 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. Must unzip into a workspace-controlled area + // 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 importLocalDatabase( this.app.commands, diff --git a/extensions/ql-vscode/src/databases/local-databases/database-manager.ts b/extensions/ql-vscode/src/databases/local-databases/database-manager.ts index a1a7dc28be4..f512e5f5df8 100644 --- a/extensions/ql-vscode/src/databases/local-databases/database-manager.ts +++ b/extensions/ql-vscode/src/databases/local-databases/database-manager.ts @@ -43,6 +43,7 @@ import { DatabaseResolver } from "./database-resolver"; import { telemetryListener } from "../../common/vscode/telemetry"; import type { LanguageContextStore } from "../../language-context-store"; import type { DatabaseOrigin } from "./database-origin"; +import { ensureZippedSourceLocation } from "../database-fetcher"; /** * The name of the key in the workspaceState dictionary in which we @@ -227,8 +228,16 @@ export class DatabaseManager extends DisposableObject { "codeql-database.yml", ); + let originStat; + try { + originStat = await stat(originDbYml); + } catch (e) { + // if there is an error here, assume that the origin database + // is no longer available. Safely ignore and do not try to re-import. + return false; + } + try { - const originStat = await stat(originDbYml); const importedStat = await stat(importedDbYml); return originStat.mtimeMs > importedStat.mtimeMs; } catch (e) { @@ -252,6 +261,7 @@ export class DatabaseManager extends DisposableObject { await this.removeDatabaseItem(dbItem); await copy(dbItem.origin.path, databaseUri.fsPath); + await ensureZippedSourceLocation(databaseUri.fsPath); const newDbItem = new DatabaseItemImpl(databaseUri, dbItem.contents, { dateAdded: Date.now(), language: dbItem.language,