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:
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user