mirror of
				https://github.com/actions/cache.git
				synced 2025-10-31 16:44:01 +00:00 
			
		
		
		
	Merge 783accdc1c503e1488bfdafbfc3a8740b5b9284f into 0057852bfaa89a56745cba8c7296529d2fc39830
This commit is contained in:
		
						commit
						68966a72c5
					
				| @ -89,6 +89,8 @@ If you are using a `self-hosted` Windows runner, `GNU tar` and `zstd` are requir | ||||
| * `cache-hit` - A string value to indicate an exact match was found for the key. | ||||
|   * If there's a cache hit, this will be 'true' or 'false' to indicate if there's an exact match for `key`. | ||||
|   * If there's a cache miss, this will be an empty string. | ||||
| * `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. | ||||
| 
 | ||||
| See [Skipping steps based on cache-hit](#skipping-steps-based-on-cache-hit) for info on using this output | ||||
| 
 | ||||
|  | ||||
| @ -149,7 +149,7 @@ test("restore with cache found for key", async () => { | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -173,8 +173,10 @@ test("restore with cache found for key", async () => { | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key); | ||||
|     expect(stateMock).toHaveBeenCalledTimes(2); | ||||
| 
 | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", key); | ||||
| 
 | ||||
|     expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`); | ||||
|     expect(failedMock).toHaveBeenCalledTimes(0); | ||||
| @ -194,7 +196,7 @@ test("restore with cache found for restore key", async () => { | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -218,8 +220,10 @@ test("restore with cache found for restore key", async () => { | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey); | ||||
|     expect(stateMock).toHaveBeenCalledTimes(2); | ||||
| 
 | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "false"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", restoreKey); | ||||
|     expect(infoMock).toHaveBeenCalledWith( | ||||
|         `Cache restored from key: ${restoreKey}` | ||||
|     ); | ||||
| @ -239,7 +243,7 @@ test("Fail restore when fail on cache miss is enabled and primary + restore keys | ||||
| 
 | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -260,7 +264,8 @@ test("Fail restore when fail on cache miss is enabled and primary + restore keys | ||||
|     ); | ||||
| 
 | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(0); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
| 
 | ||||
|     expect(failedMock).toHaveBeenCalledWith( | ||||
|         `Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${key}` | ||||
| @ -282,7 +287,7 @@ test("restore when fail on cache miss is enabled and primary key doesn't match r | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -306,8 +311,10 @@ test("restore when fail on cache miss is enabled and primary key doesn't match r | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", restoreKey); | ||||
|     expect(stateMock).toHaveBeenCalledTimes(2); | ||||
| 
 | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "false"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", restoreKey); | ||||
| 
 | ||||
|     expect(infoMock).toHaveBeenCalledWith( | ||||
|         `Cache restored from key: ${restoreKey}` | ||||
|  | ||||
| @ -112,7 +112,7 @@ test("restore on GHES with AC available ", async () => { | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -133,8 +133,10 @@ test("restore on GHES with AC available ", async () => { | ||||
|     ); | ||||
| 
 | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", key); | ||||
| 
 | ||||
|     expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`); | ||||
|     expect(failedMock).toHaveBeenCalledTimes(0); | ||||
| @ -334,7 +336,7 @@ test("restore with cache found for key", async () => { | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -355,8 +357,10 @@ test("restore with cache found for key", async () => { | ||||
|     ); | ||||
| 
 | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", key); | ||||
| 
 | ||||
|     expect(infoMock).toHaveBeenCalledWith(`Cache restored from key: ${key}`); | ||||
|     expect(failedMock).toHaveBeenCalledTimes(0); | ||||
| @ -376,7 +380,7 @@ test("restore with cache found for restore key", async () => { | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -397,8 +401,10 @@ test("restore with cache found for restore key", async () => { | ||||
|     ); | ||||
| 
 | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "false"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "false"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", restoreKey); | ||||
|     expect(infoMock).toHaveBeenCalledWith( | ||||
|         `Cache restored from key: ${restoreKey}` | ||||
|     ); | ||||
| @ -417,7 +423,7 @@ test("restore with lookup-only set", async () => { | ||||
|     const infoMock = jest.spyOn(core, "info"); | ||||
|     const failedMock = jest.spyOn(core, "setFailed"); | ||||
|     const stateMock = jest.spyOn(core, "saveState"); | ||||
|     const setCacheHitOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const setOutputMock = jest.spyOn(core, "setOutput"); | ||||
|     const restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
| @ -441,8 +447,10 @@ test("restore with lookup-only set", async () => { | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key); | ||||
|     expect(stateMock).toHaveBeenCalledTimes(2); | ||||
| 
 | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(3); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(setOutputMock).toHaveBeenCalledWith("cache-matched-key", key); | ||||
| 
 | ||||
|     expect(infoMock).toHaveBeenCalledWith( | ||||
|         `Cache found and can be restored from key: ${key}` | ||||
|  | ||||
| @ -54,7 +54,7 @@ test("StateProvider saves states", async () => { | ||||
|     expect(cacheStateValue).toBe(cacheMatchedKey); | ||||
|     expect(getStateMock).toHaveBeenCalledTimes(2); | ||||
|     expect(saveStateMock).toHaveBeenCalledTimes(2); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(0); | ||||
|     expect(setOutputMock).toHaveBeenCalledTimes(2); | ||||
| }); | ||||
| 
 | ||||
| test("NullStateProvider saves outputs", async () => { | ||||
|  | ||||
| @ -37,6 +37,10 @@ inputs: | ||||
| outputs: | ||||
|   cache-hit: | ||||
|     description: 'A boolean value to indicate an exact match was found for the primary key' | ||||
|   cache-primary-key: | ||||
|     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' | ||||
| runs: | ||||
|   using: 'node20' | ||||
|   main: 'dist/restore/index.js' | ||||
|  | ||||
							
								
								
									
										17
									
								
								dist/restore-only/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/restore-only/index.js
									
									
									
									
										vendored
									
									
								
							| @ -66264,21 +66264,22 @@ class StateProviderBase { | ||||
| class StateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.setState = core.saveState; | ||||
|         this.setState = (key, value) => { core.saveState(key, value); stateToOutput(key, value); }; | ||||
|         this.getState = core.getState; | ||||
|     } | ||||
| } | ||||
| exports.StateProvider = StateProvider; | ||||
| const stateToOutputMap = new Map([ | ||||
|     [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|     [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
| ]); | ||||
| function stateToOutput(key, value) { | ||||
|     core.setOutput(stateToOutputMap.get(key), value); | ||||
| } | ||||
| class NullStateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.stateToOutputMap = new Map([ | ||||
|             [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|             [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
|         ]); | ||||
|         this.setState = (key, value) => { | ||||
|             core.setOutput(this.stateToOutputMap.get(key), value); | ||||
|         }; | ||||
|         this.setState = stateToOutput; | ||||
|         // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|         this.getState = (key) => ""; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										17
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							| @ -66264,21 +66264,22 @@ class StateProviderBase { | ||||
| class StateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.setState = core.saveState; | ||||
|         this.setState = (key, value) => { core.saveState(key, value); stateToOutput(key, value); }; | ||||
|         this.getState = core.getState; | ||||
|     } | ||||
| } | ||||
| exports.StateProvider = StateProvider; | ||||
| const stateToOutputMap = new Map([ | ||||
|     [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|     [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
| ]); | ||||
| function stateToOutput(key, value) { | ||||
|     core.setOutput(stateToOutputMap.get(key), value); | ||||
| } | ||||
| class NullStateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.stateToOutputMap = new Map([ | ||||
|             [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|             [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
|         ]); | ||||
|         this.setState = (key, value) => { | ||||
|             core.setOutput(this.stateToOutputMap.get(key), value); | ||||
|         }; | ||||
|         this.setState = stateToOutput; | ||||
|         // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|         this.getState = (key) => ""; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										17
									
								
								dist/save-only/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/save-only/index.js
									
									
									
									
										vendored
									
									
								
							| @ -66277,21 +66277,22 @@ class StateProviderBase { | ||||
| class StateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.setState = core.saveState; | ||||
|         this.setState = (key, value) => { core.saveState(key, value); stateToOutput(key, value); }; | ||||
|         this.getState = core.getState; | ||||
|     } | ||||
| } | ||||
| exports.StateProvider = StateProvider; | ||||
| const stateToOutputMap = new Map([ | ||||
|     [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|     [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
| ]); | ||||
| function stateToOutput(key, value) { | ||||
|     core.setOutput(stateToOutputMap.get(key), value); | ||||
| } | ||||
| class NullStateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.stateToOutputMap = new Map([ | ||||
|             [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|             [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
|         ]); | ||||
|         this.setState = (key, value) => { | ||||
|             core.setOutput(this.stateToOutputMap.get(key), value); | ||||
|         }; | ||||
|         this.setState = stateToOutput; | ||||
|         // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|         this.getState = (key) => ""; | ||||
|     } | ||||
|  | ||||
							
								
								
									
										17
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							| @ -66277,21 +66277,22 @@ class StateProviderBase { | ||||
| class StateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.setState = core.saveState; | ||||
|         this.setState = (key, value) => { core.saveState(key, value); stateToOutput(key, value); }; | ||||
|         this.getState = core.getState; | ||||
|     } | ||||
| } | ||||
| exports.StateProvider = StateProvider; | ||||
| const stateToOutputMap = new Map([ | ||||
|     [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|     [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
| ]); | ||||
| function stateToOutput(key, value) { | ||||
|     core.setOutput(stateToOutputMap.get(key), value); | ||||
| } | ||||
| class NullStateProvider extends StateProviderBase { | ||||
|     constructor() { | ||||
|         super(...arguments); | ||||
|         this.stateToOutputMap = new Map([ | ||||
|             [constants_1.State.CacheMatchedKey, constants_1.Outputs.CacheMatchedKey], | ||||
|             [constants_1.State.CachePrimaryKey, constants_1.Outputs.CachePrimaryKey] | ||||
|         ]); | ||||
|         this.setState = (key, value) => { | ||||
|             core.setOutput(this.stateToOutputMap.get(key), value); | ||||
|         }; | ||||
|         this.setState = stateToOutput; | ||||
|         // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|         this.getState = (key) => ""; | ||||
|     } | ||||
|  | ||||
| @ -28,19 +28,22 @@ class StateProviderBase implements IStateProvider { | ||||
| } | ||||
| 
 | ||||
| export class StateProvider extends StateProviderBase { | ||||
|     setState = core.saveState; | ||||
|     setState = (key: string, value: string) => { | ||||
|         core.saveState(key, value); | ||||
|         stateToOutput(key, value); | ||||
|     }; | ||||
|     getState = core.getState; | ||||
| } | ||||
| 
 | ||||
| const stateToOutputMap = new Map<string, string>([ | ||||
|     [State.CacheMatchedKey, Outputs.CacheMatchedKey], | ||||
|     [State.CachePrimaryKey, Outputs.CachePrimaryKey] | ||||
| ]); | ||||
| function stateToOutput(key: string, value: string) { | ||||
|     core.setOutput(stateToOutputMap.get(key) as string, value); | ||||
| } | ||||
| export class NullStateProvider extends StateProviderBase { | ||||
|     stateToOutputMap = new Map<string, string>([ | ||||
|         [State.CacheMatchedKey, Outputs.CacheMatchedKey], | ||||
|         [State.CachePrimaryKey, Outputs.CachePrimaryKey] | ||||
|     ]); | ||||
| 
 | ||||
|     setState = (key: string, value: string) => { | ||||
|         core.setOutput(this.stateToOutputMap.get(key) as string, value); | ||||
|     }; | ||||
|     setState = stateToOutput; | ||||
|     // eslint-disable-next-line @typescript-eslint/no-unused-vars
 | ||||
|     getState = (key: string) => ""; | ||||
| } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user