mirror of
				https://github.com/actions/cache.git
				synced 2025-10-31 18:34:19 +08:00 
			
		
		
		
	Merge pull request #343 from actions/improve-string-split
Improve string split to handle whitespace
This commit is contained in:
		
						commit
						ff937cc950
					
				| @ -2,9 +2,16 @@ import * as core from "@actions/core"; | |||||||
| 
 | 
 | ||||||
| import { Events, Outputs, RefKey, State } from "../src/constants"; | import { Events, Outputs, RefKey, State } from "../src/constants"; | ||||||
| import * as actionUtils from "../src/utils/actionUtils"; | import * as actionUtils from "../src/utils/actionUtils"; | ||||||
|  | import * as testUtils from "../src/utils/testUtils"; | ||||||
| 
 | 
 | ||||||
| jest.mock("@actions/core"); | jest.mock("@actions/core"); | ||||||
| 
 | 
 | ||||||
|  | beforeAll(() => { | ||||||
|  |     jest.spyOn(core, "getInput").mockImplementation((name, options) => { | ||||||
|  |         return jest.requireActual("@actions/core").getInput(name, options); | ||||||
|  |     }); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
| afterEach(() => { | afterEach(() => { | ||||||
|     delete process.env[Events.Key]; |     delete process.env[Events.Key]; | ||||||
|     delete process.env[RefKey]; |     delete process.env[RefKey]; | ||||||
| @ -157,3 +164,33 @@ test("isValidEvent returns true for event that has a ref", () => { | |||||||
| 
 | 
 | ||||||
|     expect(isValidEvent).toBe(true); |     expect(isValidEvent).toBe(true); | ||||||
| }); | }); | ||||||
|  | 
 | ||||||
|  | test("getInputAsArray returns empty array if not required and missing", () => { | ||||||
|  |     expect(actionUtils.getInputAsArray("foo")).toEqual([]); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test("getInputAsArray throws error if required and missing", () => { | ||||||
|  |     expect(() => | ||||||
|  |         actionUtils.getInputAsArray("foo", { required: true }) | ||||||
|  |     ).toThrowError(); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test("getInputAsArray handles single line correctly", () => { | ||||||
|  |     testUtils.setInput("foo", "bar"); | ||||||
|  |     expect(actionUtils.getInputAsArray("foo")).toEqual(["bar"]); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test("getInputAsArray handles multiple lines correctly", () => { | ||||||
|  |     testUtils.setInput("foo", "bar\nbaz"); | ||||||
|  |     expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test("getInputAsArray handles different new lines correctly", () => { | ||||||
|  |     testUtils.setInput("foo", "bar\r\nbaz"); | ||||||
|  |     expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | test("getInputAsArray handles empty lines correctly", () => { | ||||||
|  |     testUtils.setInput("foo", "\n\nbar\n\nbaz\n\n"); | ||||||
|  |     expect(actionUtils.getInputAsArray("foo")).toEqual(["bar", "baz"]); | ||||||
|  | }); | ||||||
|  | |||||||
| @ -20,6 +20,13 @@ beforeAll(() => { | |||||||
|         const actualUtils = jest.requireActual("../src/utils/actionUtils"); |         const actualUtils = jest.requireActual("../src/utils/actionUtils"); | ||||||
|         return actualUtils.isValidEvent(); |         return actualUtils.isValidEvent(); | ||||||
|     }); |     }); | ||||||
|  | 
 | ||||||
|  |     jest.spyOn(actionUtils, "getInputAsArray").mockImplementation( | ||||||
|  |         (name, options) => { | ||||||
|  |             const actualUtils = jest.requireActual("../src/utils/actionUtils"); | ||||||
|  |             return actualUtils.getInputAsArray(name, options); | ||||||
|  |         } | ||||||
|  |     ); | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| beforeEach(() => { | beforeEach(() => { | ||||||
|  | |||||||
| @ -19,6 +19,14 @@ beforeAll(() => { | |||||||
|         return jest.requireActual("../src/utils/actionUtils").getCacheState(); |         return jest.requireActual("../src/utils/actionUtils").getCacheState(); | ||||||
|     }); |     }); | ||||||
| 
 | 
 | ||||||
|  |     jest.spyOn(actionUtils, "getInputAsArray").mockImplementation( | ||||||
|  |         (name, options) => { | ||||||
|  |             return jest | ||||||
|  |                 .requireActual("../src/utils/actionUtils") | ||||||
|  |                 .getInputAsArray(name, options); | ||||||
|  |         } | ||||||
|  |     ); | ||||||
|  | 
 | ||||||
|     jest.spyOn(actionUtils, "isExactKeyMatch").mockImplementation( |     jest.spyOn(actionUtils, "isExactKeyMatch").mockImplementation( | ||||||
|         (key, cacheResult) => { |         (key, cacheResult) => { | ||||||
|             return jest |             return jest | ||||||
|  | |||||||
							
								
								
									
										22
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										22
									
								
								dist/restore/index.js
									
									
									
									
										vendored
									
									
								
							| @ -5306,7 +5306,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | |||||||
|     return result; |     return result; | ||||||
| }; | }; | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); | Object.defineProperty(exports, "__esModule", { value: true }); | ||||||
| exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0; | exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0; | ||||||
| const core = __importStar(__webpack_require__(470)); | const core = __importStar(__webpack_require__(470)); | ||||||
| const constants_1 = __webpack_require__(694); | const constants_1 = __webpack_require__(694); | ||||||
| function isExactKeyMatch(key, cacheKey) { | function isExactKeyMatch(key, cacheKey) { | ||||||
| @ -5350,6 +5350,14 @@ function isValidEvent() { | |||||||
|     return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]); |     return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]); | ||||||
| } | } | ||||||
| exports.isValidEvent = isValidEvent; | exports.isValidEvent = isValidEvent; | ||||||
|  | function getInputAsArray(name, options) { | ||||||
|  |     return core | ||||||
|  |         .getInput(name, options) | ||||||
|  |         .split("\n") | ||||||
|  |         .map(s => s.trim()) | ||||||
|  |         .filter(x => x !== ""); | ||||||
|  | } | ||||||
|  | exports.getInputAsArray = getInputAsArray; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /***/ }), | /***/ }), | ||||||
| @ -6835,14 +6843,10 @@ function run() { | |||||||
|             } |             } | ||||||
|             const primaryKey = core.getInput(constants_1.Inputs.Key, { required: true }); |             const primaryKey = core.getInput(constants_1.Inputs.Key, { required: true }); | ||||||
|             core.saveState(constants_1.State.CachePrimaryKey, primaryKey); |             core.saveState(constants_1.State.CachePrimaryKey, primaryKey); | ||||||
|             const restoreKeys = core |             const restoreKeys = utils.getInputAsArray(constants_1.Inputs.RestoreKeys); | ||||||
|                 .getInput(constants_1.Inputs.RestoreKeys) |             const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, { | ||||||
|                 .split("\n") |                 required: true | ||||||
|                 .filter(x => x !== ""); |             }); | ||||||
|             const cachePaths = core |  | ||||||
|                 .getInput(constants_1.Inputs.Path, { required: true }) |  | ||||||
|                 .split("\n") |  | ||||||
|                 .filter(x => x !== ""); |  | ||||||
|             try { |             try { | ||||||
|                 const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys); |                 const cacheKey = yield cache.restoreCache(cachePaths, primaryKey, restoreKeys); | ||||||
|                 if (!cacheKey) { |                 if (!cacheKey) { | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								dist/save/index.js
									
									
									
									
										vendored
									
									
								
							| @ -5306,7 +5306,7 @@ var __importStar = (this && this.__importStar) || function (mod) { | |||||||
|     return result; |     return result; | ||||||
| }; | }; | ||||||
| Object.defineProperty(exports, "__esModule", { value: true }); | Object.defineProperty(exports, "__esModule", { value: true }); | ||||||
| exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0; | exports.getInputAsArray = exports.isValidEvent = exports.logWarning = exports.getCacheState = exports.setOutputAndState = exports.setCacheHitOutput = exports.setCacheState = exports.isExactKeyMatch = void 0; | ||||||
| const core = __importStar(__webpack_require__(470)); | const core = __importStar(__webpack_require__(470)); | ||||||
| const constants_1 = __webpack_require__(694); | const constants_1 = __webpack_require__(694); | ||||||
| function isExactKeyMatch(key, cacheKey) { | function isExactKeyMatch(key, cacheKey) { | ||||||
| @ -5350,6 +5350,14 @@ function isValidEvent() { | |||||||
|     return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]); |     return constants_1.RefKey in process.env && Boolean(process.env[constants_1.RefKey]); | ||||||
| } | } | ||||||
| exports.isValidEvent = isValidEvent; | exports.isValidEvent = isValidEvent; | ||||||
|  | function getInputAsArray(name, options) { | ||||||
|  |     return core | ||||||
|  |         .getInput(name, options) | ||||||
|  |         .split("\n") | ||||||
|  |         .map(s => s.trim()) | ||||||
|  |         .filter(x => x !== ""); | ||||||
|  | } | ||||||
|  | exports.getInputAsArray = getInputAsArray; | ||||||
| 
 | 
 | ||||||
| 
 | 
 | ||||||
| /***/ }), | /***/ }), | ||||||
| @ -6600,10 +6608,9 @@ function run() { | |||||||
|                 core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`); |                 core.info(`Cache hit occurred on the primary key ${primaryKey}, not saving cache.`); | ||||||
|                 return; |                 return; | ||||||
|             } |             } | ||||||
|             const cachePaths = core |             const cachePaths = utils.getInputAsArray(constants_1.Inputs.Path, { | ||||||
|                 .getInput(constants_1.Inputs.Path, { required: true }) |                 required: true | ||||||
|                 .split("\n") |             }); | ||||||
|                 .filter(x => x !== ""); |  | ||||||
|             try { |             try { | ||||||
|                 yield cache.saveCache(cachePaths, primaryKey); |                 yield cache.saveCache(cachePaths, primaryKey); | ||||||
|             } |             } | ||||||
|  | |||||||
| @ -19,15 +19,10 @@ async function run(): Promise<void> { | |||||||
|         const primaryKey = core.getInput(Inputs.Key, { required: true }); |         const primaryKey = core.getInput(Inputs.Key, { required: true }); | ||||||
|         core.saveState(State.CachePrimaryKey, primaryKey); |         core.saveState(State.CachePrimaryKey, primaryKey); | ||||||
| 
 | 
 | ||||||
|         const restoreKeys = core |         const restoreKeys = utils.getInputAsArray(Inputs.RestoreKeys); | ||||||
|             .getInput(Inputs.RestoreKeys) |         const cachePaths = utils.getInputAsArray(Inputs.Path, { | ||||||
|             .split("\n") |             required: true | ||||||
|             .filter(x => x !== ""); |         }); | ||||||
| 
 |  | ||||||
|         const cachePaths = core |  | ||||||
|             .getInput(Inputs.Path, { required: true }) |  | ||||||
|             .split("\n") |  | ||||||
|             .filter(x => x !== ""); |  | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|             const cacheKey = await cache.restoreCache( |             const cacheKey = await cache.restoreCache( | ||||||
|  | |||||||
| @ -31,10 +31,9 @@ async function run(): Promise<void> { | |||||||
|             return; |             return; | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         const cachePaths = core |         const cachePaths = utils.getInputAsArray(Inputs.Path, { | ||||||
|             .getInput(Inputs.Path, { required: true }) |             required: true | ||||||
|             .split("\n") |         }); | ||||||
|             .filter(x => x !== ""); |  | ||||||
| 
 | 
 | ||||||
|         try { |         try { | ||||||
|             await cache.saveCache(cachePaths, primaryKey); |             await cache.saveCache(cachePaths, primaryKey); | ||||||
|  | |||||||
| @ -45,3 +45,14 @@ export function logWarning(message: string): void { | |||||||
| export function isValidEvent(): boolean { | export function isValidEvent(): boolean { | ||||||
|     return RefKey in process.env && Boolean(process.env[RefKey]); |     return RefKey in process.env && Boolean(process.env[RefKey]); | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | export function getInputAsArray( | ||||||
|  |     name: string, | ||||||
|  |     options?: core.InputOptions | ||||||
|  | ): string[] { | ||||||
|  |     return core | ||||||
|  |         .getInput(name, options) | ||||||
|  |         .split("\n") | ||||||
|  |         .map(s => s.trim()) | ||||||
|  |         .filter(x => x !== ""); | ||||||
|  | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 David Hadka
						David Hadka