Skip to content

Commit cb03da3

Browse files
committed
Avoid running query when a user cancels when there are unsaved changes
Fixes #538 Adds a new menu item to cancel a query run when the query is unsaved. Also, ensures that no warning message is sent to the console.
1 parent f968f8e commit cb03da3

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

extensions/ql-vscode/CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
## 1.3.3 - [UNRELEASED]
44

55
- Fix display of raw results entities with label but no url.
6-
- Fix bug where sort order is forgotten when changing raw results page
6+
- Fix bug where sort order is forgotten when changing raw results page.
77

88
## 1.3.2 - 12 August 2020
99

extensions/ql-vscode/src/extension.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -408,7 +408,11 @@ async function activateWithInstalledDistribution(
408408
await showResultsForCompletedQuery(item, WebviewReveal.NotForced);
409409
} catch (e) {
410410
if (e instanceof UserCancellationException) {
411-
helpers.showAndLogWarningMessage(e.message);
411+
if (e.silent) {
412+
logger.log(e.message);
413+
} else {
414+
helpers.showAndLogWarningMessage(e.message);
415+
}
412416
} else if (e instanceof Error) {
413417
helpers.showAndLogErrorMessage(e.message);
414418
} else {

extensions/ql-vscode/src/run-queries.ts

Lines changed: 25 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,15 @@ export const tmpDirDisposal = {
3434
}
3535
};
3636

37-
export class UserCancellationException extends Error { }
37+
export class UserCancellationException extends Error {
38+
/**
39+
* @param message The error message
40+
* @param silent If silent is true, then this exception will avoid showing a warning message to the user.
41+
*/
42+
constructor(message?: string, public readonly silent = false) {
43+
super(message);
44+
}
45+
}
3846

3947
/**
4048
* A collection of evaluation-time information about a query,
@@ -307,7 +315,11 @@ async function checkDbschemeCompatibility(
307315

308316
/**
309317
* Prompts the user to save `document` if it has unsaved changes.
310-
* Returns true if we should save changes.
318+
*
319+
* @param document The document to save.
320+
*
321+
* @returns true if we should save changes and false if we should continue without saving changes.
322+
* @throws UserCancellationException if we should abort whatever operation triggered this prompt
311323
*/
312324
async function promptUserToSaveChanges(document: vscode.TextDocument): Promise<boolean> {
313325
if (document.isDirty) {
@@ -317,9 +329,14 @@ async function promptUserToSaveChanges(document: vscode.TextDocument): Promise<b
317329
else {
318330
const yesItem = { title: 'Yes', isCloseAffordance: false };
319331
const alwaysItem = { title: 'Always Save', isCloseAffordance: false };
320-
const noItem = { title: 'No', isCloseAffordance: true };
332+
const noItem = { title: 'No (run anyway)', isCloseAffordance: false };
333+
const cancelItem = { title: 'Cancel', isCloseAffordance: true };
321334
const message = 'Query file has unsaved changes. Save now?';
322-
const chosenItem = await vscode.window.showInformationMessage(message, { modal: true }, yesItem, alwaysItem, noItem);
335+
const chosenItem = await vscode.window.showInformationMessage(
336+
message,
337+
{ modal: true },
338+
yesItem, alwaysItem, noItem, cancelItem
339+
);
323340

324341
if (chosenItem === alwaysItem) {
325342
await config.AUTOSAVE_SETTING.updateValue(true, vscode.ConfigurationTarget.Workspace);
@@ -329,6 +346,10 @@ async function promptUserToSaveChanges(document: vscode.TextDocument): Promise<b
329346
if (chosenItem === yesItem) {
330347
return true;
331348
}
349+
350+
if (chosenItem === cancelItem) {
351+
throw new UserCancellationException('Query run cancelled.', true);
352+
}
332353
}
333354
}
334355
return false;

0 commit comments

Comments
 (0)