From 6e5b278ead409e28cd5a784014d7ce55007a81d2 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Thu, 6 Aug 2026 08:08:37 +0200 Subject: [PATCH] correctly sort and dedupe Rust versions fixes #369 --- src/config.ts | 34 ++++++++++++++++------------------ 1 file changed, 16 insertions(+), 18 deletions(-) diff --git a/src/config.ts b/src/config.ts index b1010e9..12be670 100644 --- a/src/config.ts +++ b/src/config.ts @@ -102,15 +102,9 @@ export class CacheConfig { // resulting environment hash. let hasher = crypto.createHash("sha1"); - const rustVersions = Array.from(await getRustVersions(cmdFormat)); - // Doesn't matter how they're sorted, just as long as it's deterministic. - rustVersions.sort(); - + const rustVersions = (self.keyRust = await getRustVersions(cmdFormat)); for (const rustVersion of rustVersions) { - const { release, host, "commit-hash": commitHash } = rustVersion; - const keyRust = `${release} ${host} ${commitHash}`; - hasher.update(keyRust); - self.keyRust.push(keyRust); + hasher.update(rustVersion); } // these prefixes should cover most of the compiler / rust / cargo keys @@ -392,14 +386,9 @@ export async function getCargoBins(): Promise> { return bins; } -interface RustVersion { - host: string; - release: string; - "commit-hash": string; -} -async function getRustVersions(cmdFormat: string): Promise> { - const versions = new Set(); +async function getRustVersions(cmdFormat: string): Promise> { + const versions = new Set(); versions.add(parseRustVersion(await getCmdOutput(cmdFormat, "rustc -vV"))); @@ -420,16 +409,25 @@ async function getRustVersions(cmdFormat: string): Promise> { versions.add(parseRustVersion(await getCmdOutput(cmdFormat, `rustup run ${toolchain} rustc -vV`))); } } - return versions; + const rustVersions = Array.from(versions); + // Doesn't matter how they're sorted, just as long as it's deterministic. + rustVersions.sort(); + return rustVersions; } -function parseRustVersion(stdout: string): RustVersion { +interface RustVersion { + host: string; + release: string; + "commit-hash": string; +} +function parseRustVersion(stdout: string): string { const splits = stdout .split(/[\n\r]+/) .filter(Boolean) .map((s) => s.split(":").map((s) => s.trim())) .filter((s) => s.length === 2); - return Object.fromEntries(splits); + const { release, host, "commit-hash": commitHash } = Object.fromEntries(splits) as RustVersion; + return `${release} ${host} ${commitHash}`; } async function globFiles(pattern: string): Promise {