mirror of
https://github.com/actions/cache.git
synced 2024-11-25 11:01:24 +01:00
Merge pull request #343 from actions/improve-string-split
Improve string split to handle whitespace
This commit is contained in:
commit
ff937cc950
8 changed files with 95 additions and 27 deletions
|
@ -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…
Reference in a new issue