Skip to content

Commit

Permalink
Add prompt for updating GitHub databases
Browse files Browse the repository at this point in the history
  • Loading branch information
koesie10 committed Nov 20, 2023
1 parent d0488dd commit d03082d
Show file tree
Hide file tree
Showing 6 changed files with 861 additions and 15 deletions.
13 changes: 13 additions & 0 deletions extensions/ql-vscode/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -441,6 +441,19 @@
"Never download a GitHub databases when a workspace is opened."
],
"description": "Ask to download a GitHub database when a workspace is opened."
},
"codeQL.githubDatabase.update": {
"type": "string",
"default": "ask",
"enum": [
"ask",
"never"
],
"enumDescriptions": [
"Ask to download an updated GitHub database when a new version is available.",
"Never download an updated GitHub database when a new version is available."
],
"description": "Ask to download an updated GitHub database when a new version is available."
}
}
},
Expand Down
22 changes: 22 additions & 0 deletions extensions/ql-vscode/src/config.ts
Original file line number Diff line number Diff line change
Expand Up @@ -788,13 +788,23 @@ const GITHUB_DATABASE_DOWNLOAD = new Setting(
const GitHubDatabaseDownloadValues = ["ask", "never"] as const;
type GitHubDatabaseDownload = (typeof GitHubDatabaseDownloadValues)[number];

const GITHUB_DATABASE_UPDATE = new Setting("update", GITHUB_DATABASE_SETTING);

const GitHubDatabaseUpdateValues = ["ask", "never"] as const;
type GitHubDatabaseUpdate = (typeof GitHubDatabaseUpdateValues)[number];

export interface GitHubDatabaseConfig {
enable: boolean;
download: GitHubDatabaseDownload;
update: GitHubDatabaseUpdate;
setDownload(
value: GitHubDatabaseDownload,
target?: ConfigurationTarget,
): Promise<void>;
setUpdate(
value: GitHubDatabaseUpdate,
target?: ConfigurationTarget,
): Promise<void>;
}

export class GitHubDatabaseConfigListener
Expand All @@ -817,10 +827,22 @@ export class GitHubDatabaseConfigListener
return GitHubDatabaseDownloadValues.includes(value) ? value : "ask";
}

public get update(): GitHubDatabaseUpdate {
const value = GITHUB_DATABASE_UPDATE.getValue<GitHubDatabaseUpdate>();
return GitHubDatabaseUpdateValues.includes(value) ? value : "ask";
}

public async setDownload(
value: GitHubDatabaseDownload,
target: ConfigurationTarget = ConfigurationTarget.Workspace,
): Promise<void> {
await GITHUB_DATABASE_DOWNLOAD.updateValue(value, target);
}

public async setUpdate(
value: GitHubDatabaseUpdate,
target: ConfigurationTarget = ConfigurationTarget.Workspace,
): Promise<void> {
await GITHUB_DATABASE_UPDATE.updateValue(value, target);
}
}
59 changes: 48 additions & 11 deletions extensions/ql-vscode/src/databases/github-database-module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import { DisposableObject } from "../common/disposable-object";
import { App } from "../common/app";
import { findGitHubRepositoryForWorkspace } from "./github-repository-finder";
import { redactableError } from "../common/errors";
import { asError, getErrorMessage } from "../common/helpers-pure";
import { asError, assertNever, getErrorMessage } from "../common/helpers-pure";
import {
CodeqlDatabase,
findGitHubDatabasesForRepository,
Expand All @@ -16,6 +16,11 @@ import {
import { AppOctokit } from "../common/octokit";
import { DatabaseManager } from "./local-databases";
import { CodeQLCliServer } from "../codeql-cli/cli";
import {
askForGitHubDatabaseUpdate,
downloadDatabaseUpdateFromGitHub,
isNewerDatabaseAvailable,
} from "./github-database-updater";

export class GithubDatabaseModule extends DisposableObject {
private readonly config: GitHubDatabaseConfig;
Expand Down Expand Up @@ -83,16 +88,6 @@ export class GithubDatabaseModule extends DisposableObject {

const githubRepository = githubRepositoryResult.value;

const hasExistingDatabase = this.databaseManager.databaseItems.some(
(db) =>
db.origin?.type === "github" &&
db.origin.repository ===
`${githubRepository.owner}/${githubRepository.name}`,
);
if (hasExistingDatabase) {
return;
}

const credentials = isCanary() ? this.app.credentials : undefined;

const octokit = credentials
Expand Down Expand Up @@ -124,6 +119,48 @@ export class GithubDatabaseModule extends DisposableObject {
return;
}

const updateStatus = isNewerDatabaseAvailable(
databases,
githubRepository.owner,
githubRepository.name,
this.databaseManager,
);
if (updateStatus.type === "upToDate") {
return;
}

if (updateStatus.type === "updateAvailable") {
if (this.config.update === "never") {
return;
}

if (
!(await askForGitHubDatabaseUpdate(
updateStatus.databaseUpdates,
this.config,
))
) {
return;
}

await downloadDatabaseUpdateFromGitHub(
octokit,
githubRepository.owner,
githubRepository.name,
updateStatus.databaseUpdates,
this.databaseManager,
this.databaseStoragePath,
this.cliServer,
this.app.commands,
);

return;
}

if (updateStatus.type !== "noDatabase") {
assertNever(updateStatus);
}

void promptGitHubDatabaseDownload(
octokit,
githubRepository.owner,
Expand Down
17 changes: 13 additions & 4 deletions extensions/ql-vscode/src/databases/github-database-prompt.ts
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ export async function promptGitHubDatabaseDownload(
*
* @param languages The languages to join. These should be language identifiers, such as `csharp`.
*/
function joinLanguages(languages: string[]): string {
export function joinLanguages(languages: string[]): string {
const languageDisplayNames = languages
.map((language) => getLanguageDisplayName(language))
.sort();
Expand All @@ -141,8 +141,17 @@ function joinLanguages(languages: string[]): string {
return result;
}

async function promptForDatabases(
type PromptForDatabasesOptions = {
title?: string;
placeHolder?: string;
};

export async function promptForDatabases(
databases: CodeqlDatabase[],
{
title = "Select databases to download",
placeHolder = "Databases found in this repository",
}: PromptForDatabasesOptions = {},
): Promise<CodeqlDatabase[]> {
if (databases.length === 1) {
return databases;
Expand All @@ -163,8 +172,8 @@ async function promptForDatabases(
.sort((a, b) => a.label.localeCompare(b.label));

const selectedItems = await window.showQuickPick(items, {
title: "Select databases to download",
placeHolder: "Databases found in this repository",
title,
placeHolder,
ignoreFocusOut: true,
canPickMany: true,
});
Expand Down
Loading

0 comments on commit d03082d

Please sign in to comment.