Skip to content

Commit b436fbd

Browse files
Merge pull request #3453 from github/robertbrignull/convertGithubNwoToDatabaseUrl
Move convertGithubNwoToDatabaseUrl to databases/github-databases/api.ts
2 parents 5402cab + 66879ef commit b436fbd

4 files changed

Lines changed: 284 additions & 288 deletions

File tree

extensions/ql-vscode/src/databases/database-fetcher.ts

Lines changed: 1 addition & 90 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,11 @@ import {
3333
} from "../config";
3434
import { showAndLogInformationMessage } from "../common/logging";
3535
import { AppOctokit } from "../common/octokit";
36-
import { getLanguageDisplayName } from "../common/query-language";
3736
import type { DatabaseOrigin } from "./local-databases/database-origin";
3837
import { createTimeoutSignal } from "../common/fetch-stream";
3938
import type { App } from "../common/app";
4039
import { findDirWithFile } from "../common/files";
40+
import { convertGithubNwoToDatabaseUrl } from "./github-databases/api";
4141

4242
/**
4343
* Prompts a user to fetch a database from a remote location. Database is assumed to be an archive file.
@@ -587,95 +587,6 @@ function isFile(databaseUrl: string) {
587587
return Uri.parse(databaseUrl).scheme === "file";
588588
}
589589

590-
export async function convertGithubNwoToDatabaseUrl(
591-
nwo: string,
592-
octokit: Octokit,
593-
progress: ProgressCallback,
594-
language?: string,
595-
): Promise<
596-
| {
597-
databaseUrl: string;
598-
owner: string;
599-
name: string;
600-
databaseId: number;
601-
databaseCreatedAt: string;
602-
commitOid: string | null;
603-
}
604-
| undefined
605-
> {
606-
try {
607-
const [owner, repo] = nwo.split("/");
608-
609-
const response = await octokit.rest.codeScanning.listCodeqlDatabases({
610-
owner,
611-
repo,
612-
});
613-
614-
const languages = response.data.map((db) => db.language);
615-
616-
if (!language || !languages.includes(language)) {
617-
language = await promptForLanguage(languages, progress);
618-
if (!language) {
619-
return;
620-
}
621-
}
622-
623-
const databaseForLanguage = response.data.find(
624-
(db) => db.language === language,
625-
);
626-
if (!databaseForLanguage) {
627-
throw new Error(`No database found for language '${language}'`);
628-
}
629-
630-
return {
631-
databaseUrl: databaseForLanguage.url,
632-
owner,
633-
name: repo,
634-
databaseId: databaseForLanguage.id,
635-
databaseCreatedAt: databaseForLanguage.created_at,
636-
commitOid: databaseForLanguage.commit_oid ?? null,
637-
};
638-
} catch (e) {
639-
void extLogger.log(`Error: ${getErrorMessage(e)}`);
640-
throw new Error(`Unable to get database for '${nwo}'`);
641-
}
642-
}
643-
644-
export async function promptForLanguage(
645-
languages: string[],
646-
progress: ProgressCallback | undefined,
647-
): Promise<string | undefined> {
648-
progress?.({
649-
message: "Choose language",
650-
step: 2,
651-
maxStep: 2,
652-
});
653-
if (!languages.length) {
654-
throw new Error("No databases found");
655-
}
656-
if (languages.length === 1) {
657-
return languages[0];
658-
}
659-
660-
const items = languages
661-
.map((language) => ({
662-
label: getLanguageDisplayName(language),
663-
description: language,
664-
language,
665-
}))
666-
.sort((a, b) => a.label.localeCompare(b.label));
667-
668-
const selectedItem = await window.showQuickPick(items, {
669-
placeHolder: "Select the database language to download:",
670-
ignoreFocusOut: true,
671-
});
672-
if (!selectedItem) {
673-
return undefined;
674-
}
675-
676-
return selectedItem.language;
677-
}
678-
679590
/**
680591
* Databases created by the old odasa tool will not have a zipped
681592
* source location. However, this extension works better if sources

extensions/ql-vscode/src/databases/github-databases/api.ts

Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,11 @@ import { showNeverAskAgainDialog } from "../../common/vscode/dialog";
55
import type { GitHubDatabaseConfig } from "../../config";
66
import type { Credentials } from "../../common/authentication";
77
import { AppOctokit } from "../../common/octokit";
8+
import type { ProgressCallback } from "../../common/vscode/progress";
9+
import { getErrorMessage } from "../../common/helpers-pure";
10+
import { getLanguageDisplayName } from "../../common/query-language";
11+
import { window } from "vscode";
12+
import { extLogger } from "../../common/logging/vscode";
813

914
export type CodeqlDatabase =
1015
RestEndpointMethodTypes["codeScanning"]["listCodeqlDatabases"]["response"]["data"][number];
@@ -108,3 +113,92 @@ export async function listDatabases(
108113
octokit,
109114
};
110115
}
116+
117+
export async function convertGithubNwoToDatabaseUrl(
118+
nwo: string,
119+
octokit: Octokit,
120+
progress: ProgressCallback,
121+
language?: string,
122+
): Promise<
123+
| {
124+
databaseUrl: string;
125+
owner: string;
126+
name: string;
127+
databaseId: number;
128+
databaseCreatedAt: string;
129+
commitOid: string | null;
130+
}
131+
| undefined
132+
> {
133+
try {
134+
const [owner, repo] = nwo.split("/");
135+
136+
const response = await octokit.rest.codeScanning.listCodeqlDatabases({
137+
owner,
138+
repo,
139+
});
140+
141+
const languages = response.data.map((db) => db.language);
142+
143+
if (!language || !languages.includes(language)) {
144+
language = await promptForLanguage(languages, progress);
145+
if (!language) {
146+
return;
147+
}
148+
}
149+
150+
const databaseForLanguage = response.data.find(
151+
(db) => db.language === language,
152+
);
153+
if (!databaseForLanguage) {
154+
throw new Error(`No database found for language '${language}'`);
155+
}
156+
157+
return {
158+
databaseUrl: databaseForLanguage.url,
159+
owner,
160+
name: repo,
161+
databaseId: databaseForLanguage.id,
162+
databaseCreatedAt: databaseForLanguage.created_at,
163+
commitOid: databaseForLanguage.commit_oid ?? null,
164+
};
165+
} catch (e) {
166+
void extLogger.log(`Error: ${getErrorMessage(e)}`);
167+
throw new Error(`Unable to get database for '${nwo}'`);
168+
}
169+
}
170+
171+
async function promptForLanguage(
172+
languages: string[],
173+
progress: ProgressCallback | undefined,
174+
): Promise<string | undefined> {
175+
progress?.({
176+
message: "Choose language",
177+
step: 2,
178+
maxStep: 2,
179+
});
180+
if (!languages.length) {
181+
throw new Error("No databases found");
182+
}
183+
if (languages.length === 1) {
184+
return languages[0];
185+
}
186+
187+
const items = languages
188+
.map((language) => ({
189+
label: getLanguageDisplayName(language),
190+
description: language,
191+
language,
192+
}))
193+
.sort((a, b) => a.label.localeCompare(b.label));
194+
195+
const selectedItem = await window.showQuickPick(items, {
196+
placeHolder: "Select the database language to download:",
197+
ignoreFocusOut: true,
198+
});
199+
if (!selectedItem) {
200+
return undefined;
201+
}
202+
203+
return selectedItem.language;
204+
}

0 commit comments

Comments
 (0)