JezK
Edit File: git.js
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); var _typeof = require("@babel/runtime/helpers/typeof"); Object.defineProperty(exports, "__esModule", { value: true }); exports["default"] = void 0; function _regenerator() { var data = _interopRequireDefault(require("@babel/runtime/regenerator")); _regenerator = function _regenerator() { return data; }; return data; } function _slicedToArray2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray")); _slicedToArray2 = function _slicedToArray2() { return data; }; return data; } function _asyncToGenerator2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator")); _asyncToGenerator2 = function _asyncToGenerator2() { return data; }; return data; } function _classCallCheck2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck")); _classCallCheck2 = function _classCallCheck2() { return data; }; return data; } function _createClass2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/createClass")); _createClass2 = function _createClass2() { return data; }; return data; } function _defineProperty2() { var data = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty")); _defineProperty2 = function _defineProperty2() { return data; }; return data; } function _invariant() { var data = _interopRequireDefault(require("invariant")); _invariant = function _invariant() { return data; }; return data; } function _string_decoder() { var data = require("string_decoder"); _string_decoder = function _string_decoder() { return data; }; return data; } function _tarFs() { var data = _interopRequireDefault(require("tar-fs")); _tarFs = function _tarFs() { return data; }; return data; } function _tarStream() { var data = _interopRequireDefault(require("tar-stream")); _tarStream = function _tarStream() { return data; }; return data; } function _url() { var data = _interopRequireDefault(require("url")); _url = function _url() { return data; }; return data; } function _fs() { var data = require("fs"); _fs = function _fs() { return data; }; return data; } function _errors() { var data = require("../errors.js"); _errors = function _errors() { return data; }; return data; } function _gitSpawn() { var data = require("./git/git-spawn.js"); _gitSpawn = function _gitSpawn() { return data; }; return data; } function _gitRefResolver() { var data = require("./git/git-ref-resolver.js"); _gitRefResolver = function _gitRefResolver() { return data; }; return data; } function crypto() { var data = _interopRequireWildcard(require("./crypto.js")); crypto = function crypto() { return data; }; return data; } function fs() { var data = _interopRequireWildcard(require("./fs.js")); fs = function fs() { return data; }; return data; } function _map() { var data = _interopRequireDefault(require("./map.js")); _map = function _map() { return data; }; return data; } function _misc() { var data = require("./misc.js"); _misc = function _misc() { return data; }; return data; } function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { "default": obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj["default"] = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; } function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2()["default"])(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; } var GIT_PROTOCOL_PREFIX = 'git+'; var SSH_PROTOCOL = 'ssh:'; var SCP_PATH_PREFIX = '/:'; var FILE_PROTOCOL = 'file:'; var GIT_VALID_REF_LINE_REGEXP = /^([a-fA-F0-9]+|ref)/; var validRef = function validRef(line) { return GIT_VALID_REF_LINE_REGEXP.exec(line); }; var supportsArchiveCache = (0, _map()["default"])({ 'github.com': false // not support, doubt they will ever support it }); var handleSpawnError = function handleSpawnError(err) { if (err instanceof _errors().ProcessSpawnError) { throw err; } }; var SHORTHAND_SERVICES = (0, _map()["default"])({ 'github:': function github(parsedUrl) { return _objectSpread(_objectSpread({}, parsedUrl), {}, { slashes: true, auth: 'git', protocol: SSH_PROTOCOL, host: 'github.com', hostname: 'github.com', pathname: "/".concat(parsedUrl.hostname).concat(parsedUrl.pathname) }); }, 'bitbucket:': function bitbucket(parsedUrl) { return _objectSpread(_objectSpread({}, parsedUrl), {}, { slashes: true, auth: 'git', protocol: SSH_PROTOCOL, host: 'bitbucket.com', hostname: 'bitbucket.com', pathname: "/".concat(parsedUrl.hostname).concat(parsedUrl.pathname) }); } }); var Git = /*#__PURE__*/function () { function Git(config, gitUrl, hash) { (0, _classCallCheck2()["default"])(this, Git); (0, _defineProperty2()["default"])(this, "supportsArchive", void 0); (0, _defineProperty2()["default"])(this, "fetched", void 0); (0, _defineProperty2()["default"])(this, "config", void 0); (0, _defineProperty2()["default"])(this, "reporter", void 0); (0, _defineProperty2()["default"])(this, "hash", void 0); (0, _defineProperty2()["default"])(this, "ref", void 0); (0, _defineProperty2()["default"])(this, "cwd", void 0); (0, _defineProperty2()["default"])(this, "gitUrl", void 0); this.supportsArchive = false; this.fetched = false; this.config = config; this.reporter = config.reporter; this.hash = hash; this.ref = hash; this.gitUrl = gitUrl; this.cwd = this.config.getTemp(crypto().hash(this.gitUrl.repository)); } (0, _createClass2()["default"])(Git, [{ key: "archive", value: /** * Archive a repo to destination */ function archive(dest) { if (this.supportsArchive) { return this._archiveViaRemoteArchive(dest); } else { return this._archiveViaLocalFetched(dest); } } }, { key: "_archiveViaRemoteArchive", value: function () { var _archiveViaRemoteArchive2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee(dest) { var hashStream; return _regenerator()["default"].wrap(function _callee$(_context) { while (1) switch (_context.prev = _context.next) { case 0: hashStream = new (crypto().HashStream)(); _context.next = 3; return (0, _gitSpawn().spawn)(['archive', "--remote=".concat(this.gitUrl.repository), this.ref], { process: function process(proc, resolve, reject, done) { var writeStream = (0, _fs().createWriteStream)(dest); proc.on('error', reject); writeStream.on('error', reject); writeStream.on('end', done); writeStream.on('open', function () { proc.stdout.pipe(hashStream).pipe(writeStream); }); writeStream.once('finish', done); } }); case 3: return _context.abrupt("return", hashStream.getHash()); case 4: case "end": return _context.stop(); } }, _callee, this); })); function _archiveViaRemoteArchive(_x) { return _archiveViaRemoteArchive2.apply(this, arguments); } return _archiveViaRemoteArchive; }() }, { key: "_archiveViaLocalFetched", value: function () { var _archiveViaLocalFetched2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee2(dest) { var hashStream; return _regenerator()["default"].wrap(function _callee2$(_context2) { while (1) switch (_context2.prev = _context2.next) { case 0: hashStream = new (crypto().HashStream)(); _context2.next = 3; return (0, _gitSpawn().spawn)(['archive', this.hash], { cwd: this.cwd, process: function process(proc, resolve, reject, done) { var writeStream = (0, _fs().createWriteStream)(dest); proc.on('error', reject); writeStream.on('error', reject); writeStream.on('open', function () { proc.stdout.pipe(hashStream).pipe(writeStream); }); writeStream.once('finish', done); } }); case 3: return _context2.abrupt("return", hashStream.getHash()); case 4: case "end": return _context2.stop(); } }, _callee2, this); })); function _archiveViaLocalFetched(_x2) { return _archiveViaLocalFetched2.apply(this, arguments); } return _archiveViaLocalFetched; }() /** * Clone a repo to the input `dest`. Use `git archive` if it's available, otherwise fall * back to `git clone`. */ }, { key: "clone", value: function clone(dest) { if (this.supportsArchive) { return this._cloneViaRemoteArchive(dest); } else { return this._cloneViaLocalFetched(dest); } } }, { key: "_cloneViaRemoteArchive", value: function () { var _cloneViaRemoteArchive2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee3(dest) { return _regenerator()["default"].wrap(function _callee3$(_context3) { while (1) switch (_context3.prev = _context3.next) { case 0: _context3.next = 2; return (0, _gitSpawn().spawn)(['archive', "--remote=".concat(this.gitUrl.repository), this.ref], { process: function process(proc, update, reject, done) { var extractor = _tarFs()["default"].extract(dest, { dmode: 365, // all dirs should be readable fmode: 292 // all files should be readable }); extractor.on('error', reject); extractor.on('finish', done); proc.stdout.pipe(extractor); proc.on('error', reject); } }); case 2: case "end": return _context3.stop(); } }, _callee3, this); })); function _cloneViaRemoteArchive(_x3) { return _cloneViaRemoteArchive2.apply(this, arguments); } return _cloneViaRemoteArchive; }() }, { key: "_cloneViaLocalFetched", value: function () { var _cloneViaLocalFetched2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee4(dest) { return _regenerator()["default"].wrap(function _callee4$(_context4) { while (1) switch (_context4.prev = _context4.next) { case 0: _context4.next = 2; return (0, _gitSpawn().spawn)(['archive', this.hash], { cwd: this.cwd, process: function process(proc, resolve, reject, done) { var extractor = _tarFs()["default"].extract(dest, { dmode: 365, // all dirs should be readable fmode: 292 // all files should be readable }); extractor.on('error', reject); extractor.on('finish', done); proc.stdout.pipe(extractor); } }); case 2: case "end": return _context4.stop(); } }, _callee4, this); })); function _cloneViaLocalFetched(_x4) { return _cloneViaLocalFetched2.apply(this, arguments); } return _cloneViaLocalFetched; }() /** * Clone this repo. */ }, { key: "fetch", value: function fetch() { var _this = this; var gitUrl = this.gitUrl, cwd = this.cwd; return fs().lockQueue.push(gitUrl.repository, /*#__PURE__*/(0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee5() { return _regenerator()["default"].wrap(function _callee5$(_context5) { while (1) switch (_context5.prev = _context5.next) { case 0: _context5.next = 2; return fs().exists(cwd); case 2: if (!_context5.sent) { _context5.next = 9; break; } _context5.next = 5; return (0, _gitSpawn().spawn)(['fetch', '--tags'], { cwd: cwd }); case 5: _context5.next = 7; return (0, _gitSpawn().spawn)(['pull'], { cwd: cwd }); case 7: _context5.next = 11; break; case 9: _context5.next = 11; return (0, _gitSpawn().spawn)(['clone', gitUrl.repository, cwd]); case 11: _this.fetched = true; case 12: case "end": return _context5.stop(); } }, _callee5); }))); } /** * Fetch the file by cloning the repo and reading it. */ }, { key: "getFile", value: function getFile(filename) { if (this.supportsArchive) { return this._getFileFromArchive(filename); } else { return this._getFileFromClone(filename); } } }, { key: "_getFileFromArchive", value: function () { var _getFileFromArchive2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee6(filename) { return _regenerator()["default"].wrap(function _callee6$(_context6) { while (1) switch (_context6.prev = _context6.next) { case 0: _context6.prev = 0; _context6.next = 3; return (0, _gitSpawn().spawn)(['archive', "--remote=".concat(this.gitUrl.repository), this.ref, filename], { process: function process(proc, update, reject, done) { var parser = _tarStream()["default"].extract(); parser.on('error', reject); parser.on('finish', done); parser.on('entry', function (header, stream, next) { var decoder = new (_string_decoder().StringDecoder)('utf8'); var fileContent = ''; stream.on('data', function (buffer) { fileContent += decoder.write(buffer); }); stream.on('end', function () { var remaining = decoder.end(); update(fileContent + remaining); next(); }); stream.resume(); }); proc.stdout.pipe(parser); } }); case 3: return _context6.abrupt("return", _context6.sent); case 6: _context6.prev = 6; _context6.t0 = _context6["catch"](0); if (!(_context6.t0.message.indexOf('did not match any files') >= 0)) { _context6.next = 12; break; } return _context6.abrupt("return", false); case 12: throw _context6.t0; case 13: case "end": return _context6.stop(); } }, _callee6, this, [[0, 6]]); })); function _getFileFromArchive(_x5) { return _getFileFromArchive2.apply(this, arguments); } return _getFileFromArchive; }() }, { key: "_getFileFromClone", value: function () { var _getFileFromClone2 = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee7(filename) { return _regenerator()["default"].wrap(function _callee7$(_context7) { while (1) switch (_context7.prev = _context7.next) { case 0: (0, _invariant()["default"])(this.fetched, 'Repo not fetched'); _context7.prev = 1; _context7.next = 4; return (0, _gitSpawn().spawn)(['show', "".concat(this.hash, ":").concat(filename)], { cwd: this.cwd }); case 4: return _context7.abrupt("return", _context7.sent); case 7: _context7.prev = 7; _context7.t0 = _context7["catch"](1); handleSpawnError(_context7.t0); // file doesn't exist return _context7.abrupt("return", false); case 11: case "end": return _context7.stop(); } }, _callee7, this, [[1, 7]]); })); function _getFileFromClone(_x6) { return _getFileFromClone2.apply(this, arguments); } return _getFileFromClone; }() /** * Initialize the repo, find a secure url to use and * set the ref to match an input `target`. */ }, { key: "init", value: function () { var _init = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee8() { return _regenerator()["default"].wrap(function _callee8$(_context8) { while (1) switch (_context8.prev = _context8.next) { case 0: _context8.next = 2; return Git.secureGitUrl(this.gitUrl, this.hash, this.reporter); case 2: this.gitUrl = _context8.sent; _context8.next = 5; return this.setRefRemote(); case 5: _context8.t0 = this.ref !== ''; if (!_context8.t0) { _context8.next = 10; break; } _context8.next = 9; return Git.hasArchiveCapability(this.gitUrl); case 9: _context8.t0 = _context8.sent; case 10: if (!_context8.t0) { _context8.next = 14; break; } this.supportsArchive = true; _context8.next = 16; break; case 14: _context8.next = 16; return this.fetch(); case 16: return _context8.abrupt("return", this.hash); case 17: case "end": return _context8.stop(); } }, _callee8, this); })); function init() { return _init.apply(this, arguments); } return init; }() }, { key: "setRefRemote", value: function () { var _setRefRemote = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee9() { var isLocal, stdout, refs; return _regenerator()["default"].wrap(function _callee9$(_context9) { while (1) switch (_context9.prev = _context9.next) { case 0: isLocal = this.gitUrl.protocol === FILE_PROTOCOL; if (!isLocal) { _context9.next = 7; break; } _context9.next = 4; return (0, _gitSpawn().spawn)(['show-ref', '--tags', '--heads'], { cwd: this.gitUrl.repository }); case 4: stdout = _context9.sent; _context9.next = 10; break; case 7: _context9.next = 9; return (0, _gitSpawn().spawn)(['ls-remote', '--tags', '--heads', this.gitUrl.repository]); case 9: stdout = _context9.sent; case 10: refs = (0, _gitRefResolver().parseRefs)(stdout); return _context9.abrupt("return", this.setRef(refs)); case 12: case "end": return _context9.stop(); } }, _callee9, this); })); function setRefRemote() { return _setRefRemote.apply(this, arguments); } return setRefRemote; }() }, { key: "setRefHosted", value: function setRefHosted(hostedRefsList) { var refs = (0, _gitRefResolver().parseRefs)(hostedRefsList); return this.setRef(refs); } /** * Resolves the default branch of a remote repository (not always "master") */ }, { key: "resolveDefaultBranch", value: function () { var _resolveDefaultBranch = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee10() { var isLocal, stdout, refs, sha, lines, _lines$0$split, _lines$0$split2, ref, _lines$1$split, _lines$1$split2, _sha, _stdout, _lines, _lines$0$split3, _lines$0$split4, _sha2; return _regenerator()["default"].wrap(function _callee10$(_context10) { while (1) switch (_context10.prev = _context10.next) { case 0: isLocal = this.gitUrl.protocol === FILE_PROTOCOL; _context10.prev = 1; if (!isLocal) { _context10.next = 15; break; } _context10.next = 5; return (0, _gitSpawn().spawn)(['show-ref', 'HEAD'], { cwd: this.gitUrl.repository }); case 5: stdout = _context10.sent; refs = (0, _gitRefResolver().parseRefs)(stdout); sha = refs.values().next().value; if (!sha) { _context10.next = 12; break; } return _context10.abrupt("return", { sha: sha, ref: undefined }); case 12: throw new Error('Unable to find SHA for git HEAD'); case 13: _context10.next = 22; break; case 15: _context10.next = 17; return (0, _gitSpawn().spawn)(['ls-remote', '--symref', this.gitUrl.repository, 'HEAD']); case 17: stdout = _context10.sent; lines = stdout.split('\n').filter(validRef); _lines$0$split = lines[0].split(/\s+/), _lines$0$split2 = (0, _slicedToArray2()["default"])(_lines$0$split, 2), ref = _lines$0$split2[1]; _lines$1$split = lines[1].split(/\s+/), _lines$1$split2 = (0, _slicedToArray2()["default"])(_lines$1$split, 1), _sha = _lines$1$split2[0]; return _context10.abrupt("return", { sha: _sha, ref: ref }); case 22: _context10.next = 33; break; case 24: _context10.prev = 24; _context10.t0 = _context10["catch"](1); handleSpawnError(_context10.t0); // older versions of git don't support "--symref" _context10.next = 29; return (0, _gitSpawn().spawn)(['ls-remote', this.gitUrl.repository, 'HEAD']); case 29: _stdout = _context10.sent; _lines = _stdout.split('\n').filter(validRef); _lines$0$split3 = _lines[0].split(/\s+/), _lines$0$split4 = (0, _slicedToArray2()["default"])(_lines$0$split3, 1), _sha2 = _lines$0$split4[0]; return _context10.abrupt("return", { sha: _sha2, ref: undefined }); case 33: case "end": return _context10.stop(); } }, _callee10, this, [[1, 24]]); })); function resolveDefaultBranch() { return _resolveDefaultBranch.apply(this, arguments); } return resolveDefaultBranch; }() /** * Resolve a git commit to it's 40-chars format and ensure it exists in the repository * We need to use the 40-chars format to avoid multiple folders in the cache */ }, { key: "resolveCommit", value: function () { var _resolveCommit = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee11(shaToResolve) { var revListArgs, stdout, _stdout$split, _stdout$split2, sha; return _regenerator()["default"].wrap(function _callee11$(_context11) { while (1) switch (_context11.prev = _context11.next) { case 0: _context11.prev = 0; _context11.next = 3; return this.fetch(); case 3: revListArgs = ['rev-list', '-n', '1', '--no-abbrev-commit', '--format=oneline', shaToResolve]; _context11.next = 6; return (0, _gitSpawn().spawn)(revListArgs, { cwd: this.cwd }); case 6: stdout = _context11.sent; _stdout$split = stdout.split(/\s+/), _stdout$split2 = (0, _slicedToArray2()["default"])(_stdout$split, 1), sha = _stdout$split2[0]; return _context11.abrupt("return", { sha: sha, ref: undefined }); case 11: _context11.prev = 11; _context11.t0 = _context11["catch"](0); handleSpawnError(_context11.t0); // assuming commit not found, let's try something else return _context11.abrupt("return", null); case 15: case "end": return _context11.stop(); } }, _callee11, this, [[0, 11]]); })); function resolveCommit(_x7) { return _resolveCommit.apply(this, arguments); } return resolveCommit; }() /** * Resolves the input hash / ref / semver range to a valid commit sha * If possible also resolves the sha to a valid ref in order to use "git archive" */ }, { key: "setRef", value: function () { var _setRef = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee12(refs) { var version, resolvedResult; return _regenerator()["default"].wrap(function _callee12$(_context12) { while (1) switch (_context12.prev = _context12.next) { case 0: // get commit ref version = this.hash; _context12.next = 3; return (0, _gitRefResolver().resolveVersion)({ config: this.config, git: this, version: version, refs: refs }); case 3: resolvedResult = _context12.sent; if (resolvedResult) { _context12.next = 6; break; } throw new (_errors().MessageError)(this.reporter.lang('couldntFindMatch', version, Array.from(refs.keys()).join(','), this.gitUrl.repository)); case 6: this.hash = resolvedResult.sha; this.ref = resolvedResult.ref || ''; return _context12.abrupt("return", this.hash); case 9: case "end": return _context12.stop(); } }, _callee12, this); })); function setRef(_x8) { return _setRef.apply(this, arguments); } return setRef; }() }], [{ key: "npmUrlToGitUrl", value: /** * npm URLs contain a 'git+' scheme prefix, which is not understood by git. * git "URLs" also allow an alternative scp-like syntax, so they're not standard URLs. */ function npmUrlToGitUrl(npmUrl) { npmUrl = (0, _misc().removePrefix)(npmUrl, GIT_PROTOCOL_PREFIX); var parsed = _url()["default"].parse(npmUrl); var expander = parsed.protocol && SHORTHAND_SERVICES[parsed.protocol]; if (expander) { parsed = expander(parsed); } // Special case in npm, where ssh:// prefix is stripped to pass scp-like syntax // which in git works as remote path only if there are no slashes before ':'. // See #3146. if (parsed.protocol === SSH_PROTOCOL && parsed.hostname && parsed.path && parsed.path.startsWith(SCP_PATH_PREFIX) && parsed.port === null) { var auth = parsed.auth ? parsed.auth + '@' : ''; var pathname = parsed.path.slice(SCP_PATH_PREFIX.length); return { hostname: parsed.hostname, protocol: parsed.protocol, repository: "".concat(auth).concat(parsed.hostname, ":").concat(pathname) }; } // git local repos are specified as `git+file:` and a filesystem path, not a url. var repository; if (parsed.protocol === FILE_PROTOCOL) { repository = parsed.path; } else { repository = _url()["default"].format(_objectSpread(_objectSpread({}, parsed), {}, { hash: '' })); } return { hostname: parsed.hostname || null, protocol: parsed.protocol || FILE_PROTOCOL, repository: repository || '' }; } /** * Check if the host specified in the input `gitUrl` has archive capability. */ }, { key: "hasArchiveCapability", value: function () { var _hasArchiveCapability = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee13(ref) { var hostname, supports; return _regenerator()["default"].wrap(function _callee13$(_context13) { while (1) switch (_context13.prev = _context13.next) { case 0: hostname = ref.hostname; if (!(ref.protocol !== 'ssh:' || hostname == null)) { _context13.next = 3; break; } return _context13.abrupt("return", false); case 3: if (!(hostname in supportsArchiveCache)) { _context13.next = 5; break; } return _context13.abrupt("return", supportsArchiveCache[hostname]); case 5: _context13.prev = 5; _context13.next = 8; return (0, _gitSpawn().spawn)(['archive', "--remote=".concat(ref.repository), 'HEAD', Date.now() + '']); case 8: throw new Error(); case 11: _context13.prev = 11; _context13.t0 = _context13["catch"](5); handleSpawnError(_context13.t0); supports = _context13.t0.message.indexOf('did not match any files') >= 0; return _context13.abrupt("return", supportsArchiveCache[hostname] = supports); case 16: case "end": return _context13.stop(); } }, _callee13, null, [[5, 11]]); })); function hasArchiveCapability(_x9) { return _hasArchiveCapability.apply(this, arguments); } return hasArchiveCapability; }() /** * Check if the input `target` is a 5-40 character hex commit hash. */ }, { key: "repoExists", value: function () { var _repoExists = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee14(ref) { var isLocal; return _regenerator()["default"].wrap(function _callee14$(_context14) { while (1) switch (_context14.prev = _context14.next) { case 0: isLocal = ref.protocol === FILE_PROTOCOL; _context14.prev = 1; if (!isLocal) { _context14.next = 7; break; } _context14.next = 5; return (0, _gitSpawn().spawn)(['show-ref', '-t'], { cwd: ref.repository }); case 5: _context14.next = 9; break; case 7: _context14.next = 9; return (0, _gitSpawn().spawn)(['ls-remote', '-t', ref.repository]); case 9: return _context14.abrupt("return", true); case 12: _context14.prev = 12; _context14.t0 = _context14["catch"](1); handleSpawnError(_context14.t0); return _context14.abrupt("return", false); case 16: case "end": return _context14.stop(); } }, _callee14, null, [[1, 12]]); })); function repoExists(_x10) { return _repoExists.apply(this, arguments); } return repoExists; }() }, { key: "replaceProtocol", value: function replaceProtocol(ref, protocol) { return { hostname: ref.hostname, protocol: protocol, repository: ref.repository.replace(/^(?:git|http):/, protocol) }; } /** * Attempt to upgrade insecure protocols to secure protocol */ }, { key: "secureGitUrl", value: function () { var _secureGitUrl = (0, _asyncToGenerator2()["default"])( /*#__PURE__*/_regenerator()["default"].mark(function _callee15(ref, hash, reporter) { var secureUrl, secureRef; return _regenerator()["default"].wrap(function _callee15$(_context15) { while (1) switch (_context15.prev = _context15.next) { case 0: if (!(0, _gitRefResolver().isCommitSha)(hash)) { _context15.next = 2; break; } return _context15.abrupt("return", ref); case 2: if (!(ref.protocol === 'git:')) { _context15.next = 12; break; } secureUrl = Git.replaceProtocol(ref, 'https:'); _context15.next = 6; return Git.repoExists(secureUrl); case 6: if (!_context15.sent) { _context15.next = 10; break; } return _context15.abrupt("return", secureUrl); case 10: reporter.warn(reporter.lang('downloadGitWithoutCommit', ref.repository)); return _context15.abrupt("return", ref); case 12: if (!(ref.protocol === 'http:')) { _context15.next = 22; break; } secureRef = Git.replaceProtocol(ref, 'https:'); _context15.next = 16; return Git.repoExists(secureRef); case 16: if (!_context15.sent) { _context15.next = 20; break; } return _context15.abrupt("return", secureRef); case 20: reporter.warn(reporter.lang('downloadHTTPWithoutCommit', ref.repository)); return _context15.abrupt("return", ref); case 22: return _context15.abrupt("return", ref); case 23: case "end": return _context15.stop(); } }, _callee15); })); function secureGitUrl(_x11, _x12, _x13) { return _secureGitUrl.apply(this, arguments); } return secureGitUrl; }() }]); return Git; }(); exports["default"] = Git; //# sourceMappingURL=git.js.map