Skip to content

Commit 09d744a

Browse files
authored
Merge branch 'github:main' into main
2 parents f7d4891 + 2493ddd commit 09d744a

8 files changed

Lines changed: 0 additions & 380 deletions

File tree

extensions/ql-vscode/media/dark/lgtm-plus.svg

Lines changed: 0 additions & 5 deletions
This file was deleted.

extensions/ql-vscode/media/light/lgtm-plus.svg

Lines changed: 0 additions & 5 deletions
This file was deleted.

extensions/ql-vscode/package.json

Lines changed: 0 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@
4848
"onCommand:codeQLDatabases.chooseDatabaseArchive",
4949
"onCommand:codeQLDatabases.chooseDatabaseInternet",
5050
"onCommand:codeQLDatabases.chooseDatabaseGithub",
51-
"onCommand:codeQLDatabases.chooseDatabaseLgtm",
5251
"onCommand:codeQL.setCurrentDatabase",
5352
"onCommand:codeQL.viewAst",
5453
"onCommand:codeQL.viewCfg",
@@ -58,7 +57,6 @@
5857
"onCommand:codeQL.chooseDatabaseArchive",
5958
"onCommand:codeQL.chooseDatabaseInternet",
6059
"onCommand:codeQL.chooseDatabaseGithub",
61-
"onCommand:codeQL.chooseDatabaseLgtm",
6260
"onCommand:codeQLDatabases.chooseDatabase",
6361
"onCommand:codeQLDatabases.setCurrentDatabase",
6462
"onCommand:codeQLDatabasesExperimental.openConfigFile",
@@ -410,14 +408,6 @@
410408
"dark": "media/dark/github.svg"
411409
}
412410
},
413-
{
414-
"command": "codeQLDatabases.chooseDatabaseLgtm",
415-
"title": "Download from LGTM",
416-
"icon": {
417-
"light": "media/light/lgtm-plus.svg",
418-
"dark": "media/dark/lgtm-plus.svg"
419-
}
420-
},
421411
{
422412
"command": "codeQL.setCurrentDatabase",
423413
"title": "CodeQL: Set Current Database"
@@ -486,10 +476,6 @@
486476
"command": "codeQL.chooseDatabaseGithub",
487477
"title": "CodeQL: Download Database from GitHub"
488478
},
489-
{
490-
"command": "codeQL.chooseDatabaseLgtm",
491-
"title": "CodeQL: Download Database from LGTM"
492-
},
493479
{
494480
"command": "codeQLDatabases.sortByName",
495481
"title": "Sort by Name",
@@ -728,11 +714,6 @@
728714
"when": "view == codeQLDatabases",
729715
"group": "navigation"
730716
},
731-
{
732-
"command": "codeQLDatabases.chooseDatabaseLgtm",
733-
"when": "config.codeQL.canary && view == codeQLDatabases",
734-
"group": "navigation"
735-
},
736717
{
737718
"command": "codeQLQueryHistory.openQuery",
738719
"when": "view == codeQLQueryHistory",
@@ -997,10 +978,6 @@
997978
"command": "codeQL.viewCfg",
998979
"when": "resourceScheme == codeql-zip-archive && config.codeQL.canary"
999980
},
1000-
{
1001-
"command": "codeQL.chooseDatabaseLgtm",
1002-
"when": "config.codeQL.canary"
1003-
},
1004981
{
1005982
"command": "codeQLDatabasesExperimental.openConfigFile",
1006983
"when": "false"
@@ -1061,10 +1038,6 @@
10611038
"command": "codeQLDatabases.chooseDatabaseGithub",
10621039
"when": "false"
10631040
},
1064-
{
1065-
"command": "codeQLDatabases.chooseDatabaseLgtm",
1066-
"when": "false"
1067-
},
10681041
{
10691042
"command": "codeQLDatabases.upgradeDatabase",
10701043
"when": "false"

extensions/ql-vscode/src/databaseFetcher.ts

Lines changed: 0 additions & 189 deletions
Original file line numberDiff line numberDiff line change
@@ -153,74 +153,6 @@ export async function promptImportGithubDatabase(
153153
return;
154154
}
155155

156-
/**
157-
* Prompts a user to fetch a database from lgtm.
158-
* User enters a project url and then the user is asked which language
159-
* to download (if there is more than one)
160-
*
161-
* @param databaseManager the DatabaseManager
162-
* @param storagePath where to store the unzipped database.
163-
*/
164-
export async function promptImportLgtmDatabase(
165-
databaseManager: DatabaseManager,
166-
storagePath: string,
167-
progress: ProgressCallback,
168-
token: CancellationToken,
169-
cli?: CodeQLCliServer,
170-
): Promise<DatabaseItem | undefined> {
171-
progress({
172-
message: "Choose project",
173-
step: 1,
174-
maxStep: 2,
175-
});
176-
const lgtmUrl = await window.showInputBox({
177-
prompt:
178-
"Enter the project slug or URL on LGTM (e.g., g/github/codeql or https://lgtm.com/projects/g/github/codeql)",
179-
});
180-
if (!lgtmUrl) {
181-
return;
182-
}
183-
184-
if (looksLikeLgtmUrl(lgtmUrl)) {
185-
const databaseUrl = await convertLgtmUrlToDatabaseUrl(lgtmUrl, progress);
186-
if (databaseUrl) {
187-
const item = await databaseArchiveFetcher(
188-
databaseUrl,
189-
{},
190-
databaseManager,
191-
storagePath,
192-
undefined,
193-
progress,
194-
token,
195-
cli,
196-
);
197-
if (item) {
198-
await commands.executeCommand("codeQLDatabases.focus");
199-
void showAndLogInformationMessage(
200-
"Database downloaded and imported successfully.",
201-
);
202-
}
203-
return item;
204-
}
205-
} else {
206-
throw new Error(`Invalid LGTM URL: ${lgtmUrl}`);
207-
}
208-
return;
209-
}
210-
211-
export async function retrieveCanonicalRepoName(lgtmUrl: string) {
212-
const givenRepoName = extractProjectSlug(lgtmUrl);
213-
const response = await checkForFailingResponse(
214-
await fetch(`https://api.github.com/repos/${givenRepoName}`),
215-
"Failed to locate the repository on github",
216-
);
217-
const repo = await response.json();
218-
if (!repo || !repo.full_name) {
219-
return;
220-
}
221-
return repo.full_name;
222-
}
223-
224156
/**
225157
* Imports a database from a local archive.
226158
*
@@ -552,127 +484,6 @@ export async function convertGithubNwoToDatabaseUrl(
552484
}
553485
}
554486

555-
/**
556-
* The URL pattern is https://lgtm.com/projects/{provider}/{org}/{name}/{irrelevant-subpages}.
557-
* There are several possibilities for the provider: in addition to GitHub.com (g),
558-
* LGTM currently hosts projects from Bitbucket (b), GitLab (gl) and plain git (git).
559-
*
560-
* This function accepts any url that matches the pattern above. It also accepts the
561-
* raw project slug, e.g., `g/myorg/myproject`
562-
*
563-
* After the `{provider}/{org}/{name}` path components, there may be the components
564-
* related to sub pages.
565-
*
566-
* @param lgtmUrl The URL to the lgtm project
567-
*
568-
* @return true if this looks like an LGTM project url
569-
*/
570-
// exported for testing
571-
export function looksLikeLgtmUrl(
572-
lgtmUrl: string | undefined,
573-
): lgtmUrl is string {
574-
if (!lgtmUrl) {
575-
return false;
576-
}
577-
578-
if (convertRawLgtmSlug(lgtmUrl)) {
579-
return true;
580-
}
581-
582-
try {
583-
const uri = Uri.parse(lgtmUrl, true);
584-
if (uri.scheme !== "https") {
585-
return false;
586-
}
587-
588-
if (uri.authority !== "lgtm.com" && uri.authority !== "www.lgtm.com") {
589-
return false;
590-
}
591-
592-
const paths = uri.path.split("/").filter((segment: string) => segment);
593-
return paths.length >= 4 && paths[0] === "projects";
594-
} catch (e) {
595-
return false;
596-
}
597-
}
598-
599-
function convertRawLgtmSlug(maybeSlug: string): string | undefined {
600-
if (!maybeSlug) {
601-
return;
602-
}
603-
const segments = maybeSlug.split("/");
604-
const providers = ["g", "gl", "b", "git"];
605-
if (segments.length === 3 && providers.includes(segments[0])) {
606-
return `https://lgtm.com/projects/${maybeSlug}`;
607-
}
608-
return;
609-
}
610-
611-
function extractProjectSlug(lgtmUrl: string): string | undefined {
612-
// Only matches the '/g/' provider (github)
613-
const re = new RegExp("https://lgtm.com/projects/g/(.*[^/])");
614-
const match = lgtmUrl.match(re);
615-
if (!match) {
616-
return;
617-
}
618-
return match[1];
619-
}
620-
621-
// exported for testing
622-
export async function convertLgtmUrlToDatabaseUrl(
623-
lgtmUrl: string,
624-
progress: ProgressCallback,
625-
) {
626-
try {
627-
lgtmUrl = convertRawLgtmSlug(lgtmUrl) || lgtmUrl;
628-
let projectJson = await downloadLgtmProjectMetadata(lgtmUrl);
629-
630-
if (projectJson.code === 404) {
631-
// fallback check for github repositories with same name but different case
632-
// will fail for other providers
633-
let canonicalName = await retrieveCanonicalRepoName(lgtmUrl);
634-
if (!canonicalName) {
635-
throw new Error(`Project was not found at ${lgtmUrl}.`);
636-
}
637-
canonicalName = convertRawLgtmSlug(`g/${canonicalName}`);
638-
projectJson = await downloadLgtmProjectMetadata(canonicalName);
639-
if (projectJson.code === 404) {
640-
throw new Error("Failed to download project from LGTM.");
641-
}
642-
}
643-
644-
const languages =
645-
projectJson?.languages?.map(
646-
(lang: { language: string }) => lang.language,
647-
) || [];
648-
649-
const language = await promptForLanguage(languages, progress);
650-
if (!language) {
651-
return;
652-
}
653-
return `https://lgtm.com/${[
654-
"api",
655-
"v1.0",
656-
"snapshots",
657-
projectJson.id,
658-
language,
659-
].join("/")}`;
660-
} catch (e) {
661-
void extLogger.log(`Error: ${getErrorMessage(e)}`);
662-
throw new Error(`Invalid LGTM URL: ${lgtmUrl}`);
663-
}
664-
}
665-
666-
async function downloadLgtmProjectMetadata(lgtmUrl: string): Promise<any> {
667-
const uri = Uri.parse(lgtmUrl, true);
668-
const paths = ["api", "v1.0"]
669-
.concat(uri.path.split("/").filter((segment: string) => segment))
670-
.slice(0, 6);
671-
const projectUrl = `https://lgtm.com/${paths.join("/")}`;
672-
const projectResponse = await fetch(projectUrl);
673-
return projectResponse.json();
674-
}
675-
676487
async function promptForLanguage(
677488
languages: string[],
678489
progress: ProgressCallback,

extensions/ql-vscode/src/databases-ui.ts

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@ import {
3333
importArchiveDatabase,
3434
promptImportGithubDatabase,
3535
promptImportInternetDatabase,
36-
promptImportLgtmDatabase,
3736
} from "./databaseFetcher";
3837
import { asyncFilter, getErrorMessage } from "./pure/helpers-pure";
3938
import { Credentials } from "./authentication";
@@ -308,15 +307,6 @@ export class DatabaseUI extends DisposableObject {
308307
},
309308
),
310309
);
311-
this.push(
312-
commandRunnerWithProgress(
313-
"codeQLDatabases.chooseDatabaseLgtm",
314-
this.handleChooseDatabaseLgtm,
315-
{
316-
title: "Adding database from LGTM",
317-
},
318-
),
319-
);
320310
this.push(
321311
commandRunner(
322312
"codeQLDatabases.setCurrentDatabase",
@@ -491,19 +481,6 @@ export class DatabaseUI extends DisposableObject {
491481
);
492482
};
493483

494-
handleChooseDatabaseLgtm = async (
495-
progress: ProgressCallback,
496-
token: CancellationToken,
497-
): Promise<DatabaseItem | undefined> => {
498-
return await promptImportLgtmDatabase(
499-
this.databaseManager,
500-
this.storagePath,
501-
progress,
502-
token,
503-
this.queryServer?.cliServer,
504-
);
505-
};
506-
507484
async tryUpgradeCurrentDatabase(
508485
progress: ProgressCallback,
509486
token: CancellationToken,

extensions/ql-vscode/src/extension.ts

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1369,16 +1369,6 @@ async function activateWithInstalledDistribution(
13691369
},
13701370
),
13711371
);
1372-
ctx.subscriptions.push(
1373-
commandRunnerWithProgress(
1374-
"codeQL.chooseDatabaseLgtm",
1375-
(progress: ProgressCallback, token: CancellationToken) =>
1376-
databaseUI.handleChooseDatabaseLgtm(progress, token),
1377-
{
1378-
title: "Adding database from LGTM",
1379-
},
1380-
),
1381-
);
13821372
ctx.subscriptions.push(
13831373
commandRunnerWithProgress(
13841374
"codeQL.chooseDatabaseInternet",

extensions/ql-vscode/src/vscode-tests/cli-integration/databases.test.ts

Lines changed: 0 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import { CodeQLExtensionInterface } from "../../extension";
55
import { CodeQLCliServer } from "../../cli";
66
import { DatabaseManager } from "../../databases";
77
import {
8-
promptImportLgtmDatabase,
98
importArchiveDatabase,
109
promptImportInternetDatabase,
1110
} from "../../databaseFetcher";
@@ -17,9 +16,6 @@ jest.setTimeout(60_000);
1716
* Run various integration tests for databases
1817
*/
1918
describe("Databases", () => {
20-
const LGTM_URL =
21-
"https://lgtm.com/projects/g/aeisenberg/angular-bind-notifier/";
22-
2319
let databaseManager: DatabaseManager;
2420
let inputBoxStub: jest.SpiedFunction<typeof window.showInputBox>;
2521
let cli: CodeQLCliServer;
@@ -71,27 +67,6 @@ describe("Databases", () => {
7167
expect(dbItem.databaseUri.fsPath).toBe(join(storagePath, "db", "db"));
7268
});
7369

74-
it("should add a database from lgtm with only one language", async () => {
75-
inputBoxStub.mockResolvedValue(LGTM_URL);
76-
let dbItem = await promptImportLgtmDatabase(
77-
databaseManager,
78-
storagePath,
79-
progressCallback,
80-
{} as CancellationToken,
81-
cli,
82-
);
83-
expect(dbItem).toBeDefined();
84-
dbItem = dbItem!;
85-
expect(dbItem.name).toBe("aeisenberg_angular-bind-notifier_106179a");
86-
expect(dbItem.databaseUri.fsPath).toBe(
87-
join(
88-
storagePath,
89-
"javascript",
90-
"aeisenberg_angular-bind-notifier_106179a",
91-
),
92-
);
93-
});
94-
9570
it("should add a database from a url", async () => {
9671
inputBoxStub.mockResolvedValue(DB_URL);
9772

0 commit comments

Comments
 (0)