mirror of
				https://gitea.com/actions/cache.git
				synced 2025-10-31 07:47:07 +00:00 
			
		
		
		
	Compare commits
	
		
			9 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|   | 940f3d7cf1 | ||
|   | e0d62270e2 | ||
|   | 69d9d449ac | ||
|   | 8d3a1e02aa | ||
|   | b1db4b4897 | ||
|   | 7d4d6f7ffd | ||
|   | 8f7fa5d715 | ||
|   | 95b455a0fb | ||
|   | 81b7281936 | 
							
								
								
									
										2
									
								
								.licenses/npm/@actions/cache.dep.yml
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										2
									
								
								.licenses/npm/@actions/cache.dep.yml
									
									
									
										generated
									
									
									
								
							| @@ -1,6 +1,6 @@ | ||||
| --- | ||||
| name: "@actions/cache" | ||||
| version: 3.1.3 | ||||
| version: 3.2.0 | ||||
| type: npm | ||||
| summary: | ||||
| homepage: | ||||
|   | ||||
| @@ -31,6 +31,8 @@ See ["Caching dependencies to speed up workflows"](https://docs.github.com/en/ac | ||||
| * New actions are available for granular control over caches - [restore](restore/action.yml) and [save](save/action.yml). | ||||
| * Support cross-os caching as an opt-in feature. See [Cross OS caching](./tips-and-workarounds.md#cross-os-cache) for more info. | ||||
| * Added option to fail job on cache miss. See [Exit workflow on cache miss](./restore/README.md#exit-workflow-on-cache-miss) for more info. | ||||
| * Fix zstd not being used after zstd version upgrade to 1.5.4 on hosted runners | ||||
| * Added option to lookup cache without downloading it. | ||||
|  | ||||
| See the [v2 README.md](https://github.com/actions/cache/blob/v2/README.md) for older updates. | ||||
|  | ||||
| @@ -51,6 +53,7 @@ If you are using a `self-hosted` Windows runner, `GNU tar` and `zstd` are requir | ||||
| * `restore-keys` - An ordered list of prefix-matched keys to use for restoring stale cache if no cache hit occurred for key. | ||||
| * `enableCrossOsArchive` - An optional boolean when enabled, allows Windows runners to save or restore caches that can be restored or saved respectively on other platforms. Default: `false` | ||||
| * `fail-on-cache-miss` - Fail the workflow if cache entry is not found. Default: `false` | ||||
| * `lookup-only` - Skip downloading cache. Only check if cache entry exists. Default: `false` | ||||
|  | ||||
| #### Environment Variables | ||||
|  | ||||
|   | ||||
| @@ -73,3 +73,9 @@ | ||||
|  | ||||
| ### 3.2.5 | ||||
| - Added fix to prevent from setting MYSYS environment variable globally. | ||||
|  | ||||
| ### 3.2.6 | ||||
| - Fix zstd not being used after zstd version upgrade to 1.5.4 on hosted runners. | ||||
|  | ||||
| ### 3.3.0 | ||||
| - Added option to lookup cache without downloading it. | ||||
|   | ||||
| @@ -74,7 +74,15 @@ test("restore with no cache found", async () => { | ||||
|     await run(); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(stateMock).toHaveBeenCalledTimes(1); | ||||
| @@ -113,7 +121,9 @@ test("restore with restore keys and no cache found", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -149,7 +159,15 @@ test("restore with cache found for key", async () => { | ||||
|     await run(); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key); | ||||
| @@ -190,7 +208,9 @@ test("restore with cache found for restore key", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -233,7 +253,9 @@ test("Fail restore when fail on cache miss is enabled and primary + restore keys | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -274,7 +296,9 @@ test("restore when fail on cache miss is enabled and primary key doesn't match r | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -318,7 +342,9 @@ test("restore with fail on cache miss disabled and no cache found", async () => | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|   | ||||
| @@ -122,7 +122,15 @@ test("restore on GHES with AC available ", async () => { | ||||
|     await run(new StateProvider()); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
| @@ -172,7 +180,9 @@ test("restore with too many keys should fail", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         restoreKeys, | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|     expect(failedMock).toHaveBeenCalledWith( | ||||
| @@ -192,7 +202,15 @@ test("restore with large key should fail", async () => { | ||||
|     const restoreCacheMock = jest.spyOn(cache, "restoreCache"); | ||||
|     await run(new StateProvider()); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|     expect(failedMock).toHaveBeenCalledWith( | ||||
|         `Key Validation Error: ${key} cannot be larger than 512 characters.` | ||||
|     ); | ||||
| @@ -210,7 +228,15 @@ test("restore with invalid key should fail", async () => { | ||||
|     const restoreCacheMock = jest.spyOn(cache, "restoreCache"); | ||||
|     await run(new StateProvider()); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|     expect(failedMock).toHaveBeenCalledWith( | ||||
|         `Key Validation Error: ${key} cannot contain commas.` | ||||
|     ); | ||||
| @@ -237,7 +263,15 @@ test("restore with no cache found", async () => { | ||||
|     await run(new StateProvider()); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(failedMock).toHaveBeenCalledTimes(0); | ||||
| @@ -274,7 +308,9 @@ test("restore with restore keys and no cache found", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -308,7 +344,15 @@ test("restore with cache found for key", async () => { | ||||
|     await run(new StateProvider()); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
| @@ -346,7 +390,9 @@ test("restore with cache found for restore key", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -358,3 +404,48 @@ test("restore with cache found for restore key", async () => { | ||||
|     ); | ||||
|     expect(failedMock).toHaveBeenCalledTimes(0); | ||||
| }); | ||||
|  | ||||
| test("restore with lookup-only set", async () => { | ||||
|     const path = "node_modules"; | ||||
|     const key = "node-test"; | ||||
|     testUtils.setInputs({ | ||||
|         path: path, | ||||
|         key, | ||||
|         lookupOnly: true | ||||
|     }); | ||||
|  | ||||
|     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 restoreCacheMock = jest | ||||
|         .spyOn(cache, "restoreCache") | ||||
|         .mockImplementationOnce(() => { | ||||
|             return Promise.resolve(key); | ||||
|         }); | ||||
|  | ||||
|     await run(new StateProvider()); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: true | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_KEY", key); | ||||
|     expect(stateMock).toHaveBeenCalledWith("CACHE_RESULT", key); | ||||
|     expect(stateMock).toHaveBeenCalledTimes(2); | ||||
|  | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledTimes(1); | ||||
|     expect(setCacheHitOutputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
|  | ||||
|     expect(infoMock).toHaveBeenCalledWith( | ||||
|         `Cache found and can be restored from key: ${key}` | ||||
|     ); | ||||
|     expect(failedMock).toHaveBeenCalledTimes(0); | ||||
| }); | ||||
|   | ||||
| @@ -75,7 +75,15 @@ test("restore with no cache found", async () => { | ||||
|     await run(); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(outputMock).toHaveBeenCalledTimes(1); | ||||
| @@ -113,7 +121,9 @@ test("restore with restore keys and no cache found", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
| @@ -146,7 +156,15 @@ test("restore with cache found for key", async () => { | ||||
|     await run(); | ||||
|  | ||||
|     expect(restoreCacheMock).toHaveBeenCalledTimes(1); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith([path], key, [], {}, false); | ||||
|     expect(restoreCacheMock).toHaveBeenCalledWith( | ||||
|         [path], | ||||
|         key, | ||||
|         [], | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|     expect(outputMock).toHaveBeenCalledWith("cache-primary-key", key); | ||||
|     expect(outputMock).toHaveBeenCalledWith("cache-hit", "true"); | ||||
| @@ -185,7 +203,9 @@ test("restore with cache found for restore key", async () => { | ||||
|         [path], | ||||
|         key, | ||||
|         [restoreKey], | ||||
|         {}, | ||||
|         { | ||||
|             lookupOnly: false | ||||
|         }, | ||||
|         false | ||||
|     ); | ||||
|  | ||||
|   | ||||
| @@ -22,6 +22,10 @@ inputs: | ||||
|     description: 'Fail the workflow if cache entry is not found' | ||||
|     default: 'false' | ||||
|     required: false | ||||
|   lookup-only: | ||||
|     description: 'Check if a cache entry exists for the given input(s) (key, restore-keys) without downloading the cache' | ||||
|     default: 'false' | ||||
|     required: false | ||||
| outputs: | ||||
|   cache-hit: | ||||
|     description: 'A boolean value to indicate an exact match was found for the primary key' | ||||
|   | ||||
							
								
								
									
										44
									
								
								dist/restore-only/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								dist/restore-only/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -1152,12 +1152,13 @@ function unlinkFile(filePath) { | ||||
|     }); | ||||
| } | ||||
| exports.unlinkFile = unlinkFile; | ||||
| function getVersion(app) { | ||||
| function getVersion(app, additionalArgs = []) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         core.debug(`Checking ${app} --version`); | ||||
|         let versionOutput = ''; | ||||
|         additionalArgs.push('--version'); | ||||
|         core.debug(`Checking ${app} ${additionalArgs.join(' ')}`); | ||||
|         try { | ||||
|             yield exec.exec(`${app} --version`, [], { | ||||
|             yield exec.exec(`${app}`, additionalArgs, { | ||||
|                 ignoreReturnCode: true, | ||||
|                 silent: true, | ||||
|                 listeners: { | ||||
| @@ -1177,19 +1178,14 @@ function getVersion(app) { | ||||
| // Use zstandard if possible to maximize cache performance
 | ||||
| function getCompressionMethod() { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         const versionOutput = yield getVersion('zstd'); | ||||
|         const versionOutput = yield getVersion('zstd', ['--quiet']); | ||||
|         const version = semver.clean(versionOutput); | ||||
|         if (!versionOutput.toLowerCase().includes('zstd command line interface')) { | ||||
|             // zstd is not installed
 | ||||
|         core.debug(`zstd version: ${version}`); | ||||
|         if (versionOutput === '') { | ||||
|             return constants_1.CompressionMethod.Gzip; | ||||
|         } | ||||
|         else if (!version || semver.lt(version, 'v1.3.2')) { | ||||
|             // zstd is installed but using a version earlier than v1.3.2
 | ||||
|             // v1.3.2 is required to use the `--long` options in zstd
 | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|         else { | ||||
|             return constants_1.CompressionMethod.Zstd; | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| @@ -4979,7 +4975,8 @@ var Inputs; | ||||
|     Inputs["RestoreKeys"] = "restore-keys"; | ||||
|     Inputs["UploadChunkSize"] = "upload-chunk-size"; | ||||
|     Inputs["EnableCrossOsArchive"] = "enableCrossOsArchive"; | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; // Input for cache, restore action
 | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; | ||||
|     Inputs["LookupOnly"] = "lookup-only"; // Input for cache, restore action
 | ||||
| })(Inputs = exports.Inputs || (exports.Inputs = {})); | ||||
| var Outputs; | ||||
| (function (Outputs) { | ||||
| @@ -41810,7 +41807,8 @@ function getDownloadOptions(copy) { | ||||
|         useAzureSdk: true, | ||||
|         downloadConcurrency: 8, | ||||
|         timeoutInMs: 30000, | ||||
|         segmentTimeoutInMs: 3600000 | ||||
|         segmentTimeoutInMs: 3600000, | ||||
|         lookupOnly: false | ||||
|     }; | ||||
|     if (copy) { | ||||
|         if (typeof copy.useAzureSdk === 'boolean') { | ||||
| @@ -41825,6 +41823,9 @@ function getDownloadOptions(copy) { | ||||
|         if (typeof copy.segmentTimeoutInMs === 'number') { | ||||
|             result.segmentTimeoutInMs = copy.segmentTimeoutInMs; | ||||
|         } | ||||
|         if (typeof copy.lookupOnly === 'boolean') { | ||||
|             result.lookupOnly = copy.lookupOnly; | ||||
|         } | ||||
|     } | ||||
|     const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']; | ||||
|     if (segmentDownloadTimeoutMins && | ||||
| @@ -41837,6 +41838,7 @@ function getDownloadOptions(copy) { | ||||
|     core.debug(`Request timeout (ms): ${result.timeoutInMs}`); | ||||
|     core.debug(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`); | ||||
|     core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`); | ||||
|     core.debug(`Lookup only: ${result.lookupOnly}`); | ||||
|     return result; | ||||
| } | ||||
| exports.getDownloadOptions = getDownloadOptions; | ||||
| @@ -47285,6 +47287,10 @@ function restoreCache(paths, primaryKey, restoreKeys, options, enableCrossOsArch | ||||
|                 // Cache not found
 | ||||
|                 return undefined; | ||||
|             } | ||||
|             if (options === null || options === void 0 ? void 0 : options.lookupOnly) { | ||||
|                 core.info('Lookup only - skipping download'); | ||||
|                 return cacheEntry.cacheKey; | ||||
|             } | ||||
|             archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|             core.debug(`Archive Path: ${archivePath}`); | ||||
|             // Download the cache from the cache entry
 | ||||
| @@ -50498,7 +50504,8 @@ function restoreImpl(stateProvider) { | ||||
|             }); | ||||
|             const enableCrossOsArchive = utils.getInputAsBool(constants_1.Inputs.EnableCrossOsArchive); | ||||
|             const failOnCacheMiss = utils.getInputAsBool(constants_1.Inputs.FailOnCacheMiss); | ||||
|             const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys, {}, enableCrossOsArchive); | ||||
|             const lookupOnly = utils.getInputAsBool(constants_1.Inputs.LookupOnly); | ||||
|             const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys, { lookupOnly: lookupOnly }, enableCrossOsArchive); | ||||
|             if (!cacheKey) { | ||||
|                 if (failOnCacheMiss) { | ||||
|                     throw new Error(`Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${primaryKey}`); | ||||
| @@ -50513,7 +50520,12 @@ function restoreImpl(stateProvider) { | ||||
|             stateProvider.setState(constants_1.State.CacheMatchedKey, cacheKey); | ||||
|             const isExactKeyMatch = utils.isExactKeyMatch(core.getInput(constants_1.Inputs.Key, { required: true }), cacheKey); | ||||
|             core.setOutput(constants_1.Outputs.CacheHit, isExactKeyMatch.toString()); | ||||
|             core.info(`Cache restored from key: ${cacheKey}`); | ||||
|             if (lookupOnly) { | ||||
|                 core.info(`Cache found and can be restored from key: ${cacheKey}`); | ||||
|             } | ||||
|             else { | ||||
|                 core.info(`Cache restored from key: ${cacheKey}`); | ||||
|             } | ||||
|             return cacheKey; | ||||
|         } | ||||
|         catch (error) { | ||||
|   | ||||
							
								
								
									
										44
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										44
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -1152,12 +1152,13 @@ function unlinkFile(filePath) { | ||||
|     }); | ||||
| } | ||||
| exports.unlinkFile = unlinkFile; | ||||
| function getVersion(app) { | ||||
| function getVersion(app, additionalArgs = []) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         core.debug(`Checking ${app} --version`); | ||||
|         let versionOutput = ''; | ||||
|         additionalArgs.push('--version'); | ||||
|         core.debug(`Checking ${app} ${additionalArgs.join(' ')}`); | ||||
|         try { | ||||
|             yield exec.exec(`${app} --version`, [], { | ||||
|             yield exec.exec(`${app}`, additionalArgs, { | ||||
|                 ignoreReturnCode: true, | ||||
|                 silent: true, | ||||
|                 listeners: { | ||||
| @@ -1177,19 +1178,14 @@ function getVersion(app) { | ||||
| // Use zstandard if possible to maximize cache performance
 | ||||
| function getCompressionMethod() { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         const versionOutput = yield getVersion('zstd'); | ||||
|         const versionOutput = yield getVersion('zstd', ['--quiet']); | ||||
|         const version = semver.clean(versionOutput); | ||||
|         if (!versionOutput.toLowerCase().includes('zstd command line interface')) { | ||||
|             // zstd is not installed
 | ||||
|         core.debug(`zstd version: ${version}`); | ||||
|         if (versionOutput === '') { | ||||
|             return constants_1.CompressionMethod.Gzip; | ||||
|         } | ||||
|         else if (!version || semver.lt(version, 'v1.3.2')) { | ||||
|             // zstd is installed but using a version earlier than v1.3.2
 | ||||
|             // v1.3.2 is required to use the `--long` options in zstd
 | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|         else { | ||||
|             return constants_1.CompressionMethod.Zstd; | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| @@ -4979,7 +4975,8 @@ var Inputs; | ||||
|     Inputs["RestoreKeys"] = "restore-keys"; | ||||
|     Inputs["UploadChunkSize"] = "upload-chunk-size"; | ||||
|     Inputs["EnableCrossOsArchive"] = "enableCrossOsArchive"; | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; // Input for cache, restore action
 | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; | ||||
|     Inputs["LookupOnly"] = "lookup-only"; // Input for cache, restore action
 | ||||
| })(Inputs = exports.Inputs || (exports.Inputs = {})); | ||||
| var Outputs; | ||||
| (function (Outputs) { | ||||
| @@ -41781,7 +41778,8 @@ function getDownloadOptions(copy) { | ||||
|         useAzureSdk: true, | ||||
|         downloadConcurrency: 8, | ||||
|         timeoutInMs: 30000, | ||||
|         segmentTimeoutInMs: 3600000 | ||||
|         segmentTimeoutInMs: 3600000, | ||||
|         lookupOnly: false | ||||
|     }; | ||||
|     if (copy) { | ||||
|         if (typeof copy.useAzureSdk === 'boolean') { | ||||
| @@ -41796,6 +41794,9 @@ function getDownloadOptions(copy) { | ||||
|         if (typeof copy.segmentTimeoutInMs === 'number') { | ||||
|             result.segmentTimeoutInMs = copy.segmentTimeoutInMs; | ||||
|         } | ||||
|         if (typeof copy.lookupOnly === 'boolean') { | ||||
|             result.lookupOnly = copy.lookupOnly; | ||||
|         } | ||||
|     } | ||||
|     const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']; | ||||
|     if (segmentDownloadTimeoutMins && | ||||
| @@ -41808,6 +41809,7 @@ function getDownloadOptions(copy) { | ||||
|     core.debug(`Request timeout (ms): ${result.timeoutInMs}`); | ||||
|     core.debug(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`); | ||||
|     core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`); | ||||
|     core.debug(`Lookup only: ${result.lookupOnly}`); | ||||
|     return result; | ||||
| } | ||||
| exports.getDownloadOptions = getDownloadOptions; | ||||
| @@ -47256,6 +47258,10 @@ function restoreCache(paths, primaryKey, restoreKeys, options, enableCrossOsArch | ||||
|                 // Cache not found
 | ||||
|                 return undefined; | ||||
|             } | ||||
|             if (options === null || options === void 0 ? void 0 : options.lookupOnly) { | ||||
|                 core.info('Lookup only - skipping download'); | ||||
|                 return cacheEntry.cacheKey; | ||||
|             } | ||||
|             archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|             core.debug(`Archive Path: ${archivePath}`); | ||||
|             // Download the cache from the cache entry
 | ||||
| @@ -50498,7 +50504,8 @@ function restoreImpl(stateProvider) { | ||||
|             }); | ||||
|             const enableCrossOsArchive = utils.getInputAsBool(constants_1.Inputs.EnableCrossOsArchive); | ||||
|             const failOnCacheMiss = utils.getInputAsBool(constants_1.Inputs.FailOnCacheMiss); | ||||
|             const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys, {}, enableCrossOsArchive); | ||||
|             const lookupOnly = utils.getInputAsBool(constants_1.Inputs.LookupOnly); | ||||
|             const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys, { lookupOnly: lookupOnly }, enableCrossOsArchive); | ||||
|             if (!cacheKey) { | ||||
|                 if (failOnCacheMiss) { | ||||
|                     throw new Error(`Failed to restore cache entry. Exiting as fail-on-cache-miss is set. Input key: ${primaryKey}`); | ||||
| @@ -50513,7 +50520,12 @@ function restoreImpl(stateProvider) { | ||||
|             stateProvider.setState(constants_1.State.CacheMatchedKey, cacheKey); | ||||
|             const isExactKeyMatch = utils.isExactKeyMatch(core.getInput(constants_1.Inputs.Key, { required: true }), cacheKey); | ||||
|             core.setOutput(constants_1.Outputs.CacheHit, isExactKeyMatch.toString()); | ||||
|             core.info(`Cache restored from key: ${cacheKey}`); | ||||
|             if (lookupOnly) { | ||||
|                 core.info(`Cache found and can be restored from key: ${cacheKey}`); | ||||
|             } | ||||
|             else { | ||||
|                 core.info(`Cache restored from key: ${cacheKey}`); | ||||
|             } | ||||
|             return cacheKey; | ||||
|         } | ||||
|         catch (error) { | ||||
|   | ||||
							
								
								
									
										34
									
								
								dist/save-only/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								dist/save-only/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -1208,12 +1208,13 @@ function unlinkFile(filePath) { | ||||
|     }); | ||||
| } | ||||
| exports.unlinkFile = unlinkFile; | ||||
| function getVersion(app) { | ||||
| function getVersion(app, additionalArgs = []) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         core.debug(`Checking ${app} --version`); | ||||
|         let versionOutput = ''; | ||||
|         additionalArgs.push('--version'); | ||||
|         core.debug(`Checking ${app} ${additionalArgs.join(' ')}`); | ||||
|         try { | ||||
|             yield exec.exec(`${app} --version`, [], { | ||||
|             yield exec.exec(`${app}`, additionalArgs, { | ||||
|                 ignoreReturnCode: true, | ||||
|                 silent: true, | ||||
|                 listeners: { | ||||
| @@ -1233,19 +1234,14 @@ function getVersion(app) { | ||||
| // Use zstandard if possible to maximize cache performance
 | ||||
| function getCompressionMethod() { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         const versionOutput = yield getVersion('zstd'); | ||||
|         const versionOutput = yield getVersion('zstd', ['--quiet']); | ||||
|         const version = semver.clean(versionOutput); | ||||
|         if (!versionOutput.toLowerCase().includes('zstd command line interface')) { | ||||
|             // zstd is not installed
 | ||||
|         core.debug(`zstd version: ${version}`); | ||||
|         if (versionOutput === '') { | ||||
|             return constants_1.CompressionMethod.Gzip; | ||||
|         } | ||||
|         else if (!version || semver.lt(version, 'v1.3.2')) { | ||||
|             // zstd is installed but using a version earlier than v1.3.2
 | ||||
|             // v1.3.2 is required to use the `--long` options in zstd
 | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|         else { | ||||
|             return constants_1.CompressionMethod.Zstd; | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| @@ -5035,7 +5031,8 @@ var Inputs; | ||||
|     Inputs["RestoreKeys"] = "restore-keys"; | ||||
|     Inputs["UploadChunkSize"] = "upload-chunk-size"; | ||||
|     Inputs["EnableCrossOsArchive"] = "enableCrossOsArchive"; | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; // Input for cache, restore action
 | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; | ||||
|     Inputs["LookupOnly"] = "lookup-only"; // Input for cache, restore action
 | ||||
| })(Inputs = exports.Inputs || (exports.Inputs = {})); | ||||
| var Outputs; | ||||
| (function (Outputs) { | ||||
| @@ -41922,7 +41919,8 @@ function getDownloadOptions(copy) { | ||||
|         useAzureSdk: true, | ||||
|         downloadConcurrency: 8, | ||||
|         timeoutInMs: 30000, | ||||
|         segmentTimeoutInMs: 3600000 | ||||
|         segmentTimeoutInMs: 3600000, | ||||
|         lookupOnly: false | ||||
|     }; | ||||
|     if (copy) { | ||||
|         if (typeof copy.useAzureSdk === 'boolean') { | ||||
| @@ -41937,6 +41935,9 @@ function getDownloadOptions(copy) { | ||||
|         if (typeof copy.segmentTimeoutInMs === 'number') { | ||||
|             result.segmentTimeoutInMs = copy.segmentTimeoutInMs; | ||||
|         } | ||||
|         if (typeof copy.lookupOnly === 'boolean') { | ||||
|             result.lookupOnly = copy.lookupOnly; | ||||
|         } | ||||
|     } | ||||
|     const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']; | ||||
|     if (segmentDownloadTimeoutMins && | ||||
| @@ -41949,6 +41950,7 @@ function getDownloadOptions(copy) { | ||||
|     core.debug(`Request timeout (ms): ${result.timeoutInMs}`); | ||||
|     core.debug(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`); | ||||
|     core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`); | ||||
|     core.debug(`Lookup only: ${result.lookupOnly}`); | ||||
|     return result; | ||||
| } | ||||
| exports.getDownloadOptions = getDownloadOptions; | ||||
| @@ -47397,6 +47399,10 @@ function restoreCache(paths, primaryKey, restoreKeys, options, enableCrossOsArch | ||||
|                 // Cache not found
 | ||||
|                 return undefined; | ||||
|             } | ||||
|             if (options === null || options === void 0 ? void 0 : options.lookupOnly) { | ||||
|                 core.info('Lookup only - skipping download'); | ||||
|                 return cacheEntry.cacheKey; | ||||
|             } | ||||
|             archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|             core.debug(`Archive Path: ${archivePath}`); | ||||
|             // Download the cache from the cache entry
 | ||||
|   | ||||
							
								
								
									
										34
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										34
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							| @@ -1152,12 +1152,13 @@ function unlinkFile(filePath) { | ||||
|     }); | ||||
| } | ||||
| exports.unlinkFile = unlinkFile; | ||||
| function getVersion(app) { | ||||
| function getVersion(app, additionalArgs = []) { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         core.debug(`Checking ${app} --version`); | ||||
|         let versionOutput = ''; | ||||
|         additionalArgs.push('--version'); | ||||
|         core.debug(`Checking ${app} ${additionalArgs.join(' ')}`); | ||||
|         try { | ||||
|             yield exec.exec(`${app} --version`, [], { | ||||
|             yield exec.exec(`${app}`, additionalArgs, { | ||||
|                 ignoreReturnCode: true, | ||||
|                 silent: true, | ||||
|                 listeners: { | ||||
| @@ -1177,19 +1178,14 @@ function getVersion(app) { | ||||
| // Use zstandard if possible to maximize cache performance
 | ||||
| function getCompressionMethod() { | ||||
|     return __awaiter(this, void 0, void 0, function* () { | ||||
|         const versionOutput = yield getVersion('zstd'); | ||||
|         const versionOutput = yield getVersion('zstd', ['--quiet']); | ||||
|         const version = semver.clean(versionOutput); | ||||
|         if (!versionOutput.toLowerCase().includes('zstd command line interface')) { | ||||
|             // zstd is not installed
 | ||||
|         core.debug(`zstd version: ${version}`); | ||||
|         if (versionOutput === '') { | ||||
|             return constants_1.CompressionMethod.Gzip; | ||||
|         } | ||||
|         else if (!version || semver.lt(version, 'v1.3.2')) { | ||||
|             // zstd is installed but using a version earlier than v1.3.2
 | ||||
|             // v1.3.2 is required to use the `--long` options in zstd
 | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|         else { | ||||
|             return constants_1.CompressionMethod.Zstd; | ||||
|             return constants_1.CompressionMethod.ZstdWithoutLong; | ||||
|         } | ||||
|     }); | ||||
| } | ||||
| @@ -4979,7 +4975,8 @@ var Inputs; | ||||
|     Inputs["RestoreKeys"] = "restore-keys"; | ||||
|     Inputs["UploadChunkSize"] = "upload-chunk-size"; | ||||
|     Inputs["EnableCrossOsArchive"] = "enableCrossOsArchive"; | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; // Input for cache, restore action
 | ||||
|     Inputs["FailOnCacheMiss"] = "fail-on-cache-miss"; | ||||
|     Inputs["LookupOnly"] = "lookup-only"; // Input for cache, restore action
 | ||||
| })(Inputs = exports.Inputs || (exports.Inputs = {})); | ||||
| var Outputs; | ||||
| (function (Outputs) { | ||||
| @@ -41866,7 +41863,8 @@ function getDownloadOptions(copy) { | ||||
|         useAzureSdk: true, | ||||
|         downloadConcurrency: 8, | ||||
|         timeoutInMs: 30000, | ||||
|         segmentTimeoutInMs: 3600000 | ||||
|         segmentTimeoutInMs: 3600000, | ||||
|         lookupOnly: false | ||||
|     }; | ||||
|     if (copy) { | ||||
|         if (typeof copy.useAzureSdk === 'boolean') { | ||||
| @@ -41881,6 +41879,9 @@ function getDownloadOptions(copy) { | ||||
|         if (typeof copy.segmentTimeoutInMs === 'number') { | ||||
|             result.segmentTimeoutInMs = copy.segmentTimeoutInMs; | ||||
|         } | ||||
|         if (typeof copy.lookupOnly === 'boolean') { | ||||
|             result.lookupOnly = copy.lookupOnly; | ||||
|         } | ||||
|     } | ||||
|     const segmentDownloadTimeoutMins = process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']; | ||||
|     if (segmentDownloadTimeoutMins && | ||||
| @@ -41893,6 +41894,7 @@ function getDownloadOptions(copy) { | ||||
|     core.debug(`Request timeout (ms): ${result.timeoutInMs}`); | ||||
|     core.debug(`Cache segment download timeout mins env var: ${process.env['SEGMENT_DOWNLOAD_TIMEOUT_MINS']}`); | ||||
|     core.debug(`Segment download timeout (ms): ${result.segmentTimeoutInMs}`); | ||||
|     core.debug(`Lookup only: ${result.lookupOnly}`); | ||||
|     return result; | ||||
| } | ||||
| exports.getDownloadOptions = getDownloadOptions; | ||||
| @@ -47370,6 +47372,10 @@ function restoreCache(paths, primaryKey, restoreKeys, options, enableCrossOsArch | ||||
|                 // Cache not found
 | ||||
|                 return undefined; | ||||
|             } | ||||
|             if (options === null || options === void 0 ? void 0 : options.lookupOnly) { | ||||
|                 core.info('Lookup only - skipping download'); | ||||
|                 return cacheEntry.cacheKey; | ||||
|             } | ||||
|             archivePath = path.join(yield utils.createTempDirectory(), utils.getCacheFileName(compressionMethod)); | ||||
|             core.debug(`Archive Path: ${archivePath}`); | ||||
|             // Download the cache from the cache entry
 | ||||
|   | ||||
							
								
								
									
										18
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										18
									
								
								package-lock.json
									
									
									
										generated
									
									
									
								
							| @@ -1,15 +1,15 @@ | ||||
| { | ||||
|   "name": "cache", | ||||
|   "version": "3.2.5", | ||||
|   "version": "3.3.0", | ||||
|   "lockfileVersion": 2, | ||||
|   "requires": true, | ||||
|   "packages": { | ||||
|     "": { | ||||
|       "name": "cache", | ||||
|       "version": "3.2.5", | ||||
|       "version": "3.3.0", | ||||
|       "license": "MIT", | ||||
|       "dependencies": { | ||||
|         "@actions/cache": "^3.1.3", | ||||
|         "@actions/cache": "^3.2.0", | ||||
|         "@actions/core": "^1.10.0", | ||||
|         "@actions/exec": "^1.1.1", | ||||
|         "@actions/io": "^1.1.2" | ||||
| @@ -36,9 +36,9 @@ | ||||
|       } | ||||
|     }, | ||||
|     "node_modules/@actions/cache": { | ||||
|       "version": "3.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.1.3.tgz", | ||||
|       "integrity": "sha512-5YbATJUS6nVs9EkpK7JaliC3G5koKdJT99NLreL0gJlznudzZzXGNIheW5+HUT9C2DBvubOxYIyfX4v2UpZWrA==", | ||||
|       "version": "3.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.0.tgz", | ||||
|       "integrity": "sha512-bCjN0+gPLaZZbpOoeK/1ve7J5MO+zv8FpcdKOWF3Tb9to0bWDpvgn9D2c/lC22oPUtHnCWQhLNVMfsWF4OBhNw==", | ||||
|       "dependencies": { | ||||
|         "@actions/core": "^1.10.0", | ||||
|         "@actions/exec": "^1.0.1", | ||||
| @@ -9722,9 +9722,9 @@ | ||||
|   }, | ||||
|   "dependencies": { | ||||
|     "@actions/cache": { | ||||
|       "version": "3.1.3", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.1.3.tgz", | ||||
|       "integrity": "sha512-5YbATJUS6nVs9EkpK7JaliC3G5koKdJT99NLreL0gJlznudzZzXGNIheW5+HUT9C2DBvubOxYIyfX4v2UpZWrA==", | ||||
|       "version": "3.2.0", | ||||
|       "resolved": "https://registry.npmjs.org/@actions/cache/-/cache-3.2.0.tgz", | ||||
|       "integrity": "sha512-bCjN0+gPLaZZbpOoeK/1ve7J5MO+zv8FpcdKOWF3Tb9to0bWDpvgn9D2c/lC22oPUtHnCWQhLNVMfsWF4OBhNw==", | ||||
|       "requires": { | ||||
|         "@actions/core": "^1.10.0", | ||||
|         "@actions/exec": "^1.0.1", | ||||
|   | ||||
| @@ -1,6 +1,6 @@ | ||||
| { | ||||
|   "name": "cache", | ||||
|   "version": "3.2.5", | ||||
|   "version": "3.3.0", | ||||
|   "private": true, | ||||
|   "description": "Cache dependencies and build outputs", | ||||
|   "main": "dist/restore/index.js", | ||||
| @@ -23,7 +23,7 @@ | ||||
|   "author": "GitHub", | ||||
|   "license": "MIT", | ||||
|   "dependencies": { | ||||
|     "@actions/cache": "^3.1.3", | ||||
|     "@actions/cache": "^3.2.0", | ||||
|     "@actions/core": "^1.10.0", | ||||
|     "@actions/exec": "^1.1.1", | ||||
|     "@actions/io": "^1.1.2" | ||||
|   | ||||
| @@ -9,7 +9,8 @@ The restore action restores a cache. It works similarly to the `cache` action ex | ||||
| * `key` - An explicit key for a cache entry. See [creating a cache key](../README.md#creating-a-cache-key). | ||||
| * `path` - A list of files, directories, and wildcard patterns to restore. See [`@actions/glob`](https://github.com/actions/toolkit/tree/main/packages/glob) for supported patterns. | ||||
| * `restore-keys` - An ordered list of prefix-matched keys to use for restoring stale cache if no cache hit occurred for key. | ||||
| * `fail-on-cache-miss` - Fail the workflow if cache entry is not found. Default: false | ||||
| * `fail-on-cache-miss` - Fail the workflow if cache entry is not found. Default: `false` | ||||
| * `lookup-only` - Check if a cache entry exists for the given input(s) (key, restore-keys) without downloading the cache. Default: `false` | ||||
|  | ||||
| ### Outputs | ||||
|  | ||||
|   | ||||
| @@ -19,6 +19,10 @@ inputs: | ||||
|     description: 'Fail the workflow if cache entry is not found' | ||||
|     default: 'false' | ||||
|     required: false | ||||
|   lookup-only: | ||||
|     description: 'Check if a cache entry exists for the given input(s) (key, restore-keys) without downloading the cache' | ||||
|     default: 'false' | ||||
|     required: false | ||||
| outputs: | ||||
|   cache-hit: | ||||
|     description: 'A boolean value to indicate an exact match was found for the primary key' | ||||
|   | ||||
| @@ -4,7 +4,8 @@ export enum Inputs { | ||||
|     RestoreKeys = "restore-keys", // Input for cache, restore action | ||||
|     UploadChunkSize = "upload-chunk-size", // Input for cache, save action | ||||
|     EnableCrossOsArchive = "enableCrossOsArchive", // Input for cache, restore, save action | ||||
|     FailOnCacheMiss = "fail-on-cache-miss" // Input for cache, restore action | ||||
|     FailOnCacheMiss = "fail-on-cache-miss", // Input for cache, restore action | ||||
|     LookupOnly = "lookup-only" // Input for cache, restore action | ||||
| } | ||||
|  | ||||
| export enum Outputs { | ||||
|   | ||||
| @@ -35,12 +35,13 @@ async function restoreImpl( | ||||
|             Inputs.EnableCrossOsArchive | ||||
|         ); | ||||
|         const failOnCacheMiss = utils.getInputAsBool(Inputs.FailOnCacheMiss); | ||||
|         const lookupOnly = utils.getInputAsBool(Inputs.LookupOnly); | ||||
|  | ||||
|         const cacheKey = await cache.restoreCache( | ||||
|             cachePaths, | ||||
|             primaryKey, | ||||
|             restoreKeys, | ||||
|             {}, | ||||
|             { lookupOnly: lookupOnly }, | ||||
|             enableCrossOsArchive | ||||
|         ); | ||||
|  | ||||
| @@ -69,7 +70,11 @@ async function restoreImpl( | ||||
|         ); | ||||
|  | ||||
|         core.setOutput(Outputs.CacheHit, isExactKeyMatch.toString()); | ||||
|         core.info(`Cache restored from key: ${cacheKey}`); | ||||
|         if (lookupOnly) { | ||||
|             core.info(`Cache found and can be restored from key: ${cacheKey}`); | ||||
|         } else { | ||||
|             core.info(`Cache restored from key: ${cacheKey}`); | ||||
|         } | ||||
|  | ||||
|         return cacheKey; | ||||
|     } catch (error: unknown) { | ||||
|   | ||||
| @@ -15,6 +15,7 @@ interface CacheInput { | ||||
|     restoreKeys?: string[]; | ||||
|     enableCrossOsArchive?: boolean; | ||||
|     failOnCacheMiss?: boolean; | ||||
|     lookupOnly?: boolean; | ||||
| } | ||||
|  | ||||
| export function setInputs(input: CacheInput): void { | ||||
| @@ -29,6 +30,8 @@ export function setInputs(input: CacheInput): void { | ||||
|         ); | ||||
|     input.failOnCacheMiss !== undefined && | ||||
|         setInput(Inputs.FailOnCacheMiss, input.failOnCacheMiss.toString()); | ||||
|     input.lookupOnly !== undefined && | ||||
|         setInput(Inputs.LookupOnly, input.lookupOnly.toString()); | ||||
| } | ||||
|  | ||||
| export function clearInputs(): void { | ||||
| @@ -38,4 +41,5 @@ export function clearInputs(): void { | ||||
|     delete process.env[getInputName(Inputs.UploadChunkSize)]; | ||||
|     delete process.env[getInputName(Inputs.EnableCrossOsArchive)]; | ||||
|     delete process.env[getInputName(Inputs.FailOnCacheMiss)]; | ||||
|     delete process.env[getInputName(Inputs.LookupOnly)]; | ||||
| } | ||||
|   | ||||
| @@ -44,6 +44,11 @@ on: | ||||
| jobs: | ||||
|   cleanup: | ||||
|     runs-on: ubuntu-latest | ||||
|     permissions: | ||||
|       # `actions:write` permission is required to delete caches | ||||
|       #   See also: https://docs.github.com/en/rest/actions/cache?apiVersion=2022-11-28#delete-a-github-actions-cache-for-a-repository-using-a-cache-id | ||||
|       actions: write | ||||
|       contents: read | ||||
|     steps: | ||||
|       - name: Check out code | ||||
|         uses: actions/checkout@v3 | ||||
| @@ -53,7 +58,7 @@ jobs: | ||||
|           gh extension install actions/gh-actions-cache | ||||
|            | ||||
|           REPO=${{ github.repository }} | ||||
|           BRANCH=${{ github.ref }} | ||||
|           BRANCH=refs/pull/${{ github.event.pull_request.number }}/merge | ||||
|  | ||||
|           echo "Fetching list of cache key" | ||||
|           cacheKeysForPR=$(gh actions-cache list -R $REPO -B $BRANCH | cut -f 1 ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user