import * as cache from "@actions/cache"; import * as core from "@actions/core"; import { Events, Inputs, State } from "./constants"; import { IStateProvider, StateProvider } from "./stateProvider"; import * as utils from "./utils/actionUtils"; // Catch and log any unhandled exceptions. These exceptions can leak out of the uploadChunk method in // @actions/toolkit when a failed upload closes the file descriptor causing any in-process reads to // throw an uncaught exception. Instead of failing this action, just warn. process.on("uncaughtException", e => utils.logWarning(e.message)); async function saveImpl(stateProvider: IStateProvider): Promise { try { if (!utils.isCacheFeatureAvailable()) { return; } if (!utils.isValidEvent()) { utils.logWarning( `Event Validation Error: The event type ${ process.env[Events.Key] } is not supported because it's not tied to a branch or tag ref.` ); return; } // If restore has stored a primary key in state, reuse that // Else re-evaluate from inputs const primaryKey = stateProvider.getState(State.CachePrimaryKey) || core.getInput(Inputs.Key); if (!primaryKey) { if (stateProvider instanceof StateProvider) { utils.logWarning(`Error retrieving key from state.`); } else { utils.logWarning(`Error retrieving key from input.`); } return; } // If matched restore key is same as primary key, then do not save cache // NO-OP in case of SaveOnly action const restoredKey = stateProvider.getCacheState() || core.getInput(Inputs.RestoredKey); if (utils.isExactKeyMatch(primaryKey, restoredKey)) { core.info( `Cache hit occurred on the primary key ${primaryKey}, not saving cache.` ); return; } const cachePaths = utils.getInputAsArray(Inputs.Path, { required: true }); const cacheId = await cache.saveCache(cachePaths, primaryKey, { uploadChunkSize: utils.getInputAsInt(Inputs.UploadChunkSize) }); if (cacheId != -1) { core.info(`Cache saved with key: ${primaryKey}`); } } catch (error: unknown) { utils.logWarning((error as Error).message); } } export default saveImpl;