Skip to content

Commit 754fa67

Browse files
committed
Move db contents heuristics to separate file
1 parent b0c18b3 commit 754fa67

File tree

6 files changed

+116
-97
lines changed

6 files changed

+116
-97
lines changed

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,11 +29,13 @@ import {
2929
withProgress,
3030
} from "../common/vscode/progress";
3131
import {
32-
isLikelyDatabaseRoot,
33-
isLikelyDbLanguageFolder,
3432
showAndLogErrorMessage,
3533
showAndLogExceptionWithTelemetry,
3634
} from "../helpers";
35+
import {
36+
isLikelyDatabaseRoot,
37+
isLikelyDbLanguageFolder,
38+
} from "./local-databases/db-contents-heuristics";
3739
import { extLogger } from "../common";
3840
import {
3941
importArchiveDatabase,

extensions/ql-vscode/src/databases/local-databases/database-item-impl.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import {
1010
zipArchiveScheme,
1111
} from "../../common/vscode/archive-filesystem-provider";
1212
import { DatabaseItem, PersistedDatabaseItem } from "./database-item";
13-
import { isLikelyDatabaseRoot } from "../../helpers";
13+
import { isLikelyDatabaseRoot } from "./db-contents-heuristics";
1414
import { stat } from "fs-extra";
1515
import { pathsEqual } from "../../pure/files";
1616
import { DatabaseContents } from "./database-contents";
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { pathExists } from "fs-extra";
2+
import { basename, join } from "path";
3+
import { glob } from "glob";
4+
5+
/**
6+
* The following functions al heuristically determine metadata about databases.
7+
*/
8+
9+
/**
10+
* Heuristically determines if the directory passed in corresponds
11+
* to a database root. A database root is a directory that contains
12+
* a codeql-database.yml or (historically) a .dbinfo file. It also
13+
* contains a folder starting with `db-`.
14+
*/
15+
export async function isLikelyDatabaseRoot(maybeRoot: string) {
16+
const [a, b, c] = await Promise.all([
17+
// databases can have either .dbinfo or codeql-database.yml.
18+
pathExists(join(maybeRoot, ".dbinfo")),
19+
pathExists(join(maybeRoot, "codeql-database.yml")),
20+
21+
// they *must* have a db-{language} folder
22+
glob("db-*/", { cwd: maybeRoot }),
23+
]);
24+
25+
return (a || b) && c.length > 0;
26+
}
27+
28+
/**
29+
* A language folder is any folder starting with `db-` that is itself not a database root.
30+
*/
31+
export async function isLikelyDbLanguageFolder(dbPath: string) {
32+
return (
33+
basename(dbPath).startsWith("db-") && !(await isLikelyDatabaseRoot(dbPath))
34+
);
35+
}

extensions/ql-vscode/src/helpers.ts

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,6 @@ import {
55
writeFile,
66
opendir,
77
} from "fs-extra";
8-
import { glob } from "glob";
98
import { join, basename, dirname } from "path";
109
import { dirSync } from "tmp-promise";
1110
import { Uri, window as Window, workspace, env, WorkspaceFolder } from "vscode";
@@ -353,10 +352,6 @@ export async function prepareCodeTour(
353352
}
354353
}
355354

356-
/**
357-
* The following functions al heuristically determine metadata about databases.
358-
*/
359-
360355
/**
361356
* Returns the initial contents for an empty query, based on the language of the selected
362357
* databse.
@@ -378,34 +373,6 @@ export function getInitialQueryContents(language: string, dbscheme: string) {
378373
return language ? `import ${language}\n\nselect ""` : 'select ""';
379374
}
380375

381-
/**
382-
* Heuristically determines if the directory passed in corresponds
383-
* to a database root. A database root is a directory that contains
384-
* a codeql-database.yml or (historically) a .dbinfo file. It also
385-
* contains a folder starting with `db-`.
386-
*/
387-
export async function isLikelyDatabaseRoot(maybeRoot: string) {
388-
const [a, b, c] = await Promise.all([
389-
// databases can have either .dbinfo or codeql-database.yml.
390-
pathExists(join(maybeRoot, ".dbinfo")),
391-
pathExists(join(maybeRoot, "codeql-database.yml")),
392-
393-
// they *must* have a db-{language} folder
394-
glob("db-*/", { cwd: maybeRoot }),
395-
]);
396-
397-
return (a || b) && c.length > 0;
398-
}
399-
400-
/**
401-
* A language folder is any folder starting with `db-` that is itself not a database root.
402-
*/
403-
export async function isLikelyDbLanguageFolder(dbPath: string) {
404-
return (
405-
basename(dbPath).startsWith("db-") && !(await isLikelyDatabaseRoot(dbPath))
406-
);
407-
}
408-
409376
export function isQueryLanguage(language: string): language is QueryLanguage {
410377
return Object.values(QueryLanguage).includes(language as QueryLanguage);
411378
}
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
import * as tmp from "tmp";
2+
import { join } from "path";
3+
import { mkdirSync, writeFileSync } from "fs-extra";
4+
import {
5+
isLikelyDatabaseRoot,
6+
isLikelyDbLanguageFolder,
7+
} from "../../../../src/databases/local-databases/db-contents-heuristics";
8+
9+
describe("isLikelyDatabaseRoot", () => {
10+
let dir: tmp.DirResult;
11+
beforeEach(() => {
12+
dir = tmp.dirSync();
13+
});
14+
15+
afterEach(() => {
16+
dir.removeCallback();
17+
});
18+
19+
it("should likely be a database root: codeql-database.yml", async () => {
20+
const dbFolder = join(dir.name, "db");
21+
mkdirSync(dbFolder);
22+
mkdirSync(join(dbFolder, "db-python"));
23+
writeFileSync(join(dbFolder, "codeql-database.yml"), "", "utf8");
24+
25+
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(true);
26+
});
27+
28+
it("should likely be a database root: .dbinfo", async () => {
29+
const dbFolder = join(dir.name, "db");
30+
mkdirSync(dbFolder);
31+
mkdirSync(join(dbFolder, "db-python"));
32+
writeFileSync(join(dbFolder, ".dbinfo"), "", "utf8");
33+
34+
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(true);
35+
});
36+
37+
it("should likely NOT be a database root: empty dir", async () => {
38+
const dbFolder = join(dir.name, "db");
39+
mkdirSync(dbFolder);
40+
mkdirSync(join(dbFolder, "db-python"));
41+
42+
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(false);
43+
});
44+
45+
it("should likely NOT be a database root: no db language folder", async () => {
46+
const dbFolder = join(dir.name, "db");
47+
mkdirSync(dbFolder);
48+
writeFileSync(join(dbFolder, ".dbinfo"), "", "utf8");
49+
50+
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(false);
51+
});
52+
});
53+
54+
describe("isLikelyDbLanguageFolder", () => {
55+
let dir: tmp.DirResult;
56+
beforeEach(() => {
57+
dir = tmp.dirSync();
58+
});
59+
60+
afterEach(() => {
61+
dir.removeCallback();
62+
});
63+
64+
it("should find likely db language folder", async () => {
65+
const dbFolder = join(dir.name, "db-python");
66+
mkdirSync(dbFolder);
67+
mkdirSync(join(dbFolder, "db-python"));
68+
writeFileSync(join(dbFolder, "codeql-database.yml"), "", "utf8");
69+
70+
// not a db folder since there is a db-python folder inside this one
71+
expect(await isLikelyDbLanguageFolder(dbFolder)).toBe(false);
72+
73+
const nestedDbPythonFolder = join(dbFolder, "db-python");
74+
expect(await isLikelyDbLanguageFolder(nestedDbPythonFolder)).toBe(true);
75+
});
76+
});

extensions/ql-vscode/test/vscode-tests/no-workspace/helpers.test.ts

Lines changed: 0 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import * as tmp from "tmp";
44
import { join } from "path";
55
import {
66
writeFileSync,
7-
mkdirSync,
87
ensureDirSync,
98
symlinkSync,
109
writeFile,
@@ -16,8 +15,6 @@ import {
1615
getFirstWorkspaceFolder,
1716
getInitialQueryContents,
1817
isFolderAlreadyInWorkspace,
19-
isLikelyDatabaseRoot,
20-
isLikelyDbLanguageFolder,
2118
prepareCodeTour,
2219
showBinaryChoiceDialog,
2320
showBinaryChoiceWithUrlDialog,
@@ -66,64 +63,6 @@ describe("helpers", () => {
6663
});
6764
});
6865

69-
describe("likely database tests", () => {
70-
let dir: tmp.DirResult;
71-
beforeEach(() => {
72-
dir = tmp.dirSync();
73-
});
74-
75-
afterEach(() => {
76-
dir.removeCallback();
77-
});
78-
79-
it("should likely be a database root: codeql-database.yml", async () => {
80-
const dbFolder = join(dir.name, "db");
81-
mkdirSync(dbFolder);
82-
mkdirSync(join(dbFolder, "db-python"));
83-
writeFileSync(join(dbFolder, "codeql-database.yml"), "", "utf8");
84-
85-
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(true);
86-
});
87-
88-
it("should likely be a database root: .dbinfo", async () => {
89-
const dbFolder = join(dir.name, "db");
90-
mkdirSync(dbFolder);
91-
mkdirSync(join(dbFolder, "db-python"));
92-
writeFileSync(join(dbFolder, ".dbinfo"), "", "utf8");
93-
94-
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(true);
95-
});
96-
97-
it("should likely NOT be a database root: empty dir", async () => {
98-
const dbFolder = join(dir.name, "db");
99-
mkdirSync(dbFolder);
100-
mkdirSync(join(dbFolder, "db-python"));
101-
102-
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(false);
103-
});
104-
105-
it("should likely NOT be a database root: no db language folder", async () => {
106-
const dbFolder = join(dir.name, "db");
107-
mkdirSync(dbFolder);
108-
writeFileSync(join(dbFolder, ".dbinfo"), "", "utf8");
109-
110-
expect(await isLikelyDatabaseRoot(dbFolder)).toBe(false);
111-
});
112-
113-
it("should find likely db language folder", async () => {
114-
const dbFolder = join(dir.name, "db-python");
115-
mkdirSync(dbFolder);
116-
mkdirSync(join(dbFolder, "db-python"));
117-
writeFileSync(join(dbFolder, "codeql-database.yml"), "", "utf8");
118-
119-
// not a db folder since there is a db-python folder inside this one
120-
expect(await isLikelyDbLanguageFolder(dbFolder)).toBe(false);
121-
122-
const nestedDbPythonFolder = join(dbFolder, "db-python");
123-
expect(await isLikelyDbLanguageFolder(nestedDbPythonFolder)).toBe(true);
124-
});
125-
});
126-
12766
it("should report stream progress", () => {
12867
const progressSpy = jest.fn();
12968
const mockReadable = {

0 commit comments

Comments
 (0)