Skip to content

Commit 681c761

Browse files
committed
Add support for 'canceling' status for variant analysis
1 parent f4a866b commit 681c761

6 files changed

Lines changed: 61 additions & 2 deletions

File tree

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/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: 30 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";
@@ -611,10 +612,22 @@ export class VariantAnalysisManager
611612
return;
612613
}
613614

614-
if (!this.variantAnalyses.has(variantAnalysis.id)) {
615+
const originalVariantAnalysis = this.variantAnalyses.get(
616+
variantAnalysis.id,
617+
);
618+
619+
if (!originalVariantAnalysis) {
615620
return;
616621
}
617622

623+
// Maintain the canceling status if we are still canceling.
624+
if (
625+
originalVariantAnalysis.status === VariantAnalysisStatus.Canceling &&
626+
variantAnalysis.status === VariantAnalysisStatus.InProgress
627+
) {
628+
variantAnalysis.status = VariantAnalysisStatus.Canceling;
629+
}
630+
618631
await this.setVariantAnalysis(variantAnalysis);
619632
this._onVariantAnalysisStatusUpdated.fire(variantAnalysis);
620633
}
@@ -838,6 +851,11 @@ export class VariantAnalysisManager
838851
throw new Error(`No variant analysis with id: ${variantAnalysisId}`);
839852
}
840853

854+
await this.onVariantAnalysisUpdated({
855+
...variantAnalysis,
856+
status: VariantAnalysisStatus.Canceling,
857+
});
858+
841859
if (!variantAnalysis.actionsWorkflowRunId) {
842860
throw new Error(
843861
`No workflow run id for variant analysis with id: ${variantAnalysis.id}`,
@@ -848,7 +866,17 @@ export class VariantAnalysisManager
848866
this.app.logger,
849867
"Cancelling variant analysis. This may take a while.",
850868
);
851-
await cancelVariantAnalysis(this.app.credentials, variantAnalysis);
869+
try {
870+
await cancelVariantAnalysis(this.app.credentials, variantAnalysis);
871+
} catch (e) {
872+
if (variantAnalysis.status === VariantAnalysisStatus.Canceling) {
873+
await this.onVariantAnalysisUpdated({
874+
...variantAnalysis,
875+
status: VariantAnalysisStatus.InProgress,
876+
});
877+
}
878+
throw e;
879+
}
852880
}
853881

854882
public async openVariantAnalysisLogs(variantAnalysisId: number) {

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/__tests__/VariantAnalysisActions.spec.tsx

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,24 @@ describe(VariantAnalysisActions.name, () => {
4545
expect(onStopQueryClick).toHaveBeenCalledTimes(1);
4646
});
4747

48+
it("renders the stopping query disabled button when canceling", async () => {
49+
render({
50+
variantAnalysisStatus: VariantAnalysisStatus.Canceling,
51+
});
52+
53+
const button = screen.getByText("Stopping query");
54+
expect(button).toBeInTheDocument();
55+
expect(button.getElementsByTagName("input")[0]).toBeDisabled();
56+
});
57+
58+
it("does not render a stop query button when canceling", async () => {
59+
render({
60+
variantAnalysisStatus: VariantAnalysisStatus.Canceling,
61+
});
62+
63+
expect(screen.queryByText("Stop query")).not.toBeInTheDocument();
64+
});
65+
4866
it("renders 3 buttons when in progress with results", async () => {
4967
const { container } = render({
5068
variantAnalysisStatus: VariantAnalysisStatus.InProgress,

0 commit comments

Comments
 (0)