UNPKG

renovate

Version:

Automated dependency updates. Flexible so you don't need to be.

181 lines • 5.89 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.parseUrlPath = parseUrlPath; exports.extractPackageFile = extractPackageFile; const logger_1 = require("../../../logger"); const regex_1 = require("../../../util/regex"); const github_tags_1 = require("../../datasource/github-tags"); const util_1 = require("./util"); function parseSha256(idx, content) { let i = idx; i += 'sha256'.length; i = (0, util_1.skip)(i, content, (c) => (0, util_1.isSpace)(c)); if (content[i] !== '"' && content[i] !== "'") { return null; } i += 1; const j = (0, util_1.skip)(i, content, (c) => c !== '"' && c !== "'"); const sha256 = content.slice(i, j); return sha256; } function extractSha256(content) { const sha256RegExp = (0, regex_1.regEx)(/(^|\s)sha256(\s)/); let i = content.search(sha256RegExp); if ((0, util_1.isSpace)(content[i])) { i += 1; } return parseSha256(i, content); } function parseUrl(idx, content) { let i = idx; i += 'url'.length; i = (0, util_1.skip)(i, content, (c) => (0, util_1.isSpace)(c)); const chr = content[i]; if (chr !== '"' && chr !== "'") { return null; } i += 1; const j = (0, util_1.skip)(i, content, (c) => c !== '"' && c !== "'" && !(0, util_1.isSpace)(c)); const url = content.slice(i, j); return url; } function extractUrl(content) { const urlRegExp = (0, regex_1.regEx)(/(^|\s)url(\s)/); let i = content.search(urlRegExp); // content.search() returns -1 if not found if (i === -1) { return null; } if ((0, util_1.isSpace)(content[i])) { i += 1; } return parseUrl(i, content); } function parseUrlPath(urlStr) { if (!urlStr) { return null; } try { const url = new URL(urlStr); if (url.hostname !== 'github.com') { return null; } let s = url.pathname.split('/'); s = s.filter((val) => val); const ownerName = s[0]; const repoName = s[1]; let currentValue; if (s[2] === 'archive') { // old archive url in form: [...]/archive/<tag>.tar.gz currentValue = s[3]; if (currentValue === 'refs') { // new archive url in form: [...]/archive/refs/tags/<tag>.tar.gz currentValue = s[5]; } const targz = currentValue.slice(currentValue.length - 7, currentValue.length); if (targz === '.tar.gz') { currentValue = currentValue.substring(0, currentValue.length - 7); } } else if (s[2] === 'releases' && s[3] === 'download') { currentValue = s[4]; } if (!currentValue) { return null; } return { currentValue, ownerName, repoName }; } catch { return null; } } /* This function parses the "class className < Formula" header and returns the className and index of the character just after the header */ function parseClassHeader(idx, content) { let i = idx; i += 'class'.length; i = (0, util_1.skip)(i, content, (c) => (0, util_1.isSpace)(c)); // Skip all non space and non '<' characters let j = (0, util_1.skip)(i, content, (c) => !(0, util_1.isSpace)(c) && c !== '<'); const className = content.slice(i, j); i = j; // Skip spaces i = (0, util_1.skip)(i, content, (c) => (0, util_1.isSpace)(c)); if (content[i] === '<') { i += 1; } else { return null; } // Skip spaces i = (0, util_1.skip)(i, content, (c) => (0, util_1.isSpace)(c)); // Skip non-spaces j = (0, util_1.skip)(i, content, (c) => !(0, util_1.isSpace)(c)); if (content.slice(i, j) !== 'Formula') { return null; } return className; } function extractClassName(content) { const classRegExp = (0, regex_1.regEx)(/(^|\s)class\s/); let i = content.search(classRegExp); if ((0, util_1.isSpace)(content[i])) { i += 1; } return parseClassHeader(i, content); } // TODO: Maybe check if quotes/double-quotes are balanced (#9591) function extractPackageFile(content) { logger_1.logger.trace('extractPackageFile()'); /* 1. match "class className < Formula" 2. extract className 3. extract url field (get depName from url) 4. extract sha256 field */ const cleanContent = (0, util_1.removeComments)(content); const className = extractClassName(cleanContent); if (!className) { logger_1.logger.debug('Invalid class definition'); return null; } const url = extractUrl(cleanContent); if (!url) { logger_1.logger.debug('Invalid URL field'); } const urlPathResult = parseUrlPath(url); let skipReason; let currentValue = null; let ownerName = null; let repoName = null; if (urlPathResult) { currentValue = urlPathResult.currentValue; ownerName = urlPathResult.ownerName; repoName = urlPathResult.repoName; } else { logger_1.logger.debug('Error: Unsupported URL field'); skipReason = 'unsupported-url'; } const sha256 = extractSha256(cleanContent); if (!sha256 || sha256.length !== 64) { logger_1.logger.debug('Error: Invalid sha256 field'); skipReason = 'invalid-sha256'; } const dep = { // TODO: types (#22198) depName: `${ownerName}/${repoName}`, managerData: { ownerName, repoName, sha256, url }, currentValue, datasource: github_tags_1.GithubTagsDatasource.id, }; if (skipReason) { dep.skipReason = skipReason; if (skipReason === 'unsupported-url') { dep.depName = className; dep.datasource = undefined; } } const deps = [dep]; return { deps }; } //# sourceMappingURL=extract.js.map