Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Push QL pack details creation to commands #3262

Merged
merged 1 commit into from
Jan 23, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 3 additions & 16 deletions extensions/ql-vscode/src/variant-analysis/run-remote-query.ts
Original file line number Diff line number Diff line change
Expand Up @@ -332,25 +332,15 @@ interface PreparedRemoteQuery {
export async function prepareRemoteQueryRun(
cliServer: CodeQLCliServer,
credentials: Credentials,
uris: Uri[],
qlPackDetails: QlPackDetails,
progress: ProgressCallback,
token: CancellationToken,
dbManager: DbManager,
): Promise<PreparedRemoteQuery> {
if (uris.length !== 1) {
// For now we only support a single file, but we're aiming
// to support multiple files in the near future.
throw Error("Exactly one query file must be selected.");
}

const uri = uris[0];

if (!uri.fsPath.endsWith(".ql")) {
if (!qlPackDetails.queryFile.endsWith(".ql")) {
throw new UserCancellationException("Not a CodeQL query file.");
}

const queryFile = uri.fsPath;

progress({
maxStep: 4,
step: 1,
Expand Down Expand Up @@ -384,10 +374,6 @@ export async function prepareRemoteQueryRun(

let pack: GeneratedQueryPack;

const qlPackDetails: QlPackDetails = {
queryFile,
};

try {
pack = await generateQueryPack(cliServer, qlPackDetails, tempDir);
} finally {
Expand All @@ -406,6 +392,7 @@ export async function prepareRemoteQueryRun(
message: "Sending request",
});

const queryFile = qlPackDetails.queryFile;
const actionBranch = getActionBranch();
const queryStartTime = Date.now();
const queryMetadata = await tryGetQueryMetadata(cliServer, queryFile);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@ import { DisposableObject } from "../common/disposable-object";
import { VariantAnalysisMonitor } from "./variant-analysis-monitor";
import type {
VariantAnalysis,
VariantAnalysisQueries,
VariantAnalysisRepositoryTask,
VariantAnalysisScannedRepository,
VariantAnalysisScannedRepositoryResult,
Expand Down Expand Up @@ -88,6 +89,7 @@ import { RequestError } from "@octokit/request-error";
import { handleRequestError } from "./custom-errors";
import { createMultiSelectionCommand } from "../common/vscode/selection-commands";
import { askForLanguage } from "../codeql-cli/query-language";
import type { QlPackDetails } from "./ql-pack-details";

const maxRetryCount = 3;

Expand Down Expand Up @@ -263,8 +265,15 @@ export class VariantAnalysisManager
return;
}

// Build up details to pass to the functions that run the variant analysis.
// For now, only include the first problem query until we have support
// for multiple queries.
const qlPackDetails: QlPackDetails = {
queryFile: problemQueries[0],
};

await this.runVariantAnalysis(
problemQueries.map((q) => Uri.file(q)),
qlPackDetails,
(p) =>
progress({
...p,
Expand Down Expand Up @@ -295,9 +304,14 @@ export class VariantAnalysisManager
}

private async runVariantAnalysisCommand(uri: Uri): Promise<void> {
// Build up details to pass to the functions that run the variant analysis.
const qlPackDetails: QlPackDetails = {
queryFile: uri.fsPath,
};

return withProgress(
async (progress, token) => {
await this.runVariantAnalysis([uri], progress, token);
await this.runVariantAnalysis(qlPackDetails, progress, token);
},
{
title: "Run Variant Analysis",
Expand All @@ -307,7 +321,7 @@ export class VariantAnalysisManager
}

public async runVariantAnalysis(
uris: Uri[],
qlPackDetails: QlPackDetails,
progress: ProgressCallback,
token: CancellationToken,
): Promise<void> {
Expand All @@ -331,7 +345,7 @@ export class VariantAnalysisManager
} = await prepareRemoteQueryRun(
this.cliServer,
this.app.credentials,
uris,
qlPackDetails,
progress,
token,
this.dbManager,
Expand All @@ -347,12 +361,10 @@ export class VariantAnalysisManager

const queryText = await readFile(queryFile, "utf8");

const queries =
uris.length === 1
? undefined
: {
language: variantAnalysisLanguage,
};
// TODO: Once we have basic support multiple queries, and qlPackDetails has
// more than 1 queryFile, we should set this to have a proper value
// (e.g. { language: variantAnalysisLanguage })
const queries: VariantAnalysisQueries | undefined = undefined;

const variantAnalysisSubmission: VariantAnalysisSubmission = {
startTime: queryStartTime,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { CancellationTokenSource, commands, Uri, window } from "vscode";
import type { Uri } from "vscode";
import { CancellationTokenSource, commands, window } from "vscode";
import { extLogger } from "../../../../src/common/logging/vscode";
import { setRemoteControllerRepo } from "../../../../src/config";
import * as ghApiClient from "../../../../src/variant-analysis/gh-api/gh-api-client";
Expand Down Expand Up @@ -26,6 +27,7 @@ import type { ExtensionPackMetadata } from "../../../../src/model-editor/extensi
import type { QlPackLockFile } from "../../../../src/packaging/qlpack-lock-file";
//import { expect } from "@jest/globals";
import "../../../matchers/toExistInCodeQLPack";
import type { QlPackDetails } from "../../../../src/variant-analysis/ql-pack-details";

describe("Variant Analysis Manager", () => {
let cli: CodeQLCliServer;
Expand Down Expand Up @@ -99,10 +101,13 @@ describe("Variant Analysis Manager", () => {
});

it("should run a variant analysis that is part of a qlpack", async () => {
const fileUri = getFile("data-remote-qlpack/in-pack.ql");
const filePath = getFile("data-remote-qlpack/in-pack.ql");
const qlPackDetails: QlPackDetails = {
queryFile: filePath,
};

await variantAnalysisManager.runVariantAnalysis(
[fileUri],
qlPackDetails,
progress,
cancellationTokenSource.token,
);
Expand All @@ -120,10 +125,13 @@ describe("Variant Analysis Manager", () => {
});

it("should run a remote query that is not part of a qlpack", async () => {
const fileUri = getFile("data-remote-no-qlpack/in-pack.ql");
const filePath = getFile("data-remote-no-qlpack/in-pack.ql");
const qlPackDetails: QlPackDetails = {
queryFile: filePath,
};

await variantAnalysisManager.runVariantAnalysis(
[fileUri],
qlPackDetails,
progress,
cancellationTokenSource.token,
);
Expand All @@ -141,10 +149,15 @@ describe("Variant Analysis Manager", () => {
});

it("should run a remote query that is nested inside a qlpack", async () => {
const fileUri = getFile("data-remote-qlpack-nested/subfolder/in-pack.ql");
const filePath = getFile(
"data-remote-qlpack-nested/subfolder/in-pack.ql",
);
const qlPackDetails: QlPackDetails = {
queryFile: filePath,
};

await variantAnalysisManager.runVariantAnalysis(
[fileUri],
qlPackDetails,
progress,
cancellationTokenSource.token,
);
Expand All @@ -162,10 +175,13 @@ describe("Variant Analysis Manager", () => {
});

it("should cancel a run before uploading", async () => {
const fileUri = getFile("data-remote-no-qlpack/in-pack.ql");
const filePath = getFile("data-remote-no-qlpack/in-pack.ql");
const qlPackDetails: QlPackDetails = {
queryFile: filePath,
};

const promise = variantAnalysisManager.runVariantAnalysis(
[fileUri],
qlPackDetails,
progress,
cancellationTokenSource.token,
);
Expand Down Expand Up @@ -313,9 +329,13 @@ describe("Variant Analysis Manager", () => {
dependenciesToCheck?: string[];
checkVersion?: boolean;
}) {
const fileUri = getFile(queryPath);
const filePath = getFile(queryPath);
const qlPackDetails: QlPackDetails = {
queryFile: filePath,
};

await variantAnalysisManager.runVariantAnalysis(
[fileUri],
qlPackDetails,
progress,
cancellationTokenSource.token,
);
Expand All @@ -324,7 +344,7 @@ describe("Variant Analysis Manager", () => {
expect(executeCommandSpy).toHaveBeenCalledWith(
"codeQL.monitorNewVariantAnalysis",
expect.objectContaining({
query: expect.objectContaining({ filePath: fileUri.fsPath }),
query: expect.objectContaining({ filePath }),
}),
);

Expand Down Expand Up @@ -390,17 +410,19 @@ describe("Variant Analysis Manager", () => {
);
}

function getFile(file: string): Uri {
function getFile(file: string): string {
if (isAbsolute(file)) {
return Uri.file(file);
return file;
} else {
return Uri.file(join(baseDir, file));
return join(baseDir, file);
}
}
});

describe("runVariantAnalysisFromPublishedPack", () => {
it("should download pack for correct language and identify problem queries", async () => {
// Temporarily disabling this until we add a way to receive multiple queries in the
// runVariantAnalysis function.
it.skip("should download pack for correct language and identify problem queries", async () => {
const showQuickPickSpy = jest
.spyOn(window, "showQuickPick")
.mockResolvedValue(
Expand Down
Loading