Compare commits

..

4 commits
v4.8.4 ... main

Author SHA1 Message Date
github-actions[bot]
7ff4fce545
chore: release v4.8.5 (#156)
Some checks failed
main ci / ubuntu-latest - node 16 (push) Has been cancelled
main ci / ubuntu-latest - node 18 (push) Has been cancelled
main ci / ubuntu-latest - node 20 (push) Has been cancelled
Co-authored-by: Create or Update Pull Request Action <create-or-update-pull-request@users.noreply.github.com>
2025-04-15 10:57:49 +02:00
Andrea Lamparelli
c9a7375bf9
build(deps): upgrade release-it to v18 (#153) 2025-04-15 10:42:44 +02:00
Andrea Lamparelli
d74a787035
fix(#151): fix gitlab post comments url (#152)
Some checks are pending
main ci / ubuntu-latest - node 20 (push) Waiting to run
main ci / ubuntu-latest - node 16 (push) Waiting to run
main ci / ubuntu-latest - node 18 (push) Waiting to run
2025-04-14 17:48:09 +02:00
Andrea Lamparelli
3a9d367b48
build(deps): audit fix (#150)
Some checks failed
main ci / ubuntu-latest - node 16 (push) Has been cancelled
main ci / ubuntu-latest - node 18 (push) Has been cancelled
main ci / ubuntu-latest - node 20 (push) Has been cancelled
2025-03-24 20:23:36 +01:00
7 changed files with 4028 additions and 5461 deletions

View file

@ -1,5 +1,11 @@
# Changelog # Changelog
## <small>4.8.5 (2025-04-15)</small>
* build(deps): audit fix (#150) ([3a9d367](https://github.com/kiegroup/git-backporting/commit/3a9d367)), closes [#150](https://github.com/kiegroup/git-backporting/issues/150)
* build(deps): upgrade release-it to v18 (#153) ([c9a7375](https://github.com/kiegroup/git-backporting/commit/c9a7375)), closes [#153](https://github.com/kiegroup/git-backporting/issues/153)
* fix(#151): fix gitlab post comments url (#152) ([d74a787](https://github.com/kiegroup/git-backporting/commit/d74a787)), closes [#152](https://github.com/kiegroup/git-backporting/issues/152)
## [4.8.4](https://github.com/kiegroup/git-backporting/compare/v4.8.3...v4.8.4) (2024-11-02) ## [4.8.4](https://github.com/kiegroup/git-backporting/compare/v4.8.3...v4.8.4) (2024-11-02)

330
dist/cli/index.js vendored
View file

@ -1151,7 +1151,9 @@ class GitLabClient {
// example: <host>/api/v4/projects/<namespace>%2Fbackporting-example/merge_requests/1 // example: <host>/api/v4/projects/<namespace>%2Fbackporting-example/merge_requests/1
async getPullRequest(namespace, repo, mrNumber, squash) { async getPullRequest(namespace, repo, mrNumber, squash) {
const projectId = this.getProjectId(namespace, repo); const projectId = this.getProjectId(namespace, repo);
const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}`); const url = `/projects/${projectId}/merge_requests/${mrNumber}`;
this.logger.debug(`Fetching pull request ${url}`);
const { data } = await this.client.get(`${url}`);
if (squash === undefined) { if (squash === undefined) {
squash = (0, git_util_1.inferSquash)(data.state === "opened", data.squash_commit_sha); squash = (0, git_util_1.inferSquash)(data.state === "opened", data.squash_commit_sha);
} }
@ -1241,7 +1243,7 @@ class GitLabClient {
try { try {
const { namespace, project, id } = this.extractMergeRequestData(mrUrl); const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
const projectId = this.getProjectId(namespace, project); const projectId = this.getProjectId(namespace, project);
const { data } = await this.client.post(`/projects/${projectId}/issues/${id}/notes`, { const { data } = await this.client.post(`/projects/${projectId}/merge_requests/${id}/notes`, {
body: comment, body: comment,
}); });
if (!data) { if (!data) {
@ -16266,6 +16268,14 @@ module.exports = require("child_process");
/***/ }), /***/ }),
/***/ 6113:
/***/ ((module) => {
"use strict";
module.exports = require("crypto");
/***/ }),
/***/ 2361: /***/ 2361:
/***/ ((module) => { /***/ ((module) => {
@ -19634,10 +19644,11 @@ exports.suggestSimilar = suggestSimilar;
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
// Axios v1.7.4 Copyright (c) 2024 Matt Zabriskie and contributors /*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */
const FormData$1 = __nccwpck_require__(4334); const FormData$1 = __nccwpck_require__(4334);
const crypto = __nccwpck_require__(6113);
const url = __nccwpck_require__(7310); const url = __nccwpck_require__(7310);
const proxyFromEnv = __nccwpck_require__(3329); const proxyFromEnv = __nccwpck_require__(3329);
const http = __nccwpck_require__(3685); const http = __nccwpck_require__(3685);
@ -19651,7 +19662,9 @@ const events = __nccwpck_require__(2361);
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1); const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1);
const crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
const url__default = /*#__PURE__*/_interopDefaultLegacy(url); const url__default = /*#__PURE__*/_interopDefaultLegacy(url);
const proxyFromEnv__default = /*#__PURE__*/_interopDefaultLegacy(proxyFromEnv);
const http__default = /*#__PURE__*/_interopDefaultLegacy(http); const http__default = /*#__PURE__*/_interopDefaultLegacy(http);
const https__default = /*#__PURE__*/_interopDefaultLegacy(https); const https__default = /*#__PURE__*/_interopDefaultLegacy(https);
const util__default = /*#__PURE__*/_interopDefaultLegacy(util); const util__default = /*#__PURE__*/_interopDefaultLegacy(util);
@ -20265,26 +20278,6 @@ const toFiniteNumber = (value, defaultValue) => {
return value != null && Number.isFinite(value = +value) ? value : defaultValue; return value != null && Number.isFinite(value = +value) ? value : defaultValue;
}; };
const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
const DIGIT = '0123456789';
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = '';
const {length} = alphabet;
while (size--) {
str += alphabet[Math.random() * length|0];
}
return str;
};
/** /**
* If the thing is a FormData object, return true, otherwise return false. * If the thing is a FormData object, return true, otherwise return false.
* *
@ -20412,8 +20405,6 @@ const utils$1 = {
findKey, findKey,
global: _global, global: _global,
isContextDefined, isContextDefined,
ALPHABET,
generateString,
isSpecCompliantForm, isSpecCompliantForm,
toJSONObject, toJSONObject,
isAsyncFn, isAsyncFn,
@ -20447,7 +20438,10 @@ function AxiosError(message, code, config, request, response) {
code && (this.code = code); code && (this.code = code);
config && (this.config = config); config && (this.config = config);
request && (this.request = request); request && (this.request = request);
response && (this.response = response); if (response) {
this.response = response;
this.status = response.status ? response.status : null;
}
} }
utils$1.inherits(AxiosError, Error, { utils$1.inherits(AxiosError, Error, {
@ -20467,7 +20461,7 @@ utils$1.inherits(AxiosError, Error, {
// Axios // Axios
config: utils$1.toJSONObject(this.config), config: utils$1.toJSONObject(this.config),
code: this.code, code: this.code,
status: this.response && this.response.status ? this.response.status : null status: this.status
}; };
} }
}); });
@ -20804,7 +20798,7 @@ function encode(val) {
* *
* @param {string} url The base of the url (e.g., http://www.google.com) * @param {string} url The base of the url (e.g., http://www.google.com)
* @param {object} [params] The params to be appended * @param {object} [params] The params to be appended
* @param {?object} options * @param {?(object|Function)} options
* *
* @returns {string} The formatted url * @returns {string} The formatted url
*/ */
@ -20816,6 +20810,12 @@ function buildURL(url, params, options) {
const _encode = options && options.encode || encode; const _encode = options && options.encode || encode;
if (utils$1.isFunction(options)) {
options = {
serialize: options
};
}
const serializeFn = options && options.serialize; const serializeFn = options && options.serialize;
let serializedParams; let serializedParams;
@ -20916,6 +20916,29 @@ const transitionalDefaults = {
const URLSearchParams = url__default["default"].URLSearchParams; const URLSearchParams = url__default["default"].URLSearchParams;
const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
const DIGIT = '0123456789';
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = '';
const {length} = alphabet;
const randomValues = new Uint32Array(size);
crypto__default["default"].randomFillSync(randomValues);
for (let i = 0; i < size; i++) {
str += alphabet[randomValues[i] % length];
}
return str;
};
const platform$1 = { const platform$1 = {
isNode: true, isNode: true,
classes: { classes: {
@ -20923,11 +20946,15 @@ const platform$1 = {
FormData: FormData__default["default"], FormData: FormData__default["default"],
Blob: typeof Blob !== 'undefined' && Blob || null Blob: typeof Blob !== 'undefined' && Blob || null
}, },
ALPHABET,
generateString,
protocols: [ 'http', 'https', 'file', 'data' ] protocols: [ 'http', 'https', 'file', 'data' ]
}; };
const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';
const _navigator = typeof navigator === 'object' && navigator || undefined;
/** /**
* Determine if we're running in a standard browser environment * Determine if we're running in a standard browser environment
* *
@ -20945,10 +20972,8 @@ const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'unde
* *
* @returns {boolean} * @returns {boolean}
*/ */
const hasStandardBrowserEnv = ( const hasStandardBrowserEnv = hasBrowserEnv &&
(product) => { (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);
return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0
})(typeof navigator !== 'undefined' && navigator.product);
/** /**
* Determine if we're running in a standard browser webWorker environment * Determine if we're running in a standard browser webWorker environment
@ -20975,6 +21000,7 @@ const utils = /*#__PURE__*/Object.freeze({
hasBrowserEnv: hasBrowserEnv, hasBrowserEnv: hasBrowserEnv,
hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
hasStandardBrowserEnv: hasStandardBrowserEnv, hasStandardBrowserEnv: hasStandardBrowserEnv,
navigator: _navigator,
origin: origin origin: origin
}); });
@ -21696,14 +21722,15 @@ function combineURLs(baseURL, relativeURL) {
* *
* @returns {string} The combined full path * @returns {string} The combined full path
*/ */
function buildFullPath(baseURL, requestedURL) { function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
if (baseURL && !isAbsoluteURL(requestedURL)) { let isRelativeUrl = !isAbsoluteURL(requestedURL);
if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {
return combineURLs(baseURL, requestedURL); return combineURLs(baseURL, requestedURL);
} }
return requestedURL; return requestedURL;
} }
const VERSION = "1.7.4"; const VERSION = "1.8.4";
function parseProtocol(url) { function parseProtocol(url) {
const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
@ -21913,9 +21940,9 @@ const readBlob = async function* (blob) {
const readBlob$1 = readBlob; const readBlob$1 = readBlob;
const BOUNDARY_ALPHABET = utils$1.ALPHABET.ALPHA_DIGIT + '-_'; const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';
const textEncoder = new util.TextEncoder(); const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util__default["default"].TextEncoder();
const CRLF = '\r\n'; const CRLF = '\r\n';
const CRLF_BYTES = textEncoder.encode(CRLF); const CRLF_BYTES = textEncoder.encode(CRLF);
@ -21973,7 +22000,7 @@ const formDataToStream = (form, headersHandler, options) => {
const { const {
tag = 'form-data-boundary', tag = 'form-data-boundary',
size = 25, size = 25,
boundary = tag + '-' + utils$1.generateString(size, BOUNDARY_ALPHABET) boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)
} = options || {}; } = options || {};
if(!utils$1.isFormData(form)) { if(!utils$1.isFormData(form)) {
@ -22253,7 +22280,7 @@ function dispatchBeforeRedirect(options, responseDetails) {
function setProxy(options, configProxy, location) { function setProxy(options, configProxy, location) {
let proxy = configProxy; let proxy = configProxy;
if (!proxy && proxy !== false) { if (!proxy && proxy !== false) {
const proxyUrl = proxyFromEnv.getProxyForUrl(location); const proxyUrl = proxyFromEnv__default["default"].getProxyForUrl(location);
if (proxyUrl) { if (proxyUrl) {
proxy = new URL(proxyUrl); proxy = new URL(proxyUrl);
} }
@ -22398,8 +22425,8 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
} }
// Parse url // Parse url
const fullPath = buildFullPath(config.baseURL, config.url); const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
const parsed = new URL(fullPath, utils$1.hasBrowserEnv ? platform.origin : undefined); const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);
const protocol = parsed.protocol || supportedProtocols[0]; const protocol = parsed.protocol || supportedProtocols[0];
if (protocol === 'data:') { if (protocol === 'data:') {
@ -22484,7 +22511,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
} catch (e) { } catch (e) {
} }
} }
} else if (utils$1.isBlob(data)) { } else if (utils$1.isBlob(data) || utils$1.isFile(data)) {
data.size && headers.setContentType(data.type || 'application/octet-stream'); data.size && headers.setContentType(data.type || 'application/octet-stream');
headers.setContentLength(data.size || 0); headers.setContentLength(data.size || 0);
data = stream__default["default"].Readable.from(readBlob$1(data)); data = stream__default["default"].Readable.from(readBlob$1(data));
@ -22595,7 +22622,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
if (config.socketPath) { if (config.socketPath) {
options.socketPath = config.socketPath; options.socketPath = config.socketPath;
} else { } else {
options.hostname = parsed.hostname; options.hostname = parsed.hostname.startsWith("[") ? parsed.hostname.slice(1, -1) : parsed.hostname;
options.port = parsed.port; options.port = parsed.port;
setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path); setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
} }
@ -22737,7 +22764,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
} }
const err = new AxiosError( const err = new AxiosError(
'maxContentLength size of ' + config.maxContentLength + ' exceeded', 'stream has been aborted',
AxiosError.ERR_BAD_RESPONSE, AxiosError.ERR_BAD_RESPONSE,
config, config,
lastRequest lastRequest
@ -22860,68 +22887,18 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
}); });
}; };
const isURLSameOrigin = platform.hasStandardBrowserEnv ? const isURLSameOrigin = platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {
url = new URL(url, platform.origin);
// Standard browser envs have full support of the APIs needed to test return (
// whether the request URL is of the same origin as current location. origin.protocol === url.protocol &&
(function standardBrowserEnv() { origin.host === url.host &&
const msie = /(msie|trident)/i.test(navigator.userAgent); (isMSIE || origin.port === url.port)
const urlParsingNode = document.createElement('a'); );
let originURL; })(
new URL(platform.origin),
/** platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
* Parse a URL to discover its components ) : () => true;
*
* @param {String} url The URL to be parsed
* @returns {Object}
*/
function resolveURL(url) {
let href = url;
if (msie) {
// IE needs attribute set twice to normalize properties
urlParsingNode.setAttribute('href', href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute('href', href);
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
urlParsingNode.pathname :
'/' + urlParsingNode.pathname
};
}
originURL = resolveURL(window.location.href);
/**
* Determine if a URL shares the same origin as the current location
*
* @param {String} requestURL The URL to test
* @returns {boolean} True if URL shares the same origin, otherwise false
*/
return function isURLSameOrigin(requestURL) {
const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
return (parsed.protocol === originURL.protocol &&
parsed.host === originURL.host);
};
})() :
// Non standard browser envs (web workers, react-native) lack needed support.
(function nonStandardBrowserEnv() {
return function isURLSameOrigin() {
return true;
};
})();
const cookies = platform.hasStandardBrowserEnv ? const cookies = platform.hasStandardBrowserEnv ?
@ -22978,7 +22955,7 @@ function mergeConfig(config1, config2) {
config2 = config2 || {}; config2 = config2 || {};
const config = {}; const config = {};
function getMergedValue(target, source, caseless) { function getMergedValue(target, source, prop, caseless) {
if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
return utils$1.merge.call({caseless}, target, source); return utils$1.merge.call({caseless}, target, source);
} else if (utils$1.isPlainObject(source)) { } else if (utils$1.isPlainObject(source)) {
@ -22990,11 +22967,11 @@ function mergeConfig(config1, config2) {
} }
// eslint-disable-next-line consistent-return // eslint-disable-next-line consistent-return
function mergeDeepProperties(a, b, caseless) { function mergeDeepProperties(a, b, prop , caseless) {
if (!utils$1.isUndefined(b)) { if (!utils$1.isUndefined(b)) {
return getMergedValue(a, b, caseless); return getMergedValue(a, b, prop , caseless);
} else if (!utils$1.isUndefined(a)) { } else if (!utils$1.isUndefined(a)) {
return getMergedValue(undefined, a, caseless); return getMergedValue(undefined, a, prop , caseless);
} }
} }
@ -23052,7 +23029,7 @@ function mergeConfig(config1, config2) {
socketPath: defaultToConfig2, socketPath: defaultToConfig2,
responseEncoding: defaultToConfig2, responseEncoding: defaultToConfig2,
validateStatus: mergeDirectKeys, validateStatus: mergeDirectKeys,
headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)
}; };
utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
@ -23071,7 +23048,7 @@ const resolveConfig = (config) => {
newConfig.headers = headers = AxiosHeaders$1.from(headers); newConfig.headers = headers = AxiosHeaders$1.from(headers);
newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer); newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
// HTTP basic authentication // HTTP basic authentication
if (auth) { if (auth) {
@ -23300,20 +23277,24 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
}; };
const composeSignals = (signals, timeout) => { const composeSignals = (signals, timeout) => {
const {length} = (signals = signals ? signals.filter(Boolean) : []);
if (timeout || length) {
let controller = new AbortController(); let controller = new AbortController();
let aborted; let aborted;
const onabort = function (cancel) { const onabort = function (reason) {
if (!aborted) { if (!aborted) {
aborted = true; aborted = true;
unsubscribe(); unsubscribe();
const err = cancel instanceof Error ? cancel : this.reason; const err = reason instanceof Error ? reason : this.reason;
controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err)); controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
} }
}; };
let timer = timeout && setTimeout(() => { let timer = timeout && setTimeout(() => {
timer = null;
onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT)); onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));
}, timeout); }, timeout);
@ -23322,23 +23303,20 @@ const composeSignals = (signals, timeout) => {
timer && clearTimeout(timer); timer && clearTimeout(timer);
timer = null; timer = null;
signals.forEach(signal => { signals.forEach(signal => {
signal && signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);
(signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort));
}); });
signals = null; signals = null;
} }
}; };
signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort)); signals.forEach((signal) => signal.addEventListener('abort', onabort));
const {signal} = controller; const {signal} = controller;
signal.unsubscribe = unsubscribe; signal.unsubscribe = () => utils$1.asap(unsubscribe);
return [signal, () => { return signal;
timer && clearTimeout(timer); }
timer = null;
}];
}; };
const composeSignals$1 = composeSignals; const composeSignals$1 = composeSignals;
@ -23361,14 +23339,34 @@ const streamChunk = function* (chunk, chunkSize) {
} }
}; };
const readBytes = async function* (iterable, chunkSize, encode) { const readBytes = async function* (iterable, chunkSize) {
for await (const chunk of iterable) { for await (const chunk of readStream(iterable)) {
yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : (await encode(String(chunk))), chunkSize); yield* streamChunk(chunk, chunkSize);
} }
}; };
const trackStream = (stream, chunkSize, onProgress, onFinish, encode) => { const readStream = async function* (stream) {
const iterator = readBytes(stream, chunkSize, encode); if (stream[Symbol.asyncIterator]) {
yield* stream;
return;
}
const reader = stream.getReader();
try {
for (;;) {
const {done, value} = await reader.read();
if (done) {
break;
}
yield value;
}
} finally {
await reader.cancel();
}
};
const trackStream = (stream, chunkSize, onProgress, onFinish) => {
const iterator = readBytes(stream, chunkSize);
let bytes = 0; let bytes = 0;
let done; let done;
@ -23471,7 +23469,11 @@ const getBodyLength = async (body) => {
} }
if(utils$1.isSpecCompliantForm(body)) { if(utils$1.isSpecCompliantForm(body)) {
return (await new Request(body).arrayBuffer()).byteLength; const _request = new Request(platform.origin, {
method: 'POST',
body,
});
return (await _request.arrayBuffer()).byteLength;
} }
if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) { if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {
@ -23511,19 +23513,14 @@ const fetchAdapter = isFetchSupported && (async (config) => {
responseType = responseType ? (responseType + '').toLowerCase() : 'text'; responseType = responseType ? (responseType + '').toLowerCase() : 'text';
let [composedSignal, stopTimeout] = (signal || cancelToken || timeout) ? let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
composeSignals$1([signal, cancelToken], timeout) : [];
let finished, request; let request;
const onFinish = () => { const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
!finished && setTimeout(() => { composedSignal.unsubscribe();
composedSignal && composedSignal.unsubscribe();
}); });
finished = true;
};
let requestContentLength; let requestContentLength;
try { try {
@ -23549,7 +23546,7 @@ const fetchAdapter = isFetchSupported && (async (config) => {
progressEventReducer(asyncDecorator(onUploadProgress)) progressEventReducer(asyncDecorator(onUploadProgress))
); );
data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush, encodeText); data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
} }
} }
@ -23557,6 +23554,9 @@ const fetchAdapter = isFetchSupported && (async (config) => {
withCredentials = withCredentials ? 'include' : 'omit'; withCredentials = withCredentials ? 'include' : 'omit';
} }
// Cloudflare Workers throws when credentials are defined
// see https://github.com/cloudflare/workerd/issues/902
const isCredentialsSupported = "credentials" in Request.prototype;
request = new Request(url, { request = new Request(url, {
...fetchOptions, ...fetchOptions,
signal: composedSignal, signal: composedSignal,
@ -23564,14 +23564,14 @@ const fetchAdapter = isFetchSupported && (async (config) => {
headers: headers.normalize().toJSON(), headers: headers.normalize().toJSON(),
body: data, body: data,
duplex: "half", duplex: "half",
credentials: withCredentials credentials: isCredentialsSupported ? withCredentials : undefined
}); });
let response = await fetch(request); let response = await fetch(request);
const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response'); const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
if (supportsResponseStream && (onDownloadProgress || isStreamResponse)) { if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
const options = {}; const options = {};
['status', 'statusText', 'headers'].forEach(prop => { ['status', 'statusText', 'headers'].forEach(prop => {
@ -23588,8 +23588,8 @@ const fetchAdapter = isFetchSupported && (async (config) => {
response = new Response( response = new Response(
trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => { trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
flush && flush(); flush && flush();
isStreamResponse && onFinish(); unsubscribe && unsubscribe();
}, encodeText), }),
options options
); );
} }
@ -23598,9 +23598,7 @@ const fetchAdapter = isFetchSupported && (async (config) => {
let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config); let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);
!isStreamResponse && onFinish(); !isStreamResponse && unsubscribe && unsubscribe();
stopTimeout && stopTimeout();
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
settle(resolve, reject, { settle(resolve, reject, {
@ -23613,7 +23611,7 @@ const fetchAdapter = isFetchSupported && (async (config) => {
}); });
}) })
} catch (err) { } catch (err) {
onFinish(); unsubscribe && unsubscribe();
if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) { if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {
throw Object.assign( throw Object.assign(
@ -23824,6 +23822,14 @@ validators$1.transitional = function transitional(validator, version, message) {
}; };
}; };
validators$1.spelling = function spelling(correctSpelling) {
return (value, opt) => {
// eslint-disable-next-line no-console
console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
return true;
}
};
/** /**
* Assert object's properties type * Assert object's properties type
* *
@ -23893,9 +23899,9 @@ class Axios {
return await this._request(configOrUrl, config); return await this._request(configOrUrl, config);
} catch (err) { } catch (err) {
if (err instanceof Error) { if (err instanceof Error) {
let dummy; let dummy = {};
Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error()); Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());
// slice off the Error: ... line // slice off the Error: ... line
const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : ''; const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : '';
@ -23950,6 +23956,18 @@ class Axios {
} }
} }
// Set config.allowAbsoluteUrls
if (config.allowAbsoluteUrls !== undefined) ; else if (this.defaults.allowAbsoluteUrls !== undefined) {
config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
} else {
config.allowAbsoluteUrls = true;
}
validator.assertOptions(config, {
baseUrl: validators.spelling('baseURL'),
withXsrfToken: validators.spelling('withXSRFToken')
}, true);
// Set config.method // Set config.method
config.method = (config.method || this.defaults.method || 'get').toLowerCase(); config.method = (config.method || this.defaults.method || 'get').toLowerCase();
@ -24040,7 +24058,7 @@ class Axios {
getUri(config) { getUri(config) {
config = mergeConfig(this.defaults, config); config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url); const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
return buildURL(fullPath, config.params, config.paramsSerializer); return buildURL(fullPath, config.params, config.paramsSerializer);
} }
} }
@ -24180,6 +24198,20 @@ class CancelToken {
} }
} }
toAbortSignal() {
const controller = new AbortController();
const abort = (err) => {
controller.abort(err);
};
this.subscribe(abort);
controller.signal.unsubscribe = () => this.unsubscribe(abort);
return controller.signal;
}
/** /**
* Returns an object that contains a new `CancelToken` and a function that, when called, * Returns an object that contains a new `CancelToken` and a function that, when called,
* cancels the `CancelToken`. * cancels the `CancelToken`.
@ -24385,7 +24417,7 @@ module.exports = axios;
/***/ ((module) => { /***/ ((module) => {
"use strict"; "use strict";
module.exports = JSON.parse('{"name":"@kie/git-backporting","version":"4.8.4","description":"Git backporting is a tool to execute automatic pull request git backporting.","author":"","license":"MIT","private":false,"main":"./dist/gha/index.js","bin":{"git-backporting":"./dist/cli/index.js"},"files":["dist/cli/index.js"],"publishConfig":{"access":"public"},"scripts":{"prepare":"husky install","clean":"rm -rf ./build ./dist","compile":"tsc -p tsconfig.json && tsc-alias -p tsconfig.json","package":"npm run package:cli && npm run package:gha","package:cli":"ncc build ./build/src/bin/cli.js -o dist/cli","package:gha":"ncc build ./build/src/bin/gha.js -o dist/gha","build":"npm run clean && npm run compile && npm run package","test":"jest --silent","test:report":"npm test -- --coverage --testResultsProcessor=jest-sonar-reporter","lint":"eslint . --ext .ts","lint:fix":"npm run lint -- --fix","ts-node":"ts-node","postversion":"npm run build && git add dist && rm -rf build","release":"release-it","release:branch":"git checkout -b release/$(release-it --release-version) main","release:prepare":"release-it --no-npm.publish --no-github.release --no-git.push --no-git.tag --no-git.requireUpstream","release:prepare:all":"npm run release:branch && npm run release:prepare"},"repository":{"type":"git","url":"git+https://github.com/kiegroup/git-backporting.git"},"keywords":["backporting","pull-requests","merge-requests","github-action","cherry-pick"],"bugs":{"url":"https://github.com/kiegroup/git-backporting/issues"},"homepage":"https://github.com/kiegroup/git-backporting#readme","devDependencies":{"@commitlint/cli":"^17.4.0","@commitlint/config-conventional":"^17.4.0","@gitbeaker/rest":"^39.1.0","@kie/mock-github":"^1.1.0","@octokit/webhooks-types":"^6.8.0","@release-it/conventional-changelog":"^7.0.0","@types/fs-extra":"^9.0.13","@types/jest":"^29.2.4","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","@vercel/ncc":"^0.36.0","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.0.0","jest-sonar-reporter":"^2.0.0","release-it":"^16.1.3","semver":"^7.3.8","ts-jest":"^29.0.0","ts-node":"^10.8.1","tsc-alias":"^1.8.2","tsconfig-paths":"^4.1.0","typescript":"^4.9.3"},"dependencies":{"@actions/core":"^1.10.0","@octokit/rest":"^18.12.0","axios":"^1.4.0","commander":"^9.3.0","fs-extra":"^11.1.0","https":"^1.0.0","simple-git":"^3.15.1"}}'); module.exports = JSON.parse('{"name":"@kie/git-backporting","version":"4.8.5","description":"Git backporting is a tool to execute automatic pull request git backporting.","author":"","license":"MIT","private":false,"main":"./dist/gha/index.js","bin":{"git-backporting":"./dist/cli/index.js"},"files":["dist/cli/index.js"],"publishConfig":{"access":"public"},"scripts":{"prepare":"husky install","clean":"rm -rf ./build ./dist","compile":"tsc -p tsconfig.json && tsc-alias -p tsconfig.json","package":"npm run package:cli && npm run package:gha","package:cli":"ncc build ./build/src/bin/cli.js -o dist/cli","package:gha":"ncc build ./build/src/bin/gha.js -o dist/gha","build":"npm run clean && npm run compile && npm run package","test":"jest --silent","test:report":"npm test -- --coverage --testResultsProcessor=jest-sonar-reporter","lint":"eslint . --ext .ts","lint:fix":"npm run lint -- --fix","ts-node":"ts-node","postversion":"npm run build && git add dist && rm -rf build","release":"release-it","release:branch":"git checkout -b release/$(release-it --release-version) main","release:prepare":"release-it --no-npm.publish --no-github.release --no-git.push --no-git.tag --no-git.requireUpstream","release:prepare:all":"npm run release:branch && npm run release:prepare"},"repository":{"type":"git","url":"git+https://github.com/kiegroup/git-backporting.git"},"keywords":["backporting","pull-requests","merge-requests","github-action","cherry-pick"],"bugs":{"url":"https://github.com/kiegroup/git-backporting/issues"},"homepage":"https://github.com/kiegroup/git-backporting#readme","devDependencies":{"@commitlint/cli":"^17.4.0","@commitlint/config-conventional":"^17.4.0","@gitbeaker/rest":"^39.1.0","@kie/mock-github":"^1.1.0","@octokit/webhooks-types":"^6.8.0","@release-it/conventional-changelog":"^10.0.0","@types/fs-extra":"^9.0.13","@types/jest":"^29.2.4","@types/node":"^18.11.17","@typescript-eslint/eslint-plugin":"^5.47.0","@typescript-eslint/parser":"^5.47.0","@vercel/ncc":"^0.36.0","eslint":"^8.30.0","husky":"^8.0.2","jest":"^29.0.0","jest-sonar-reporter":"^2.0.0","release-it":"^18.1.2","semver":"^7.3.8","ts-jest":"^29.0.0","ts-node":"^10.8.1","tsc-alias":"^1.8.2","tsconfig-paths":"^4.1.0","typescript":"^4.9.3"},"dependencies":{"@actions/core":"^1.10.0","@octokit/rest":"^18.12.0","axios":"^1.4.0","commander":"^9.3.0","fs-extra":"^11.1.0","https":"^1.0.0","simple-git":"^3.15.1"}}');
/***/ }), /***/ }),

320
dist/gha/index.js vendored
View file

@ -1116,7 +1116,9 @@ class GitLabClient {
// example: <host>/api/v4/projects/<namespace>%2Fbackporting-example/merge_requests/1 // example: <host>/api/v4/projects/<namespace>%2Fbackporting-example/merge_requests/1
async getPullRequest(namespace, repo, mrNumber, squash) { async getPullRequest(namespace, repo, mrNumber, squash) {
const projectId = this.getProjectId(namespace, repo); const projectId = this.getProjectId(namespace, repo);
const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}`); const url = `/projects/${projectId}/merge_requests/${mrNumber}`;
this.logger.debug(`Fetching pull request ${url}`);
const { data } = await this.client.get(`${url}`);
if (squash === undefined) { if (squash === undefined) {
squash = (0, git_util_1.inferSquash)(data.state === "opened", data.squash_commit_sha); squash = (0, git_util_1.inferSquash)(data.state === "opened", data.squash_commit_sha);
} }
@ -1206,7 +1208,7 @@ class GitLabClient {
try { try {
const { namespace, project, id } = this.extractMergeRequestData(mrUrl); const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
const projectId = this.getProjectId(namespace, project); const projectId = this.getProjectId(namespace, project);
const { data } = await this.client.post(`/projects/${projectId}/issues/${id}/notes`, { const { data } = await this.client.post(`/projects/${projectId}/merge_requests/${id}/notes`, {
body: comment, body: comment,
}); });
if (!data) { if (!data) {
@ -19042,10 +19044,11 @@ module.exports = require("zlib");
/***/ ((module, __unused_webpack_exports, __nccwpck_require__) => { /***/ ((module, __unused_webpack_exports, __nccwpck_require__) => {
"use strict"; "use strict";
// Axios v1.7.4 Copyright (c) 2024 Matt Zabriskie and contributors /*! Axios v1.8.4 Copyright (c) 2025 Matt Zabriskie and contributors */
const FormData$1 = __nccwpck_require__(4334); const FormData$1 = __nccwpck_require__(4334);
const crypto = __nccwpck_require__(6113);
const url = __nccwpck_require__(7310); const url = __nccwpck_require__(7310);
const proxyFromEnv = __nccwpck_require__(3329); const proxyFromEnv = __nccwpck_require__(3329);
const http = __nccwpck_require__(3685); const http = __nccwpck_require__(3685);
@ -19059,7 +19062,9 @@ const events = __nccwpck_require__(2361);
function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; } function _interopDefaultLegacy (e) { return e && typeof e === 'object' && 'default' in e ? e : { 'default': e }; }
const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1); const FormData__default = /*#__PURE__*/_interopDefaultLegacy(FormData$1);
const crypto__default = /*#__PURE__*/_interopDefaultLegacy(crypto);
const url__default = /*#__PURE__*/_interopDefaultLegacy(url); const url__default = /*#__PURE__*/_interopDefaultLegacy(url);
const proxyFromEnv__default = /*#__PURE__*/_interopDefaultLegacy(proxyFromEnv);
const http__default = /*#__PURE__*/_interopDefaultLegacy(http); const http__default = /*#__PURE__*/_interopDefaultLegacy(http);
const https__default = /*#__PURE__*/_interopDefaultLegacy(https); const https__default = /*#__PURE__*/_interopDefaultLegacy(https);
const util__default = /*#__PURE__*/_interopDefaultLegacy(util); const util__default = /*#__PURE__*/_interopDefaultLegacy(util);
@ -19673,26 +19678,6 @@ const toFiniteNumber = (value, defaultValue) => {
return value != null && Number.isFinite(value = +value) ? value : defaultValue; return value != null && Number.isFinite(value = +value) ? value : defaultValue;
}; };
const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
const DIGIT = '0123456789';
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = '';
const {length} = alphabet;
while (size--) {
str += alphabet[Math.random() * length|0];
}
return str;
};
/** /**
* If the thing is a FormData object, return true, otherwise return false. * If the thing is a FormData object, return true, otherwise return false.
* *
@ -19820,8 +19805,6 @@ const utils$1 = {
findKey, findKey,
global: _global, global: _global,
isContextDefined, isContextDefined,
ALPHABET,
generateString,
isSpecCompliantForm, isSpecCompliantForm,
toJSONObject, toJSONObject,
isAsyncFn, isAsyncFn,
@ -19855,7 +19838,10 @@ function AxiosError(message, code, config, request, response) {
code && (this.code = code); code && (this.code = code);
config && (this.config = config); config && (this.config = config);
request && (this.request = request); request && (this.request = request);
response && (this.response = response); if (response) {
this.response = response;
this.status = response.status ? response.status : null;
}
} }
utils$1.inherits(AxiosError, Error, { utils$1.inherits(AxiosError, Error, {
@ -19875,7 +19861,7 @@ utils$1.inherits(AxiosError, Error, {
// Axios // Axios
config: utils$1.toJSONObject(this.config), config: utils$1.toJSONObject(this.config),
code: this.code, code: this.code,
status: this.response && this.response.status ? this.response.status : null status: this.status
}; };
} }
}); });
@ -20212,7 +20198,7 @@ function encode(val) {
* *
* @param {string} url The base of the url (e.g., http://www.google.com) * @param {string} url The base of the url (e.g., http://www.google.com)
* @param {object} [params] The params to be appended * @param {object} [params] The params to be appended
* @param {?object} options * @param {?(object|Function)} options
* *
* @returns {string} The formatted url * @returns {string} The formatted url
*/ */
@ -20224,6 +20210,12 @@ function buildURL(url, params, options) {
const _encode = options && options.encode || encode; const _encode = options && options.encode || encode;
if (utils$1.isFunction(options)) {
options = {
serialize: options
};
}
const serializeFn = options && options.serialize; const serializeFn = options && options.serialize;
let serializedParams; let serializedParams;
@ -20324,6 +20316,29 @@ const transitionalDefaults = {
const URLSearchParams = url__default["default"].URLSearchParams; const URLSearchParams = url__default["default"].URLSearchParams;
const ALPHA = 'abcdefghijklmnopqrstuvwxyz';
const DIGIT = '0123456789';
const ALPHABET = {
DIGIT,
ALPHA,
ALPHA_DIGIT: ALPHA + ALPHA.toUpperCase() + DIGIT
};
const generateString = (size = 16, alphabet = ALPHABET.ALPHA_DIGIT) => {
let str = '';
const {length} = alphabet;
const randomValues = new Uint32Array(size);
crypto__default["default"].randomFillSync(randomValues);
for (let i = 0; i < size; i++) {
str += alphabet[randomValues[i] % length];
}
return str;
};
const platform$1 = { const platform$1 = {
isNode: true, isNode: true,
classes: { classes: {
@ -20331,11 +20346,15 @@ const platform$1 = {
FormData: FormData__default["default"], FormData: FormData__default["default"],
Blob: typeof Blob !== 'undefined' && Blob || null Blob: typeof Blob !== 'undefined' && Blob || null
}, },
ALPHABET,
generateString,
protocols: [ 'http', 'https', 'file', 'data' ] protocols: [ 'http', 'https', 'file', 'data' ]
}; };
const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined'; const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'undefined';
const _navigator = typeof navigator === 'object' && navigator || undefined;
/** /**
* Determine if we're running in a standard browser environment * Determine if we're running in a standard browser environment
* *
@ -20353,10 +20372,8 @@ const hasBrowserEnv = typeof window !== 'undefined' && typeof document !== 'unde
* *
* @returns {boolean} * @returns {boolean}
*/ */
const hasStandardBrowserEnv = ( const hasStandardBrowserEnv = hasBrowserEnv &&
(product) => { (!_navigator || ['ReactNative', 'NativeScript', 'NS'].indexOf(_navigator.product) < 0);
return hasBrowserEnv && ['ReactNative', 'NativeScript', 'NS'].indexOf(product) < 0
})(typeof navigator !== 'undefined' && navigator.product);
/** /**
* Determine if we're running in a standard browser webWorker environment * Determine if we're running in a standard browser webWorker environment
@ -20383,6 +20400,7 @@ const utils = /*#__PURE__*/Object.freeze({
hasBrowserEnv: hasBrowserEnv, hasBrowserEnv: hasBrowserEnv,
hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv, hasStandardBrowserWebWorkerEnv: hasStandardBrowserWebWorkerEnv,
hasStandardBrowserEnv: hasStandardBrowserEnv, hasStandardBrowserEnv: hasStandardBrowserEnv,
navigator: _navigator,
origin: origin origin: origin
}); });
@ -21104,14 +21122,15 @@ function combineURLs(baseURL, relativeURL) {
* *
* @returns {string} The combined full path * @returns {string} The combined full path
*/ */
function buildFullPath(baseURL, requestedURL) { function buildFullPath(baseURL, requestedURL, allowAbsoluteUrls) {
if (baseURL && !isAbsoluteURL(requestedURL)) { let isRelativeUrl = !isAbsoluteURL(requestedURL);
if (baseURL && (isRelativeUrl || allowAbsoluteUrls == false)) {
return combineURLs(baseURL, requestedURL); return combineURLs(baseURL, requestedURL);
} }
return requestedURL; return requestedURL;
} }
const VERSION = "1.7.4"; const VERSION = "1.8.4";
function parseProtocol(url) { function parseProtocol(url) {
const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url); const match = /^([-+\w]{1,25})(:?\/\/|:)/.exec(url);
@ -21321,9 +21340,9 @@ const readBlob = async function* (blob) {
const readBlob$1 = readBlob; const readBlob$1 = readBlob;
const BOUNDARY_ALPHABET = utils$1.ALPHABET.ALPHA_DIGIT + '-_'; const BOUNDARY_ALPHABET = platform.ALPHABET.ALPHA_DIGIT + '-_';
const textEncoder = new util.TextEncoder(); const textEncoder = typeof TextEncoder === 'function' ? new TextEncoder() : new util__default["default"].TextEncoder();
const CRLF = '\r\n'; const CRLF = '\r\n';
const CRLF_BYTES = textEncoder.encode(CRLF); const CRLF_BYTES = textEncoder.encode(CRLF);
@ -21381,7 +21400,7 @@ const formDataToStream = (form, headersHandler, options) => {
const { const {
tag = 'form-data-boundary', tag = 'form-data-boundary',
size = 25, size = 25,
boundary = tag + '-' + utils$1.generateString(size, BOUNDARY_ALPHABET) boundary = tag + '-' + platform.generateString(size, BOUNDARY_ALPHABET)
} = options || {}; } = options || {};
if(!utils$1.isFormData(form)) { if(!utils$1.isFormData(form)) {
@ -21661,7 +21680,7 @@ function dispatchBeforeRedirect(options, responseDetails) {
function setProxy(options, configProxy, location) { function setProxy(options, configProxy, location) {
let proxy = configProxy; let proxy = configProxy;
if (!proxy && proxy !== false) { if (!proxy && proxy !== false) {
const proxyUrl = proxyFromEnv.getProxyForUrl(location); const proxyUrl = proxyFromEnv__default["default"].getProxyForUrl(location);
if (proxyUrl) { if (proxyUrl) {
proxy = new URL(proxyUrl); proxy = new URL(proxyUrl);
} }
@ -21806,8 +21825,8 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
} }
// Parse url // Parse url
const fullPath = buildFullPath(config.baseURL, config.url); const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
const parsed = new URL(fullPath, utils$1.hasBrowserEnv ? platform.origin : undefined); const parsed = new URL(fullPath, platform.hasBrowserEnv ? platform.origin : undefined);
const protocol = parsed.protocol || supportedProtocols[0]; const protocol = parsed.protocol || supportedProtocols[0];
if (protocol === 'data:') { if (protocol === 'data:') {
@ -21892,7 +21911,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
} catch (e) { } catch (e) {
} }
} }
} else if (utils$1.isBlob(data)) { } else if (utils$1.isBlob(data) || utils$1.isFile(data)) {
data.size && headers.setContentType(data.type || 'application/octet-stream'); data.size && headers.setContentType(data.type || 'application/octet-stream');
headers.setContentLength(data.size || 0); headers.setContentLength(data.size || 0);
data = stream__default["default"].Readable.from(readBlob$1(data)); data = stream__default["default"].Readable.from(readBlob$1(data));
@ -22003,7 +22022,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
if (config.socketPath) { if (config.socketPath) {
options.socketPath = config.socketPath; options.socketPath = config.socketPath;
} else { } else {
options.hostname = parsed.hostname; options.hostname = parsed.hostname.startsWith("[") ? parsed.hostname.slice(1, -1) : parsed.hostname;
options.port = parsed.port; options.port = parsed.port;
setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path); setProxy(options, config.proxy, protocol + '//' + parsed.hostname + (parsed.port ? ':' + parsed.port : '') + options.path);
} }
@ -22145,7 +22164,7 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
} }
const err = new AxiosError( const err = new AxiosError(
'maxContentLength size of ' + config.maxContentLength + ' exceeded', 'stream has been aborted',
AxiosError.ERR_BAD_RESPONSE, AxiosError.ERR_BAD_RESPONSE,
config, config,
lastRequest lastRequest
@ -22268,68 +22287,18 @@ const httpAdapter = isHttpAdapterSupported && function httpAdapter(config) {
}); });
}; };
const isURLSameOrigin = platform.hasStandardBrowserEnv ? const isURLSameOrigin = platform.hasStandardBrowserEnv ? ((origin, isMSIE) => (url) => {
url = new URL(url, platform.origin);
// Standard browser envs have full support of the APIs needed to test return (
// whether the request URL is of the same origin as current location. origin.protocol === url.protocol &&
(function standardBrowserEnv() { origin.host === url.host &&
const msie = /(msie|trident)/i.test(navigator.userAgent); (isMSIE || origin.port === url.port)
const urlParsingNode = document.createElement('a'); );
let originURL; })(
new URL(platform.origin),
/** platform.navigator && /(msie|trident)/i.test(platform.navigator.userAgent)
* Parse a URL to discover its components ) : () => true;
*
* @param {String} url The URL to be parsed
* @returns {Object}
*/
function resolveURL(url) {
let href = url;
if (msie) {
// IE needs attribute set twice to normalize properties
urlParsingNode.setAttribute('href', href);
href = urlParsingNode.href;
}
urlParsingNode.setAttribute('href', href);
// urlParsingNode provides the UrlUtils interface - http://url.spec.whatwg.org/#urlutils
return {
href: urlParsingNode.href,
protocol: urlParsingNode.protocol ? urlParsingNode.protocol.replace(/:$/, '') : '',
host: urlParsingNode.host,
search: urlParsingNode.search ? urlParsingNode.search.replace(/^\?/, '') : '',
hash: urlParsingNode.hash ? urlParsingNode.hash.replace(/^#/, '') : '',
hostname: urlParsingNode.hostname,
port: urlParsingNode.port,
pathname: (urlParsingNode.pathname.charAt(0) === '/') ?
urlParsingNode.pathname :
'/' + urlParsingNode.pathname
};
}
originURL = resolveURL(window.location.href);
/**
* Determine if a URL shares the same origin as the current location
*
* @param {String} requestURL The URL to test
* @returns {boolean} True if URL shares the same origin, otherwise false
*/
return function isURLSameOrigin(requestURL) {
const parsed = (utils$1.isString(requestURL)) ? resolveURL(requestURL) : requestURL;
return (parsed.protocol === originURL.protocol &&
parsed.host === originURL.host);
};
})() :
// Non standard browser envs (web workers, react-native) lack needed support.
(function nonStandardBrowserEnv() {
return function isURLSameOrigin() {
return true;
};
})();
const cookies = platform.hasStandardBrowserEnv ? const cookies = platform.hasStandardBrowserEnv ?
@ -22386,7 +22355,7 @@ function mergeConfig(config1, config2) {
config2 = config2 || {}; config2 = config2 || {};
const config = {}; const config = {};
function getMergedValue(target, source, caseless) { function getMergedValue(target, source, prop, caseless) {
if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) { if (utils$1.isPlainObject(target) && utils$1.isPlainObject(source)) {
return utils$1.merge.call({caseless}, target, source); return utils$1.merge.call({caseless}, target, source);
} else if (utils$1.isPlainObject(source)) { } else if (utils$1.isPlainObject(source)) {
@ -22398,11 +22367,11 @@ function mergeConfig(config1, config2) {
} }
// eslint-disable-next-line consistent-return // eslint-disable-next-line consistent-return
function mergeDeepProperties(a, b, caseless) { function mergeDeepProperties(a, b, prop , caseless) {
if (!utils$1.isUndefined(b)) { if (!utils$1.isUndefined(b)) {
return getMergedValue(a, b, caseless); return getMergedValue(a, b, prop , caseless);
} else if (!utils$1.isUndefined(a)) { } else if (!utils$1.isUndefined(a)) {
return getMergedValue(undefined, a, caseless); return getMergedValue(undefined, a, prop , caseless);
} }
} }
@ -22460,7 +22429,7 @@ function mergeConfig(config1, config2) {
socketPath: defaultToConfig2, socketPath: defaultToConfig2,
responseEncoding: defaultToConfig2, responseEncoding: defaultToConfig2,
validateStatus: mergeDirectKeys, validateStatus: mergeDirectKeys,
headers: (a, b) => mergeDeepProperties(headersToObject(a), headersToObject(b), true) headers: (a, b , prop) => mergeDeepProperties(headersToObject(a), headersToObject(b),prop, true)
}; };
utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) { utils$1.forEach(Object.keys(Object.assign({}, config1, config2)), function computeConfigValue(prop) {
@ -22479,7 +22448,7 @@ const resolveConfig = (config) => {
newConfig.headers = headers = AxiosHeaders$1.from(headers); newConfig.headers = headers = AxiosHeaders$1.from(headers);
newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url), config.params, config.paramsSerializer); newConfig.url = buildURL(buildFullPath(newConfig.baseURL, newConfig.url, newConfig.allowAbsoluteUrls), config.params, config.paramsSerializer);
// HTTP basic authentication // HTTP basic authentication
if (auth) { if (auth) {
@ -22708,20 +22677,24 @@ const xhrAdapter = isXHRAdapterSupported && function (config) {
}; };
const composeSignals = (signals, timeout) => { const composeSignals = (signals, timeout) => {
const {length} = (signals = signals ? signals.filter(Boolean) : []);
if (timeout || length) {
let controller = new AbortController(); let controller = new AbortController();
let aborted; let aborted;
const onabort = function (cancel) { const onabort = function (reason) {
if (!aborted) { if (!aborted) {
aborted = true; aborted = true;
unsubscribe(); unsubscribe();
const err = cancel instanceof Error ? cancel : this.reason; const err = reason instanceof Error ? reason : this.reason;
controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err)); controller.abort(err instanceof AxiosError ? err : new CanceledError(err instanceof Error ? err.message : err));
} }
}; };
let timer = timeout && setTimeout(() => { let timer = timeout && setTimeout(() => {
timer = null;
onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT)); onabort(new AxiosError(`timeout ${timeout} of ms exceeded`, AxiosError.ETIMEDOUT));
}, timeout); }, timeout);
@ -22730,23 +22703,20 @@ const composeSignals = (signals, timeout) => {
timer && clearTimeout(timer); timer && clearTimeout(timer);
timer = null; timer = null;
signals.forEach(signal => { signals.forEach(signal => {
signal && signal.unsubscribe ? signal.unsubscribe(onabort) : signal.removeEventListener('abort', onabort);
(signal.removeEventListener ? signal.removeEventListener('abort', onabort) : signal.unsubscribe(onabort));
}); });
signals = null; signals = null;
} }
}; };
signals.forEach((signal) => signal && signal.addEventListener && signal.addEventListener('abort', onabort)); signals.forEach((signal) => signal.addEventListener('abort', onabort));
const {signal} = controller; const {signal} = controller;
signal.unsubscribe = unsubscribe; signal.unsubscribe = () => utils$1.asap(unsubscribe);
return [signal, () => { return signal;
timer && clearTimeout(timer); }
timer = null;
}];
}; };
const composeSignals$1 = composeSignals; const composeSignals$1 = composeSignals;
@ -22769,14 +22739,34 @@ const streamChunk = function* (chunk, chunkSize) {
} }
}; };
const readBytes = async function* (iterable, chunkSize, encode) { const readBytes = async function* (iterable, chunkSize) {
for await (const chunk of iterable) { for await (const chunk of readStream(iterable)) {
yield* streamChunk(ArrayBuffer.isView(chunk) ? chunk : (await encode(String(chunk))), chunkSize); yield* streamChunk(chunk, chunkSize);
} }
}; };
const trackStream = (stream, chunkSize, onProgress, onFinish, encode) => { const readStream = async function* (stream) {
const iterator = readBytes(stream, chunkSize, encode); if (stream[Symbol.asyncIterator]) {
yield* stream;
return;
}
const reader = stream.getReader();
try {
for (;;) {
const {done, value} = await reader.read();
if (done) {
break;
}
yield value;
}
} finally {
await reader.cancel();
}
};
const trackStream = (stream, chunkSize, onProgress, onFinish) => {
const iterator = readBytes(stream, chunkSize);
let bytes = 0; let bytes = 0;
let done; let done;
@ -22879,7 +22869,11 @@ const getBodyLength = async (body) => {
} }
if(utils$1.isSpecCompliantForm(body)) { if(utils$1.isSpecCompliantForm(body)) {
return (await new Request(body).arrayBuffer()).byteLength; const _request = new Request(platform.origin, {
method: 'POST',
body,
});
return (await _request.arrayBuffer()).byteLength;
} }
if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) { if(utils$1.isArrayBufferView(body) || utils$1.isArrayBuffer(body)) {
@ -22919,19 +22913,14 @@ const fetchAdapter = isFetchSupported && (async (config) => {
responseType = responseType ? (responseType + '').toLowerCase() : 'text'; responseType = responseType ? (responseType + '').toLowerCase() : 'text';
let [composedSignal, stopTimeout] = (signal || cancelToken || timeout) ? let composedSignal = composeSignals$1([signal, cancelToken && cancelToken.toAbortSignal()], timeout);
composeSignals$1([signal, cancelToken], timeout) : [];
let finished, request; let request;
const onFinish = () => { const unsubscribe = composedSignal && composedSignal.unsubscribe && (() => {
!finished && setTimeout(() => { composedSignal.unsubscribe();
composedSignal && composedSignal.unsubscribe();
}); });
finished = true;
};
let requestContentLength; let requestContentLength;
try { try {
@ -22957,7 +22946,7 @@ const fetchAdapter = isFetchSupported && (async (config) => {
progressEventReducer(asyncDecorator(onUploadProgress)) progressEventReducer(asyncDecorator(onUploadProgress))
); );
data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush, encodeText); data = trackStream(_request.body, DEFAULT_CHUNK_SIZE, onProgress, flush);
} }
} }
@ -22965,6 +22954,9 @@ const fetchAdapter = isFetchSupported && (async (config) => {
withCredentials = withCredentials ? 'include' : 'omit'; withCredentials = withCredentials ? 'include' : 'omit';
} }
// Cloudflare Workers throws when credentials are defined
// see https://github.com/cloudflare/workerd/issues/902
const isCredentialsSupported = "credentials" in Request.prototype;
request = new Request(url, { request = new Request(url, {
...fetchOptions, ...fetchOptions,
signal: composedSignal, signal: composedSignal,
@ -22972,14 +22964,14 @@ const fetchAdapter = isFetchSupported && (async (config) => {
headers: headers.normalize().toJSON(), headers: headers.normalize().toJSON(),
body: data, body: data,
duplex: "half", duplex: "half",
credentials: withCredentials credentials: isCredentialsSupported ? withCredentials : undefined
}); });
let response = await fetch(request); let response = await fetch(request);
const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response'); const isStreamResponse = supportsResponseStream && (responseType === 'stream' || responseType === 'response');
if (supportsResponseStream && (onDownloadProgress || isStreamResponse)) { if (supportsResponseStream && (onDownloadProgress || (isStreamResponse && unsubscribe))) {
const options = {}; const options = {};
['status', 'statusText', 'headers'].forEach(prop => { ['status', 'statusText', 'headers'].forEach(prop => {
@ -22996,8 +22988,8 @@ const fetchAdapter = isFetchSupported && (async (config) => {
response = new Response( response = new Response(
trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => { trackStream(response.body, DEFAULT_CHUNK_SIZE, onProgress, () => {
flush && flush(); flush && flush();
isStreamResponse && onFinish(); unsubscribe && unsubscribe();
}, encodeText), }),
options options
); );
} }
@ -23006,9 +22998,7 @@ const fetchAdapter = isFetchSupported && (async (config) => {
let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config); let responseData = await resolvers[utils$1.findKey(resolvers, responseType) || 'text'](response, config);
!isStreamResponse && onFinish(); !isStreamResponse && unsubscribe && unsubscribe();
stopTimeout && stopTimeout();
return await new Promise((resolve, reject) => { return await new Promise((resolve, reject) => {
settle(resolve, reject, { settle(resolve, reject, {
@ -23021,7 +23011,7 @@ const fetchAdapter = isFetchSupported && (async (config) => {
}); });
}) })
} catch (err) { } catch (err) {
onFinish(); unsubscribe && unsubscribe();
if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) { if (err && err.name === 'TypeError' && /fetch/i.test(err.message)) {
throw Object.assign( throw Object.assign(
@ -23232,6 +23222,14 @@ validators$1.transitional = function transitional(validator, version, message) {
}; };
}; };
validators$1.spelling = function spelling(correctSpelling) {
return (value, opt) => {
// eslint-disable-next-line no-console
console.warn(`${opt} is likely a misspelling of ${correctSpelling}`);
return true;
}
};
/** /**
* Assert object's properties type * Assert object's properties type
* *
@ -23301,9 +23299,9 @@ class Axios {
return await this._request(configOrUrl, config); return await this._request(configOrUrl, config);
} catch (err) { } catch (err) {
if (err instanceof Error) { if (err instanceof Error) {
let dummy; let dummy = {};
Error.captureStackTrace ? Error.captureStackTrace(dummy = {}) : (dummy = new Error()); Error.captureStackTrace ? Error.captureStackTrace(dummy) : (dummy = new Error());
// slice off the Error: ... line // slice off the Error: ... line
const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : ''; const stack = dummy.stack ? dummy.stack.replace(/^.+\n/, '') : '';
@ -23358,6 +23356,18 @@ class Axios {
} }
} }
// Set config.allowAbsoluteUrls
if (config.allowAbsoluteUrls !== undefined) ; else if (this.defaults.allowAbsoluteUrls !== undefined) {
config.allowAbsoluteUrls = this.defaults.allowAbsoluteUrls;
} else {
config.allowAbsoluteUrls = true;
}
validator.assertOptions(config, {
baseUrl: validators.spelling('baseURL'),
withXsrfToken: validators.spelling('withXSRFToken')
}, true);
// Set config.method // Set config.method
config.method = (config.method || this.defaults.method || 'get').toLowerCase(); config.method = (config.method || this.defaults.method || 'get').toLowerCase();
@ -23448,7 +23458,7 @@ class Axios {
getUri(config) { getUri(config) {
config = mergeConfig(this.defaults, config); config = mergeConfig(this.defaults, config);
const fullPath = buildFullPath(config.baseURL, config.url); const fullPath = buildFullPath(config.baseURL, config.url, config.allowAbsoluteUrls);
return buildURL(fullPath, config.params, config.paramsSerializer); return buildURL(fullPath, config.params, config.paramsSerializer);
} }
} }
@ -23588,6 +23598,20 @@ class CancelToken {
} }
} }
toAbortSignal() {
const controller = new AbortController();
const abort = (err) => {
controller.abort(err);
};
this.subscribe(abort);
controller.signal.unsubscribe = () => this.unsubscribe(abort);
return controller.signal;
}
/** /**
* Returns an object that contains a new `CancelToken` and a function that, when called, * Returns an object that contains a new `CancelToken` and a function that, when called,
* cancels the `CancelToken`. * cancels the `CancelToken`.

2
mise.toml Normal file
View file

@ -0,0 +1,2 @@
[tools]
node = "20"

8743
package-lock.json generated

File diff suppressed because it is too large Load diff

View file

@ -1,6 +1,6 @@
{ {
"name": "@kie/git-backporting", "name": "@kie/git-backporting",
"version": "4.8.4", "version": "4.8.5",
"description": "Git backporting is a tool to execute automatic pull request git backporting.", "description": "Git backporting is a tool to execute automatic pull request git backporting.",
"author": "", "author": "",
"license": "MIT", "license": "MIT",
@ -55,7 +55,7 @@
"@gitbeaker/rest": "^39.1.0", "@gitbeaker/rest": "^39.1.0",
"@kie/mock-github": "^1.1.0", "@kie/mock-github": "^1.1.0",
"@octokit/webhooks-types": "^6.8.0", "@octokit/webhooks-types": "^6.8.0",
"@release-it/conventional-changelog": "^7.0.0", "@release-it/conventional-changelog": "^10.0.0",
"@types/fs-extra": "^9.0.13", "@types/fs-extra": "^9.0.13",
"@types/jest": "^29.2.4", "@types/jest": "^29.2.4",
"@types/node": "^18.11.17", "@types/node": "^18.11.17",
@ -66,7 +66,7 @@
"husky": "^8.0.2", "husky": "^8.0.2",
"jest": "^29.0.0", "jest": "^29.0.0",
"jest-sonar-reporter": "^2.0.0", "jest-sonar-reporter": "^2.0.0",
"release-it": "^16.1.3", "release-it": "^18.1.2",
"semver": "^7.3.8", "semver": "^7.3.8",
"ts-jest": "^29.0.0", "ts-jest": "^29.0.0",
"ts-node": "^10.8.1", "ts-node": "^10.8.1",

View file

@ -48,7 +48,9 @@ export default class GitLabClient implements GitClient {
// example: <host>/api/v4/projects/<namespace>%2Fbackporting-example/merge_requests/1 // example: <host>/api/v4/projects/<namespace>%2Fbackporting-example/merge_requests/1
async getPullRequest(namespace: string, repo: string, mrNumber: number, squash: boolean | undefined): Promise<GitPullRequest> { async getPullRequest(namespace: string, repo: string, mrNumber: number, squash: boolean | undefined): Promise<GitPullRequest> {
const projectId = this.getProjectId(namespace, repo); const projectId = this.getProjectId(namespace, repo);
const { data } = await this.client.get(`/projects/${projectId}/merge_requests/${mrNumber}`); const url = `/projects/${projectId}/merge_requests/${mrNumber}`;
this.logger.debug(`Fetching pull request ${url}`);
const { data } = await this.client.get(`${url}`);
if (squash === undefined) { if (squash === undefined) {
squash = inferSquash(data.state === "opened", data.squash_commit_sha); squash = inferSquash(data.state === "opened", data.squash_commit_sha);
@ -169,7 +171,7 @@ export default class GitLabClient implements GitClient {
const { namespace, project, id } = this.extractMergeRequestData(mrUrl); const { namespace, project, id } = this.extractMergeRequestData(mrUrl);
const projectId = this.getProjectId(namespace, project); const projectId = this.getProjectId(namespace, project);
const { data } = await this.client.post(`/projects/${projectId}/issues/${id}/notes`, { const { data } = await this.client.post(`/projects/${projectId}/merge_requests/${id}/notes`, {
body: comment, body: comment,
}); });