Skip to content

Commit 42f1e81

Browse files
committed
Handle errors when downloading database
1 parent f3eefc9 commit 42f1e81

4 files changed

Lines changed: 37 additions & 16 deletions

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ export class LocalQueries extends DisposableObject {
330330
this.cliServer,
331331
progress,
332332
credentials,
333-
this.app.logger,
333+
this.app,
334334
this.databaseManager,
335335
contextStoragePath,
336336
language,

extensions/ql-vscode/src/local-queries/skeleton-query-wizard.ts

Lines changed: 27 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
import { join } from "path";
22
import { Uri, window as Window, window, workspace } from "vscode";
33
import { CodeQLCliServer } from "../codeql-cli/cli";
4-
import { BaseLogger } from "../common/logging";
4+
import { showAndLogExceptionWithTelemetry } from "../common/logging";
55
import { Credentials } from "../common/authentication";
66
import { QueryLanguage } from "../common/query-language";
77
import {
88
getFirstWorkspaceFolder,
99
isFolderAlreadyInWorkspace,
1010
} from "../common/vscode/workspace-folders";
11-
import { getErrorMessage } from "../common/helpers-pure";
11+
import { asError, getErrorMessage } from "../common/helpers-pure";
1212
import { QlPackGenerator } from "./qlpack-generator";
1313
import { DatabaseItem, DatabaseManager } from "../databases/local-databases";
1414
import {
@@ -28,6 +28,8 @@ import {
2828
import { existsSync } from "fs-extra";
2929
import { askForLanguage } from "../codeql-cli/query-language";
3030
import { showInformationMessageWithAction } from "../common/vscode/dialog";
31+
import { redactableError } from "../common/errors";
32+
import { App } from "../common/app";
3133

3234
type QueryLanguagesToDatabaseMap = Record<string, string>;
3335

@@ -51,7 +53,7 @@ export class SkeletonQueryWizard {
5153
private readonly cliServer: CodeQLCliServer,
5254
private readonly progress: ProgressCallback,
5355
private readonly credentials: Credentials | undefined,
54-
private readonly logger: BaseLogger,
56+
private readonly app: App,
5557
private readonly databaseManager: DatabaseManager,
5658
private readonly databaseStoragePath: string | undefined,
5759
private language: QueryLanguage | undefined = undefined,
@@ -99,7 +101,7 @@ export class SkeletonQueryWizard {
99101
try {
100102
await this.openExampleFile();
101103
} catch (e: unknown) {
102-
void this.logger.log(
104+
void this.app.logger.log(
103105
`Could not open example query file: ${getErrorMessage(e)}`,
104106
);
105107
}
@@ -190,7 +192,7 @@ export class SkeletonQueryWizard {
190192

191193
await qlPackGenerator.generate();
192194
} catch (e: unknown) {
193-
void this.logger.log(
195+
void this.app.logger.log(
194196
`Could not create skeleton QL pack: ${getErrorMessage(e)}`,
195197
);
196198
}
@@ -222,7 +224,7 @@ export class SkeletonQueryWizard {
222224
this.fileName = await this.determineNextFileName(this.folderName);
223225
await qlPackGenerator.createExampleQlFile(this.fileName);
224226
} catch (e: unknown) {
225-
void this.logger.log(
227+
void this.app.logger.log(
226228
`Could not create skeleton QL pack: ${getErrorMessage(e)}`,
227229
);
228230
}
@@ -255,7 +257,25 @@ export class SkeletonQueryWizard {
255257
);
256258

257259
if (action) {
258-
void withProgress((progress) => this.downloadDatabase(progress));
260+
void withProgress(async (progress) => {
261+
try {
262+
await this.downloadDatabase(progress);
263+
} catch (e: unknown) {
264+
if (e instanceof UserCancellationException) {
265+
return;
266+
}
267+
268+
void showAndLogExceptionWithTelemetry(
269+
this.app.logger,
270+
this.app.telemetry,
271+
redactableError(
272+
asError(e),
273+
)`An error occurred while downloading the GitHub repository: ${getErrorMessage(
274+
e,
275+
)}`,
276+
);
277+
}
278+
});
259279
}
260280
}
261281

extensions/ql-vscode/test/__mocks__/appMock.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ export function createMockApp({
3434
environment?: EnvironmentContext;
3535
logger?: NotificationLogger;
3636
telemetry?: AppTelemetry;
37-
}): App {
37+
} = {}): App {
3838
return {
3939
mode: AppMode.Test,
4040
logger,

extensions/ql-vscode/test/vscode-tests/cli-integration/local-queries/skeleton-query-wizard.test.ts

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@ import {
1212
workspace,
1313
WorkspaceFolder,
1414
} from "vscode";
15-
import { extLogger } from "../../../../src/common/logging/vscode";
1615
import { QlPackGenerator } from "../../../../src/local-queries/qlpack-generator";
1716
import * as workspaceFolders from "../../../../src/common/vscode/workspace-folders";
1817
import { createFileSync, ensureDirSync, removeSync } from "fs-extra";
@@ -28,9 +27,12 @@ import { createMockDB } from "../../../factories/databases/databases";
2827
import { asError } from "../../../../src/common/helpers-pure";
2928
import { Setting } from "../../../../src/config";
3029
import { QueryLanguage } from "../../../../src/common/query-language";
30+
import { App } from "../../../../src/common/app";
31+
import { createMockApp } from "../../../__mocks__/appMock";
3132

3233
describe("SkeletonQueryWizard", () => {
3334
let mockCli: CodeQLCliServer;
35+
let mockApp: App;
3436
let wizard: SkeletonQueryWizard;
3537
let mockDatabaseManager: DatabaseManager;
3638
let dir: tmp.DirResult;
@@ -59,8 +61,6 @@ describe("SkeletonQueryWizard", () => {
5961
const credentials = testCredentialsWithStub();
6062
const chosenLanguage = "ruby";
6163

62-
jest.spyOn(extLogger, "log").mockResolvedValue(undefined);
63-
6464
beforeEach(async () => {
6565
mockCli = mockedObject<CodeQLCliServer>({
6666
resolveLanguages: jest
@@ -76,6 +76,7 @@ describe("SkeletonQueryWizard", () => {
7676
]),
7777
getSupportedLanguages: jest.fn(),
7878
});
79+
mockApp = createMockApp();
7980

8081
mockDatabaseManager = mockedObject<DatabaseManager>({
8182
setCurrentDatabaseItem: jest.fn(),
@@ -126,7 +127,7 @@ describe("SkeletonQueryWizard", () => {
126127
mockCli,
127128
jest.fn(),
128129
credentials,
129-
extLogger,
130+
mockApp,
130131
mockDatabaseManager,
131132
storagePath,
132133
);
@@ -153,7 +154,7 @@ describe("SkeletonQueryWizard", () => {
153154
mockCli,
154155
jest.fn(),
155156
credentials,
156-
extLogger,
157+
mockApp,
157158
mockDatabaseManager,
158159
storagePath,
159160
QueryLanguage.Swift,
@@ -308,7 +309,7 @@ describe("SkeletonQueryWizard", () => {
308309
mockCli,
309310
jest.fn(),
310311
credentials,
311-
extLogger,
312+
mockApp,
312313
mockDatabaseManagerWithItems,
313314
storagePath,
314315
);
@@ -357,7 +358,7 @@ describe("SkeletonQueryWizard", () => {
357358
mockCli,
358359
jest.fn(),
359360
credentials,
360-
extLogger,
361+
mockApp,
361362
mockDatabaseManagerWithItems,
362363
storagePath,
363364
);

0 commit comments

Comments
 (0)