renovate
Version:
Automated dependency updates. Flexible so you don't need to be.
117 lines (116 loc) • 4.33 kB
JavaScript
import { CONFIG_GIT_URL_UNAVAILABLE, REPOSITORY_BLOCKED } from "../../../constants/error-messages.js";
import { regEx } from "../../../util/regex.js";
import { logger } from "../../../logger/index.js";
import { parseUrl } from "../../../util/url.js";
import { find } from "../../../util/host-rules.js";
import { getPrBodyStruct } from "../pr-body.js";
import { isNonEmptyArray } from "@sindresorhus/is";
//#region lib/modules/platform/gitea/utils.ts
function smartLinks(body) {
return body?.replace(regEx(/\]\(\.\.\/issues\//g), "](issues/").replace(regEx(/\]\(\.\.\/pull\//g), "](pulls/");
}
function trimTrailingApiPath(url) {
return url?.replace(regEx(/api\/v1\/?$/g), "");
}
function getRepoUrl(repo, gitUrl, endpoint) {
if (gitUrl === "ssh") {
if (!repo.ssh_url) throw new Error(CONFIG_GIT_URL_UNAVAILABLE);
logger.debug(`Using SSH URL: ${repo.ssh_url}`);
return repo.ssh_url;
}
const opts = find({
hostType: "gitea",
url: endpoint
});
if (gitUrl === "endpoint") {
const url = parseUrl(endpoint);
if (!url) throw new Error(CONFIG_GIT_URL_UNAVAILABLE);
url.username = opts.token ?? "";
url.pathname = `${url.pathname}${repo.full_name}.git`;
logger.debug({ url: url.toString() }, "using URL based on configured endpoint");
return url.toString();
}
if (!repo.clone_url) throw new Error(CONFIG_GIT_URL_UNAVAILABLE);
logger.debug(`Using HTTP URL: ${repo.clone_url}`);
const repoUrl = parseUrl(repo.clone_url);
if (!repoUrl) throw new Error(CONFIG_GIT_URL_UNAVAILABLE);
repoUrl.username = opts.token ?? "";
return repoUrl.toString();
}
function getMergeMethod(strategy) {
switch (strategy) {
case "fast-forward": return "rebase";
case "merge-commit": return "merge";
case "rebase": return "rebase-merge";
case "squash": return strategy;
default: return null;
}
}
const API_PATH = "/api/v1";
const DRAFT_PREFIX = "WIP: ";
const reconfigurePrRegex = regEx(/reconfigure$/g);
function toRenovatePR(data, author) {
if (!data) return null;
if (!data.base?.ref || !data.head?.label || !data.head?.sha || !data.head?.repo?.full_name) {
logger.trace(`Skipping Pull Request #${data.number} due to missing base and/or head branch`);
return null;
}
const createdBy = data.user?.login;
if (createdBy && author && !reconfigurePrRegex.test(data.head.label) && createdBy !== author) return null;
let title = data.title;
let isDraft = false;
if (title.startsWith("WIP: ")) {
title = title.substring(5);
isDraft = true;
}
return {
labels: (data?.labels ?? []).map((l) => l.name),
number: data.number,
state: data.merged ? "merged" : data.state,
title,
isDraft,
bodyStruct: getPrBodyStruct(data.body),
sha: data.head.sha,
sourceBranch: data.head.label,
targetBranch: data.base.ref,
sourceRepo: data.head.repo.full_name,
createdAt: data.created_at,
cannotMergeReason: data.mergeable ? void 0 : `pr.mergeable="${data.mergeable}"`,
hasAssignees: !!(data.assignee?.login ?? isNonEmptyArray(data.assignees))
};
}
/**
* Check if a repository is usable.
* A repo isn't usable if one of the following conditions is met:
* - The repo is a `mirror`
* - We don't have pull or push permissions
* - Pull requests are disabled
* @param repo Repo to check
* @returns `true` if the repository is usable, `false` otherwise
*/
function usableRepo(repo) {
if (repo.mirror === true) return false;
if (repo.permissions.pull === false || repo.permissions.push === false) {
logger.debug(`Skipping repository ${repo.full_name} because of missing pull or push permissions`);
return false;
}
if (repo.has_pull_requests === false) {
logger.debug(`Skipping repository ${repo.full_name} because pull requests are disabled`);
return false;
}
return true;
}
function isAllowed(style, repo) {
switch (style) {
case "merge": return repo.allow_merge_commits;
case "rebase": return repo.allow_rebase;
case "rebase-merge": return repo.allow_rebase_explicit;
case "squash": return repo.allow_squash_merge;
case "fast-forward-only": return repo.allow_fast_forward_only_merge;
}
logger.debug("Repo has unknown merge style - aborting renovation");
throw new Error(REPOSITORY_BLOCKED);
}
//#endregion
export { API_PATH, DRAFT_PREFIX, getMergeMethod, getRepoUrl, isAllowed, smartLinks, toRenovatePR, trimTrailingApiPath, usableRepo };
//# sourceMappingURL=utils.js.map