diff --git a/dist/cleanup/index.js b/dist/cleanup/index.js index 106007f..10fa6a0 100644 --- a/dist/cleanup/index.js +++ b/dist/cleanup/index.js @@ -57237,6 +57237,314 @@ function isPlainObject(o) { exports.isPlainObject = isPlainObject; +/***/ }), + +/***/ 7821: +/***/ (function(module) { + +// +// THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND! +// +; +(function (global, factory) { + true + ? module.exports = factory() + : 0; +}((typeof self !== 'undefined' ? self + : typeof window !== 'undefined' ? window + : typeof global !== 'undefined' ? global + : this), function () { + 'use strict'; + /** + * base64.ts + * + * Licensed under the BSD 3-Clause License. + * http://opensource.org/licenses/BSD-3-Clause + * + * References: + * http://en.wikipedia.org/wiki/Base64 + * + * @author Dan Kogai (https://github.com/dankogai) + */ + var version = '3.7.5'; + /** + * @deprecated use lowercase `version`. + */ + var VERSION = version; + var _hasatob = typeof atob === 'function'; + var _hasbtoa = typeof btoa === 'function'; + var _hasBuffer = typeof Buffer === 'function'; + var _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined; + var _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined; + var b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var b64chs = Array.prototype.slice.call(b64ch); + var b64tab = (function (a) { + var tab = {}; + a.forEach(function (c, i) { return tab[c] = i; }); + return tab; + })(b64chs); + var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; + var _fromCC = String.fromCharCode.bind(String); + var _U8Afrom = typeof Uint8Array.from === 'function' + ? Uint8Array.from.bind(Uint8Array) + : function (it) { return new Uint8Array(Array.prototype.slice.call(it, 0)); }; + var _mkUriSafe = function (src) { return src + .replace(/=/g, '').replace(/[+\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; }); }; + var _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\+\/]/g, ''); }; + /** + * polyfill version of `btoa` + */ + var btoaPolyfill = function (bin) { + // console.log('polyfilled'); + var u32, c0, c1, c2, asc = ''; + var pad = bin.length % 3; + for (var i = 0; i < bin.length;) { + if ((c0 = bin.charCodeAt(i++)) > 255 || + (c1 = bin.charCodeAt(i++)) > 255 || + (c2 = bin.charCodeAt(i++)) > 255) + throw new TypeError('invalid character found'); + u32 = (c0 << 16) | (c1 << 8) | c2; + asc += b64chs[u32 >> 18 & 63] + + b64chs[u32 >> 12 & 63] + + b64chs[u32 >> 6 & 63] + + b64chs[u32 & 63]; + } + return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; + }; + /** + * does what `window.btoa` of web browsers do. + * @param {String} bin binary string + * @returns {string} Base64-encoded string + */ + var _btoa = _hasbtoa ? function (bin) { return btoa(bin); } + : _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); } + : btoaPolyfill; + var _fromUint8Array = _hasBuffer + ? function (u8a) { return Buffer.from(u8a).toString('base64'); } + : function (u8a) { + // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326 + var maxargs = 0x1000; + var strs = []; + for (var i = 0, l = u8a.length; i < l; i += maxargs) { + strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); + } + return _btoa(strs.join('')); + }; + /** + * converts a Uint8Array to a Base64 string. + * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5 + * @returns {string} Base64 string + */ + var fromUint8Array = function (u8a, urlsafe) { + if (urlsafe === void 0) { urlsafe = false; } + return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a); + }; + // This trick is found broken https://github.com/dankogai/js-base64/issues/130 + // const utob = (src: string) => unescape(encodeURIComponent(src)); + // reverting good old fationed regexp + var cb_utob = function (c) { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 0x80 ? c + : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6)) + + _fromCC(0x80 | (cc & 0x3f))) + : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f)) + + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + + _fromCC(0x80 | (cc & 0x3f))); + } + else { + var cc = 0x10000 + + (c.charCodeAt(0) - 0xD800) * 0x400 + + (c.charCodeAt(1) - 0xDC00); + return (_fromCC(0xf0 | ((cc >>> 18) & 0x07)) + + _fromCC(0x80 | ((cc >>> 12) & 0x3f)) + + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + + _fromCC(0x80 | (cc & 0x3f))); + } + }; + var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; + /** + * @deprecated should have been internal use only. + * @param {string} src UTF-8 string + * @returns {string} UTF-16 string + */ + var utob = function (u) { return u.replace(re_utob, cb_utob); }; + // + var _encode = _hasBuffer + ? function (s) { return Buffer.from(s, 'utf8').toString('base64'); } + : _TE + ? function (s) { return _fromUint8Array(_TE.encode(s)); } + : function (s) { return _btoa(utob(s)); }; + /** + * converts a UTF-8-encoded string to a Base64 string. + * @param {boolean} [urlsafe] if `true` make the result URL-safe + * @returns {string} Base64 string + */ + var encode = function (src, urlsafe) { + if (urlsafe === void 0) { urlsafe = false; } + return urlsafe + ? _mkUriSafe(_encode(src)) + : _encode(src); + }; + /** + * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5. + * @returns {string} Base64 string + */ + var encodeURI = function (src) { return encode(src, true); }; + // This trick is found broken https://github.com/dankogai/js-base64/issues/130 + // const btou = (src: string) => decodeURIComponent(escape(src)); + // reverting good old fationed regexp + var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; + var cb_btou = function (cccc) { + switch (cccc.length) { + case 4: + var cp = ((0x07 & cccc.charCodeAt(0)) << 18) + | ((0x3f & cccc.charCodeAt(1)) << 12) + | ((0x3f & cccc.charCodeAt(2)) << 6) + | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000; + return (_fromCC((offset >>> 10) + 0xD800) + + _fromCC((offset & 0x3FF) + 0xDC00)); + case 3: + return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12) + | ((0x3f & cccc.charCodeAt(1)) << 6) + | (0x3f & cccc.charCodeAt(2))); + default: + return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6) + | (0x3f & cccc.charCodeAt(1))); + } + }; + /** + * @deprecated should have been internal use only. + * @param {string} src UTF-16 string + * @returns {string} UTF-8 string + */ + var btou = function (b) { return b.replace(re_btou, cb_btou); }; + /** + * polyfill version of `atob` + */ + var atobPolyfill = function (asc) { + // console.log('polyfilled'); + asc = asc.replace(/\s+/g, ''); + if (!b64re.test(asc)) + throw new TypeError('malformed base64.'); + asc += '=='.slice(2 - (asc.length & 3)); + var u24, bin = '', r1, r2; + for (var i = 0; i < asc.length;) { + u24 = b64tab[asc.charAt(i++)] << 18 + | b64tab[asc.charAt(i++)] << 12 + | (r1 = b64tab[asc.charAt(i++)]) << 6 + | (r2 = b64tab[asc.charAt(i++)]); + bin += r1 === 64 ? _fromCC(u24 >> 16 & 255) + : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255) + : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); + } + return bin; + }; + /** + * does what `window.atob` of web browsers do. + * @param {String} asc Base64-encoded string + * @returns {string} binary string + */ + var _atob = _hasatob ? function (asc) { return atob(_tidyB64(asc)); } + : _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); } + : atobPolyfill; + // + var _toUint8Array = _hasBuffer + ? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); } + : function (a) { return _U8Afrom(_atob(a).split('').map(function (c) { return c.charCodeAt(0); })); }; + /** + * converts a Base64 string to a Uint8Array. + */ + var toUint8Array = function (a) { return _toUint8Array(_unURI(a)); }; + // + var _decode = _hasBuffer + ? function (a) { return Buffer.from(a, 'base64').toString('utf8'); } + : _TD + ? function (a) { return _TD.decode(_toUint8Array(a)); } + : function (a) { return btou(_atob(a)); }; + var _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); }; + /** + * converts a Base64 string to a UTF-8 string. + * @param {String} src Base64 string. Both normal and URL-safe are supported + * @returns {string} UTF-8 string + */ + var decode = function (src) { return _decode(_unURI(src)); }; + /** + * check if a value is a valid Base64 string + * @param {String} src a value to check + */ + var isValid = function (src) { + if (typeof src !== 'string') + return false; + var s = src.replace(/\s+/g, '').replace(/={0,2}$/, ''); + return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s); + }; + // + var _noEnum = function (v) { + return { + value: v, enumerable: false, writable: true, configurable: true + }; + }; + /** + * extend String.prototype with relevant methods + */ + var extendString = function () { + var _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); }; + _add('fromBase64', function () { return decode(this); }); + _add('toBase64', function (urlsafe) { return encode(this, urlsafe); }); + _add('toBase64URI', function () { return encode(this, true); }); + _add('toBase64URL', function () { return encode(this, true); }); + _add('toUint8Array', function () { return toUint8Array(this); }); + }; + /** + * extend Uint8Array.prototype with relevant methods + */ + var extendUint8Array = function () { + var _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); }; + _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); }); + _add('toBase64URI', function () { return fromUint8Array(this, true); }); + _add('toBase64URL', function () { return fromUint8Array(this, true); }); + }; + /** + * extend Builtin prototypes with relevant methods + */ + var extendBuiltins = function () { + extendString(); + extendUint8Array(); + }; + var gBase64 = { + version: version, + VERSION: VERSION, + atob: _atob, + atobPolyfill: atobPolyfill, + btoa: _btoa, + btoaPolyfill: btoaPolyfill, + fromBase64: decode, + toBase64: encode, + encode: encode, + encodeURI: encodeURI, + encodeURL: encodeURI, + utob: utob, + btou: btou, + decode: decode, + isValid: isValid, + fromUint8Array: fromUint8Array, + toUint8Array: toUint8Array, + extendString: extendString, + extendUint8Array: extendUint8Array, + extendBuiltins: extendBuiltins + }; + // + // export Base64 to the namespace + // + // ES5 is yet to have Object.assign() that may make transpilers unhappy. + // gBase64.Base64 = Object.assign({}, gBase64); + gBase64.Base64 = {}; + Object.keys(gBase64).forEach(function (k) { return gBase64.Base64[k] = gBase64[k]; }); + return gBase64; +})); + + /***/ }), /***/ 8401: @@ -74145,6 +74453,8 @@ function generateReports() { const buildOutput = JSON.parse(fs.readFileSync(BUILD_OUTPUT_JSON_PATH, 'utf8')); const treeSha = yield (0, utils_1.createTree)(JSON.stringify(buildOutput)); yield (0, utils_1.createRef)(treeSha); + const prMetrics = yield (0, utils_1.getPrBaseBranchMetrics)(); + const prBaseReport = createReport(buildOutput); const report = createReport(buildOutput); if (areJobReportsEnabled()) { core.summary.addRaw(report); @@ -74152,6 +74462,7 @@ function generateReports() { } if (arePRReportsEnabled()) { (0, utils_1.createPRComment)(report); + (0, utils_1.createPRComment)(report + buildOutput); } } }); @@ -74450,7 +74761,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createTree = exports.createRef = exports.createPRComment = exports.isPREvent = exports.toSemVer = exports.calculateSHA256 = exports.downloadExtractAndCacheJDK = exports.downloadAndExtractJDK = exports.getMatchingTags = exports.getTaggedRelease = exports.getLatestRelease = exports.exec = void 0; +exports.getPrBaseBranchMetrics = exports.createTree = exports.createRef = exports.createPRComment = exports.isPREvent = exports.toSemVer = exports.calculateSHA256 = exports.downloadExtractAndCacheJDK = exports.downloadAndExtractJDK = exports.getMatchingTags = exports.getTaggedRelease = exports.getLatestRelease = exports.exec = void 0; const c = __importStar(__nccwpck_require__(2764)); const core = __importStar(__nccwpck_require__(2258)); const github = __importStar(__nccwpck_require__(7168)); @@ -74461,6 +74772,7 @@ const fs_1 = __nccwpck_require__(7147); //import {Octokit} from '@octokit/core' const crypto_1 = __nccwpck_require__(6113); const path_1 = __nccwpck_require__(1017); +const js_base64_1 = __nccwpck_require__(7821); const rest_1 = __nccwpck_require__(6175); const node_fetch_1 = __importDefault(__nccwpck_require__(831)); // Set up Octokit for github.com only and in the same way as @actions/github (see https://git.io/Jy9YP) @@ -74593,6 +74905,12 @@ function getGitHubToken() { function getCommitSha() { return process.env.GITHUB_SHA || "default_tag"; } +function getPrBaseBranchSha() { + if (!isPREvent()) { + return ""; + } + return process.env.GITHUB_BASE_REF || "default_branch"; +} function createPRComment(content) { var _a; return __awaiter(this, void 0, void 0, function* () { @@ -74609,35 +74927,6 @@ function createPRComment(content) { }); } exports.createPRComment = createPRComment; -/*export async function saveReportJson(content: string): Promise { - const octokit = new Octokit({ - auth: getGitHubToken(), - request: { - fetch: fetch, - }, - }); - - const contentEncoded = Base64.encode(content) - - - const { data } = await octokit.repos.createOrUpdateFileContents({ - owner: 'jessiscript', - repo: 're23_build_tracking', - path: 'OUTPUT.json', - content: contentEncoded, - message: 'Add Report JSON data', - committer: { - name: 'jessiscript', - email: 'pauljessica2001@gmail.com', - }, - author:{ - name: 'jessiscript', - email: 'pauljessica2001@gmail.com', - } - }); - - console.log(data); -}*/ function createRef(sha) { return __awaiter(this, void 0, void 0, function* () { const commitSha = getCommitSha(); @@ -74679,6 +74968,62 @@ function createTree(metadataJson) { }); } exports.createTree = createTree; +function getPrBaseBranchMetrics() { + return __awaiter(this, void 0, void 0, function* () { + if (!isPREvent()) { + throw new Error('Not a PR event.'); + } + const context = github.context; + const octokit = new rest_1.Octokit({ + auth: getGitHubToken(), + request: { + fetch: node_fetch_1.default, + }, + }); + const baseCommitSha = yield getBaseBranchCommitSha(octokit, context); + core.info(baseCommitSha); + const blobTreeUrl = yield getBlobTreeUrl(octokit, context, baseCommitSha); + core.info(blobTreeUrl); + const blobUrl = yield getBlobUrl(octokit, context, blobTreeUrl); + core.info(blobUrl); + const blobContent = yield getBlobContent(octokit, context, blobUrl); + core.info(blobContent); + return blobContent; + }); +} +exports.getPrBaseBranchMetrics = getPrBaseBranchMetrics; +function getBaseBranchCommitSha(octokit, context) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/ref/heads/${getPrBaseBranchSha()}`, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return data.object.sha; + }); +} +function getBlobTreeUrl(octokit, context, baseCommitSha) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/ref/metrics/${baseCommitSha}`, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return data.object.url; + }); +} +function getBlobUrl(octokit, context, blobTreeUrl) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(blobTreeUrl, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return data.tree[0].url; + }); +} +function getBlobContent(octokit, context, blobUrl) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(blobUrl, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return js_base64_1.Base64.decode(data.content); + }); +} /***/ }), diff --git a/dist/main/index.js b/dist/main/index.js index 7545874..c07eaa3 100644 --- a/dist/main/index.js +++ b/dist/main/index.js @@ -57237,6 +57237,314 @@ function isPlainObject(o) { exports.isPlainObject = isPlainObject; +/***/ }), + +/***/ 7821: +/***/ (function(module) { + +// +// THIS FILE IS AUTOMATICALLY GENERATED! DO NOT EDIT BY HAND! +// +; +(function (global, factory) { + true + ? module.exports = factory() + : 0; +}((typeof self !== 'undefined' ? self + : typeof window !== 'undefined' ? window + : typeof global !== 'undefined' ? global + : this), function () { + 'use strict'; + /** + * base64.ts + * + * Licensed under the BSD 3-Clause License. + * http://opensource.org/licenses/BSD-3-Clause + * + * References: + * http://en.wikipedia.org/wiki/Base64 + * + * @author Dan Kogai (https://github.com/dankogai) + */ + var version = '3.7.5'; + /** + * @deprecated use lowercase `version`. + */ + var VERSION = version; + var _hasatob = typeof atob === 'function'; + var _hasbtoa = typeof btoa === 'function'; + var _hasBuffer = typeof Buffer === 'function'; + var _TD = typeof TextDecoder === 'function' ? new TextDecoder() : undefined; + var _TE = typeof TextEncoder === 'function' ? new TextEncoder() : undefined; + var b64ch = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/='; + var b64chs = Array.prototype.slice.call(b64ch); + var b64tab = (function (a) { + var tab = {}; + a.forEach(function (c, i) { return tab[c] = i; }); + return tab; + })(b64chs); + var b64re = /^(?:[A-Za-z\d+\/]{4})*?(?:[A-Za-z\d+\/]{2}(?:==)?|[A-Za-z\d+\/]{3}=?)?$/; + var _fromCC = String.fromCharCode.bind(String); + var _U8Afrom = typeof Uint8Array.from === 'function' + ? Uint8Array.from.bind(Uint8Array) + : function (it) { return new Uint8Array(Array.prototype.slice.call(it, 0)); }; + var _mkUriSafe = function (src) { return src + .replace(/=/g, '').replace(/[+\/]/g, function (m0) { return m0 == '+' ? '-' : '_'; }); }; + var _tidyB64 = function (s) { return s.replace(/[^A-Za-z0-9\+\/]/g, ''); }; + /** + * polyfill version of `btoa` + */ + var btoaPolyfill = function (bin) { + // console.log('polyfilled'); + var u32, c0, c1, c2, asc = ''; + var pad = bin.length % 3; + for (var i = 0; i < bin.length;) { + if ((c0 = bin.charCodeAt(i++)) > 255 || + (c1 = bin.charCodeAt(i++)) > 255 || + (c2 = bin.charCodeAt(i++)) > 255) + throw new TypeError('invalid character found'); + u32 = (c0 << 16) | (c1 << 8) | c2; + asc += b64chs[u32 >> 18 & 63] + + b64chs[u32 >> 12 & 63] + + b64chs[u32 >> 6 & 63] + + b64chs[u32 & 63]; + } + return pad ? asc.slice(0, pad - 3) + "===".substring(pad) : asc; + }; + /** + * does what `window.btoa` of web browsers do. + * @param {String} bin binary string + * @returns {string} Base64-encoded string + */ + var _btoa = _hasbtoa ? function (bin) { return btoa(bin); } + : _hasBuffer ? function (bin) { return Buffer.from(bin, 'binary').toString('base64'); } + : btoaPolyfill; + var _fromUint8Array = _hasBuffer + ? function (u8a) { return Buffer.from(u8a).toString('base64'); } + : function (u8a) { + // cf. https://stackoverflow.com/questions/12710001/how-to-convert-uint8-array-to-base64-encoded-string/12713326#12713326 + var maxargs = 0x1000; + var strs = []; + for (var i = 0, l = u8a.length; i < l; i += maxargs) { + strs.push(_fromCC.apply(null, u8a.subarray(i, i + maxargs))); + } + return _btoa(strs.join('')); + }; + /** + * converts a Uint8Array to a Base64 string. + * @param {boolean} [urlsafe] URL-and-filename-safe a la RFC4648 §5 + * @returns {string} Base64 string + */ + var fromUint8Array = function (u8a, urlsafe) { + if (urlsafe === void 0) { urlsafe = false; } + return urlsafe ? _mkUriSafe(_fromUint8Array(u8a)) : _fromUint8Array(u8a); + }; + // This trick is found broken https://github.com/dankogai/js-base64/issues/130 + // const utob = (src: string) => unescape(encodeURIComponent(src)); + // reverting good old fationed regexp + var cb_utob = function (c) { + if (c.length < 2) { + var cc = c.charCodeAt(0); + return cc < 0x80 ? c + : cc < 0x800 ? (_fromCC(0xc0 | (cc >>> 6)) + + _fromCC(0x80 | (cc & 0x3f))) + : (_fromCC(0xe0 | ((cc >>> 12) & 0x0f)) + + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + + _fromCC(0x80 | (cc & 0x3f))); + } + else { + var cc = 0x10000 + + (c.charCodeAt(0) - 0xD800) * 0x400 + + (c.charCodeAt(1) - 0xDC00); + return (_fromCC(0xf0 | ((cc >>> 18) & 0x07)) + + _fromCC(0x80 | ((cc >>> 12) & 0x3f)) + + _fromCC(0x80 | ((cc >>> 6) & 0x3f)) + + _fromCC(0x80 | (cc & 0x3f))); + } + }; + var re_utob = /[\uD800-\uDBFF][\uDC00-\uDFFFF]|[^\x00-\x7F]/g; + /** + * @deprecated should have been internal use only. + * @param {string} src UTF-8 string + * @returns {string} UTF-16 string + */ + var utob = function (u) { return u.replace(re_utob, cb_utob); }; + // + var _encode = _hasBuffer + ? function (s) { return Buffer.from(s, 'utf8').toString('base64'); } + : _TE + ? function (s) { return _fromUint8Array(_TE.encode(s)); } + : function (s) { return _btoa(utob(s)); }; + /** + * converts a UTF-8-encoded string to a Base64 string. + * @param {boolean} [urlsafe] if `true` make the result URL-safe + * @returns {string} Base64 string + */ + var encode = function (src, urlsafe) { + if (urlsafe === void 0) { urlsafe = false; } + return urlsafe + ? _mkUriSafe(_encode(src)) + : _encode(src); + }; + /** + * converts a UTF-8-encoded string to URL-safe Base64 RFC4648 §5. + * @returns {string} Base64 string + */ + var encodeURI = function (src) { return encode(src, true); }; + // This trick is found broken https://github.com/dankogai/js-base64/issues/130 + // const btou = (src: string) => decodeURIComponent(escape(src)); + // reverting good old fationed regexp + var re_btou = /[\xC0-\xDF][\x80-\xBF]|[\xE0-\xEF][\x80-\xBF]{2}|[\xF0-\xF7][\x80-\xBF]{3}/g; + var cb_btou = function (cccc) { + switch (cccc.length) { + case 4: + var cp = ((0x07 & cccc.charCodeAt(0)) << 18) + | ((0x3f & cccc.charCodeAt(1)) << 12) + | ((0x3f & cccc.charCodeAt(2)) << 6) + | (0x3f & cccc.charCodeAt(3)), offset = cp - 0x10000; + return (_fromCC((offset >>> 10) + 0xD800) + + _fromCC((offset & 0x3FF) + 0xDC00)); + case 3: + return _fromCC(((0x0f & cccc.charCodeAt(0)) << 12) + | ((0x3f & cccc.charCodeAt(1)) << 6) + | (0x3f & cccc.charCodeAt(2))); + default: + return _fromCC(((0x1f & cccc.charCodeAt(0)) << 6) + | (0x3f & cccc.charCodeAt(1))); + } + }; + /** + * @deprecated should have been internal use only. + * @param {string} src UTF-16 string + * @returns {string} UTF-8 string + */ + var btou = function (b) { return b.replace(re_btou, cb_btou); }; + /** + * polyfill version of `atob` + */ + var atobPolyfill = function (asc) { + // console.log('polyfilled'); + asc = asc.replace(/\s+/g, ''); + if (!b64re.test(asc)) + throw new TypeError('malformed base64.'); + asc += '=='.slice(2 - (asc.length & 3)); + var u24, bin = '', r1, r2; + for (var i = 0; i < asc.length;) { + u24 = b64tab[asc.charAt(i++)] << 18 + | b64tab[asc.charAt(i++)] << 12 + | (r1 = b64tab[asc.charAt(i++)]) << 6 + | (r2 = b64tab[asc.charAt(i++)]); + bin += r1 === 64 ? _fromCC(u24 >> 16 & 255) + : r2 === 64 ? _fromCC(u24 >> 16 & 255, u24 >> 8 & 255) + : _fromCC(u24 >> 16 & 255, u24 >> 8 & 255, u24 & 255); + } + return bin; + }; + /** + * does what `window.atob` of web browsers do. + * @param {String} asc Base64-encoded string + * @returns {string} binary string + */ + var _atob = _hasatob ? function (asc) { return atob(_tidyB64(asc)); } + : _hasBuffer ? function (asc) { return Buffer.from(asc, 'base64').toString('binary'); } + : atobPolyfill; + // + var _toUint8Array = _hasBuffer + ? function (a) { return _U8Afrom(Buffer.from(a, 'base64')); } + : function (a) { return _U8Afrom(_atob(a).split('').map(function (c) { return c.charCodeAt(0); })); }; + /** + * converts a Base64 string to a Uint8Array. + */ + var toUint8Array = function (a) { return _toUint8Array(_unURI(a)); }; + // + var _decode = _hasBuffer + ? function (a) { return Buffer.from(a, 'base64').toString('utf8'); } + : _TD + ? function (a) { return _TD.decode(_toUint8Array(a)); } + : function (a) { return btou(_atob(a)); }; + var _unURI = function (a) { return _tidyB64(a.replace(/[-_]/g, function (m0) { return m0 == '-' ? '+' : '/'; })); }; + /** + * converts a Base64 string to a UTF-8 string. + * @param {String} src Base64 string. Both normal and URL-safe are supported + * @returns {string} UTF-8 string + */ + var decode = function (src) { return _decode(_unURI(src)); }; + /** + * check if a value is a valid Base64 string + * @param {String} src a value to check + */ + var isValid = function (src) { + if (typeof src !== 'string') + return false; + var s = src.replace(/\s+/g, '').replace(/={0,2}$/, ''); + return !/[^\s0-9a-zA-Z\+/]/.test(s) || !/[^\s0-9a-zA-Z\-_]/.test(s); + }; + // + var _noEnum = function (v) { + return { + value: v, enumerable: false, writable: true, configurable: true + }; + }; + /** + * extend String.prototype with relevant methods + */ + var extendString = function () { + var _add = function (name, body) { return Object.defineProperty(String.prototype, name, _noEnum(body)); }; + _add('fromBase64', function () { return decode(this); }); + _add('toBase64', function (urlsafe) { return encode(this, urlsafe); }); + _add('toBase64URI', function () { return encode(this, true); }); + _add('toBase64URL', function () { return encode(this, true); }); + _add('toUint8Array', function () { return toUint8Array(this); }); + }; + /** + * extend Uint8Array.prototype with relevant methods + */ + var extendUint8Array = function () { + var _add = function (name, body) { return Object.defineProperty(Uint8Array.prototype, name, _noEnum(body)); }; + _add('toBase64', function (urlsafe) { return fromUint8Array(this, urlsafe); }); + _add('toBase64URI', function () { return fromUint8Array(this, true); }); + _add('toBase64URL', function () { return fromUint8Array(this, true); }); + }; + /** + * extend Builtin prototypes with relevant methods + */ + var extendBuiltins = function () { + extendString(); + extendUint8Array(); + }; + var gBase64 = { + version: version, + VERSION: VERSION, + atob: _atob, + atobPolyfill: atobPolyfill, + btoa: _btoa, + btoaPolyfill: btoaPolyfill, + fromBase64: decode, + toBase64: encode, + encode: encode, + encodeURI: encodeURI, + encodeURL: encodeURI, + utob: utob, + btou: btou, + decode: decode, + isValid: isValid, + fromUint8Array: fromUint8Array, + toUint8Array: toUint8Array, + extendString: extendString, + extendUint8Array: extendUint8Array, + extendBuiltins: extendBuiltins + }; + // + // export Base64 to the namespace + // + // ES5 is yet to have Object.assign() that may make transpilers unhappy. + // gBase64.Base64 = Object.assign({}, gBase64); + gBase64.Base64 = {}; + Object.keys(gBase64).forEach(function (k) { return gBase64.Base64[k] = gBase64[k]; }); + return gBase64; +})); + + /***/ }), /***/ 8401: @@ -74244,6 +74552,8 @@ function generateReports() { const buildOutput = JSON.parse(fs.readFileSync(BUILD_OUTPUT_JSON_PATH, 'utf8')); const treeSha = yield (0, utils_1.createTree)(JSON.stringify(buildOutput)); yield (0, utils_1.createRef)(treeSha); + const prMetrics = yield (0, utils_1.getPrBaseBranchMetrics)(); + const prBaseReport = createReport(buildOutput); const report = createReport(buildOutput); if (areJobReportsEnabled()) { core.summary.addRaw(report); @@ -74251,6 +74561,7 @@ function generateReports() { } if (arePRReportsEnabled()) { (0, utils_1.createPRComment)(report); + (0, utils_1.createPRComment)(report + buildOutput); } } }); @@ -75447,7 +75758,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", ({ value: true })); -exports.createTree = exports.createRef = exports.createPRComment = exports.isPREvent = exports.toSemVer = exports.calculateSHA256 = exports.downloadExtractAndCacheJDK = exports.downloadAndExtractJDK = exports.getMatchingTags = exports.getTaggedRelease = exports.getLatestRelease = exports.exec = void 0; +exports.getPrBaseBranchMetrics = exports.createTree = exports.createRef = exports.createPRComment = exports.isPREvent = exports.toSemVer = exports.calculateSHA256 = exports.downloadExtractAndCacheJDK = exports.downloadAndExtractJDK = exports.getMatchingTags = exports.getTaggedRelease = exports.getLatestRelease = exports.exec = void 0; const c = __importStar(__nccwpck_require__(2764)); const core = __importStar(__nccwpck_require__(2258)); const github = __importStar(__nccwpck_require__(7168)); @@ -75458,6 +75769,7 @@ const fs_1 = __nccwpck_require__(7147); //import {Octokit} from '@octokit/core' const crypto_1 = __nccwpck_require__(6113); const path_1 = __nccwpck_require__(1017); +const js_base64_1 = __nccwpck_require__(7821); const rest_1 = __nccwpck_require__(6175); const node_fetch_1 = __importDefault(__nccwpck_require__(831)); // Set up Octokit for github.com only and in the same way as @actions/github (see https://git.io/Jy9YP) @@ -75590,6 +75902,12 @@ function getGitHubToken() { function getCommitSha() { return process.env.GITHUB_SHA || "default_tag"; } +function getPrBaseBranchSha() { + if (!isPREvent()) { + return ""; + } + return process.env.GITHUB_BASE_REF || "default_branch"; +} function createPRComment(content) { var _a; return __awaiter(this, void 0, void 0, function* () { @@ -75606,35 +75924,6 @@ function createPRComment(content) { }); } exports.createPRComment = createPRComment; -/*export async function saveReportJson(content: string): Promise { - const octokit = new Octokit({ - auth: getGitHubToken(), - request: { - fetch: fetch, - }, - }); - - const contentEncoded = Base64.encode(content) - - - const { data } = await octokit.repos.createOrUpdateFileContents({ - owner: 'jessiscript', - repo: 're23_build_tracking', - path: 'OUTPUT.json', - content: contentEncoded, - message: 'Add Report JSON data', - committer: { - name: 'jessiscript', - email: 'pauljessica2001@gmail.com', - }, - author:{ - name: 'jessiscript', - email: 'pauljessica2001@gmail.com', - } - }); - - console.log(data); -}*/ function createRef(sha) { return __awaiter(this, void 0, void 0, function* () { const commitSha = getCommitSha(); @@ -75676,6 +75965,62 @@ function createTree(metadataJson) { }); } exports.createTree = createTree; +function getPrBaseBranchMetrics() { + return __awaiter(this, void 0, void 0, function* () { + if (!isPREvent()) { + throw new Error('Not a PR event.'); + } + const context = github.context; + const octokit = new rest_1.Octokit({ + auth: getGitHubToken(), + request: { + fetch: node_fetch_1.default, + }, + }); + const baseCommitSha = yield getBaseBranchCommitSha(octokit, context); + core.info(baseCommitSha); + const blobTreeUrl = yield getBlobTreeUrl(octokit, context, baseCommitSha); + core.info(blobTreeUrl); + const blobUrl = yield getBlobUrl(octokit, context, blobTreeUrl); + core.info(blobUrl); + const blobContent = yield getBlobContent(octokit, context, blobUrl); + core.info(blobContent); + return blobContent; + }); +} +exports.getPrBaseBranchMetrics = getPrBaseBranchMetrics; +function getBaseBranchCommitSha(octokit, context) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/ref/heads/${getPrBaseBranchSha()}`, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return data.object.sha; + }); +} +function getBlobTreeUrl(octokit, context, baseCommitSha) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/ref/metrics/${baseCommitSha}`, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return data.object.url; + }); +} +function getBlobUrl(octokit, context, blobTreeUrl) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(blobTreeUrl, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return data.tree[0].url; + }); +} +function getBlobContent(octokit, context, blobUrl) { + return __awaiter(this, void 0, void 0, function* () { + const { data } = yield octokit.request(blobUrl, Object.assign(Object.assign({}, context.repo), { headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } })); + return js_base64_1.Base64.decode(data.content); + }); +} /***/ }), diff --git a/src/features/reports.ts b/src/features/reports.ts index 9a80ecb..4e49726 100644 --- a/src/features/reports.ts +++ b/src/features/reports.ts @@ -4,7 +4,7 @@ import * as fs from 'fs' import * as github from '@actions/github' import {join} from 'path' import {tmpdir} from 'os' -import {createPRComment, createRef, createTree, isPREvent, toSemVer} from '../utils' +import {createPRComment, createRef, createTree, getPrBaseBranchMetrics, isPREvent, toSemVer} from '../utils' import {gte} from 'semver' import {Base64} from 'js-base64'; import { Octokit } from '@octokit/rest'; @@ -136,6 +136,8 @@ export async function generateReports(): Promise { const treeSha = await createTree(JSON.stringify(buildOutput)) await createRef(treeSha) + const prMetrics = await getPrBaseBranchMetrics() + const prBaseReport = createReport(buildOutput) const report = createReport(buildOutput) if (areJobReportsEnabled()) { @@ -144,6 +146,7 @@ export async function generateReports(): Promise { } if (arePRReportsEnabled()) { createPRComment(report) + createPRComment(report + buildOutput) } } } diff --git a/src/utils.ts b/src/utils.ts index e92ee38..35486df 100644 --- a/src/utils.ts +++ b/src/utils.ts @@ -11,6 +11,7 @@ import {join} from 'path' import {Base64} from "js-base64"; import { Octokit } from '@octokit/rest'; import fetch from "node-fetch"; +import {Context} from "@actions/github/lib/context"; // Set up Octokit for github.com only and in the same way as @actions/github (see https://git.io/Jy9YP) const baseUrl = 'https://api.github.com' @@ -163,6 +164,13 @@ function getCommitSha(): string { return process.env.GITHUB_SHA || "default_tag" } +function getPrBaseBranchSha(): string { + if (!isPREvent()) { + return "" + } + return process.env.GITHUB_BASE_REF || "default_branch" +} + export async function createPRComment(content: string): Promise { if (!isPREvent()) { throw new Error('Not a PR event.') @@ -181,36 +189,6 @@ export async function createPRComment(content: string): Promise { } } -/*export async function saveReportJson(content: string): Promise { - const octokit = new Octokit({ - auth: getGitHubToken(), - request: { - fetch: fetch, - }, - }); - - const contentEncoded = Base64.encode(content) - - - const { data } = await octokit.repos.createOrUpdateFileContents({ - owner: 'jessiscript', - repo: 're23_build_tracking', - path: 'OUTPUT.json', - content: contentEncoded, - message: 'Add Report JSON data', - committer: { - name: 'jessiscript', - email: 'pauljessica2001@gmail.com', - }, - author:{ - name: 'jessiscript', - email: 'pauljessica2001@gmail.com', - } - }); - - console.log(data); -}*/ - export async function createRef(sha: string) { const commitSha = getCommitSha() const ref = `refs/metrics/${commitSha}` @@ -264,3 +242,65 @@ export async function createTree(metadataJson: string): Promise { core.info("Tree-sha" + response.data.sha); return response.data.sha; } + +export async function getPrBaseBranchMetrics(): Promise { + if (!isPREvent()) { + throw new Error('Not a PR event.') + } + const context = github.context + const octokit = new Octokit({ + auth: getGitHubToken(), + request: { + fetch: fetch, + }, + }) + const baseCommitSha = await getBaseBranchCommitSha(octokit, context) + core.info(baseCommitSha) + const blobTreeUrl = await getBlobTreeUrl(octokit, context, baseCommitSha) + core.info(blobTreeUrl) + const blobUrl = await getBlobUrl(octokit, context, blobTreeUrl) + core.info(blobUrl) + const blobContent = await getBlobContent(octokit, context, blobUrl) + core.info(blobContent) + return blobContent +} + +async function getBaseBranchCommitSha(octokit: Octokit, context: Context): Promise { + const { data } = await octokit.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/ref/heads/${getPrBaseBranchSha()}`, { + ...context.repo, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + return data.object.sha +} + +async function getBlobTreeUrl(octokit: Octokit, context: Context, baseCommitSha: string): Promise { + const { data } = await octokit.request(`GET /repos/${context.repo.owner}/${context.repo.repo}/ref/metrics/${baseCommitSha}`, { + ...context.repo, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + return data.object.url +} + +async function getBlobUrl(octokit: Octokit, context: Context, blobTreeUrl: string) { + const { data } = await octokit.request(blobTreeUrl, { + ...context.repo, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + return data.tree[0].url +} + +async function getBlobContent(octokit: Octokit, context: Context, blobUrl: string) { + const { data } = await octokit.request(blobUrl, { + ...context.repo, + headers: { + 'X-GitHub-Api-Version': '2022-11-28' + } + }) + return Base64.decode(data.content) +} \ No newline at end of file