Skip to content

Commit

Permalink
feat: add option to cache all crates (#137)
Browse files Browse the repository at this point in the history
Add cache-all-crates option which allows all crates to be cached instead
of just the dependency crates. This is useful when additional crates are
required for CI tooling.
  • Loading branch information
stevenh authored May 11, 2023
1 parent 827c240 commit def0926
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 17 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,12 @@ sensible defaults.
# default: "false"
cache-on-failure: ""

# Determines which crates are cached.
# If `true` all crates will be cached, otherwise only dependent crates will be cached.
# Useful if additional crates are used for CI tooling.
# default: "false"
cache-all-crates: ""

# Determiners whether the cache should be saved.
# If `false`, the cache is only restored.
# Useful for jobs where the matrix is additive e.g. additional Cargo features.
Expand Down
4 changes: 4 additions & 0 deletions action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,10 @@ inputs:
cache-on-failure:
description: "Cache even if the build fails. Defaults to false."
required: false
cache-all-crates:
description: "Determines which crates are cached. If `true` all crates will be cached, otherwise only dependent crates will be cached."
required: false
default: "false"
save-if:
description: "Determiners whether the cache should be saved. If `false`, the cache is only restored."
required: false
Expand Down
6 changes: 5 additions & 1 deletion dist/restore/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -60234,7 +60234,7 @@ async function cleanBin() {
}
}
}
async function cleanRegistry(packages) {
async function cleanRegistry(packages, crates = true) {
// `.cargo/registry/src`
// we can remove this completely, as cargo will recreate this from `cache`
await rmRF(path.join(CARGO_HOME, "registry", "src"));
Expand All @@ -60252,6 +60252,10 @@ async function cleanRegistry(packages) {
// TODO: else, clean `.cache` based on the `packages`
}
}
if (!crates) {
core.debug(`skipping crate cleanup`);
return;
}
const pkgSet = new Set(packages.map((p) => `${p.name}-${p.version}.crate`));
// `.cargo/registry/cache`
const cacheDir = await fs.promises.opendir(path.join(CARGO_HOME, "registry", "cache"));
Expand Down
21 changes: 13 additions & 8 deletions dist/save/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -60234,7 +60234,7 @@ async function cleanBin() {
}
}
}
async function cleanRegistry(packages) {
async function cleanRegistry(packages, crates = true) {
// `.cargo/registry/src`
// we can remove this completely, as cargo will recreate this from `cache`
await rmRF(external_path_default().join(CARGO_HOME, "registry", "src"));
Expand All @@ -60252,6 +60252,10 @@ async function cleanRegistry(packages) {
// TODO: else, clean `.cache` based on the `packages`
}
}
if (!crates) {
core.debug(`skipping crate cleanup`);
return;
}
const pkgSet = new Set(packages.map((p) => `${p.name}-${p.version}.crate`));
// `.cargo/registry/cache`
const cacheDir = await external_fs_default().promises.opendir(external_path_default().join(CARGO_HOME, "registry", "cache"));
Expand Down Expand Up @@ -60417,29 +60421,30 @@ async function run() {
await cleanTargetDir(workspace.target, packages);
}
catch (e) {
core.info(`[warning] ${e.stack}`);
core.error(`${e.stack}`);
}
}
try {
core.info(`... Cleaning cargo registry ...`);
await cleanRegistry(allPackages);
const creates = core.getInput("cache-all-crates").toLowerCase() || "false";
core.info(`... Cleaning cargo registry cache-all-crates: ${creates} ...`);
await cleanRegistry(allPackages, creates === "true");
}
catch (e) {
core.info(`[warning] ${e.stack}`);
core.error(`${e.stack}`);
}
try {
core.info(`... Cleaning cargo/bin ...`);
await cleanBin();
}
catch (e) {
core.info(`[warning] ${e.stack}`);
core.error(`${e.stack}`);
}
try {
core.info(`... Cleaning cargo git cache ...`);
await cleanGit(allPackages);
}
catch (e) {
core.info(`[warning] ${e.stack}`);
core.error(`${e.stack}`);
}
core.info(`... Saving cache ...`);
// Pass a copy of cachePaths to avoid mutating the original array as reported by:
Expand All @@ -60448,7 +60453,7 @@ async function run() {
await cache.saveCache(config.cachePaths.slice(), config.cacheKey);
}
catch (e) {
core.info(`[warning] ${e.stack}`);
core.error(`${e.stack}`);
}
}
run();
Expand Down
7 changes: 6 additions & 1 deletion src/cleanup.ts
Original file line number Diff line number Diff line change
Expand Up @@ -85,7 +85,7 @@ export async function cleanBin() {
}
}

export async function cleanRegistry(packages: Packages) {
export async function cleanRegistry(packages: Packages, crates = true) {
// `.cargo/registry/src`
// we can remove this completely, as cargo will recreate this from `cache`
await rmRF(path.join(CARGO_HOME, "registry", "src"));
Expand All @@ -106,6 +106,11 @@ export async function cleanRegistry(packages: Packages) {
}
}

if (!crates) {
core.debug(`skipping crate cleanup`);
return;
}

const pkgSet = new Set(packages.map((p) => `${p.name}-${p.version}.crate`));

// `.cargo/registry/cache`
Expand Down
15 changes: 8 additions & 7 deletions src/save.ts
Original file line number Diff line number Diff line change
Expand Up @@ -40,29 +40,30 @@ async function run() {
core.info(`... Cleaning ${workspace.target} ...`);
await cleanTargetDir(workspace.target, packages);
} catch (e) {
core.info(`[warning] ${(e as any).stack}`);
core.error(`${(e as any).stack}`);
}
}

try {
core.info(`... Cleaning cargo registry ...`);
await cleanRegistry(allPackages);
const creates = core.getInput("cache-all-crates").toLowerCase() || "false";
core.info(`... Cleaning cargo registry cache-all-crates: ${creates} ...`);
await cleanRegistry(allPackages, creates === "true");
} catch (e) {
core.info(`[warning] ${(e as any).stack}`);
core.error(`${(e as any).stack}`);
}

try {
core.info(`... Cleaning cargo/bin ...`);
await cleanBin();
} catch (e) {
core.info(`[warning] ${(e as any).stack}`);
core.error(`${(e as any).stack}`);
}

try {
core.info(`... Cleaning cargo git cache ...`);
await cleanGit(allPackages);
} catch (e) {
core.info(`[warning] ${(e as any).stack}`);
core.error(`${(e as any).stack}`);
}

core.info(`... Saving cache ...`);
Expand All @@ -71,7 +72,7 @@ async function run() {
// TODO: remove this once the underlying bug is fixed.
await cache.saveCache(config.cachePaths.slice(), config.cacheKey);
} catch (e) {
core.info(`[warning] ${(e as any).stack}`);
core.error(`${(e as any).stack}`);
}
}

Expand Down

0 comments on commit def0926

Please sign in to comment.