UNPKG

sardines-compile-time-tools

Version:

sardines.compile-time-tools.js is part of the sardines.io project

313 lines (312 loc) 16.2 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __generator = (this && this.__generator) || function (thisArg, body) { var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; function verb(n) { return function (v) { return step([n, v]); }; } function step(op) { if (f) throw new TypeError("Generator is already executing."); while (_) try { if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; if (y = 0, t) op = [op[0] & 2, t.value]; switch (op[0]) { case 0: case 1: t = op; break; case 4: _.label++; return { value: op[1], done: false }; case 5: _.label++; y = op[1]; op = [0]; continue; case 7: op = _.ops.pop(); _.trys.pop(); continue; default: if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } if (t[2]) _.ops.pop(); _.trys.pop(); continue; } op = body.call(thisArg, _); } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; } }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GitVersioning = exports.getLatestVersion = exports.getVersionTag = void 0; var semver = require("semver"); var sardines_core_1 = require("sardines-core"); var utils_1 = require("./utils"); var isGitInstalled = function () { return __awaiter(void 0, void 0, void 0, function () { var res, e_1; return __generator(this, function (_a) { switch (_a.label) { case 0: _a.trys.push([0, 2, , 3]); return [4, utils_1.exec('which git')]; case 1: res = _a.sent(); if (res.stdout) return [2, true]; return [3, 3]; case 2: e_1 = _a.sent(); return [2, false]; case 3: return [2, false]; } }); }); }; exports.getVersionTag = function (version) { return "sardines-v" + version; }; exports.getLatestVersion = function (verbose) { if (verbose === void 0) { verbose = false; } return __awaiter(void 0, void 0, void 0, function () { var latestVersion, res, _i, _a, line, parts, v, e_2; return __generator(this, function (_b) { switch (_b.label) { case 0: latestVersion = ''; _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git tag -l sardines-v*" })]; case 2: res = _b.sent(); for (_i = 0, _a = res.stdout.split('\n'); _i < _a.length; _i++) { line = _a[_i]; if (!line) continue; parts = line.split('-v'); if (parts.length >= 2) { v = parts[1]; if (!latestVersion || semver.gt(v, latestVersion)) latestVersion = v; } } if (verbose) { console.log('last version:', latestVersion); } return [3, 4]; case 3: e_2 = _b.sent(); if (verbose) { console.error('ERROR while getting current version using git:', sardines_core_1.utils.inspect(e_2)); } return [3, 4]; case 4: return [2, latestVersion]; } }); }); }; exports.GitVersioning = function (params) { if (params === void 0) { params = {}; } return __awaiter(void 0, void 0, void 0, function () { var _a, remote, branch, doCommit, tag, tagMsg, version, patch, minor, major, commit, verbose, res, lines, originAddr, originName, _i, lines_1, line, parts, remoteName, remoteAddr, remoteRole, localBranch, remoteBranch, currentBranch, _b, lines_2, line, b, parts, remoteName, rb, latestVersion, currentVersion, v, commitMsg, e_3, e_4, e_5; return __generator(this, function (_c) { switch (_c.label) { case 0: _a = Object.assign({ remote: 'dev', branch: 'sardines', doCommit: false, tag: '', tagMsg: 'sardines publisher automatic tag', version: '0.0.1', patch: true, minor: false, major: false, commit: 'sardines publisher automatic commit', verbose: true }, params), remote = _a.remote, branch = _a.branch, doCommit = _a.doCommit, tag = _a.tag, tagMsg = _a.tagMsg, version = _a.version, patch = _a.patch, minor = _a.minor, major = _a.major, commit = _a.commit, verbose = _a.verbose; return [4, isGitInstalled]; case 1: if (!(_c.sent())) throw sardines_core_1.utils.unifyErrMesg('git is not installed', 'sardines', 'versioning'); res = null; return [4, utils_1.unifiedExec({ cmd: "git fetch " + remote, type: 'sardines', subType: 'versioning', msg: 'git is not used under current directory' })]; case 2: res = _c.sent(); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: 'git remote -v' })]; case 3: res = _c.sent(); if (!res.stdout) throw sardines_core_1.utils.unifyErrMesg('git remote is not set', 'sardines', 'versioning'); lines = res.stdout.split('\n'); originAddr = '', originName = ''; for (_i = 0, lines_1 = lines; _i < lines_1.length; _i++) { line = lines_1[_i]; if (!line) continue; parts = line.replace(/\t+/g, ' ').replace(/ +/g, ' ').split(' '); if (parts.length !== 3) continue; remoteName = parts[0]; remoteAddr = parts[1]; remoteRole = parts[2].replace(/[\(|\)]/g, ''); if (remoteName.toLowerCase() === remote && remoteRole === 'push') { originAddr = remoteAddr; originName = remoteName; break; } else if (!originAddr && remoteRole === 'push') { originAddr = remoteAddr; originName = remoteName; } } if (!originAddr) throw sardines_core_1.utils.unifyErrMesg('Can not find git remote push address', 'sardines', 'versioning'); if (verbose) console.log('remote push addr:', originAddr, ', remote name:', originName); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: 'git branch -a' })]; case 4: res = _c.sent(); lines = res.stdout.split('\n'); localBranch = '', remoteBranch = '', currentBranch = ''; for (_b = 0, lines_2 = lines; _b < lines_2.length; _b++) { line = lines_2[_b]; if (!line) continue; b = line.replace(/ +/g, ''); if (b[0] === '*') { b = b.substr(1); currentBranch = b; } if (b === branch) localBranch = b; else if (b.indexOf('remotes/') === 0) { b = b.replace('remotes/', ''); parts = b.split('/'); if (parts.length >= 2) { remoteName = parts.shift(); rb = parts.join('/'); if (remoteName === remote && rb === branch) { remoteBranch = rb; } } } } return [4, exports.getLatestVersion(verbose)]; case 5: latestVersion = _c.sent(); currentVersion = ''; if (latestVersion && version === '0.0.1') { if (!semver.valid(latestVersion)) { throw sardines_core_1.utils.unifyErrMesg("latest version [" + latestVersion + "] is not valid", 'sardines', 'versioning'); } v = latestVersion; if (v && patch) v = semver.inc(v, 'patch'); if (v && minor) v = semver.inc(v, 'minor'); if (v && major) v = semver.inc(v, 'major'); if (v) currentVersion = v; else throw sardines_core_1.utils.unifyErrMesg("can not increase patch number of latest version " + latestVersion, 'sardines', 'versioning'); } else { currentVersion = version; } if (!semver.valid(currentVersion)) { throw sardines_core_1.utils.unifyErrMesg("current version " + currentVersion + " is not valid", 'sardines', 'versioning'); } if (!(doCommit && currentVersion)) return [3, 18]; commitMsg = "" + (commit ? commit : 'sardines publisher automatic commit'); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git add ." })]; case 6: _c.sent(); _c.label = 7; case 7: _c.trys.push([7, 9, , 10]); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git commit -m \"" + commitMsg + "\"" })]; case 8: _c.sent(); return [3, 10]; case 9: e_3 = _c.sent(); if (e_3 && e_3.error && e_3.error.stdout && e_3.error.stdout.indexOf('nothing to commit, working tree clean')) { if (verbose) console.warn(e_3.error.stdout); } else { throw e_3; } return [3, 10]; case 10: if (!doCommit) return [3, 18]; _c.label = 11; case 11: _c.trys.push([11, 13, , 14]); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git tag -a " + exports.getVersionTag(currentVersion) + " -m \"" + tagMsg + "\"" })]; case 12: _c.sent(); return [3, 14]; case 13: e_4 = _c.sent(); if (e_4.code === 128 || (e_4.error && e_4.error.code === 128)) { doCommit = false; throw sardines_core_1.utils.unifyErrMesg("sardine version [" + currentVersion + "] already exists", 'sardines', 'versioning'); } else throw e_4; return [3, 14]; case 14: if (!(tag && tagMsg)) return [3, 18]; _c.label = 15; case 15: _c.trys.push([15, 17, , 18]); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git tag -a " + tag + " -m \"" + tagMsg + "\"" })]; case 16: _c.sent(); return [3, 18]; case 17: e_5 = _c.sent(); if (e_5.code === 128 || (e_5.error && e_5.error.code === 128)) { doCommit = false; throw sardines_core_1.utils.unifyErrMesg("sardine version [" + currentVersion + "] already exists", 'sardines', 'versioning'); } else throw e_5; return [3, 18]; case 18: if (!(doCommit && currentVersion)) return [3, 27]; if (!(!localBranch && !remoteBranch)) return [3, 20]; return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git checkout -b " + branch })]; case 19: _c.sent(); return [3, 22]; case 20: if (!(branch !== currentBranch)) return [3, 22]; return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git checkout " + branch })]; case 21: _c.sent(); _c.label = 22; case 22: if (!remoteBranch) return [3, 24]; return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git pull " + remote + " " + branch })]; case 23: _c.sent(); _c.label = 24; case 24: return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git merge " + currentBranch })]; case 25: _c.sent(); return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git push " + remote + " " + branch + " --tags" })]; case 26: _c.sent(); _c.label = 27; case 27: return [4, utils_1.unifiedExec({ verbose: verbose, cmd: "git checkout " + currentBranch })]; case 28: _c.sent(); return [2, { version: doCommit ? currentVersion : latestVersion, tag: exports.getVersionTag(doCommit ? currentVersion : latestVersion), branch: remoteBranch ? branch : '', git: originAddr, isNew: doCommit }]; } }); }); };