diff --git a/__tests__/restore.test.ts b/__tests__/restore.test.ts index 250f7ef..f53d376 100644 --- a/__tests__/restore.test.ts +++ b/__tests__/restore.test.ts @@ -85,7 +85,8 @@ test("restore with no cache found", async () => { ); expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); - expect(stateMock).toHaveBeenCalledTimes(1); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(2); expect(failedMock).toHaveBeenCalledTimes(0); @@ -128,7 +129,8 @@ test("restore with restore keys and no cache found", async () => { ); expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); - expect(stateMock).toHaveBeenCalledTimes(1); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(2); expect(failedMock).toHaveBeenCalledTimes(0); @@ -171,7 +173,8 @@ test("restore with cache found for key", async () => { expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key); - expect(stateMock).toHaveBeenCalledTimes(2); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(3); expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); @@ -216,7 +219,8 @@ test("restore with cache found for restore key", async () => { expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey); - expect(stateMock).toHaveBeenCalledTimes(2); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(3); expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false"); @@ -304,7 +308,8 @@ test("restore when fail on cache miss is enabled and primary key doesn't match r expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey); - expect(stateMock).toHaveBeenCalledTimes(2); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(3); expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false"); @@ -349,7 +354,8 @@ test("restore with fail on cache miss disabled and no cache found", async () => ); expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); - expect(stateMock).toHaveBeenCalledTimes(1); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(2); expect(infoMock).toHaveBeenCalledWith( `Cache not found for input keys: ${key}, ${restoreKey}` diff --git a/__tests__/restoreImpl.test.ts b/__tests__/restoreImpl.test.ts index 16f5f72..9aad012 100644 --- a/__tests__/restoreImpl.test.ts +++ b/__tests__/restoreImpl.test.ts @@ -439,7 +439,8 @@ test("restore with lookup-only set", async () => { expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key); - expect(stateMock).toHaveBeenCalledTimes(2); + expect(stateMock).toHaveBeenCalledWith("CACHE_PATH", path); + expect(stateMock).toHaveBeenCalledTimes(3); expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); diff --git a/__tests__/restoreOnly.test.ts b/__tests__/restoreOnly.test.ts index 81e5bca..c2fa513 100644 --- a/__tests__/restoreOnly.test.ts +++ b/__tests__/restoreOnly.test.ts @@ -86,7 +86,8 @@ test("restore with no cache found", async () => { ); expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); - expect(outputMock).toHaveBeenCalledTimes(1); + expect(outputMock).toHaveBeenCalledWith("cache-path", path); + expect(outputMock).toHaveBeenCalledTimes(2); expect(failedMock).toHaveBeenCalledTimes(0); expect(infoMock).toHaveBeenCalledWith( @@ -128,6 +129,7 @@ test("restore with restore keys and no cache found", async () => { ); expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); + expect(outputMock).toHaveBeenCalledWith("cache-path", path); expect(failedMock).toHaveBeenCalledTimes(0); expect(infoMock).toHaveBeenCalledWith( @@ -169,8 +171,9 @@ test("restore with cache found for key", async () => { expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); expect(outputMock).toHaveBeenCalledWith("cache-hit", "true"); expect(outputMock).toHaveBeenCalledWith("cache-matched-key", key); + expect(outputMock).toHaveBeenCalledWith("cache-path", path); - expect(outputMock).toHaveBeenCalledTimes(3); + expect(outputMock).toHaveBeenCalledTimes(4); expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`); expect(failedMock).toHaveBeenCalledTimes(0); @@ -212,8 +215,9 @@ test("restore with cache found for restore key", async () => { expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); expect(outputMock).toHaveBeenCalledWith("cache-hit", "false"); expect(outputMock).toHaveBeenCalledWith("cache-matched-key", restoreKey); + expect(outputMock).toHaveBeenCalledWith("cache-path", path); - expect(outputMock).toHaveBeenCalledTimes(3); + expect(outputMock).toHaveBeenCalledTimes(4); expect(infoMock).toHaveBeenCalledWith( `Cache restored from key: ${restoreKey}` diff --git a/restore/README.md b/restore/README.md index ed8b552..f8556f7 100644 --- a/restore/README.md +++ b/restore/README.md @@ -17,6 +17,7 @@ The restore action restores a cache. It works similarly to the `cache` action ex * `cache-hit` - A boolean value to indicate an exact match was found for the key. * `cache-primary-key` - Cache primary key passed in the input to use in subsequent steps of the workflow. * `cache-matched-key` - Key of the cache that was restored, it could either be the primary key on cache-hit or a partial/complete match of one of the restore keys. +* `cache-path` - The list of files, directories, and wildcard patterns passed in the input. > **Note** `cache-hit` will be set to `true` only when cache hit occurs for the exact `key` match. For a partial key match via `restore-keys` or a cache miss, it will be set to `false`. diff --git a/restore/action.yml b/restore/action.yml index 3c5e5ae..b07d7fd 100644 --- a/restore/action.yml +++ b/restore/action.yml @@ -30,6 +30,8 @@ outputs: description: 'A resolved cache key for which cache match was attempted' cache-matched-key: description: 'Key of the cache that was restored, it could either be the primary key on cache-hit or a partial/complete match of one of the restore keys' + cache-path: + description: 'The list of files, directories, and wildcard patterns passed in the input' runs: using: 'node20' main: '../dist/restore-only/index.js' diff --git a/src/constants.ts b/src/constants.ts index 0158ae0..771dbed 100644 --- a/src/constants.ts +++ b/src/constants.ts @@ -11,12 +11,14 @@ export enum Inputs { export enum Outputs { CacheHit = "cache-hit", // Output from cache, restore action CachePrimaryKey = "cache-primary-key", // Output from restore action - CacheMatchedKey = "cache-matched-key" // Output from restore action + CacheMatchedKey = "cache-matched-key", // Output from restore action + CachePath = "cache-path" // Output from restore action } export enum State { CachePrimaryKey = "CACHE_KEY", - CacheMatchedKey = "CACHE_RESULT" + CacheMatchedKey = "CACHE_RESULT", + CachePath = "CACHE_PATH" } export enum Events { diff --git a/src/restoreImpl.ts b/src/restoreImpl.ts index 54bef49..068c932 100644 --- a/src/restoreImpl.ts +++ b/src/restoreImpl.ts @@ -32,6 +32,8 @@ export async function restoreImpl( const primaryKey = core.getInput(Inputs.Key, { required: true }); stateProvider.setState(State.CachePrimaryKey, primaryKey); + stateProvider.setState(State.CachePath, core.getInput(Inputs.Path)); // Output path unchanged from input + const restoreKeys = utils.getInputAsArray(Inputs.RestoreKeys); const cachePaths = utils.getInputAsArray(Inputs.Path, { required: true diff --git a/src/stateProvider.ts b/src/stateProvider.ts index beb41e5..60c28b4 100644 --- a/src/stateProvider.ts +++ b/src/stateProvider.ts @@ -35,7 +35,8 @@ export class StateProvider extends StateProviderBase { export class NullStateProvider extends StateProviderBase { stateToOutputMap = new Map([ [State.CacheMatchedKey, Outputs.CacheMatchedKey], - [State.CachePrimaryKey, Outputs.CachePrimaryKey] + [State.CachePrimaryKey, Outputs.CachePrimaryKey], + [State.CachePath, Outputs.CachePath] ]); setState = (key: string, value: string) => {