turbo-gulp
Version:
Gulp tasks to boost high-quality projects.
89 lines (87 loc) • 13.3 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const incident_1 = require("incident");
const node_async_1 = require("./node-async");
async function execGit(cmd, args = [], options) {
return new node_async_1.SpawnedProcess("git", [cmd, ...args], Object.assign({ stdio: "pipe" }, options)).toPromise();
}
exports.execGit = execGit;
async function assertCleanBranch(allowedBranches) {
let stdout;
stdout = (await execGit("symbolic-ref", ["HEAD"])).stdout;
let onAllowedBranch = false;
for (const branch of allowedBranches) {
if (stdout.toString("utf8").trim() === `refs/heads/${branch}`) {
onAllowedBranch = true;
}
}
if (!onAllowedBranch) {
throw new Error(`HEAD must be on one of the branches: ${JSON.stringify(allowedBranches)}`);
}
stdout = (await execGit("status", ["--porcelain"])).stdout;
if (stdout.toString("utf8").trim().length > 0) {
throw new Error("Working copy is dirty");
}
}
exports.assertCleanBranch = assertCleanBranch;
/**
* Get the hash of the HEAD commit.
*
* @return The hash of the HEAD commit.
*/
async function getHeadHash() {
return (await execGit("rev-parse", ["--verify", "HEAD"])).stdout.toString("utf8").trim();
}
exports.getHeadHash = getHeadHash;
async function tagExists(tag) {
return (await execGit("tag", ["-l", tag])).stdout.toString("utf8").trim().length > 0;
}
exports.tagExists = tagExists;
/**
* Clone a repository into a new directory
*/
async function gitClone(options) {
const args = [];
if (options.branch !== undefined) {
args.push("--branch", options.branch);
}
if (options.depth !== undefined) {
args.push("--depth", options.depth.toString(10));
}
args.push(options.repository, options.directory);
const result = await execGit("clone", args);
if (result.exit.type === "code" && result.exit.code !== 0) {
throw new incident_1.Incident("GitClone", { options, result }, result.stderr.toString("utf8"));
}
}
exports.gitClone = gitClone;
/**
* Clone a repository into a new directory
*/
async function gitAdd(options) {
const args = ["--", ...options.paths];
const result = await execGit("add", args, { cwd: options.repository });
if (result.exit.type === "code" && result.exit.code !== 0) {
throw new incident_1.Incident("GitAdd", { options, result }, result.stderr.toString("utf8"));
}
}
exports.gitAdd = gitAdd;
async function gitCommit(options) {
const args = ["-m", options.message];
if (options.author !== undefined) {
args.push("--author", options.author);
}
const result = await execGit("commit", args, { cwd: options.repository });
if (result.exit.type === "code" && result.exit.code !== 0) {
throw new incident_1.Incident("GitCommit", { options, result }, result.stderr.toString("utf8"));
}
}
exports.gitCommit = gitCommit;
async function gitPush(options) {
const result = await execGit("push", [options.remote], { cwd: options.local });
if (result.exit.type === "code" && result.exit.code !== 0) {
throw new incident_1.Incident("GitPush", { options, result }, result.stderr.toString("utf8"));
}
}
exports.gitPush = gitPush;
//# sourceMappingURL=data:application/json;charset=utf8;base64,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Q0FBQztBQUNILENBQUM7QUFMRCwwQkFLQyIsImZpbGUiOiJ1dGlscy9naXQuanMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBJbmNpZGVudCB9IGZyb20gXCJpbmNpZGVudFwiO1xuaW1wb3J0IHsgQWJzUG9zaXhQYXRoIH0gZnJvbSBcIi4uL3R5cGVzXCI7XG5pbXBvcnQgeyBTcGF3bmVkUHJvY2VzcywgU3Bhd25PcHRpb25zLCBTcGF3blJlc3VsdCB9IGZyb20gXCIuL25vZGUtYXN5bmNcIjtcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGV4ZWNHaXQoY21kOiBzdHJpbmcsIGFyZ3M6IHN0cmluZ1tdID0gW10sIG9wdGlvbnM/OiBTcGF3bk9wdGlvbnMpOiBQcm9taXNlPFNwYXduUmVzdWx0PiB7XG4gIHJldHVybiBuZXcgU3Bhd25lZFByb2Nlc3MoXG4gICAgXCJnaXRcIixcbiAgICBbY21kLCAuLi5hcmdzXSxcbiAgICB7c3RkaW86IFwicGlwZVwiLCAuLi5vcHRpb25zfSxcbiAgKS50b1Byb21pc2UoKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGFzc2VydENsZWFuQnJhbmNoKGFsbG93ZWRCcmFuY2hlczogc3RyaW5nW10pOiBQcm9taXNlPHZvaWQ+IHtcbiAgbGV0IHN0ZG91dDogQnVmZmVyO1xuICBzdGRvdXQgPSAoYXdhaXQgZXhlY0dpdChcInN5bWJvbGljLXJlZlwiLCBbXCJIRUFEXCJdKSkuc3Rkb3V0O1xuICBsZXQgb25BbGxvd2VkQnJhbmNoOiBib29sZWFuID0gZmFsc2U7XG4gIGZvciAoY29uc3QgYnJhbmNoIG9mIGFsbG93ZWRCcmFuY2hlcykge1xuICAgIGlmIChzdGRvdXQudG9TdHJpbmcoXCJ1dGY4XCIpLnRyaW0oKSA9PT0gYHJlZnMvaGVhZHMvJHticmFuY2h9YCkge1xuICAgICAgb25BbGxvd2VkQnJhbmNoID0gdHJ1ZTtcbiAgICB9XG4gIH1cbiAgaWYgKCFvbkFsbG93ZWRCcmFuY2gpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoYEhFQUQgbXVzdCBiZSBvbiBvbmUgb2YgdGhlIGJyYW5jaGVzOiAke0pTT04uc3RyaW5naWZ5KGFsbG93ZWRCcmFuY2hlcyl9YCk7XG4gIH1cbiAgc3Rkb3V0ID0gKGF3YWl0IGV4ZWNHaXQoXCJzdGF0dXNcIiwgW1wiLS1wb3JjZWxhaW5cIl0pKS5zdGRvdXQ7XG4gIGlmIChzdGRvdXQudG9TdHJpbmcoXCJ1dGY4XCIpLnRyaW0oKS5sZW5ndGggPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiV29ya2luZyBjb3B5IGlzIGRpcnR5XCIpO1xuICB9XG59XG5cbi8qKlxuICogR2V0IHRoZSBoYXNoIG9mIHRoZSBIRUFEIGNvbW1pdC5cbiAqXG4gKiBAcmV0dXJuIFRoZSBoYXNoIG9mIHRoZSBIRUFEIGNvbW1pdC5cbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdldEhlYWRIYXNoKCk6IFByb21pc2U8c3RyaW5nPiB7XG4gIHJldHVybiAoYXdhaXQgZXhlY0dpdChcInJldi1wYXJzZVwiLCBbXCItLXZlcmlmeVwiLCBcIkhFQURcIl0pKS5zdGRvdXQudG9TdHJpbmcoXCJ1dGY4XCIpLnRyaW0oKTtcbn1cblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIHRhZ0V4aXN0cyh0YWc6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICByZXR1cm4gKGF3YWl0IGV4ZWNHaXQoXCJ0YWdcIiwgW1wiLWxcIiwgdGFnXSkpLnN0ZG91dC50b1N0cmluZyhcInV0ZjhcIikudHJpbSgpLmxlbmd0aCA+IDA7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgR2l0Q2xvbmVPcHRpb25zIHtcbiAgYnJhbmNoPzogc3RyaW5nO1xuICBkZXB0aD86IG51bWJlcjtcbiAgcmVwb3NpdG9yeTogc3RyaW5nO1xuICBkaXJlY3Rvcnk6IEFic1Bvc2l4UGF0aDtcbn1cblxuLyoqXG4gKiBDbG9uZSBhIHJlcG9zaXRvcnkgaW50byBhIG5ldyBkaXJlY3RvcnlcbiAqL1xuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdpdENsb25lKG9wdGlvbnM6IEdpdENsb25lT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtdO1xuICBpZiAob3B0aW9ucy5icmFuY2ggIT09IHVuZGVmaW5lZCkge1xuICAgIGFyZ3MucHVzaChcIi0tYnJhbmNoXCIsIG9wdGlvbnMuYnJhbmNoKTtcbiAgfVxuICBpZiAob3B0aW9ucy5kZXB0aCAhPT0gdW5kZWZpbmVkKSB7XG4gICAgYXJncy5wdXNoKFwiLS1kZXB0aFwiLCBvcHRpb25zLmRlcHRoLnRvU3RyaW5nKDEwKSk7XG4gIH1cbiAgYXJncy5wdXNoKG9wdGlvbnMucmVwb3NpdG9yeSwgb3B0aW9ucy5kaXJlY3RvcnkpO1xuICBjb25zdCByZXN1bHQ6IFNwYXduUmVzdWx0ID0gYXdhaXQgZXhlY0dpdChcImNsb25lXCIsIGFyZ3MpO1xuICBpZiAocmVzdWx0LmV4aXQudHlwZSA9PT0gXCJjb2RlXCIgJiYgcmVzdWx0LmV4aXQuY29kZSAhPT0gMCkge1xuICAgIHRocm93IG5ldyBJbmNpZGVudChcIkdpdENsb25lXCIsIHtvcHRpb25zLCByZXN1bHR9LCByZXN1bHQuc3RkZXJyLnRvU3RyaW5nKFwidXRmOFwiKSk7XG4gIH1cbn1cblxuZXhwb3J0IGludGVyZmFjZSBHaXRBZGRPcHRpb25zIHtcbiAgcGF0aHM6IHN0cmluZ1tdO1xuICByZXBvc2l0b3J5OiBBYnNQb3NpeFBhdGg7XG59XG5cbi8qKlxuICogQ2xvbmUgYSByZXBvc2l0b3J5IGludG8gYSBuZXcgZGlyZWN0b3J5XG4gKi9cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRBZGQob3B0aW9uczogR2l0QWRkT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBhcmdzOiBzdHJpbmdbXSA9IFtcIi0tXCIsIC4uLm9wdGlvbnMucGF0aHNdO1xuICBjb25zdCByZXN1bHQ6IFNwYXduUmVzdWx0ID0gYXdhaXQgZXhlY0dpdChcImFkZFwiLCBhcmdzLCB7Y3dkOiBvcHRpb25zLnJlcG9zaXRvcnl9KTtcbiAgaWYgKHJlc3VsdC5leGl0LnR5cGUgPT09IFwiY29kZVwiICYmIHJlc3VsdC5leGl0LmNvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgSW5jaWRlbnQoXCJHaXRBZGRcIiwge29wdGlvbnMsIHJlc3VsdH0sIHJlc3VsdC5zdGRlcnIudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdENvbW1pdE9wdGlvbnMge1xuICBtZXNzYWdlOiBzdHJpbmc7XG4gIGF1dGhvcj86IHN0cmluZztcbiAgcmVwb3NpdG9yeTogQWJzUG9zaXhQYXRoO1xufVxuXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gZ2l0Q29tbWl0KG9wdGlvbnM6IEdpdENvbW1pdE9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgYXJnczogc3RyaW5nW10gPSBbXCItbVwiLCBvcHRpb25zLm1lc3NhZ2VdO1xuICBpZiAob3B0aW9ucy5hdXRob3IgIT09IHVuZGVmaW5lZCkge1xuICAgIGFyZ3MucHVzaChcIi0tYXV0aG9yXCIsIG9wdGlvbnMuYXV0aG9yKTtcbiAgfVxuICBjb25zdCByZXN1bHQ6IFNwYXduUmVzdWx0ID0gYXdhaXQgZXhlY0dpdChcImNvbW1pdFwiLCBhcmdzLCB7Y3dkOiBvcHRpb25zLnJlcG9zaXRvcnl9KTtcbiAgaWYgKHJlc3VsdC5leGl0LnR5cGUgPT09IFwiY29kZVwiICYmIHJlc3VsdC5leGl0LmNvZGUgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgSW5jaWRlbnQoXCJHaXRDb21taXRcIiwge29wdGlvbnMsIHJlc3VsdH0sIHJlc3VsdC5zdGRlcnIudG9TdHJpbmcoXCJ1dGY4XCIpKTtcbiAgfVxufVxuXG5leHBvcnQgaW50ZXJmYWNlIEdpdFB1c2hPcHRpb25zIHtcbiAgbG9jYWw6IEFic1Bvc2l4UGF0aDtcbiAgcmVtb3RlOiBzdHJpbmc7XG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnaXRQdXNoKG9wdGlvbnM6IEdpdFB1c2hPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IHJlc3VsdDogU3Bhd25SZXN1bHQgPSBhd2FpdCBleGVjR2l0KFwicHVzaFwiLCBbb3B0aW9ucy5yZW1vdGVdLCB7Y3dkOiBvcHRpb25zLmxvY2FsfSk7XG4gIGlmIChyZXN1bHQuZXhpdC50eXBlID09PSBcImNvZGVcIiAmJiByZXN1bHQuZXhpdC5jb2RlICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IEluY2lkZW50KFwiR2l0UHVzaFwiLCB7b3B0aW9ucywgcmVzdWx0fSwgcmVzdWx0LnN0ZGVyci50b1N0cmluZyhcInV0ZjhcIikpO1xuICB9XG59XG4iXSwic291cmNlUm9vdCI6Ii4uIn0=