Fix Gist title in result export

The Gist title in the result export didn't take into account the actual
number of exported repositories, it only used the scanned, unfiltered,
repositories in the variant analysis. This switches it to use the actual
exported repositories for determining the result and repository counts.

This is somewhat more complicated than we'd expect it to be since the
results are being read in async, so we need to switch the order of
operations and store some additional information for being able to
compute this information. However, this also makes the code somewhat
easier to understand since the summary file is now being created in only
1 location, rather than being split between a method and a for-loop.
This commit is contained in:
Koen Vlaswinkel
2022-12-01 12:14:35 +01:00
parent 386e9bb865
commit 6a431b0719
2 changed files with 56 additions and 25 deletions

View File

@@ -20,6 +20,7 @@ import {
generateMarkdown, generateMarkdown,
generateVariantAnalysisMarkdown, generateVariantAnalysisMarkdown,
MarkdownFile, MarkdownFile,
RepositorySummary,
} from "./remote-queries-markdown-generation"; } from "./remote-queries-markdown-generation";
import { RemoteQuery } from "./remote-query"; import { RemoteQuery } from "./remote-query";
import { AnalysisResults, sumAnalysesResults } from "./shared/analysis-result"; import { AnalysisResults, sumAnalysesResults } from "./shared/analysis-result";
@@ -235,11 +236,14 @@ export async function exportVariantAnalysisAnalysisResults(
>, >,
exportFormat: "gist" | "local", exportFormat: "gist" | "local",
) { ) {
const description = buildVariantAnalysisGistDescription(variantAnalysis); const { markdownFiles, summaries } = await generateVariantAnalysisMarkdown(
const markdownFiles = await generateVariantAnalysisMarkdown(
variantAnalysis, variantAnalysis,
analysesResults, analysesResults,
"gist", exportFormat,
);
const description = buildVariantAnalysisGistDescription(
variantAnalysis,
summaries,
); );
await exportResults( await exportResults(
@@ -345,20 +349,16 @@ const buildGistDescription = (
*/ */
const buildVariantAnalysisGistDescription = ( const buildVariantAnalysisGistDescription = (
variantAnalysis: VariantAnalysis, variantAnalysis: VariantAnalysis,
summaries: RepositorySummary[],
) => { ) => {
const resultCount = const resultCount = summaries.reduce(
variantAnalysis.scannedRepos?.reduce( (acc, summary) => acc + (summary.resultCount ?? 0),
(acc, item) => acc + (item.resultCount ?? 0), 0,
0, );
) ?? 0;
const resultLabel = pluralize(resultCount, "result", "results"); const resultLabel = pluralize(resultCount, "result", "results");
const repositoryLabel = variantAnalysis.scannedRepos?.length const repositoryLabel = summaries.length
? `(${pluralize( ? `(${pluralize(summaries.length, "repository", "repositories")})`
variantAnalysis.scannedRepos.length,
"repository",
"repositories",
)})`
: ""; : "";
return `${variantAnalysis.query.name} (${variantAnalysis.query.language}) ${resultLabel} ${repositoryLabel}`; return `${variantAnalysis.query.name} (${variantAnalysis.query.language}) ${resultLabel} ${repositoryLabel}`;
}; };

View File

@@ -18,6 +18,7 @@ import {
VariantAnalysisScannedRepository, VariantAnalysisScannedRepository,
VariantAnalysisScannedRepositoryResult, VariantAnalysisScannedRepositoryResult,
} from "./shared/variant-analysis"; } from "./shared/variant-analysis";
import { RepositoryWithMetadata } from "./shared/repository";
export type MarkdownLinkType = "local" | "gist"; export type MarkdownLinkType = "local" | "gist";
@@ -74,6 +75,17 @@ export function generateMarkdown(
return [summaryFile, ...resultsFiles]; return [summaryFile, ...resultsFiles];
} }
export interface RepositorySummary {
fileName: string;
repository: RepositoryWithMetadata;
resultCount: number;
}
export interface VariantAnalysisMarkdown {
markdownFiles: MarkdownFile[];
summaries: RepositorySummary[];
}
/** /**
* Generates markdown files with variant analysis results. * Generates markdown files with variant analysis results.
*/ */
@@ -83,23 +95,22 @@ export async function generateVariantAnalysisMarkdown(
[VariantAnalysisScannedRepository, VariantAnalysisScannedRepositoryResult] [VariantAnalysisScannedRepository, VariantAnalysisScannedRepositoryResult]
>, >,
linkType: MarkdownLinkType, linkType: MarkdownLinkType,
): Promise<MarkdownFile[]> { ): Promise<VariantAnalysisMarkdown> {
const resultsFiles: MarkdownFile[] = []; const resultsFiles: MarkdownFile[] = [];
// Generate summary file with links to individual files const summaries: RepositorySummary[] = [];
const summaryFile: MarkdownFile =
generateVariantAnalysisMarkdownSummary(variantAnalysis);
for await (const [scannedRepo, result] of results) { for await (const [scannedRepo, result] of results) {
if (scannedRepo.resultCount === 0) { if (!scannedRepo.resultCount || scannedRepo.resultCount === 0) {
continue; continue;
} }
// Append nwo and results count to the summary table // Append nwo and results count to the summary table
const fullName = scannedRepo.repository.fullName; const fullName = scannedRepo.repository.fullName;
const fileName = createFileName(fullName); const fileName = createFileName(fullName);
const link = createRelativeLink(fileName, linkType); summaries.push({
summaryFile.content.push( fileName,
`| ${fullName} | [${scannedRepo.resultCount} result(s)](${link}) |`, repository: scannedRepo.repository,
); resultCount: scannedRepo.resultCount,
});
// Generate individual markdown file for each repository // Generate individual markdown file for each repository
const resultsFileContent = [`### ${scannedRepo.repository.fullName}`, ""]; const resultsFileContent = [`### ${scannedRepo.repository.fullName}`, ""];
@@ -121,7 +132,18 @@ export async function generateVariantAnalysisMarkdown(
content: resultsFileContent, content: resultsFileContent,
}); });
} }
return [summaryFile, ...resultsFiles];
// Generate summary file with links to individual files
const summaryFile: MarkdownFile = generateVariantAnalysisMarkdownSummary(
variantAnalysis,
summaries,
linkType,
);
return {
markdownFiles: [summaryFile, ...resultsFiles],
summaries,
};
} }
export function generateMarkdownSummary(query: RemoteQuery): MarkdownFile { export function generateMarkdownSummary(query: RemoteQuery): MarkdownFile {
@@ -147,6 +169,8 @@ export function generateMarkdownSummary(query: RemoteQuery): MarkdownFile {
export function generateVariantAnalysisMarkdownSummary( export function generateVariantAnalysisMarkdownSummary(
variantAnalysis: VariantAnalysis, variantAnalysis: VariantAnalysis,
summaries: RepositorySummary[],
linkType: MarkdownLinkType,
): MarkdownFile { ): MarkdownFile {
const lines: string[] = []; const lines: string[] = [];
// Title // Title
@@ -165,7 +189,14 @@ export function generateVariantAnalysisMarkdownSummary(
// Summary table // Summary table
lines.push("### Summary", "", "| Repository | Results |", "| --- | --- |"); lines.push("### Summary", "", "| Repository | Results |", "| --- | --- |");
// nwo and result count will be appended to this table
for (const summary of summaries) {
// Append nwo and results count to the summary table
const fullName = summary.repository.fullName;
const link = createRelativeLink(summary.fileName, linkType);
lines.push(`| ${fullName} | [${summary.resultCount} result(s)](${link}) |`);
}
return { return {
fileName: "_summary", fileName: "_summary",
content: lines, content: lines,