Skip to content

Commit 15a9093

Browse files
authored
Merge pull request #2270 from github/nora/model-repo-states
Repo States: new data model and mapping
2 parents 3628f4b + 1595d6f commit 15a9093

File tree

6 files changed

+138
-20
lines changed

6 files changed

+138
-20
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
export interface VariantAnalysisScannedRepositoryStateData {
2+
repositoryId: number;
3+
downloadStatus: VariantAnalysisScannedRepositoryDownloadData;
4+
downloadPercentage?: number;
5+
}
6+
7+
export enum VariantAnalysisScannedRepositoryDownloadData {
8+
Pending = "pending",
9+
InProgress = "inProgress",
10+
Succeeded = "succeeded",
11+
Failed = "failed",
12+
}
Lines changed: 31 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,44 @@
11
import { outputJson, readJson } from "fs-extra";
22
import { VariantAnalysisScannedRepositoryState } from "../shared/variant-analysis";
3+
import { VariantAnalysisScannedRepositoryStateData } from "./repo-states-data-types";
4+
import { mapRepoStateToData } from "./repo-states-to-data-mapper";
5+
import { mapRepoStateToDomain } from "./repo-states-to-domain-mapper";
36

47
export const REPO_STATES_FILENAME = "repo_states.json";
58

69
export async function writeRepoStates(
710
storagePath: string,
8-
repoStates: Record<number, VariantAnalysisScannedRepositoryState> | undefined,
11+
repoStates: Record<number, VariantAnalysisScannedRepositoryState>,
912
): Promise<void> {
10-
return await outputJson(storagePath, repoStates);
13+
// Map from repoStates Domain type to the repoStates Data type
14+
const repoStatesData = Object.fromEntries(
15+
Object.entries(repoStates).map(([key, value]) => {
16+
return [key, mapRepoStateToData(value)];
17+
}),
18+
);
19+
20+
return await outputJson(storagePath, repoStatesData);
1121
}
1222

1323
export async function readRepoStates(
1424
storagePath: string,
15-
): Promise<Record<number, VariantAnalysisScannedRepositoryState>> {
16-
return await readJson(storagePath);
25+
): Promise<Record<number, VariantAnalysisScannedRepositoryState> | undefined> {
26+
try {
27+
const repoStatesData: Record<
28+
number,
29+
VariantAnalysisScannedRepositoryStateData
30+
> = await readJson(storagePath);
31+
32+
// Map from repoStates Data type to the repoStates Domain type
33+
const repoStates = Object.fromEntries(
34+
Object.entries(repoStatesData).map(([key, value]) => {
35+
return [key, mapRepoStateToDomain(value)];
36+
}),
37+
);
38+
39+
return repoStates;
40+
} catch (e) {
41+
// Ignore this error, we simply might not have downloaded anything yet
42+
return undefined;
43+
}
1744
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { assertNever } from "../../pure/helpers-pure";
2+
import {
3+
VariantAnalysisScannedRepositoryDownloadStatus,
4+
VariantAnalysisScannedRepositoryState,
5+
} from "../shared/variant-analysis";
6+
import {
7+
VariantAnalysisScannedRepositoryDownloadData,
8+
VariantAnalysisScannedRepositoryStateData,
9+
} from "./repo-states-data-types";
10+
11+
export function mapRepoStateToData(
12+
repoState: VariantAnalysisScannedRepositoryState,
13+
): VariantAnalysisScannedRepositoryStateData {
14+
return {
15+
repositoryId: repoState.repositoryId,
16+
downloadStatus: processDownloadStatus(repoState.downloadStatus),
17+
downloadPercentage: repoState.downloadPercentage,
18+
};
19+
}
20+
21+
function processDownloadStatus(
22+
downloadedStatus: VariantAnalysisScannedRepositoryDownloadStatus,
23+
) {
24+
switch (downloadedStatus) {
25+
case VariantAnalysisScannedRepositoryDownloadStatus.Pending:
26+
return VariantAnalysisScannedRepositoryDownloadData.Pending;
27+
case VariantAnalysisScannedRepositoryDownloadStatus.InProgress:
28+
return VariantAnalysisScannedRepositoryDownloadData.InProgress;
29+
case VariantAnalysisScannedRepositoryDownloadStatus.Succeeded:
30+
return VariantAnalysisScannedRepositoryDownloadData.Succeeded;
31+
case VariantAnalysisScannedRepositoryDownloadStatus.Failed:
32+
return VariantAnalysisScannedRepositoryDownloadData.Failed;
33+
default:
34+
assertNever(downloadedStatus);
35+
}
36+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
import { assertNever } from "../../pure/helpers-pure";
2+
import {
3+
VariantAnalysisScannedRepositoryState,
4+
VariantAnalysisScannedRepositoryDownloadStatus,
5+
} from "../shared/variant-analysis";
6+
import {
7+
VariantAnalysisScannedRepositoryStateData,
8+
VariantAnalysisScannedRepositoryDownloadData,
9+
} from "./repo-states-data-types";
10+
11+
export function mapRepoStateToDomain(
12+
repoState: VariantAnalysisScannedRepositoryStateData,
13+
): VariantAnalysisScannedRepositoryState {
14+
return {
15+
repositoryId: repoState.repositoryId,
16+
downloadStatus: processDownloadStatus(repoState.downloadStatus),
17+
downloadPercentage: repoState.downloadPercentage,
18+
};
19+
}
20+
21+
function processDownloadStatus(
22+
downloadedStatus: VariantAnalysisScannedRepositoryDownloadData,
23+
) {
24+
switch (downloadedStatus) {
25+
case VariantAnalysisScannedRepositoryDownloadData.Pending:
26+
return VariantAnalysisScannedRepositoryDownloadStatus.Pending;
27+
case VariantAnalysisScannedRepositoryDownloadData.InProgress:
28+
return VariantAnalysisScannedRepositoryDownloadStatus.InProgress;
29+
case VariantAnalysisScannedRepositoryDownloadData.Succeeded:
30+
return VariantAnalysisScannedRepositoryDownloadStatus.Succeeded;
31+
case VariantAnalysisScannedRepositoryDownloadData.Failed:
32+
return VariantAnalysisScannedRepositoryDownloadStatus.Failed;
33+
default:
34+
assertNever(downloadedStatus);
35+
}
36+
}

extensions/ql-vscode/src/variant-analysis/variant-analysis-manager.ts

Lines changed: 12 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -264,15 +264,11 @@ export class VariantAnalysisManager
264264
} else {
265265
await this.setVariantAnalysis(variantAnalysis);
266266

267-
try {
268-
const repoStates = await readRepoStates(
269-
this.getRepoStatesStoragePath(variantAnalysis.id),
270-
);
271-
this.repoStates.set(variantAnalysis.id, repoStates);
272-
} catch (e) {
273-
// Ignore this error, we simply might not have downloaded anything yet
274-
this.repoStates.set(variantAnalysis.id, {});
275-
}
267+
const repoStatesFromDisk = await readRepoStates(
268+
this.getRepoStatesStoragePath(variantAnalysis.id),
269+
);
270+
271+
this.repoStates.set(variantAnalysis.id, repoStatesFromDisk || {});
276272

277273
if (
278274
!(await isVariantAnalysisComplete(
@@ -598,10 +594,13 @@ export class VariantAnalysisManager
598594
VariantAnalysisScannedRepositoryDownloadStatus.Succeeded;
599595
await this.onRepoStateUpdated(variantAnalysis.id, repoState);
600596

601-
await writeRepoStates(
602-
this.getRepoStatesStoragePath(variantAnalysis.id),
603-
this.repoStates.get(variantAnalysis.id),
604-
);
597+
const repoStates = this.repoStates.get(variantAnalysis.id);
598+
if (repoStates) {
599+
await writeRepoStates(
600+
this.getRepoStatesStoragePath(variantAnalysis.id),
601+
repoStates,
602+
);
603+
}
605604
}
606605

607606
public async enqueueDownload(

extensions/ql-vscode/test/vscode-tests/activated-extension/variant-analysis/variant-analysis-manager.test.ts

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,10 @@ import { App } from "../../../../src/common/app";
4545
import { ExtensionApp } from "../../../../src/common/vscode/vscode-app";
4646
import { DbConfigStore } from "../../../../src/databases/config/db-config-store";
4747
import { mockedObject } from "../../utils/mocking.helpers";
48+
import {
49+
REPO_STATES_FILENAME,
50+
writeRepoStates,
51+
} from "../../../../src/variant-analysis/store/repo-states-store";
4852

4953
// up to 3 minutes per test
5054
jest.setTimeout(3 * 60 * 1000);
@@ -119,8 +123,12 @@ describe("Variant Analysis Manager", () => {
119123
});
120124

121125
it("should read in the repo states if it exists", async () => {
122-
await fs.writeJson(
123-
join(storagePath, variantAnalysis.id.toString(), "repo_states.json"),
126+
await writeRepoStates(
127+
join(
128+
storagePath,
129+
variantAnalysis.id.toString(),
130+
REPO_STATES_FILENAME,
131+
),
124132
{
125133
[scannedRepos[0].repository.id]: {
126134
repositoryId: scannedRepos[0].repository.id,
@@ -177,7 +185,7 @@ describe("Variant Analysis Manager", () => {
177185
repoStatesPath = join(
178186
storagePath,
179187
variantAnalysis.id.toString(),
180-
"repo_states.json",
188+
REPO_STATES_FILENAME,
181189
);
182190
});
183191

0 commit comments

Comments
 (0)