Emit more relevant error message when failing to add source folder (#1021)

* Emit more relevant error message when failing to add source folder

Fixes #1020

* Update changelog

* Clarify changelog and error message

Co-authored-by: Shati Patel <42641846+shati-patel@users.noreply.github.com>

Co-authored-by: Shati Patel <42641846+shati-patel@users.noreply.github.com>
This commit is contained in:
Andrew Eisenberg
2021-11-29 08:28:07 -08:00
committed by GitHub
parent 6a1d1a492e
commit b481441052
2 changed files with 45 additions and 23 deletions

View File

@@ -2,6 +2,8 @@
## [UNRELEASED] ## [UNRELEASED]
- Emit a more explicit error message when a user tries to add a database with an unzipped source folder to the workspace. [1021](https://github.com/github/vscode-codeql/pull/1021)
## 1.5.7 - 23 November 2021 ## 1.5.7 - 23 November 2021
- Fix the _CodeQL: Open Referenced File_ command for Windows systems. [#979](https://github.com/github/vscode-codeql/pull/979) - Fix the _CodeQL: Open Referenced File_ command for Windows systems. [#979](https://github.com/github/vscode-codeql/pull/979)

View File

@@ -258,7 +258,7 @@ export interface DatabaseItem {
* Returns the root uri of the virtual filesystem for this database's source archive, * Returns the root uri of the virtual filesystem for this database's source archive,
* as displayed in the filesystem explorer. * as displayed in the filesystem explorer.
*/ */
getSourceArchiveExplorerUri(): vscode.Uri | undefined; getSourceArchiveExplorerUri(): vscode.Uri;
/** /**
* Holds if `uri` belongs to this database's source archive. * Holds if `uri` belongs to this database's source archive.
@@ -274,6 +274,11 @@ export interface DatabaseItem {
* Gets the state of this database, to be persisted in the workspace state. * Gets the state of this database, to be persisted in the workspace state.
*/ */
getPersistedState(): PersistedDatabaseItem; getPersistedState(): PersistedDatabaseItem;
/**
* Verifies that this database item has a zipped source folder. Returns an error message if it does not.
*/
verifyZippedSources(): string | undefined;
} }
export enum DatabaseEventKind { export enum DatabaseEventKind {
@@ -459,13 +464,26 @@ export class DatabaseItemImpl implements DatabaseItem {
/** /**
* Returns the root uri of the virtual filesystem for this database's source archive. * Returns the root uri of the virtual filesystem for this database's source archive.
*/ */
public getSourceArchiveExplorerUri(): vscode.Uri | undefined { public getSourceArchiveExplorerUri(): vscode.Uri {
const sourceArchive = this.sourceArchive; const sourceArchive = this.sourceArchive;
if (sourceArchive === undefined || !sourceArchive.fsPath.endsWith('.zip')) if (sourceArchive === undefined || !sourceArchive.fsPath.endsWith('.zip')) {
return undefined; throw new Error(this.verifyZippedSources());
}
return encodeArchiveBasePath(sourceArchive.fsPath); return encodeArchiveBasePath(sourceArchive.fsPath);
} }
public verifyZippedSources(): string | undefined {
const sourceArchive = this.sourceArchive;
if (sourceArchive === undefined) {
return `${this.name} has no source archive.`;
}
if (!sourceArchive.fsPath.endsWith('.zip')) {
return `${this.name} has a source folder that is unzipped.`;
}
return;
}
/** /**
* Holds if `uri` belongs to this database's source archive. * Holds if `uri` belongs to this database's source archive.
*/ */
@@ -603,26 +621,28 @@ export class DatabaseManager extends DisposableObject {
// This is undesirable, as we might be adding and removing many // This is undesirable, as we might be adding and removing many
// workspace folders as the user adds and removes databases. // workspace folders as the user adds and removes databases.
const end = (vscode.workspace.workspaceFolders || []).length; const end = (vscode.workspace.workspaceFolders || []).length;
const msg = item.verifyZippedSources();
if (msg) {
void logger.log(`Could not add source folder because ${msg}`);
return;
}
const uri = item.getSourceArchiveExplorerUri(); const uri = item.getSourceArchiveExplorerUri();
if (uri === undefined) { void logger.log(`Adding workspace folder for ${item.name} source archive at index ${end}`);
void logger.log(`Couldn't obtain file explorer uri for ${item.name}`); if ((vscode.workspace.workspaceFolders || []).length < 2) {
} // Adding this workspace folder makes the workspace
else { // multi-root, which may surprise the user. Let them know
void logger.log(`Adding workspace folder for ${item.name} source archive at index ${end}`); // we're doing this.
if ((vscode.workspace.workspaceFolders || []).length < 2) { void vscode.window.showInformationMessage(`Adding workspace folder for source archive of database ${item.name}.`);
// Adding this workspace folder makes the workspace
// multi-root, which may surprise the user. Let them know
// we're doing this.
void vscode.window.showInformationMessage(`Adding workspace folder for source archive of database ${item.name}.`);
}
vscode.workspace.updateWorkspaceFolders(end, 0, {
name: `[${item.name} source archive]`,
uri,
});
// vscode api documentation says we must to wait for this event
// between multiple `updateWorkspaceFolders` calls.
await eventFired(vscode.workspace.onDidChangeWorkspaceFolders);
} }
vscode.workspace.updateWorkspaceFolders(end, 0, {
name: `[${item.name} source archive]`,
uri,
});
// vscode api documentation says we must to wait for this event
// between multiple `updateWorkspaceFolders` calls.
await eventFired(vscode.workspace.onDidChangeWorkspaceFolders);
} }
} }
@@ -732,7 +752,7 @@ export class DatabaseManager extends DisposableObject {
this.updatePersistedCurrentDatabaseItem(); this.updatePersistedCurrentDatabaseItem();
await vscode.commands.executeCommand('setContext', 'codeQL.currentDatabaseItem', item?.name); await vscode.commands.executeCommand('setContext', 'codeQL.currentDatabaseItem', item?.name);
this._onDidChangeCurrentDatabaseItem.fire({ this._onDidChangeCurrentDatabaseItem.fire({
item, item,
kind: DatabaseEventKind.Change kind: DatabaseEventKind.Change