diff --git a/CHANGELOG.md b/CHANGELOG.md index 65b9e9c..005970e 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,5 +1,11 @@ # Changelog +## 1.1.0 + +- Add a new `working-directory` input. +- Support caching git dependencies. +- Lots of other improvements. + ## 1.0.2 - Don’t prune targets that have a different name from the crate, but do prune targets from the workspace. diff --git a/README.md b/README.md index acd802d..9d8c7a1 100644 --- a/README.md +++ b/README.md @@ -6,10 +6,26 @@ sensible defaults. ## Example usage ```yaml +# selecting a toolchain either by action or manual `rustup` calls should happen +# before the plugin, as it uses the current rustc version as its cache key +- uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + - uses: Swatinem/rust-cache@v1 ``` -### Cache Details +## Inputs + +: `key` +An optional key that is added to the automatic cache key. + +: `working-directory` +The working directory the action operates in, is case the cargo project is not +located in the repo root. + +## Cache Details The cache currently caches the following directories: diff --git a/action.yml b/action.yml index 0abc7cc..fe29ead 100644 --- a/action.yml +++ b/action.yml @@ -5,6 +5,9 @@ inputs: key: description: "An additional key for the cache" required: false + working-directory: + description: "The working directory this action should operate in" + required: false runs: using: "node12" main: "dist/restore/index.js" diff --git a/src/common.ts b/src/common.ts index c887853..5ba5c80 100644 --- a/src/common.ts +++ b/src/common.ts @@ -11,6 +11,11 @@ process.on("uncaughtException", (e) => { core.info(`[warning] ${e.message}`); }); +const cwd = core.getInput("working-directory"); +if (cwd) { + process.chdir(cwd); +} + export const stateKey = "RUST_CACHE_KEY"; const stateHash = "RUST_CACHE_HASH"; @@ -196,11 +201,13 @@ export async function rmExcept(dirName: string, keepPrefix: Set) { } export async function rm(parent: string, dirent: fs.Dirent) { - const fileName = path.join(parent, dirent.name); - core.debug(`deleting "${fileName}"`); - if (dirent.isFile()) { - await fs.promises.unlink(fileName); - } else if (dirent.isDirectory()) { - await io.rmRF(fileName); - } + try { + const fileName = path.join(parent, dirent.name); + core.debug(`deleting "${fileName}"`); + if (dirent.isFile()) { + await fs.promises.unlink(fileName); + } else if (dirent.isDirectory()) { + await io.rmRF(fileName); + } + } catch {} } diff --git a/src/restore.ts b/src/restore.ts index 16d7cb8..b1dfdf4 100644 --- a/src/restore.ts +++ b/src/restore.ts @@ -1,42 +1,28 @@ import * as cache from "@actions/cache"; import * as core from "@actions/core"; -import { cleanTarget, getCacheConfig, getPackages, isValidEvent, stateKey } from "./common"; +import { cleanTarget, getCacheConfig, getPackages, stateKey } from "./common"; async function run() { - if (!isValidEvent()) { - return; - } - try { core.exportVariable("CARGO_INCREMENTAL", 0); - const start = Date.now(); const { paths, key, restoreKeys } = await getCacheConfig(); core.info(`Restoring paths:\n ${paths.join("\n ")}`); core.info(`Using keys:\n ${[key, ...restoreKeys].join("\n ")}`); - try { - const restoreKey = await cache.restoreCache(paths, key, restoreKeys); - if (restoreKey) { - core.info(`Restored from cache key "${restoreKey}".`); - core.saveState(stateKey, restoreKey); + const restoreKey = await cache.restoreCache(paths, key, restoreKeys); + if (restoreKey) { + core.info(`Restored from cache key "${restoreKey}".`); + core.saveState(stateKey, restoreKey); - if (restoreKey !== key) { - // pre-clean the target directory on cache mismatch - const packages = await getPackages(); + if (restoreKey !== key) { + // pre-clean the target directory on cache mismatch + const packages = await getPackages(); - await cleanTarget(packages); - } - } else { - core.info("No cache found."); + await cleanTarget(packages); } - } catch (e) { - core.info(`[warning] ${e.message}`); - } - - const duration = Math.round((Date.now() - start) / 1000); - if (duration) { - core.info(`Took ${duration}s.`); + } else { + core.info("No cache found."); } } catch (e) { core.info(`[warning] ${e.message}`); diff --git a/src/save.ts b/src/save.ts index 0d1968c..a351e16 100644 --- a/src/save.ts +++ b/src/save.ts @@ -5,15 +5,10 @@ import * as glob from "@actions/glob"; import * as io from "@actions/io"; import fs from "fs"; import path from "path"; -import { cleanTarget, getCacheConfig, getPackages, isValidEvent, Packages, paths, rm, stateKey } from "./common"; +import { cleanTarget, getCacheConfig, getPackages, Packages, paths, rm, stateKey } from "./common"; async function run() { - if (!isValidEvent()) { - return; - } - try { - const start = Date.now(); const { paths: savePaths, key } = await getCacheConfig(); if (core.getState(stateKey) === key) { @@ -41,16 +36,7 @@ async function run() { core.info(`Saving paths:\n ${savePaths.join("\n ")}`); core.info(`Using key "${key}".`); - try { - await cache.saveCache(savePaths, key); - } catch (e) { - core.info(`[warning] ${e.message}`); - } - - const duration = Math.round((Date.now() - start) / 1000); - if (duration) { - core.info(`Took ${duration}s.`); - } + await cache.saveCache(savePaths, key); } catch (e) { core.info(`[warning] ${e.message}`); }