Skip to content

Commit e6f9ce0

Browse files
committed
Extract potentially reusable functions to shared file
1 parent 1005ecd commit e6f9ce0

2 files changed

Lines changed: 48 additions & 20 deletions

File tree

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

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,3 +96,41 @@ export interface VariantAnalysisSubmission {
9696
repositoryOwners?: string[],
9797
}
9898
}
99+
100+
/**
101+
* @param repo
102+
* @returns whether the repo scan is in a completed state, i.e. it cannot normally change state anymore
103+
*/
104+
export function hasRepoScanCompleted(repo: VariantAnalysisScannedRepository): boolean {
105+
return [
106+
// All states that indicates the repository has been scanned and cannot
107+
// change status anymore.
108+
VariantAnalysisRepoStatus.Succeeded, VariantAnalysisRepoStatus.Failed,
109+
VariantAnalysisRepoStatus.Canceled, VariantAnalysisRepoStatus.TimedOut,
110+
].includes(repo.analysisStatus);
111+
}
112+
113+
/**
114+
* @param repos
115+
* @returns the total number of results. Will be `undefined` when there are no repos with results.
116+
*/
117+
export function getTotalResultCount(repos: VariantAnalysisScannedRepository[] | undefined): number | undefined {
118+
const reposWithResultCounts = repos?.filter(repo => repo.resultCount !== undefined);
119+
if (reposWithResultCounts === undefined || reposWithResultCounts.length === 0) {
120+
return undefined;
121+
}
122+
123+
return reposWithResultCounts.reduce((acc, repo) => acc + (repo.resultCount ?? 0), 0);
124+
}
125+
126+
/**
127+
* @param skippedRepos
128+
* @returns the total number of skipped repositories.
129+
*/
130+
export function getSkippedRepoCount(skippedRepos: VariantAnalysisSkippedRepositories | undefined): number {
131+
if (!skippedRepos) {
132+
return 0;
133+
}
134+
135+
return Object.values(skippedRepos).reduce((acc, group) => acc + group.repositoryCount, 0);
136+
}

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

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,11 @@
11
import * as React from 'react';
22
import { useMemo } from 'react';
33
import styled from 'styled-components';
4-
import { VariantAnalysis, VariantAnalysisRepoStatus } from '../../remote-queries/shared/variant-analysis';
4+
import {
5+
getSkippedRepoCount, getTotalResultCount,
6+
hasRepoScanCompleted,
7+
VariantAnalysis,
8+
} from '../../remote-queries/shared/variant-analysis';
59
import { QueryDetails } from './QueryDetails';
610
import { VariantAnalysisActions } from './VariantAnalysisActions';
711
import { VariantAnalysisStats } from './VariantAnalysisStats';
@@ -45,31 +49,17 @@ export const VariantAnalysisHeader = ({
4549
onExportResultsClick,
4650
onViewLogsClick,
4751
}: VariantAnalysisHeaderProps) => {
48-
const totalRepositoryCount = useMemo(() => {
52+
const totalScannedRepositoryCount = useMemo(() => {
4953
return variantAnalysis.scannedRepos?.length ?? 0;
5054
}, [variantAnalysis.scannedRepos]);
5155
const completedRepositoryCount = useMemo(() => {
52-
return variantAnalysis.scannedRepos?.filter(repo => [
53-
// All states that indicates the repository has been scanned and cannot
54-
// change status anymore.
55-
VariantAnalysisRepoStatus.Succeeded, VariantAnalysisRepoStatus.Failed,
56-
VariantAnalysisRepoStatus.Canceled, VariantAnalysisRepoStatus.TimedOut,
57-
].includes(repo.analysisStatus))?.length ?? 0;
56+
return variantAnalysis.scannedRepos?.filter(repo => hasRepoScanCompleted(repo))?.length ?? 0;
5857
}, [variantAnalysis.scannedRepos]);
5958
const resultCount = useMemo(() => {
60-
const reposWithResultCounts = variantAnalysis.scannedRepos?.filter(repo => repo.resultCount !== undefined);
61-
if (reposWithResultCounts === undefined || reposWithResultCounts.length === 0) {
62-
return undefined;
63-
}
64-
65-
return reposWithResultCounts.map(repo => repo.resultCount ?? 0).reduce((a, b) => a + b, 0);
59+
return getTotalResultCount(variantAnalysis.scannedRepos);
6660
}, [variantAnalysis.scannedRepos]);
6761
const hasSkippedRepos = useMemo(() => {
68-
if (!variantAnalysis.skippedRepos) {
69-
return false;
70-
}
71-
72-
return Object.values(variantAnalysis.skippedRepos).some(skippedRepos => skippedRepos.length > 0);
62+
return getSkippedRepoCount(variantAnalysis.skippedRepos) > 0;
7363
}, [variantAnalysis.skippedRepos]);
7464

7565
return (
@@ -90,7 +80,7 @@ export const VariantAnalysisHeader = ({
9080
</Row>
9181
<VariantAnalysisStats
9282
variantAnalysisStatus={variantAnalysis.status}
93-
totalRepositoryCount={totalRepositoryCount}
83+
totalRepositoryCount={totalScannedRepositoryCount}
9484
completedRepositoryCount={completedRepositoryCount}
9585
resultCount={resultCount}
9686
hasWarnings={hasSkippedRepos}

0 commit comments

Comments
 (0)