Skip to content

Commit 040c7fc

Browse files
authored
Add support for 'canceling' status for variant analysis (#3405)
1 parent 5f04738 commit 040c7fc

File tree

15 files changed

+152
-6
lines changed

15 files changed

+152
-6
lines changed

extensions/ql-vscode/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## [UNRELEASED]
44

5+
- Update variant analysis view to show when cancelation is in progress. [#3405](https://github.com/github/vscode-codeql/pull/3405)
56
- Remove support for CodeQL CLI versions older than 2.13.5. [#3371](https://github.com/github/vscode-codeql/pull/3371)
67
- Add a timeout to downloading databases and the CodeQL CLI. These can be changed using the `codeQL.addingDatabases.downloadTimeout` and `codeQL.cli.downloadTimeout` settings respectively. [#3373](https://github.com/github/vscode-codeql/pull/3373)
78

extensions/ql-vscode/src/query-history/query-status.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,8 @@ export function variantAnalysisStatusToQueryStatus(
1717
return QueryStatus.Failed;
1818
case VariantAnalysisStatus.InProgress:
1919
return QueryStatus.InProgress;
20+
case VariantAnalysisStatus.Canceling:
21+
return QueryStatus.InProgress;
2022
case VariantAnalysisStatus.Canceled:
2123
return QueryStatus.Completed;
2224
default:

extensions/ql-vscode/src/query-history/store/query-history-variant-analysis-domain-mapper.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,11 @@ function mapVariantAnalysisStatusToDto(
195195
return VariantAnalysisStatusDto.Succeeded;
196196
case VariantAnalysisStatus.Failed:
197197
return VariantAnalysisStatusDto.Failed;
198+
case VariantAnalysisStatus.Canceling:
199+
// The canceling state shouldn't be persisted. We can just
200+
// assume that the analysis is still in progress, since the
201+
// canceling state is very short-lived.
202+
return VariantAnalysisStatusDto.InProgress;
198203
case VariantAnalysisStatus.Canceled:
199204
return VariantAnalysisStatusDto.Canceled;
200205
default:

extensions/ql-vscode/src/stories/variant-analysis/VariantAnalysisActions.stories.tsx

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,3 +70,9 @@ Failed.args = {
7070
...InProgress.args,
7171
variantAnalysisStatus: VariantAnalysisStatus.Failed,
7272
};
73+
74+
export const Canceling = Template.bind({});
75+
Canceling.args = {
76+
...InProgress.args,
77+
variantAnalysisStatus: VariantAnalysisStatus.Canceling,
78+
};

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ export enum VariantAnalysisStatus {
3939
InProgress = "inProgress",
4040
Succeeded = "succeeded",
4141
Failed = "failed",
42+
Canceling = "canceling",
4243
Canceled = "canceled",
4344
}
4445

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

Lines changed: 34 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ import {
3434
isVariantAnalysisComplete,
3535
parseVariantAnalysisQueryLanguage,
3636
VariantAnalysisScannedRepositoryDownloadStatus,
37+
VariantAnalysisStatus,
3738
} from "./shared/variant-analysis";
3839
import { getErrorMessage } from "../common/helpers-pure";
3940
import { VariantAnalysisView } from "./variant-analysis-view";
@@ -145,6 +146,7 @@ export class VariantAnalysisManager
145146
new VariantAnalysisMonitor(
146147
app,
147148
this.shouldCancelMonitorVariantAnalysis.bind(this),
149+
this.getVariantAnalysisStatus.bind(this),
148150
),
149151
);
150152
this.variantAnalysisMonitor.onVariantAnalysisChange(
@@ -604,14 +606,31 @@ export class VariantAnalysisManager
604606
return !this.variantAnalyses.has(variantAnalysisId);
605607
}
606608

609+
private getVariantAnalysisStatus(
610+
variantAnalysisId: number,
611+
): VariantAnalysisStatus {
612+
const variantAnalysis = this.variantAnalyses.get(variantAnalysisId);
613+
if (!variantAnalysis) {
614+
throw new Error(
615+
`No variant analysis found with id: ${variantAnalysisId}.`,
616+
);
617+
}
618+
619+
return variantAnalysis.status;
620+
}
621+
607622
public async onVariantAnalysisUpdated(
608623
variantAnalysis: VariantAnalysis | undefined,
609624
): Promise<void> {
610625
if (!variantAnalysis) {
611626
return;
612627
}
613628

614-
if (!this.variantAnalyses.has(variantAnalysis.id)) {
629+
const originalVariantAnalysis = this.variantAnalyses.get(
630+
variantAnalysis.id,
631+
);
632+
633+
if (!originalVariantAnalysis) {
615634
return;
616635
}
617636

@@ -844,11 +863,24 @@ export class VariantAnalysisManager
844863
);
845864
}
846865

866+
await this.onVariantAnalysisUpdated({
867+
...variantAnalysis,
868+
status: VariantAnalysisStatus.Canceling,
869+
});
870+
847871
void showAndLogInformationMessage(
848872
this.app.logger,
849873
"Cancelling variant analysis. This may take a while.",
850874
);
851-
await cancelVariantAnalysis(this.app.credentials, variantAnalysis);
875+
try {
876+
await cancelVariantAnalysis(this.app.credentials, variantAnalysis);
877+
} catch (e) {
878+
await this.onVariantAnalysisUpdated({
879+
...variantAnalysis,
880+
status: VariantAnalysisStatus.InProgress,
881+
});
882+
throw e;
883+
}
852884
}
853885

854886
public async openVariantAnalysisLogs(variantAnalysisId: number) {

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ export function mapVariantAnalysis(
4040
databases: submission.databases,
4141
executionStartTime: submission.startTime,
4242
},
43+
undefined,
4344
response,
4445
);
4546
}
@@ -49,6 +50,7 @@ export function mapUpdatedVariantAnalysis(
4950
VariantAnalysis,
5051
"language" | "query" | "queries" | "databases" | "executionStartTime"
5152
>,
53+
currentStatus: VariantAnalysisStatus | undefined,
5254
response: ApiVariantAnalysis,
5355
): VariantAnalysis {
5456
let scannedRepos: VariantAnalysisScannedRepository[] = [];
@@ -66,6 +68,13 @@ export function mapUpdatedVariantAnalysis(
6668
);
6769
}
6870

71+
// Maintain the canceling status if we are still canceling.
72+
const status =
73+
currentStatus === VariantAnalysisStatus.Canceling &&
74+
response.status === "in_progress"
75+
? VariantAnalysisStatus.Canceling
76+
: mapApiStatus(response.status);
77+
6978
const variantAnalysis: VariantAnalysis = {
7079
id: response.id,
7180
controllerRepo: {
@@ -80,7 +89,7 @@ export function mapUpdatedVariantAnalysis(
8089
executionStartTime: previousVariantAnalysis.executionStartTime,
8190
createdAt: response.created_at,
8291
updatedAt: response.updated_at,
83-
status: mapApiStatus(response.status),
92+
status,
8493
completedAt: response.completed_at,
8594
actionsWorkflowRunId: response.actions_workflow_run_id,
8695
scannedRepos,

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

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ import { RequestError } from "@octokit/request-error";
55
import type {
66
VariantAnalysis,
77
VariantAnalysisScannedRepository,
8+
VariantAnalysisStatus,
89
} from "./shared/variant-analysis";
910
import {
1011
isFinalVariantAnalysisStatus,
@@ -36,6 +37,9 @@ export class VariantAnalysisMonitor extends DisposableObject {
3637
private readonly shouldCancelMonitor: (
3738
variantAnalysisId: number,
3839
) => Promise<boolean>,
40+
private readonly getVariantAnalysisStatus: (
41+
variantAnalysisId: number,
42+
) => VariantAnalysisStatus,
3943
) {
4044
super();
4145
}
@@ -119,8 +123,13 @@ export class VariantAnalysisMonitor extends DisposableObject {
119123
continue;
120124
}
121125

126+
// Get the current status of the variant analysis as known by the rest
127+
// of the app, because it may have been changed by the user and this code
128+
// may not be aware of it yet.
129+
const currentStatus = this.getVariantAnalysisStatus(variantAnalysis.id);
122130
variantAnalysis = mapUpdatedVariantAnalysis(
123131
variantAnalysis,
132+
currentStatus,
124133
variantAnalysisSummary,
125134
);
126135

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisActions.tsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,11 @@ export const VariantAnalysisActions = ({
103103
Stop query
104104
</Button>
105105
)}
106+
{variantAnalysisStatus === VariantAnalysisStatus.Canceling && (
107+
<Button appearance="secondary" disabled={true}>
108+
Stopping query
109+
</Button>
110+
)}
106111
</Container>
107112
);
108113
};

extensions/ql-vscode/src/view/variant-analysis/VariantAnalysisStats.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,10 @@ export const VariantAnalysisStats = ({
4848
return "Failed";
4949
}
5050

51+
if (variantAnalysisStatus === VariantAnalysisStatus.Canceling) {
52+
return "Canceling";
53+
}
54+
5155
if (variantAnalysisStatus === VariantAnalysisStatus.Canceled) {
5256
return "Stopped";
5357
}

0 commit comments

Comments
 (0)