diff --git a/__tests__/save.test.ts b/__tests__/save.test.ts index 943a2bd..ab78d77 100644 --- a/__tests__/save.test.ts +++ b/__tests__/save.test.ts @@ -118,6 +118,44 @@ test("save with exact match returns early", async () => { expect(failedMock).toHaveBeenCalledTimes(0); }); +test("save with exact match and updates enabled updates the cache", async () => { + const infoMock = jest.spyOn(core, "info"); + const failedMock = jest.spyOn(core, "setFailed"); + + const primaryKey = "Linux-node-bb828da54c148048dd17899ba9fda624811cfb43"; + const savedCacheKey = primaryKey; + + jest.spyOn(core, "getState") + // Cache Entry State + .mockImplementationOnce(() => { + return savedCacheKey; + }) + // Cache Key State + .mockImplementationOnce(() => { + return primaryKey; + }); + + const inputPath = "node_modules"; + testUtils.setInput(Inputs.Path, inputPath); + testUtils.setInput(Inputs.Update, "true"); + + const cacheId = 4; + const saveCacheMock = jest + .spyOn(cache, "saveCache") + .mockImplementationOnce(() => { + return Promise.resolve(cacheId); + }); + + await run(); + + expect(infoMock).toHaveBeenCalledWith( + `Cache hit occurred on the primary key ${primaryKey}, but updates were enabled, so updating cache.` + ); + expect(saveCacheMock).toHaveBeenCalledTimes(1); + expect(saveCacheMock).toHaveBeenCalledWith([inputPath], primaryKey); + expect(failedMock).toHaveBeenCalledTimes(0); +}); + test("save with missing input outputs warning", async () => { const logWarningMock = jest.spyOn(actionUtils, "logWarning"); const failedMock = jest.spyOn(core, "setFailed"); diff --git a/action.yml b/action.yml index e50c38b..47fa26a 100644 --- a/action.yml +++ b/action.yml @@ -11,6 +11,9 @@ inputs: restore-keys: description: 'An ordered list of keys to use for restoring the cache if no cache hit occurred for key' required: false + update: + description: 'If true, the cache will be updated if the key already exists' + required: false outputs: cache-hit: description: 'A boolean value to indicate an exact match was found for the primary key' diff --git a/dist/restore/index.js b/dist/restore/index.js index 00349f4..811694c 100644 --- a/dist/restore/index.js +++ b/dist/restore/index.js @@ -6717,6 +6717,7 @@ var Inputs; Inputs["Key"] = "key"; Inputs["Path"] = "path"; Inputs["RestoreKeys"] = "restore-keys"; + Inputs["Update"] = "update"; })(Inputs = exports.Inputs || (exports.Inputs = {})); var Outputs; (function (Outputs) { diff --git a/dist/save/index.js b/dist/save/index.js index f733e9a..b9ba86f 100644 --- a/dist/save/index.js +++ b/dist/save/index.js @@ -6605,8 +6605,13 @@ function run() { return; } if (utils.isExactKeyMatch(primaryKey, state)) { - core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`); - return; + if (core.getInput(constants_1.Inputs.Update) === "true") { + core.info(`Cache hit occurred on the primary key ${primaryKey}, but updates were enabled, so updating cache.`); + } + else { + core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`); + return; + } } const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, { required: true @@ -6802,6 +6807,7 @@ var Inputs; Inputs["Key"] = "key"; Inputs["Path"] = "path"; Inputs["RestoreKeys"] = "restore-keys"; + Inputs["Update"] = "update"; })(Inputs = exports.Inputs || (exports.Inputs = {})); var Outputs; (function (Outputs) { diff --git a/src/constants.ts b/src/constants.ts index a190e00..b32968e 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -1,7 +1,8 @@ export enum Inputs { Key = "key", Path = "path", - RestoreKeys = "restore-keys" + RestoreKeys = "restore-keys", + Update = "update" } export enum Outputs { diff --git a/src/save.ts b/src/save.ts index 80b656c..0b0a7ca 100644 --- a/src/save.ts +++ b/src/save.ts @@ -25,10 +25,16 @@ async function run(): Promise { } if (utils.isExactKeyMatch(primaryKey, state)) { - core.info( - `Cache hit occurred on the primary key ${primaryKey}, not saving cache.` - ); - return; + if (core.getInput(Inputs.Update) === "true") { + core.info( + `Cache hit occurred on the primary key ${primaryKey}, but updates were enabled, so updating cache.` + ); + } else { + core.info( + `Cache hit occurred on the primary key ${primaryKey}, not saving cache.` + ); + return; + } } const cachePaths = utils.getInputAsArray(Inputs.Path, { diff --git a/src/utils/testUtils.ts b/src/utils/testUtils.ts index b1d20d0..140a2b1 100644 --- a/src/utils/testUtils.ts +++ b/src/utils/testUtils.ts @@ -13,11 +13,15 @@ interface CacheInput { path: string; key: string; restoreKeys?: string[]; + update?: string; } export function setInputs(input: CacheInput): void { setInput(Inputs.Path, input.path); setInput(Inputs.Key, input.key); + input.update + ? setInput(Inputs.Update, input.update) + : setInput(Inputs.Update, "false"); input.restoreKeys && setInput(Inputs.RestoreKeys, input.restoreKeys.join("\n")); } @@ -25,5 +29,6 @@ export function setInputs(input: CacheInput): void { export function clearInputs(): void { delete process.env[getInputName(Inputs.Path)]; delete process.env[getInputName(Inputs.Key)]; + delete process.env[getInputName(Inputs.Update)]; delete process.env[getInputName(Inputs.RestoreKeys)]; }