From 008623fb834cadde1d7ccee1a26dc84acb660ec3 Mon Sep 17 00:00:00 2001 From: Arpad Borsos Date: Sun, 29 Dec 2024 08:47:45 +0100 Subject: [PATCH] also cache `cargo install` metadata --- dist/restore/index.js | 30 ++++++++++++++++++------------ dist/save/index.js | 26 +++++++++++++++----------- src/cleanup.ts | 6 +++--- src/config.ts | 22 +++++++++++++--------- src/restore.ts | 15 ++++----------- src/workspace.ts | 6 +++--- 6 files changed, 56 insertions(+), 49 deletions(-) diff --git a/dist/restore/index.js b/dist/restore/index.js index 6891ff8..ea98ed1 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -86684,10 +86684,10 @@ class Workspace { return packages; } async getPackagesOutsideWorkspaceRoot() { - return await this.getPackages(pkg => !pkg.manifest_path.startsWith(this.root)); + return await this.getPackages((pkg) => !pkg.manifest_path.startsWith(this.root)); } async getWorkspaceMembers() { - return await this.getPackages(_ => true, "--no-deps"); + return await this.getPackages((_) => true, "--no-deps"); } } @@ -86811,7 +86811,7 @@ class CacheConfig { const root = workspace.root; keyFiles.push(...(await globFiles(`${root}/**/.cargo/config.toml\n${root}/**/rust-toolchain\n${root}/**/rust-toolchain.toml`))); const workspaceMembers = await workspace.getWorkspaceMembers(); - const cargo_manifests = sort_and_uniq(workspaceMembers.map(member => external_path_default().join(member.path, "Cargo.toml"))); + const cargo_manifests = sort_and_uniq(workspaceMembers.map((member) => external_path_default().join(member.path, "Cargo.toml"))); for (const cargo_manifest of cargo_manifests) { try { const content = await promises_default().readFile(cargo_manifest, { encoding: "utf8" }); @@ -86847,7 +86847,8 @@ class CacheConfig { hasher.update(JSON.stringify(parsed)); parsedKeyFiles.push(cargo_manifest); } - catch (e) { // Fallback to caching them as regular file + catch (e) { + // Fallback to caching them as regular file lib_core.warning(`Error parsing Cargo.toml manifest, fallback to caching entire file: ${e}`); keyFiles.push(cargo_manifest); } @@ -86860,7 +86861,7 @@ class CacheConfig { if ((parsed.version !== 3 && parsed.version !== 4) || !("package" in parsed)) { // Fallback to caching them as regular file since this action // can only handle Cargo.lock format version 3 - lib_core.warning('Unsupported Cargo.lock format, fallback to caching entire file'); + lib_core.warning("Unsupported Cargo.lock format, fallback to caching entire file"); keyFiles.push(cargo_lock); continue; } @@ -86870,7 +86871,8 @@ class CacheConfig { hasher.update(JSON.stringify(packages)); parsedKeyFiles.push(cargo_lock); } - catch (e) { // Fallback to caching them as regular file + catch (e) { + // Fallback to caching them as regular file lib_core.warning(`Error parsing Cargo.lock manifest, fallback to caching entire file: ${e}`); keyFiles.push(cargo_lock); } @@ -86887,12 +86889,14 @@ class CacheConfig { self.keyFiles = sort_and_uniq(keyFiles); key += `-${lockHash}`; self.cacheKey = key; - self.cachePaths = [ - external_path_default().join(config_CARGO_HOME, "registry"), - external_path_default().join(config_CARGO_HOME, "git"), - ]; + self.cachePaths = [external_path_default().join(config_CARGO_HOME, "registry"), external_path_default().join(config_CARGO_HOME, "git")]; if (self.cacheBin) { - self.cachePaths = [external_path_default().join(config_CARGO_HOME, "bin"), ...self.cachePaths]; + self.cachePaths = [ + external_path_default().join(config_CARGO_HOME, "bin"), + external_path_default().join(config_CARGO_HOME, ".crates.toml"), + external_path_default().join(config_CARGO_HOME, ".crates2.json"), + ...self.cachePaths, + ]; } const cacheTargets = lib_core.getInput("cache-targets").toLowerCase() || "true"; if (cacheTargets === "true") { @@ -87338,7 +87342,9 @@ async function run() { // Pass a copy of cachePaths to avoid mutating the original array as reported by: // https://github.com/actions/toolkit/pull/1378 // TODO: remove this once the underlying bug is fixed. - const restoreKey = await cacheProvider.cache.restoreCache(config.cachePaths.slice(), key, [config.restoreKey], { lookupOnly }); + const restoreKey = await cacheProvider.cache.restoreCache(config.cachePaths.slice(), key, [config.restoreKey], { + lookupOnly, + }); if (restoreKey) { const match = restoreKey === key; lib_core.info(`${lookupOnly ? "Found" : "Restored from"} cache key "${restoreKey}" full match: ${match}.`); diff --git a/dist/save/index.js b/dist/save/index.js index 4982394..ea2ddfb 100644 --- a/dist/save/index.js +++ b/dist/save/index.js @@ -86684,10 +86684,10 @@ class Workspace { return packages; } async getPackagesOutsideWorkspaceRoot() { - return await this.getPackages(pkg => !pkg.manifest_path.startsWith(this.root)); + return await this.getPackages((pkg) => !pkg.manifest_path.startsWith(this.root)); } async getWorkspaceMembers() { - return await this.getPackages(_ => true, "--no-deps"); + return await this.getPackages((_) => true, "--no-deps"); } } @@ -86811,7 +86811,7 @@ class CacheConfig { const root = workspace.root; keyFiles.push(...(await globFiles(`${root}/**/.cargo/config.toml\n${root}/**/rust-toolchain\n${root}/**/rust-toolchain.toml`))); const workspaceMembers = await workspace.getWorkspaceMembers(); - const cargo_manifests = sort_and_uniq(workspaceMembers.map(member => external_path_default().join(member.path, "Cargo.toml"))); + const cargo_manifests = sort_and_uniq(workspaceMembers.map((member) => external_path_default().join(member.path, "Cargo.toml"))); for (const cargo_manifest of cargo_manifests) { try { const content = await promises_default().readFile(cargo_manifest, { encoding: "utf8" }); @@ -86847,7 +86847,8 @@ class CacheConfig { hasher.update(JSON.stringify(parsed)); parsedKeyFiles.push(cargo_manifest); } - catch (e) { // Fallback to caching them as regular file + catch (e) { + // Fallback to caching them as regular file core.warning(`Error parsing Cargo.toml manifest, fallback to caching entire file: ${e}`); keyFiles.push(cargo_manifest); } @@ -86860,7 +86861,7 @@ class CacheConfig { if ((parsed.version !== 3 && parsed.version !== 4) || !("package" in parsed)) { // Fallback to caching them as regular file since this action // can only handle Cargo.lock format version 3 - core.warning('Unsupported Cargo.lock format, fallback to caching entire file'); + core.warning("Unsupported Cargo.lock format, fallback to caching entire file"); keyFiles.push(cargo_lock); continue; } @@ -86870,7 +86871,8 @@ class CacheConfig { hasher.update(JSON.stringify(packages)); parsedKeyFiles.push(cargo_lock); } - catch (e) { // Fallback to caching them as regular file + catch (e) { + // Fallback to caching them as regular file core.warning(`Error parsing Cargo.lock manifest, fallback to caching entire file: ${e}`); keyFiles.push(cargo_lock); } @@ -86887,12 +86889,14 @@ class CacheConfig { self.keyFiles = sort_and_uniq(keyFiles); key += `-${lockHash}`; self.cacheKey = key; - self.cachePaths = [ - external_path_default().join(CARGO_HOME, "registry"), - external_path_default().join(CARGO_HOME, "git"), - ]; + self.cachePaths = [external_path_default().join(CARGO_HOME, "registry"), external_path_default().join(CARGO_HOME, "git")]; if (self.cacheBin) { - self.cachePaths = [external_path_default().join(CARGO_HOME, "bin"), ...self.cachePaths]; + self.cachePaths = [ + external_path_default().join(CARGO_HOME, "bin"), + external_path_default().join(CARGO_HOME, ".crates.toml"), + external_path_default().join(CARGO_HOME, ".crates2.json"), + ...self.cachePaths, + ]; } const cacheTargets = core.getInput("cache-targets").toLowerCase() || "true"; if (cacheTargets === "true") { diff --git a/src/cleanup.ts b/src/cleanup.ts index 56fe9b4..d84a9d5 100644 --- a/src/cleanup.ts +++ b/src/cleanup.ts @@ -43,16 +43,16 @@ async function cleanProfileTarget(profileDir: string, packages: Packages, checkT // https://github.com/vertexclique/kaos/blob/9876f6c890339741cc5be4b7cb9df72baa5a6d79/src/cargo.rs#L25 // https://github.com/eupn/macrotest/blob/c4151a5f9f545942f4971980b5d264ebcd0b1d11/src/cargo.rs#L27 cleanTargetDir(path.join(profileDir, "target"), packages, checkTimestamp); - } catch { } + } catch {} try { // https://github.com/dtolnay/trybuild/blob/eec8ca6cb9b8f53d0caf1aa499d99df52cae8b40/src/cargo.rs#L50 cleanTargetDir(path.join(profileDir, "trybuild"), packages, checkTimestamp); - } catch { } + } catch {} // Delete everything else. await rmExcept(profileDir, new Set(["target", "trybuild"]), checkTimestamp); - return + return; } let keepProfile = new Set(["build", ".fingerprint", "deps"]); diff --git a/src/config.ts b/src/config.ts index 2d33be7..5104f5c 100644 --- a/src/config.ts +++ b/src/config.ts @@ -153,7 +153,7 @@ export class CacheConfig { const workspaceMembers = await workspace.getWorkspaceMembers(); - const cargo_manifests = sort_and_uniq(workspaceMembers.map(member => path.join(member.path, "Cargo.toml"))); + const cargo_manifests = sort_and_uniq(workspaceMembers.map((member) => path.join(member.path, "Cargo.toml"))); for (const cargo_manifest of cargo_manifests) { try { @@ -194,7 +194,8 @@ export class CacheConfig { hasher.update(JSON.stringify(parsed)); parsedKeyFiles.push(cargo_manifest); - } catch (e) { // Fallback to caching them as regular file + } catch (e) { + // Fallback to caching them as regular file core.warning(`Error parsing Cargo.toml manifest, fallback to caching entire file: ${e}`); keyFiles.push(cargo_manifest); } @@ -209,7 +210,7 @@ export class CacheConfig { if ((parsed.version !== 3 && parsed.version !== 4) || !("package" in parsed)) { // Fallback to caching them as regular file since this action // can only handle Cargo.lock format version 3 - core.warning('Unsupported Cargo.lock format, fallback to caching entire file'); + core.warning("Unsupported Cargo.lock format, fallback to caching entire file"); keyFiles.push(cargo_lock); continue; } @@ -221,7 +222,8 @@ export class CacheConfig { hasher.update(JSON.stringify(packages)); parsedKeyFiles.push(cargo_lock); - } catch (e) { // Fallback to caching them as regular file + } catch (e) { + // Fallback to caching them as regular file core.warning(`Error parsing Cargo.lock manifest, fallback to caching entire file: ${e}`); keyFiles.push(cargo_lock); } @@ -243,12 +245,14 @@ export class CacheConfig { key += `-${lockHash}`; self.cacheKey = key; - self.cachePaths = [ - path.join(CARGO_HOME, "registry"), - path.join(CARGO_HOME, "git"), - ]; + self.cachePaths = [path.join(CARGO_HOME, "registry"), path.join(CARGO_HOME, "git")]; if (self.cacheBin) { - self.cachePaths = [path.join(CARGO_HOME, "bin"), ...self.cachePaths]; + self.cachePaths = [ + path.join(CARGO_HOME, "bin"), + path.join(CARGO_HOME, ".crates.toml"), + path.join(CARGO_HOME, ".crates2.json"), + ...self.cachePaths, + ]; } const cacheTargets = core.getInput("cache-targets").toLowerCase() || "true"; if (cacheTargets === "true") { diff --git a/src/restore.ts b/src/restore.ts index 289c00d..21af56f 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -38,19 +38,12 @@ async function run() { // Pass a copy of cachePaths to avoid mutating the original array as reported by: // https://github.com/actions/toolkit/pull/1378 // TODO: remove this once the underlying bug is fixed. - const restoreKey = await cacheProvider.cache.restoreCache( - config.cachePaths.slice(), - key, - [config.restoreKey], - { lookupOnly } - ); + const restoreKey = await cacheProvider.cache.restoreCache(config.cachePaths.slice(), key, [config.restoreKey], { + lookupOnly, + }); if (restoreKey) { const match = restoreKey === key; - core.info( - `${ - lookupOnly ? "Found" : "Restored from" - } cache key "${restoreKey}" full match: ${match}.` - ); + core.info(`${lookupOnly ? "Found" : "Restored from"} cache key "${restoreKey}" full match: ${match}.`); if (!match) { // pre-clean the target directory on cache mismatch for (const workspace of config.workspaces) { diff --git a/src/workspace.ts b/src/workspace.ts index dec38e4..e8fa93a 100644 --- a/src/workspace.ts +++ b/src/workspace.ts @@ -8,7 +8,7 @@ const SAVE_TARGETS = new Set(["lib", "proc-macro"]); export class Workspace { constructor(public root: string, public target: string) {} - async getPackages(filter: ((p: Meta['packages'][0]) => boolean), ...extraArgs: string[]): Promise { + async getPackages(filter: (p: Meta["packages"][0]) => boolean, ...extraArgs: string[]): Promise { let packages: Packages = []; try { core.debug(`collecting metadata for "${this.root}"`); @@ -29,11 +29,11 @@ export class Workspace { } public async getPackagesOutsideWorkspaceRoot(): Promise { - return await this.getPackages(pkg => !pkg.manifest_path.startsWith(this.root)); + return await this.getPackages((pkg) => !pkg.manifest_path.startsWith(this.root)); } public async getWorkspaceMembers(): Promise { - return await this.getPackages(_ => true, "--no-deps"); + return await this.getPackages((_) => true, "--no-deps"); } }