Add getFileOidsUnderPath() tests
This commit is contained in:
parent
6be6984cc1
commit
9825184a0a
6 changed files with 179 additions and 14 deletions
24
lib/git-utils.js
generated
24
lib/git-utils.js
generated
|
|
@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
|
||||||
};
|
};
|
||||||
})();
|
})();
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
exports.getFileOidsUnderPath = exports.getGitRoot = exports.decodeGitFilePath = exports.gitRepack = exports.gitFetch = exports.deepenGitHistory = exports.determineBaseBranchHeadCommitOid = exports.getCommitOid = void 0;
|
exports.getFileOidsUnderPath = exports.getGitRoot = exports.decodeGitFilePath = exports.gitRepack = exports.gitFetch = exports.deepenGitHistory = exports.determineBaseBranchHeadCommitOid = exports.getCommitOid = exports.runGitCommand = void 0;
|
||||||
exports.getRef = getRef;
|
exports.getRef = getRef;
|
||||||
exports.isAnalyzingDefaultBranch = isAnalyzingDefaultBranch;
|
exports.isAnalyzingDefaultBranch = isAnalyzingDefaultBranch;
|
||||||
const core = __importStar(require("@actions/core"));
|
const core = __importStar(require("@actions/core"));
|
||||||
|
|
@ -41,7 +41,7 @@ const toolrunner = __importStar(require("@actions/exec/lib/toolrunner"));
|
||||||
const io = __importStar(require("@actions/io"));
|
const io = __importStar(require("@actions/io"));
|
||||||
const actions_util_1 = require("./actions-util");
|
const actions_util_1 = require("./actions-util");
|
||||||
const util_1 = require("./util");
|
const util_1 = require("./util");
|
||||||
async function runGitCommand(workingDirectory, args, customErrorMessage) {
|
const runGitCommand = async function (workingDirectory, args, customErrorMessage) {
|
||||||
let stdout = "";
|
let stdout = "";
|
||||||
let stderr = "";
|
let stderr = "";
|
||||||
core.debug(`Running git command: git ${args.join(" ")}`);
|
core.debug(`Running git command: git ${args.join(" ")}`);
|
||||||
|
|
@ -69,7 +69,8 @@ async function runGitCommand(workingDirectory, args, customErrorMessage) {
|
||||||
core.info(`git call failed. ${customErrorMessage} Error: ${reason}`);
|
core.info(`git call failed. ${customErrorMessage} Error: ${reason}`);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
exports.runGitCommand = runGitCommand;
|
||||||
/**
|
/**
|
||||||
* Gets the SHA of the commit that is currently checked out.
|
* Gets the SHA of the commit that is currently checked out.
|
||||||
*/
|
*/
|
||||||
|
|
@ -82,7 +83,7 @@ const getCommitOid = async function (checkoutPath, ref = "HEAD") {
|
||||||
// Even if this does go wrong, it's not a huge problem for the alerts to
|
// Even if this does go wrong, it's not a huge problem for the alerts to
|
||||||
// reported on the merge commit.
|
// reported on the merge commit.
|
||||||
try {
|
try {
|
||||||
const stdout = await runGitCommand(checkoutPath, ["rev-parse", ref], "Continuing with commit SHA from user input or environment.");
|
const stdout = await (0, exports.runGitCommand)(checkoutPath, ["rev-parse", ref], "Continuing with commit SHA from user input or environment.");
|
||||||
return stdout.trim();
|
return stdout.trim();
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
@ -106,7 +107,7 @@ const determineBaseBranchHeadCommitOid = async function (checkoutPathOverride) {
|
||||||
let commitOid = "";
|
let commitOid = "";
|
||||||
let baseOid = "";
|
let baseOid = "";
|
||||||
let headOid = "";
|
let headOid = "";
|
||||||
const stdout = await runGitCommand(checkoutPath, ["show", "-s", "--format=raw", mergeSha], "Will calculate the base branch SHA on the server.");
|
const stdout = await (0, exports.runGitCommand)(checkoutPath, ["show", "-s", "--format=raw", mergeSha], "Will calculate the base branch SHA on the server.");
|
||||||
for (const data of stdout.split("\n")) {
|
for (const data of stdout.split("\n")) {
|
||||||
if (data.startsWith("commit ") && commitOid === "") {
|
if (data.startsWith("commit ") && commitOid === "") {
|
||||||
commitOid = data.substring(7);
|
commitOid = data.substring(7);
|
||||||
|
|
@ -141,7 +142,7 @@ exports.determineBaseBranchHeadCommitOid = determineBaseBranchHeadCommitOid;
|
||||||
*/
|
*/
|
||||||
const deepenGitHistory = async function () {
|
const deepenGitHistory = async function () {
|
||||||
try {
|
try {
|
||||||
await runGitCommand((0, actions_util_1.getOptionalInput)("checkout_path"), [
|
await (0, exports.runGitCommand)((0, actions_util_1.getOptionalInput)("checkout_path"), [
|
||||||
"fetch",
|
"fetch",
|
||||||
"origin",
|
"origin",
|
||||||
"HEAD",
|
"HEAD",
|
||||||
|
|
@ -163,7 +164,7 @@ exports.deepenGitHistory = deepenGitHistory;
|
||||||
*/
|
*/
|
||||||
const gitFetch = async function (branch, extraFlags) {
|
const gitFetch = async function (branch, extraFlags) {
|
||||||
try {
|
try {
|
||||||
await runGitCommand((0, actions_util_1.getOptionalInput)("checkout_path"), ["fetch", "--no-tags", ...extraFlags, "origin", `${branch}:${branch}`], `Cannot fetch ${branch}.`);
|
await (0, exports.runGitCommand)((0, actions_util_1.getOptionalInput)("checkout_path"), ["fetch", "--no-tags", ...extraFlags, "origin", `${branch}:${branch}`], `Cannot fetch ${branch}.`);
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
// Errors are already logged by runGitCommand()
|
// Errors are already logged by runGitCommand()
|
||||||
|
|
@ -178,7 +179,7 @@ exports.gitFetch = gitFetch;
|
||||||
*/
|
*/
|
||||||
const gitRepack = async function (flags) {
|
const gitRepack = async function (flags) {
|
||||||
try {
|
try {
|
||||||
await runGitCommand((0, actions_util_1.getOptionalInput)("checkout_path"), ["repack", ...flags], "Cannot repack the repository.");
|
await (0, exports.runGitCommand)((0, actions_util_1.getOptionalInput)("checkout_path"), ["repack", ...flags], "Cannot repack the repository.");
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
// Errors are already logged by runGitCommand()
|
// Errors are already logged by runGitCommand()
|
||||||
|
|
@ -238,7 +239,7 @@ exports.decodeGitFilePath = decodeGitFilePath;
|
||||||
*/
|
*/
|
||||||
const getGitRoot = async function (sourceRoot) {
|
const getGitRoot = async function (sourceRoot) {
|
||||||
try {
|
try {
|
||||||
const stdout = await runGitCommand(sourceRoot, ["rev-parse", "--show-toplevel"], `Cannot find Git repository root from the source root ${sourceRoot}.`);
|
const stdout = await (0, exports.runGitCommand)(sourceRoot, ["rev-parse", "--show-toplevel"], `Cannot find Git repository root from the source root ${sourceRoot}.`);
|
||||||
return stdout.trim();
|
return stdout.trim();
|
||||||
}
|
}
|
||||||
catch {
|
catch {
|
||||||
|
|
@ -260,8 +261,11 @@ exports.getGitRoot = getGitRoot;
|
||||||
const getFileOidsUnderPath = async function (basePath) {
|
const getFileOidsUnderPath = async function (basePath) {
|
||||||
// Without the --full-name flag, the path is relative to the current working
|
// Without the --full-name flag, the path is relative to the current working
|
||||||
// directory of the git command, which is basePath.
|
// directory of the git command, which is basePath.
|
||||||
const stdout = await runGitCommand(basePath, ["ls-files", "--recurse-submodules", "--format=%(objectname)_%(path)"], "Cannot list Git OIDs of tracked files.");
|
const stdout = await (0, exports.runGitCommand)(basePath, ["ls-files", "--recurse-submodules", "--format=%(objectname)_%(path)"], "Cannot list Git OIDs of tracked files.");
|
||||||
const fileOidMap = {};
|
const fileOidMap = {};
|
||||||
|
// With --format=%(objectname)_%(path), the output is a list of lines like:
|
||||||
|
// 30d998ded095371488be3a729eb61d86ed721a18_lib/git-utils.js
|
||||||
|
// d89514599a9a99f22b4085766d40af7b99974827_lib/git-utils.js.map
|
||||||
const regex = /^([0-9a-f]{40})_(.+)$/;
|
const regex = /^([0-9a-f]{40})_(.+)$/;
|
||||||
for (const line of stdout.split("\n")) {
|
for (const line of stdout.split("\n")) {
|
||||||
if (line) {
|
if (line) {
|
||||||
|
|
|
||||||
File diff suppressed because one or more lines are too long
71
lib/git-utils.test.js
generated
71
lib/git-utils.test.js
generated
|
|
@ -265,4 +265,75 @@ const util_1 = require("./util");
|
||||||
t.deepEqual(gitUtils.decodeGitFilePath('"foo\\vbar"'), "foo\vbar");
|
t.deepEqual(gitUtils.decodeGitFilePath('"foo\\vbar"'), "foo\vbar");
|
||||||
t.deepEqual(gitUtils.decodeGitFilePath('"\\a\\b\\f\\n\\r\\t\\v"'), "\x07\b\f\n\r\t\v");
|
t.deepEqual(gitUtils.decodeGitFilePath('"\\a\\b\\f\\n\\r\\t\\v"'), "\x07\b\f\n\r\t\v");
|
||||||
});
|
});
|
||||||
|
(0, ava_1.default)("getFileOidsUnderPath returns correct file mapping", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils, "runGitCommand")
|
||||||
|
.resolves("30d998ded095371488be3a729eb61d86ed721a18_lib/git-utils.js\n" +
|
||||||
|
"d89514599a9a99f22b4085766d40af7b99974827_lib/git-utils.js.map\n" +
|
||||||
|
"a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96_src/git-utils.ts");
|
||||||
|
try {
|
||||||
|
const result = await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
t.deepEqual(result, {
|
||||||
|
"lib/git-utils.js": "30d998ded095371488be3a729eb61d86ed721a18",
|
||||||
|
"lib/git-utils.js.map": "d89514599a9a99f22b4085766d40af7b99974827",
|
||||||
|
"src/git-utils.ts": "a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96",
|
||||||
|
});
|
||||||
|
t.deepEqual(runGitCommandStub.firstCall.args, [
|
||||||
|
"/fake/path",
|
||||||
|
["ls-files", "--recurse-submodules", "--format=%(objectname)_%(path)"],
|
||||||
|
"Cannot list Git OIDs of tracked files.",
|
||||||
|
]);
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
(0, ava_1.default)("getFileOidsUnderPath handles quoted paths", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils, "runGitCommand")
|
||||||
|
.resolves("30d998ded095371488be3a729eb61d86ed721a18_lib/normal-file.js\n" +
|
||||||
|
'd89514599a9a99f22b4085766d40af7b99974827_"lib/file with spaces.js"\n' +
|
||||||
|
'a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96_"lib/file\\twith\\ttabs.js"');
|
||||||
|
try {
|
||||||
|
const result = await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
t.deepEqual(result, {
|
||||||
|
"lib/normal-file.js": "30d998ded095371488be3a729eb61d86ed721a18",
|
||||||
|
"lib/file with spaces.js": "d89514599a9a99f22b4085766d40af7b99974827",
|
||||||
|
"lib/file\twith\ttabs.js": "a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96",
|
||||||
|
});
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
(0, ava_1.default)("getFileOidsUnderPath handles empty output", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils, "runGitCommand")
|
||||||
|
.resolves("");
|
||||||
|
try {
|
||||||
|
const result = await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
t.deepEqual(result, {});
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
(0, ava_1.default)("getFileOidsUnderPath throws on unexpected output format", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils, "runGitCommand")
|
||||||
|
.resolves("30d998ded095371488be3a729eb61d86ed721a18_lib/git-utils.js\n" +
|
||||||
|
"invalid-line-format\n" +
|
||||||
|
"a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96_src/git-utils.ts");
|
||||||
|
try {
|
||||||
|
await t.throwsAsync(async () => {
|
||||||
|
await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
}, {
|
||||||
|
instanceOf: Error,
|
||||||
|
message: 'Unexpected "git ls-files" output: invalid-line-format',
|
||||||
|
});
|
||||||
|
}
|
||||||
|
finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
//# sourceMappingURL=git-utils.test.js.map
|
//# sourceMappingURL=git-utils.test.js.map
|
||||||
File diff suppressed because one or more lines are too long
|
|
@ -305,3 +305,90 @@ test("decodeGitFilePath quoted strings", async (t) => {
|
||||||
"\x07\b\f\n\r\t\v",
|
"\x07\b\f\n\r\t\v",
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
test("getFileOidsUnderPath returns correct file mapping", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils as any, "runGitCommand")
|
||||||
|
.resolves(
|
||||||
|
"30d998ded095371488be3a729eb61d86ed721a18_lib/git-utils.js\n" +
|
||||||
|
"d89514599a9a99f22b4085766d40af7b99974827_lib/git-utils.js.map\n" +
|
||||||
|
"a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96_src/git-utils.ts",
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
|
||||||
|
t.deepEqual(result, {
|
||||||
|
"lib/git-utils.js": "30d998ded095371488be3a729eb61d86ed721a18",
|
||||||
|
"lib/git-utils.js.map": "d89514599a9a99f22b4085766d40af7b99974827",
|
||||||
|
"src/git-utils.ts": "a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96",
|
||||||
|
});
|
||||||
|
|
||||||
|
t.deepEqual(runGitCommandStub.firstCall.args, [
|
||||||
|
"/fake/path",
|
||||||
|
["ls-files", "--recurse-submodules", "--format=%(objectname)_%(path)"],
|
||||||
|
"Cannot list Git OIDs of tracked files.",
|
||||||
|
]);
|
||||||
|
} finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getFileOidsUnderPath handles quoted paths", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils as any, "runGitCommand")
|
||||||
|
.resolves(
|
||||||
|
"30d998ded095371488be3a729eb61d86ed721a18_lib/normal-file.js\n" +
|
||||||
|
'd89514599a9a99f22b4085766d40af7b99974827_"lib/file with spaces.js"\n' +
|
||||||
|
'a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96_"lib/file\\twith\\ttabs.js"',
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
|
||||||
|
t.deepEqual(result, {
|
||||||
|
"lib/normal-file.js": "30d998ded095371488be3a729eb61d86ed721a18",
|
||||||
|
"lib/file with spaces.js": "d89514599a9a99f22b4085766d40af7b99974827",
|
||||||
|
"lib/file\twith\ttabs.js": "a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96",
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getFileOidsUnderPath handles empty output", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils as any, "runGitCommand")
|
||||||
|
.resolves("");
|
||||||
|
|
||||||
|
try {
|
||||||
|
const result = await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
t.deepEqual(result, {});
|
||||||
|
} finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
test("getFileOidsUnderPath throws on unexpected output format", async (t) => {
|
||||||
|
const runGitCommandStub = sinon
|
||||||
|
.stub(gitUtils as any, "runGitCommand")
|
||||||
|
.resolves(
|
||||||
|
"30d998ded095371488be3a729eb61d86ed721a18_lib/git-utils.js\n" +
|
||||||
|
"invalid-line-format\n" +
|
||||||
|
"a47c11f5bfdca7661942d2c8f1b7209fb0dfdf96_src/git-utils.ts",
|
||||||
|
);
|
||||||
|
|
||||||
|
try {
|
||||||
|
await t.throwsAsync(
|
||||||
|
async () => {
|
||||||
|
await gitUtils.getFileOidsUnderPath("/fake/path");
|
||||||
|
},
|
||||||
|
{
|
||||||
|
instanceOf: Error,
|
||||||
|
message: 'Unexpected "git ls-files" output: invalid-line-format',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
} finally {
|
||||||
|
runGitCommandStub.restore();
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@ import {
|
||||||
} from "./actions-util";
|
} from "./actions-util";
|
||||||
import { ConfigurationError, getRequiredEnvParam } from "./util";
|
import { ConfigurationError, getRequiredEnvParam } from "./util";
|
||||||
|
|
||||||
async function runGitCommand(
|
export const runGitCommand = async function (
|
||||||
workingDirectory: string | undefined,
|
workingDirectory: string | undefined,
|
||||||
args: string[],
|
args: string[],
|
||||||
customErrorMessage: string,
|
customErrorMessage: string,
|
||||||
|
|
@ -40,7 +40,7 @@ async function runGitCommand(
|
||||||
core.info(`git call failed. ${customErrorMessage} Error: ${reason}`);
|
core.info(`git call failed. ${customErrorMessage} Error: ${reason}`);
|
||||||
throw error;
|
throw error;
|
||||||
}
|
}
|
||||||
}
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Gets the SHA of the commit that is currently checked out.
|
* Gets the SHA of the commit that is currently checked out.
|
||||||
|
|
@ -275,6 +275,9 @@ export const getFileOidsUnderPath = async function (
|
||||||
);
|
);
|
||||||
|
|
||||||
const fileOidMap: { [key: string]: string } = {};
|
const fileOidMap: { [key: string]: string } = {};
|
||||||
|
// With --format=%(objectname)_%(path), the output is a list of lines like:
|
||||||
|
// 30d998ded095371488be3a729eb61d86ed721a18_lib/git-utils.js
|
||||||
|
// d89514599a9a99f22b4085766d40af7b99974827_lib/git-utils.js.map
|
||||||
const regex = /^([0-9a-f]{40})_(.+)$/;
|
const regex = /^([0-9a-f]{40})_(.+)$/;
|
||||||
for (const line of stdout.split("\n")) {
|
for (const line of stdout.split("\n")) {
|
||||||
if (line) {
|
if (line) {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue