JezK
Edit File: git-ref-resolver.js
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); Object.defineProperty(exports, "__esModule", { value: true }); exports.resolveVersion = exports.parseRefs = exports.isCommitSha = void 0; function _regenerator() { var data = _interopRequireDefault(require("@babel/runtime/regenerator")); _regenerator = function _regenerator() { return data; }; return data; } function _asyncToGenerator2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); _asyncToGenerator2 = function _asyncToGenerator2() { return data; }; return data; } function _slicedToArray2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); _slicedToArray2 = function _slicedToArray2() { return data; }; return data; } function _misc() { var data = require("../misc.js"); _misc = function _misc() { return data; }; return data; } function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it["return"] != null) it["return"](); } finally { if (didErr) throw err; } } }; } function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); } function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; } var semver = require('semver'); var REF_PREFIX = 'refs/'; var REF_TAG_PREFIX = 'refs/tags/'; var REF_BRANCH_PREFIX = 'refs/heads/'; var REF_PR_PREFIX = 'refs/pull/'; // This regex is designed to match output from git of the style: // ebeb6eafceb61dd08441ffe086c77eb472842494 refs/tags/v0.21.0 // and extract the hash and ref name as capture groups var GIT_REF_LINE_REGEXP = /^([a-fA-F0-9]+)\s+(refs\/(?:tags|heads|pull|remotes)\/.*)$/; var COMMIT_SHA_REGEXP = /^[a-f0-9]{5,40}$/; var REF_NAME_REGEXP = /^refs\/(tags|heads)\/(.+)$/; var isCommitSha = function isCommitSha(target) { return COMMIT_SHA_REGEXP.test(target); }; exports.isCommitSha = isCommitSha; var tryVersionAsGitCommit = function tryVersionAsGitCommit(_ref) { var version = _ref.version, refs = _ref.refs, git = _ref.git; var lowercaseVersion = version.toLowerCase(); if (!isCommitSha(lowercaseVersion)) { return Promise.resolve(null); } var _iterator = _createForOfIteratorHelper(refs.entries()), _step; try { for (_iterator.s(); !(_step = _iterator.n()).done;) { var _step$value = (0, _slicedToArray2()["default"])(_step.value, 2), ref = _step$value[0], _sha = _step$value[1]; if (_sha.startsWith(lowercaseVersion)) { return Promise.resolve({ sha: _sha, ref: ref }); } } } catch (err) { _iterator.e(err); } finally { _iterator.f(); } return git.resolveCommit(lowercaseVersion); }; var tryEmptyVersionAsDefaultBranch = function tryEmptyVersionAsDefaultBranch(_ref2) { var version = _ref2.version, git = _ref2.git; return version.trim() === '' ? git.resolveDefaultBranch() : Promise.resolve(null); }; var tryWildcardVersionAsDefaultBranch = function tryWildcardVersionAsDefaultBranch(_ref3) { var version = _ref3.version, git = _ref3.git; return version === '*' ? git.resolveDefaultBranch() : Promise.resolve(null); }; var tryRef = function tryRef(refs, ref) { var sha = refs.get(ref); return sha ? { sha: sha, ref: ref } : null; }; var tryVersionAsFullRef = function tryVersionAsFullRef(_ref4) { var version = _ref4.version, refs = _ref4.refs; return version.startsWith('refs/') ? tryRef(refs, version) : null; }; var tryVersionAsTagName = function tryVersionAsTagName(_ref5) { var version = _ref5.version, refs = _ref5.refs; return tryRef(refs, "".concat(REF_TAG_PREFIX).concat(version)); }; var tryVersionAsPullRequestNo = function tryVersionAsPullRequestNo(_ref6) { var version = _ref6.version, refs = _ref6.refs; return tryRef(refs, "".concat(REF_PR_PREFIX).concat(version)); }; var tryVersionAsBranchName = function tryVersionAsBranchName(_ref7) { var version = _ref7.version, refs = _ref7.refs; return tryRef(refs, "".concat(REF_BRANCH_PREFIX).concat(version)); }; var tryVersionAsDirectRef = function tryVersionAsDirectRef(_ref8) { var version = _ref8.version, refs = _ref8.refs; return tryRef(refs, "".concat(REF_PREFIX).concat(version)); }; var computeSemverNames = function computeSemverNames(_ref9) { var config = _ref9.config, refs = _ref9.refs; var names = { tags: [], heads: [] }; var _iterator2 = _createForOfIteratorHelper(refs.keys()), _step2; try { for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) { var ref = _step2.value; var match = REF_NAME_REGEXP.exec(ref); if (!match) { continue; } var _match = (0, _slicedToArray2()["default"])(match, 3), type = _match[1], name = _match[2]; if (semver.valid(name, config.looseSemver)) { names[type].push(name); } } } catch (err) { _iterator2.e(err); } finally { _iterator2.f(); } return names; }; var findSemver = function findSemver(version, config, namesList) { return config.resolveConstraints(namesList, version); }; var tryVersionAsTagSemver = /*#__PURE__*/function () { var _ref11 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee(_ref10, names) { var version, config, refs, result; return _regenerator()["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: version = _ref10.version, config = _ref10.config, refs = _ref10.refs; _context.next = 3; return findSemver(version.replace(/^semver:/, ''), config, names.tags); case 3: result = _context.sent; return _context.abrupt("return", result ? tryRef(refs, "".concat(REF_TAG_PREFIX).concat(result)) : null); case 5: case "end": return _context.stop(); } }, _callee); })); return function tryVersionAsTagSemver(_x, _x2) { return _ref11.apply(this, arguments); }; }(); var tryVersionAsBranchSemver = /*#__PURE__*/function () { var _ref13 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee2(_ref12, names) { var version, config, refs, result; return _regenerator()["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: version = _ref12.version, config = _ref12.config, refs = _ref12.refs; _context2.next = 3; return findSemver(version.replace(/^semver:/, ''), config, names.heads); case 3: result = _context2.sent; return _context2.abrupt("return", result ? tryRef(refs, "".concat(REF_BRANCH_PREFIX).concat(result)) : null); case 5: case "end": return _context2.stop(); } }, _callee2); })); return function tryVersionAsBranchSemver(_x3, _x4) { return _ref13.apply(this, arguments); }; }(); var tryVersionAsSemverRange = /*#__PURE__*/function () { var _ref14 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee3(options) { var names; return _regenerator()["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: names = computeSemverNames(options); _context3.next = 3; return tryVersionAsTagSemver(options, names); case 3: _context3.t0 = _context3.sent; if (_context3.t0) { _context3.next = 6; break; } _context3.t0 = tryVersionAsBranchSemver(options, names); case 6: return _context3.abrupt("return", _context3.t0); case 7: case "end": return _context3.stop(); } }, _callee3); })); return function tryVersionAsSemverRange(_x5) { return _ref14.apply(this, arguments); }; }(); var VERSION_RESOLUTION_STEPS = [tryEmptyVersionAsDefaultBranch, tryVersionAsGitCommit, tryVersionAsFullRef, tryVersionAsTagName, tryVersionAsPullRequestNo, tryVersionAsBranchName, tryVersionAsSemverRange, tryWildcardVersionAsDefaultBranch, tryVersionAsDirectRef]; /** * Resolve a git-url hash (version) to a git commit sha and branch/tag ref * Returns null if the version cannot be resolved to any commit */ var resolveVersion = /*#__PURE__*/function () { var _ref15 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee4(options) { var _i, _VERSION_RESOLUTION_S, testFunction, result; return _regenerator()["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _i = 0, _VERSION_RESOLUTION_S = VERSION_RESOLUTION_STEPS; case 1: if (!(_i < _VERSION_RESOLUTION_S.length)) { _context4.next = 11; break; } testFunction = _VERSION_RESOLUTION_S[_i]; _context4.next = 5; return testFunction(options); case 5: result = _context4.sent; if (!(result !== null)) { _context4.next = 8; break; } return _context4.abrupt("return", result); case 8: _i++; _context4.next = 1; break; case 11: return _context4.abrupt("return", null); case 12: case "end": return _context4.stop(); } }, _callee4); })); return function resolveVersion(_x6) { return _ref15.apply(this, arguments); }; }(); /** * Parse Git ref lines into hash of ref names to SHA hashes */ exports.resolveVersion = resolveVersion; var parseRefs = function parseRefs(stdout) { // store references var refs = new Map(); // line delimited var refLines = stdout.split('\n'); var _iterator3 = _createForOfIteratorHelper(refLines), _step3; try { for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) { var line = _step3.value; var match = GIT_REF_LINE_REGEXP.exec(line); if (match) { var _match2 = (0, _slicedToArray2()["default"])(match, 3), _sha2 = _match2[1], tagName = _match2[2]; // As documented in gitrevisions: // https://www.kernel.org/pub/software/scm/git/docs/gitrevisions.html#_specifying_revisions // "A suffix ^ followed by an empty brace pair means the object could be a tag, // and dereference the tag recursively until a non-tag object is found." // In other words, the hash without ^{} is the hash of the tag, // and the hash with ^{} is the hash of the commit at which the tag was made. var name = (0, _misc().removeSuffix)(tagName, '^{}'); refs.set(name, _sha2); } } } catch (err) { _iterator3.e(err); } finally { _iterator3.f(); } return refs; }; exports.parseRefs = parseRefs; //# sourceMappingURL=git-ref-resolver.js.map