UNPKG

@dependabot/yarn-lib

Version:

📦🐈 Fast, reliable, and secure dependency management.

235 lines (181 loc) 7.52 kB
'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseRefs = exports.resolveVersion = exports.isCommitSha = undefined; var _asyncToGenerator2; function _load_asyncToGenerator() { return _asyncToGenerator2 = _interopRequireDefault(require('babel-runtime/helpers/asyncToGenerator')); } var _misc; function _load_misc() { return _misc = require('../misc.js'); } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } const semver = require('semver'); const REF_PREFIX = 'refs/'; const REF_TAG_PREFIX = 'refs/tags/'; const REF_BRANCH_PREFIX = 'refs/heads/'; const 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 const GIT_REF_LINE_REGEXP = /^([a-fA-F0-9]+)\s+(refs\/(?:tags|heads|pull|remotes)\/.*)$/; const COMMIT_SHA_REGEXP = /^[a-f0-9]{5,40}$/; const REF_NAME_REGEXP = /^refs\/(tags|heads)\/(.+)$/; const isCommitSha = exports.isCommitSha = target => COMMIT_SHA_REGEXP.test(target); const tryVersionAsGitCommit = ({ version, refs, git }) => { const lowercaseVersion = version.toLowerCase(); if (!isCommitSha(lowercaseVersion)) { return Promise.resolve(null); } for (var _iterator = refs.entries(), _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) { var _ref2; if (_isArray) { if (_i >= _iterator.length) break; _ref2 = _iterator[_i++]; } else { _i = _iterator.next(); if (_i.done) break; _ref2 = _i.value; } const _ref = _ref2; const ref = _ref[0]; const sha = _ref[1]; if (sha.startsWith(lowercaseVersion)) { return Promise.resolve({ sha, ref }); } } return git.resolveCommit(lowercaseVersion); }; const tryEmptyVersionAsDefaultBranch = ({ version, git }) => version.trim() === '' ? git.resolveDefaultBranch() : Promise.resolve(null); const tryWildcardVersionAsDefaultBranch = ({ version, git }) => version === '*' ? git.resolveDefaultBranch() : Promise.resolve(null); const tryRef = (refs, ref) => { const sha = refs.get(ref); return sha ? { sha, ref } : null; }; const tryVersionAsFullRef = ({ version, refs }) => version.startsWith('refs/') ? tryRef(refs, version) : null; const tryVersionAsTagName = ({ version, refs }) => tryRef(refs, `${REF_TAG_PREFIX}${version}`); const tryVersionAsPullRequestNo = ({ version, refs }) => tryRef(refs, `${REF_PR_PREFIX}${version}`); const tryVersionAsBranchName = ({ version, refs }) => tryRef(refs, `${REF_BRANCH_PREFIX}${version}`); const tryVersionAsDirectRef = ({ version, refs }) => tryRef(refs, `${REF_PREFIX}${version}`); const computeSemverNames = ({ config, refs }) => { const names = { tags: [], heads: [] }; for (var _iterator2 = refs.keys(), _isArray2 = Array.isArray(_iterator2), _i2 = 0, _iterator2 = _isArray2 ? _iterator2 : _iterator2[Symbol.iterator]();;) { var _ref3; if (_isArray2) { if (_i2 >= _iterator2.length) break; _ref3 = _iterator2[_i2++]; } else { _i2 = _iterator2.next(); if (_i2.done) break; _ref3 = _i2.value; } const ref = _ref3; const match = REF_NAME_REGEXP.exec(ref); if (!match) { continue; } const type = match[1], name = match[2]; if (semver.valid(name, config.looseSemver)) { names[type].push(name); } } return names; }; const findSemver = (version, config, namesList) => config.resolveConstraints(namesList, version); const tryVersionAsTagSemver = (() => { var _ref4 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({ version, config, refs }, names) { const result = yield findSemver(version.replace(/^semver:/, ''), config, names.tags); return result ? tryRef(refs, `${REF_TAG_PREFIX}${result}`) : null; }); return function tryVersionAsTagSemver(_x, _x2) { return _ref4.apply(this, arguments); }; })(); const tryVersionAsBranchSemver = (() => { var _ref5 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* ({ version, config, refs }, names) { const result = yield findSemver(version.replace(/^semver:/, ''), config, names.heads); return result ? tryRef(refs, `${REF_BRANCH_PREFIX}${result}`) : null; }); return function tryVersionAsBranchSemver(_x3, _x4) { return _ref5.apply(this, arguments); }; })(); const tryVersionAsSemverRange = (() => { var _ref6 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (options) { const names = computeSemverNames(options); return (yield tryVersionAsTagSemver(options, names)) || tryVersionAsBranchSemver(options, names); }); return function tryVersionAsSemverRange(_x5) { return _ref6.apply(this, arguments); }; })(); const 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 */ const resolveVersion = exports.resolveVersion = (() => { var _ref7 = (0, (_asyncToGenerator2 || _load_asyncToGenerator()).default)(function* (options) { for (var _iterator3 = VERSION_RESOLUTION_STEPS, _isArray3 = Array.isArray(_iterator3), _i3 = 0, _iterator3 = _isArray3 ? _iterator3 : _iterator3[Symbol.iterator]();;) { var _ref8; if (_isArray3) { if (_i3 >= _iterator3.length) break; _ref8 = _iterator3[_i3++]; } else { _i3 = _iterator3.next(); if (_i3.done) break; _ref8 = _i3.value; } const testFunction = _ref8; const result = yield testFunction(options); if (result !== null) { return result; } } return null; }); return function resolveVersion(_x6) { return _ref7.apply(this, arguments); }; })(); /** * Parse Git ref lines into hash of ref names to SHA hashes */ const parseRefs = exports.parseRefs = stdout => { // store references const refs = new Map(); // line delimited const refLines = stdout.split('\n'); for (var _iterator4 = refLines, _isArray4 = Array.isArray(_iterator4), _i4 = 0, _iterator4 = _isArray4 ? _iterator4 : _iterator4[Symbol.iterator]();;) { var _ref9; if (_isArray4) { if (_i4 >= _iterator4.length) break; _ref9 = _iterator4[_i4++]; } else { _i4 = _iterator4.next(); if (_i4.done) break; _ref9 = _i4.value; } const line = _ref9; const match = GIT_REF_LINE_REGEXP.exec(line); if (match) { const sha = match[1], tagName = match[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. const name = (0, (_misc || _load_misc()).removeSuffix)(tagName, '^{}'); refs.set(name, sha); } } return refs; };