renovate 43.263.2 → 43.263.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/modules/platform/gerrit/index.js +1 -1
- package/dist/modules/platform/gerrit/index.js.map +1 -1
- package/dist/modules/platform/gerrit/utils.js +4 -4
- package/dist/modules/platform/gerrit/utils.js.map +1 -1
- package/dist/workers/repository/process/limits.js +54 -45
- package/dist/workers/repository/process/limits.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +1 -0
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -23,7 +23,7 @@ const globalConfigOptionDefaults = {
|
|
|
23
23
|
"detectHostRulesFromEnv": false,
|
|
24
24
|
"dockerChildPrefix": "renovate_",
|
|
25
25
|
"dockerMaxPages": 20,
|
|
26
|
-
"dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.75.
|
|
26
|
+
"dockerSidecarImage": "ghcr.io/renovatebot/base-image:13.75.2",
|
|
27
27
|
"dockerUser": "12021",
|
|
28
28
|
"executionTimeout": 15,
|
|
29
29
|
"exposeAllEnv": false,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.75.
|
|
1
|
+
{"version":3,"file":"global-config-option-defaults.generated.js","names":[],"sources":["../lib/global-config-option-defaults.generated.ts"],"sourcesContent":["\nexport const globalConfigOptionDefaults: Record<string, unknown> = {\n \"allowCustomCrateRegistries\": false,\n \"allowedCommands\": [],\n \"allowedEnv\": [],\n \"allowedHeaders\": [\n \"X-*\"\n ],\n \"allowedUnsafeExecutions\": [],\n \"allowPlugins\": false,\n \"allowScripts\": false,\n \"allowShellExecutorForPostUpgradeCommands\": false,\n \"autodiscover\": false,\n \"bbUseDevelopmentBranch\": false,\n \"binarySource\": \"install\",\n \"cacheHardTtlMinutes\": 10080,\n \"cachePrivatePackages\": false,\n \"cacheTtlOverride\": {},\n \"checkedBranches\": [],\n \"configValidationError\": false,\n \"customEnvVariables\": {},\n \"deleteAdditionalConfigFile\": false,\n \"deleteConfigFile\": false,\n \"detectGlobalManagerConfig\": false,\n \"detectHostRulesFromEnv\": false,\n \"dockerChildPrefix\": \"renovate_\",\n \"dockerMaxPages\": 20,\n \"dockerSidecarImage\": \"ghcr.io/renovatebot/base-image:13.75.2\",\n \"dockerUser\": \"12021\",\n \"executionTimeout\": 15,\n \"exposeAllEnv\": false,\n \"forceCli\": true,\n \"forkCreation\": true,\n \"githubTokenWarn\": true,\n \"gitNoVerify\": [\n \"commit\",\n \"push\"\n ],\n \"gitTimeout\": 0,\n \"gitUrl\": \"default\",\n \"httpCacheTtlDays\": 90,\n \"ignorePrAuthor\": false,\n \"includeMirrors\": false,\n \"inheritConfig\": false,\n \"inheritConfigFileName\": \"org-inherited-config.json\",\n \"inheritConfigRepoName\": \"{{parentOrg}}/renovate-config\",\n \"inheritConfigStrict\": false,\n \"mergeConfidenceDatasources\": [\n \"go\",\n \"maven\",\n \"npm\",\n \"nuget\",\n \"packagist\",\n \"pypi\",\n \"rubygems\"\n ],\n \"mergeConfidenceEndpoint\": \"https://developer.mend.io/\",\n \"migratePresets\": {},\n \"onboardingBranch\": \"renovate/configure\",\n \"onboardingConfig\": {\n \"$schema\": \"https://docs.renovatebot.com/renovate-schema.json\"\n },\n \"onboardingConfigFileName\": \"renovate.json\",\n \"onboardingNoDeps\": \"auto\",\n \"onboardingPrTitle\": \"Configure Renovate\",\n \"onboardingRebaseCheckbox\": false,\n \"optimizeForDisabled\": false,\n \"persistRepoData\": false,\n \"platform\": \"github\",\n \"prCacheSyncMaxPages\": 100,\n \"prCommitsPerRunLimit\": 0,\n \"presetCachePersistence\": false,\n \"processEnv\": {},\n \"productLinks\": {\n \"documentation\": \"https://docs.renovatebot.com/\",\n \"help\": \"https://github.com/renovatebot/renovate/discussions\",\n \"homepage\": \"https://github.com/renovatebot/renovate\"\n },\n \"reportFormatting\": false,\n \"repositoryCache\": \"disabled\",\n \"repositoryCacheForceLocal\": false,\n \"repositoryCacheType\": \"local\",\n \"requireConfig\": \"required\",\n \"s3PathStyle\": false,\n \"secrets\": {},\n \"unicodeEmoji\": true,\n \"useCloudMetadataServices\": true,\n \"userAgent\": \"Renovate/{{renovateVersion}} (https://github.com/renovatebot/renovate)\",\n \"variables\": {}\n};\n"],"mappings":";AACA,MAAa,6BAAsD;CACjE,8BAA8B;CAC9B,mBAAmB,CAAC;CACpB,cAAc,CAAC;CACf,kBAAkB,CAChB,KACF;CACA,2BAA2B,CAAC;CAC5B,gBAAgB;CAChB,gBAAgB;CAChB,4CAA4C;CAC5C,gBAAgB;CAChB,0BAA0B;CAC1B,gBAAgB;CAChB,uBAAuB;CACvB,wBAAwB;CACxB,oBAAoB,CAAC;CACrB,mBAAmB,CAAC;CACpB,yBAAyB;CACzB,sBAAsB,CAAC;CACvB,8BAA8B;CAC9B,oBAAoB;CACpB,6BAA6B;CAC7B,0BAA0B;CAC1B,qBAAqB;CACrB,kBAAkB;CAClB,sBAAsB;CACtB,cAAc;CACd,oBAAoB;CACpB,gBAAgB;CAChB,YAAY;CACZ,gBAAgB;CAChB,mBAAmB;CACnB,eAAe,CACb,UACA,MACF;CACA,cAAc;CACd,UAAU;CACV,oBAAoB;CACpB,kBAAkB;CAClB,kBAAkB;CAClB,iBAAiB;CACjB,yBAAyB;CACzB,yBAAyB;CACzB,uBAAuB;CACvB,8BAA8B;EAC5B;EACA;EACA;EACA;EACA;EACA;EACA;CACF;CACA,2BAA2B;CAC3B,kBAAkB,CAAC;CACnB,oBAAoB;CACpB,oBAAoB,EAClB,WAAW,oDACb;CACA,4BAA4B;CAC5B,oBAAoB;CACpB,qBAAqB;CACrB,4BAA4B;CAC5B,uBAAuB;CACvB,mBAAmB;CACnB,YAAY;CACZ,uBAAuB;CACvB,wBAAwB;CACxB,0BAA0B;CAC1B,cAAc,CAAC;CACf,gBAAgB;EACd,iBAAiB;EACjB,QAAQ;EACR,YAAY;CACd;CACA,oBAAoB;CACpB,mBAAmB;CACnB,6BAA6B;CAC7B,uBAAuB;CACvB,iBAAiB;CACjB,eAAe;CACf,WAAW,CAAC;CACZ,gBAAgB;CAChB,4BAA4B;CAC5B,aAAa;CACb,aAAa,CAAC;AAChB"}
|
|
@@ -105,7 +105,7 @@ async function initRepo({ repository, cloneSubmodules, cloneSubmodulesFilter, gi
|
|
|
105
105
|
labels: projectInfo.labels ?? {}
|
|
106
106
|
};
|
|
107
107
|
const baseUrl = defaults.endpoint;
|
|
108
|
-
const url = getGerritRepoUrl(repository, baseUrl, gitUrl);
|
|
108
|
+
const url = getGerritRepoUrl(repository, baseUrl, gitUrl, config.gerritUsername);
|
|
109
109
|
configureScm(repository, config.gerritUsername);
|
|
110
110
|
await initRepo$1({
|
|
111
111
|
url,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["git.initRepo"],"sources":["../../../../lib/modules/platform/gerrit/index.ts"],"sourcesContent":["import { isTruthy, isUndefined } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { setBaseUrl } from '../../../util/http/gerrit.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfigByContent,\n EnsureCommentRemovalConfigByTopic,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\n\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { readOnlyIssueBody } from '../utils/read-only-issue-body.ts';\nimport { client } from './client.ts';\nimport type { GerritLabelTypeInfo, GerritProjectInfo } from './schema.ts';\nimport { configureScm, pushForReview } from './scm.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n REQUEST_DETAILS_FOR_PRS,\n TAG_PULL_REQUEST_BODY,\n getGerritRepoUrl,\n mapBranchStatusToLabel,\n mapGerritChangeToPr,\n} from './utils.ts';\n\nexport const id = 'gerrit';\nexport const experimental = true;\n\nconst defaults: {\n endpoint?: string;\n} = {};\n\nlet config: {\n repository?: string;\n head?: string;\n config?: GerritProjectInfo;\n labels: Record<string, GerritLabelTypeInfo>;\n gerritUsername?: string;\n} = {\n labels: {},\n};\n\nexport function writeToConfig(newConfig: typeof config): void {\n config = { ...config, ...newConfig };\n}\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n}: PlatformParams): Promise<PlatformResult> {\n logger.debug(`initPlatform(${endpoint!}, ${username!})`);\n if (!endpoint) {\n throw new Error('Init: You must configure a Gerrit Server endpoint');\n }\n if (!(username && password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n config.gerritUsername = username;\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n\n let gerritVersion: string;\n try {\n const env = getEnv();\n /* v8 ignore if: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n gerritVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } else {\n gerritVersion = await client.getGerritVersion({\n username,\n password,\n });\n }\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Gerrit. Check your credentials',\n );\n throw new Error('Init: Authentication failure');\n }\n\n logger.debug(`Gerrit version is: ${gerritVersion}`);\n // Example: 3.13.0-rc3-148-gb478dbbb57\n const parsed = semver.parse(gerritVersion);\n if (!parsed) {\n throw new Error(`Unable to parse Gerrit version: ${gerritVersion}`);\n }\n gerritVersion = `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n client.setGerritVersion(gerritVersion);\n\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n return platformConfig;\n}\n\n/**\n * Get all state=\"ACTIVE\" and type=\"CODE\" repositories from gerrit\n */\nexport async function getRepos(): Promise<string[]> {\n logger.debug(`getRepos()`);\n return await client.getRepos();\n}\n\n/**\n * Clone repository to local directory\n * @param config\n */\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(${repository}, ${gitUrl})`);\n const projectInfo = await client.getProjectInfo(repository);\n const branchInfo = await client.getBranchInfo(repository);\n\n config = {\n ...config,\n repository,\n head: branchInfo.revision,\n config: projectInfo,\n labels: projectInfo.labels ?? {},\n };\n const baseUrl = defaults.endpoint!;\n const url = getGerritRepoUrl(repository, baseUrl, gitUrl);\n configureScm(repository, config.gerritUsername!);\n await git.initRepo({ url, cloneSubmodules, cloneSubmodulesFilter });\n\n //abandon \"open\" and \"rejected\" changes at startup\n const rejectedChanges = await client.findChanges(config.repository!, {\n branchName: '',\n state: 'open',\n label: '-2',\n });\n for (const change of rejectedChanges) {\n await client.abandonChange(\n change._number,\n 'This change has been abandoned as it was voted with Code-Review -2.',\n );\n logger.info(\n `Abandoned change ${change._number} with Code-Review -2 in repository ${repository}`,\n );\n }\n const repoConfig: RepoResult = {\n defaultBranch: config.head!,\n isFork: false,\n repoFingerprint: repoFingerprint(repository, baseUrl),\n };\n return repoConfig;\n}\n\nexport async function findPr(findPRConfig: FindPRConfig): Promise<Pr | null> {\n const change = (\n await client.findChanges(config.repository!, {\n ...findPRConfig,\n singleChange: true,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n })\n ).pop();\n return change\n ? mapGerritChangeToPr(change, {\n sourceBranch: findPRConfig.branchName,\n })\n : null;\n}\n\nexport async function getPr(number: number): Promise<Pr | null> {\n try {\n const change = await client.getChange(number, REQUEST_DETAILS_FOR_PRS);\n return mapGerritChangeToPr(change);\n } catch (err) {\n if (err.statusCode === 404) {\n return null;\n }\n throw err;\n }\n}\n\nexport async function updatePr(prConfig: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prConfig.number}, ${prConfig.prTitle})`);\n if (prConfig.prBody) {\n await client.addMessageIfNotAlreadyExists(\n prConfig.number,\n prConfig.prBody,\n TAG_PULL_REQUEST_BODY,\n );\n }\n await client.setHashtags(prConfig.number, {\n add: prConfig.addLabels,\n remove: prConfig.removeLabels,\n });\n if (prConfig.targetBranch) {\n await client.moveChange(prConfig.number, prConfig.targetBranch);\n }\n if (prConfig.state && prConfig.state === 'closed') {\n await client.abandonChange(prConfig.number);\n }\n}\n\nexport async function createPr(prConfig: CreatePRConfig): Promise<Pr | null> {\n logger.debug(\n `createPr(${prConfig.sourceBranch}, ${prConfig.prTitle}, ${\n prConfig.labels?.toString() ?? ''\n })`,\n );\n\n logger.debug(\n `Pushing commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n const pushResult = await pushForReview({\n sourceRef: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n files: [],\n autoApprove: prConfig.platformPrOptions?.autoApprove,\n labels: prConfig.labels ?? undefined,\n });\n\n if (!pushResult) {\n throw new Error(\n `Failed to push commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n }\n\n const change = (\n await client.findChanges(config.repository!, {\n branchName: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n state: 'open',\n singleChange: true,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n })\n ).pop();\n if (isUndefined(change)) {\n throw new Error(\n `Could not find the Gerrit change after pushing to refs/for/${prConfig.targetBranch}`,\n );\n }\n await client.addMessage(\n change._number,\n prConfig.prBody,\n TAG_PULL_REQUEST_BODY,\n );\n return mapGerritChangeToPr(change, {\n sourceBranch: prConfig.sourceBranch,\n prBody: prConfig.prBody,\n });\n}\n\nexport async function getBranchPr(\n branchName: string,\n targetBranch?: string,\n): Promise<Pr | null> {\n const change = await client.getBranchChange(config.repository!, {\n branchName,\n state: 'open',\n targetBranch,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n });\n\n return change\n ? mapGerritChangeToPr(change, {\n sourceBranch: branchName,\n })\n : null;\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n const changes = await client.findChanges(config.repository!, {\n branchName: '',\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n });\n return changes.map((change) => mapGerritChangeToPr(change)).filter(isTruthy);\n}\n\nexport async function mergePr(config: MergePRConfig): Promise<boolean> {\n logger.debug(\n `mergePr(${config.id}, ${config.branchName!}, ${config.strategy!})`,\n );\n try {\n const change = await client.submitChange(config.id);\n return change.status === 'MERGED';\n } catch (err) {\n if (err.statusCode === 409) {\n logger.warn(\n { err },\n \"Can't submit the change, because the submit rule doesn't allow it.\",\n );\n return false;\n }\n throw err;\n }\n}\n\n/**\n * BranchStatus for Gerrit assumes that the branchName refers to a change.\n * @param branchName\n */\nexport async function getBranchStatus(\n branchName: string,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n const change = (\n await client.findChanges(config.repository!, {\n state: 'open',\n branchName,\n singleChange: true,\n requestDetails: ['LABELS', 'SUBMITTABLE', 'CHECK'],\n })\n ).pop();\n if (change) {\n const hasProblems = change.problems && change.problems.length > 0;\n if (hasProblems) {\n return 'red';\n }\n const hasBlockingLabels = Object.values(change.labels ?? {}).some(\n (label) => label.blocking,\n );\n if (hasBlockingLabels) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (change.submittable) {\n return 'green';\n }\n }\n return 'yellow';\n}\n\n/**\n * check the gerrit-change for the presence of the corresponding \"$context\" Gerrit label if configured,\n * return 'yellow' if not configured or not set\n * @param branchName\n * @param context renovate/stability-days || ...\n */\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n const labelConfig = config.labels[context];\n if (labelConfig) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n // v8 ignore else -- TODO: add test #40625\n if (change) {\n const label = change.labels![context];\n // v8 ignore else -- TODO: add test #40625\n if (label) {\n // Check for rejected or blocking first, as a label could have both rejected and approved\n if (label.rejected || label.blocking) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (label.approved) {\n return 'green';\n }\n }\n }\n }\n return 'yellow';\n}\n\n/**\n * Apply the branch state $context to the corresponding gerrit label (if available)\n * context === \"renovate/stability-days\" / \"renovate/merge-confidence\" and state === \"green\"/...\n * @param branchStatusConfig\n */\nexport async function setBranchStatus(\n branchStatusConfig: BranchStatusConfig,\n): Promise<void> {\n const label = config.labels[branchStatusConfig.context];\n const labelValue =\n label && mapBranchStatusToLabel(branchStatusConfig.state, label);\n if (branchStatusConfig.context && labelValue) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName: branchStatusConfig.branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n\n const labelKey = branchStatusConfig.context;\n if (!change?.labels || !Object.hasOwn(change.labels, labelKey)) {\n return;\n }\n\n await client.setLabel(change._number, labelKey, labelValue);\n }\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const repo = repoName ?? config.repository;\n if (!repo) {\n logger.debug('No repo so cannot getRawFile');\n return null;\n }\n // v8 ignore next -- TODO: add test #40625\n const branch =\n branchOrTag ??\n (repo === config.repository ? (config.head ?? 'HEAD') : 'HEAD');\n const result = await client.getFile(repo, branch, fileName);\n return result;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function addReviewers(\n number: number,\n reviewers: string[],\n): Promise<void> {\n await client.addReviewers(number, reviewers);\n}\n\n/**\n * add \"CC\" (only one possible)\n */\nexport async function addAssignees(\n number: number,\n assignees: string[],\n): Promise<void> {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length) {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length > 1) {\n logger.debug(\n `addAssignees(${number}, ${assignees.toString()}) called with more then one assignee! Gerrit only supports one assignee! Using the first from list.`,\n );\n }\n await client.addAssignee(number, assignees[0]);\n }\n}\n\nexport async function ensureComment(\n ensureComment: EnsureCommentConfig,\n): Promise<boolean> {\n logger.debug(\n `ensureComment(${ensureComment.number}, ${ensureComment.topic!}, ${\n ensureComment.content\n })`,\n );\n await client.addMessageIfNotAlreadyExists(\n ensureComment.number,\n ensureComment.content,\n ensureComment.topic ?? undefined,\n );\n return true;\n}\n\nexport function massageMarkdown(prBody: string, rebaseLabel: string): string {\n return (\n smartTruncate(readOnlyIssueBody(prBody), maxBodyLength())\n .replace('Branch creation', 'Change creation')\n .replace(\n 'close this Pull Request unmerged',\n 'abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'Close this PR',\n 'Abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'you tick the rebase/retry checkbox',\n `you add the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(\n 'checking the rebase/retry box above',\n `adding the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(regEx(/\\b(?:Pull Request|PR)/g), 'change')\n // Remove HTML tags not supported in Gerrit markdown\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?(details|blockquote)>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/<!--renovate-(?:debug|config-hash):.*?-->/g), '')\n // Remove zero-width-space not supported in Gerrit markdown\n .replace(regEx(/​/g), '')\n );\n}\n\nexport function maxBodyLength(): number {\n return MAX_GERRIT_COMMENT_SIZE;\n}\n\nexport async function deleteLabel(\n number: number,\n label: string,\n): Promise<void> {\n await client.setHashtags(number, { remove: [label] });\n}\n\nexport function ensureCommentRemoval(\n _ensureCommentRemoval:\n | EnsureCommentRemovalConfigByTopic\n | EnsureCommentRemovalConfigByContent,\n): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssueClosing(_title: string): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssue(\n _issueConfig: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n return Promise.resolve(null);\n}\n\nexport function findIssue(_title: string): Promise<Issue | null> {\n return Promise.resolve(null);\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n return Promise.resolve([]);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["git.initRepo"],"sources":["../../../../lib/modules/platform/gerrit/index.ts"],"sourcesContent":["import { isTruthy, isUndefined } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { setBaseUrl } from '../../../util/http/gerrit.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfigByContent,\n EnsureCommentRemovalConfigByTopic,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\n\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { readOnlyIssueBody } from '../utils/read-only-issue-body.ts';\nimport { client } from './client.ts';\nimport type { GerritLabelTypeInfo, GerritProjectInfo } from './schema.ts';\nimport { configureScm, pushForReview } from './scm.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n REQUEST_DETAILS_FOR_PRS,\n TAG_PULL_REQUEST_BODY,\n getGerritRepoUrl,\n mapBranchStatusToLabel,\n mapGerritChangeToPr,\n} from './utils.ts';\n\nexport const id = 'gerrit';\nexport const experimental = true;\n\nconst defaults: {\n endpoint?: string;\n} = {};\n\nlet config: {\n repository?: string;\n head?: string;\n config?: GerritProjectInfo;\n labels: Record<string, GerritLabelTypeInfo>;\n gerritUsername?: string;\n} = {\n labels: {},\n};\n\nexport function writeToConfig(newConfig: typeof config): void {\n config = { ...config, ...newConfig };\n}\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n}: PlatformParams): Promise<PlatformResult> {\n logger.debug(`initPlatform(${endpoint!}, ${username!})`);\n if (!endpoint) {\n throw new Error('Init: You must configure a Gerrit Server endpoint');\n }\n if (!(username && password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n config.gerritUsername = username;\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n\n let gerritVersion: string;\n try {\n const env = getEnv();\n /* v8 ignore if: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n gerritVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } else {\n gerritVersion = await client.getGerritVersion({\n username,\n password,\n });\n }\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Gerrit. Check your credentials',\n );\n throw new Error('Init: Authentication failure');\n }\n\n logger.debug(`Gerrit version is: ${gerritVersion}`);\n // Example: 3.13.0-rc3-148-gb478dbbb57\n const parsed = semver.parse(gerritVersion);\n if (!parsed) {\n throw new Error(`Unable to parse Gerrit version: ${gerritVersion}`);\n }\n gerritVersion = `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n client.setGerritVersion(gerritVersion);\n\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n return platformConfig;\n}\n\n/**\n * Get all state=\"ACTIVE\" and type=\"CODE\" repositories from gerrit\n */\nexport async function getRepos(): Promise<string[]> {\n logger.debug(`getRepos()`);\n return await client.getRepos();\n}\n\n/**\n * Clone repository to local directory\n * @param config\n */\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(${repository}, ${gitUrl})`);\n const projectInfo = await client.getProjectInfo(repository);\n const branchInfo = await client.getBranchInfo(repository);\n\n config = {\n ...config,\n repository,\n head: branchInfo.revision,\n config: projectInfo,\n labels: projectInfo.labels ?? {},\n };\n const baseUrl = defaults.endpoint!;\n const url = getGerritRepoUrl(\n repository,\n baseUrl,\n gitUrl,\n config.gerritUsername!,\n );\n configureScm(repository, config.gerritUsername!);\n await git.initRepo({ url, cloneSubmodules, cloneSubmodulesFilter });\n\n //abandon \"open\" and \"rejected\" changes at startup\n const rejectedChanges = await client.findChanges(config.repository!, {\n branchName: '',\n state: 'open',\n label: '-2',\n });\n for (const change of rejectedChanges) {\n await client.abandonChange(\n change._number,\n 'This change has been abandoned as it was voted with Code-Review -2.',\n );\n logger.info(\n `Abandoned change ${change._number} with Code-Review -2 in repository ${repository}`,\n );\n }\n const repoConfig: RepoResult = {\n defaultBranch: config.head!,\n isFork: false,\n repoFingerprint: repoFingerprint(repository, baseUrl),\n };\n return repoConfig;\n}\n\nexport async function findPr(findPRConfig: FindPRConfig): Promise<Pr | null> {\n const change = (\n await client.findChanges(config.repository!, {\n ...findPRConfig,\n singleChange: true,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n })\n ).pop();\n return change\n ? mapGerritChangeToPr(change, {\n sourceBranch: findPRConfig.branchName,\n })\n : null;\n}\n\nexport async function getPr(number: number): Promise<Pr | null> {\n try {\n const change = await client.getChange(number, REQUEST_DETAILS_FOR_PRS);\n return mapGerritChangeToPr(change);\n } catch (err) {\n if (err.statusCode === 404) {\n return null;\n }\n throw err;\n }\n}\n\nexport async function updatePr(prConfig: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prConfig.number}, ${prConfig.prTitle})`);\n if (prConfig.prBody) {\n await client.addMessageIfNotAlreadyExists(\n prConfig.number,\n prConfig.prBody,\n TAG_PULL_REQUEST_BODY,\n );\n }\n await client.setHashtags(prConfig.number, {\n add: prConfig.addLabels,\n remove: prConfig.removeLabels,\n });\n if (prConfig.targetBranch) {\n await client.moveChange(prConfig.number, prConfig.targetBranch);\n }\n if (prConfig.state && prConfig.state === 'closed') {\n await client.abandonChange(prConfig.number);\n }\n}\n\nexport async function createPr(prConfig: CreatePRConfig): Promise<Pr | null> {\n logger.debug(\n `createPr(${prConfig.sourceBranch}, ${prConfig.prTitle}, ${\n prConfig.labels?.toString() ?? ''\n })`,\n );\n\n logger.debug(\n `Pushing commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n const pushResult = await pushForReview({\n sourceRef: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n files: [],\n autoApprove: prConfig.platformPrOptions?.autoApprove,\n labels: prConfig.labels ?? undefined,\n });\n\n if (!pushResult) {\n throw new Error(\n `Failed to push commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n }\n\n const change = (\n await client.findChanges(config.repository!, {\n branchName: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n state: 'open',\n singleChange: true,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n })\n ).pop();\n if (isUndefined(change)) {\n throw new Error(\n `Could not find the Gerrit change after pushing to refs/for/${prConfig.targetBranch}`,\n );\n }\n await client.addMessage(\n change._number,\n prConfig.prBody,\n TAG_PULL_REQUEST_BODY,\n );\n return mapGerritChangeToPr(change, {\n sourceBranch: prConfig.sourceBranch,\n prBody: prConfig.prBody,\n });\n}\n\nexport async function getBranchPr(\n branchName: string,\n targetBranch?: string,\n): Promise<Pr | null> {\n const change = await client.getBranchChange(config.repository!, {\n branchName,\n state: 'open',\n targetBranch,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n });\n\n return change\n ? mapGerritChangeToPr(change, {\n sourceBranch: branchName,\n })\n : null;\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n const changes = await client.findChanges(config.repository!, {\n branchName: '',\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n });\n return changes.map((change) => mapGerritChangeToPr(change)).filter(isTruthy);\n}\n\nexport async function mergePr(config: MergePRConfig): Promise<boolean> {\n logger.debug(\n `mergePr(${config.id}, ${config.branchName!}, ${config.strategy!})`,\n );\n try {\n const change = await client.submitChange(config.id);\n return change.status === 'MERGED';\n } catch (err) {\n if (err.statusCode === 409) {\n logger.warn(\n { err },\n \"Can't submit the change, because the submit rule doesn't allow it.\",\n );\n return false;\n }\n throw err;\n }\n}\n\n/**\n * BranchStatus for Gerrit assumes that the branchName refers to a change.\n * @param branchName\n */\nexport async function getBranchStatus(\n branchName: string,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n const change = (\n await client.findChanges(config.repository!, {\n state: 'open',\n branchName,\n singleChange: true,\n requestDetails: ['LABELS', 'SUBMITTABLE', 'CHECK'],\n })\n ).pop();\n if (change) {\n const hasProblems = change.problems && change.problems.length > 0;\n if (hasProblems) {\n return 'red';\n }\n const hasBlockingLabels = Object.values(change.labels ?? {}).some(\n (label) => label.blocking,\n );\n if (hasBlockingLabels) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (change.submittable) {\n return 'green';\n }\n }\n return 'yellow';\n}\n\n/**\n * check the gerrit-change for the presence of the corresponding \"$context\" Gerrit label if configured,\n * return 'yellow' if not configured or not set\n * @param branchName\n * @param context renovate/stability-days || ...\n */\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n const labelConfig = config.labels[context];\n if (labelConfig) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n // v8 ignore else -- TODO: add test #40625\n if (change) {\n const label = change.labels![context];\n // v8 ignore else -- TODO: add test #40625\n if (label) {\n // Check for rejected or blocking first, as a label could have both rejected and approved\n if (label.rejected || label.blocking) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (label.approved) {\n return 'green';\n }\n }\n }\n }\n return 'yellow';\n}\n\n/**\n * Apply the branch state $context to the corresponding gerrit label (if available)\n * context === \"renovate/stability-days\" / \"renovate/merge-confidence\" and state === \"green\"/...\n * @param branchStatusConfig\n */\nexport async function setBranchStatus(\n branchStatusConfig: BranchStatusConfig,\n): Promise<void> {\n const label = config.labels[branchStatusConfig.context];\n const labelValue =\n label && mapBranchStatusToLabel(branchStatusConfig.state, label);\n if (branchStatusConfig.context && labelValue) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName: branchStatusConfig.branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n\n const labelKey = branchStatusConfig.context;\n if (!change?.labels || !Object.hasOwn(change.labels, labelKey)) {\n return;\n }\n\n await client.setLabel(change._number, labelKey, labelValue);\n }\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const repo = repoName ?? config.repository;\n if (!repo) {\n logger.debug('No repo so cannot getRawFile');\n return null;\n }\n // v8 ignore next -- TODO: add test #40625\n const branch =\n branchOrTag ??\n (repo === config.repository ? (config.head ?? 'HEAD') : 'HEAD');\n const result = await client.getFile(repo, branch, fileName);\n return result;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function addReviewers(\n number: number,\n reviewers: string[],\n): Promise<void> {\n await client.addReviewers(number, reviewers);\n}\n\n/**\n * add \"CC\" (only one possible)\n */\nexport async function addAssignees(\n number: number,\n assignees: string[],\n): Promise<void> {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length) {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length > 1) {\n logger.debug(\n `addAssignees(${number}, ${assignees.toString()}) called with more then one assignee! Gerrit only supports one assignee! Using the first from list.`,\n );\n }\n await client.addAssignee(number, assignees[0]);\n }\n}\n\nexport async function ensureComment(\n ensureComment: EnsureCommentConfig,\n): Promise<boolean> {\n logger.debug(\n `ensureComment(${ensureComment.number}, ${ensureComment.topic!}, ${\n ensureComment.content\n })`,\n );\n await client.addMessageIfNotAlreadyExists(\n ensureComment.number,\n ensureComment.content,\n ensureComment.topic ?? undefined,\n );\n return true;\n}\n\nexport function massageMarkdown(prBody: string, rebaseLabel: string): string {\n return (\n smartTruncate(readOnlyIssueBody(prBody), maxBodyLength())\n .replace('Branch creation', 'Change creation')\n .replace(\n 'close this Pull Request unmerged',\n 'abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'Close this PR',\n 'Abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'you tick the rebase/retry checkbox',\n `you add the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(\n 'checking the rebase/retry box above',\n `adding the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(regEx(/\\b(?:Pull Request|PR)/g), 'change')\n // Remove HTML tags not supported in Gerrit markdown\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?(details|blockquote)>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/<!--renovate-(?:debug|config-hash):.*?-->/g), '')\n // Remove zero-width-space not supported in Gerrit markdown\n .replace(regEx(/​/g), '')\n );\n}\n\nexport function maxBodyLength(): number {\n return MAX_GERRIT_COMMENT_SIZE;\n}\n\nexport async function deleteLabel(\n number: number,\n label: string,\n): Promise<void> {\n await client.setHashtags(number, { remove: [label] });\n}\n\nexport function ensureCommentRemoval(\n _ensureCommentRemoval:\n | EnsureCommentRemovalConfigByTopic\n | EnsureCommentRemovalConfigByContent,\n): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssueClosing(_title: string): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssue(\n _issueConfig: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n return Promise.resolve(null);\n}\n\nexport function findIssue(_title: string): Promise<Issue | null> {\n return Promise.resolve(null);\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n return Promise.resolve([]);\n}\n"],"mappings":"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"}
|
|
@@ -21,15 +21,15 @@ const REQUEST_DETAILS_FOR_PRS = [
|
|
|
21
21
|
"CURRENT_REVISION",
|
|
22
22
|
"COMMIT_FOOTERS"
|
|
23
23
|
];
|
|
24
|
-
function getGerritRepoUrl(repository, endpoint, gitUrl) {
|
|
24
|
+
function getGerritRepoUrl(repository, endpoint, gitUrl, username) {
|
|
25
25
|
const endpointUrl = parseUrl(endpoint);
|
|
26
26
|
if (!endpointUrl) throw new Error(CONFIG_GIT_URL_UNAVAILABLE);
|
|
27
|
-
const url = gitUrl === "ssh" ? createSshUrl(endpointUrl, repository) : createHttpUrl(endpointUrl, endpoint, repository);
|
|
27
|
+
const url = gitUrl === "ssh" ? createSshUrl(endpointUrl, repository, username) : createHttpUrl(endpointUrl, endpoint, repository);
|
|
28
28
|
logger.trace({ url }, "using URL based on configured endpoint");
|
|
29
29
|
return url;
|
|
30
30
|
}
|
|
31
|
-
function createSshUrl(url, repository) {
|
|
32
|
-
return `ssh://${url.host}:${DEFAULT_SSH_PORT}/${repository}`;
|
|
31
|
+
function createSshUrl(url, repository, username) {
|
|
32
|
+
return `ssh://${username}@${url.host}:${DEFAULT_SSH_PORT}/${repository}`;
|
|
33
33
|
}
|
|
34
34
|
function createHttpUrl(url, endpoint, repository) {
|
|
35
35
|
const opts = find({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/gerrit/utils.ts"],"sourcesContent":["import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { toLongCommitSha } from '../../../util/schema-utils/git.ts';\nimport { joinUrlParts, parseUrl } from '../../../util/url.ts';\nimport { hashBody } from '../pr-body.ts';\nimport type { GitUrlOption, Pr } from '../types.ts';\nimport type { GerritChange, GerritLabelTypeInfo } from './schema.ts';\nimport type { GerritChangeStatus, GerritRequestDetail } from './types.ts';\n\nexport const MIN_GERRIT_VERSION = '3.0.0';\n\nexport const TAG_PULL_REQUEST_BODY = 'pull-request';\n\nconst DEFAULT_SSH_PORT = `29418`;\n\n/**\n * Max comment size in Gerrit (16kiB by default)\n * https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#change:~:text=change.commentSizeLimit\n */\nexport const MAX_GERRIT_COMMENT_SIZE = 16 * 1024;\n\nexport const REQUEST_DETAILS_FOR_PRS: GerritRequestDetail[] = [\n 'MESSAGES', // to get the pr body\n 'LABELS', // to get the reviewers\n 'DETAILED_ACCOUNTS', // to get the reviewers usernames\n 'CURRENT_REVISION', // to get the commit message\n 'COMMIT_FOOTERS', // to get the commit message\n] as const;\n\nexport function getGerritRepoUrl(\n repository: string,\n endpoint: string,\n gitUrl: GitUrlOption | undefined,\n): string {\n const endpointUrl = parseUrl(endpoint);\n if (!endpointUrl) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n\n const url =\n gitUrl === 'ssh'\n ? createSshUrl(endpointUrl, repository)\n : createHttpUrl(endpointUrl, endpoint, repository);\n logger.trace({ url }, 'using URL based on configured endpoint');\n\n return url;\n}\n\nfunction createSshUrl(url: URL, repository: string): string {\n return `ssh://${url.host}:${DEFAULT_SSH_PORT}/${repository}`;\n}\n\nfunction createHttpUrl(url: URL, endpoint: string, repository: string): string {\n // Find options for current host and determine Git endpoint\n const opts = hostRules.find({\n hostType: 'gerrit',\n url: endpoint,\n });\n\n if (!(opts.username && opts.password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n\n url.username = opts.username;\n url.password = opts.password;\n url.pathname = joinUrlParts(\n url.pathname,\n 'a',\n encodeURIComponent(repository),\n );\n return url.toString();\n}\n\nexport function mapPrStateToGerritFilter(state?: PrState): string | null {\n switch (state) {\n case 'merged':\n return 'status:merged';\n case 'open':\n return 'status:open';\n case 'closed':\n return 'status:abandoned';\n case '!open':\n return '-status:open';\n case 'all':\n default:\n return null;\n }\n}\n\nexport function mapGerritChangeToPr(\n change: GerritChange,\n knownProperties?: {\n sourceBranch?: string;\n prBody?: string;\n },\n): Pr | null {\n const sourceBranch =\n knownProperties?.sourceBranch ?? extractSourceBranch(change);\n if (!sourceBranch) {\n return null;\n }\n return {\n number: change._number,\n state: mapGerritChangeStateToPrState(change.status),\n sourceBranch,\n targetBranch: change.branch,\n title: change.subject,\n createdAt: convertGerritDateToISO(change.created),\n labels: change.hashtags,\n reviewers:\n change.reviewers?.REVIEWER?.map((reviewer) => reviewer.username!) ?? [],\n bodyStruct: {\n hash: hashBody(knownProperties?.prBody ?? findPullRequestBody(change)),\n },\n sha: toLongCommitSha(change.current_revision),\n };\n}\n\nexport function mapGerritChangeStateToPrState(\n state: GerritChangeStatus,\n): 'merged' | 'open' | 'closed' {\n switch (state) {\n case 'NEW':\n return 'open';\n case 'MERGED':\n return 'merged';\n case 'ABANDONED':\n return 'closed';\n }\n}\n\nexport function extractSourceBranch(change: GerritChange): string | undefined {\n let sourceBranch: string | undefined = undefined;\n\n if (change.current_revision) {\n const re = regEx(/^Renovate-Branch: (.+)$/m);\n const currentRevision = change.revisions![change.current_revision];\n const message = currentRevision.commit_with_footers;\n // v8 ignore else -- TODO: add test #40625\n if (message) {\n sourceBranch = re.exec(message)?.[1];\n }\n }\n\n return sourceBranch ?? undefined;\n}\n\nexport function findPullRequestBody(change: GerritChange): string | undefined {\n const msg = Array.from(change.messages ?? [])\n .reverse()\n .find((msg) => msg.tag === TAG_PULL_REQUEST_BODY);\n if (msg) {\n // Gerrit adds a \"Patch Set X:\" prefix to comments\n return msg.message.replace(/^Patch Set \\d+:\\n\\n/, '');\n }\n return undefined;\n}\n\nexport function mapBranchStatusToLabel(\n state: BranchStatus | 'UNKNOWN', // suppress default path code removal\n label: GerritLabelTypeInfo,\n): number {\n const numbers = Object.keys(label.values).map((x) => parseInt(x, 10));\n switch (state) {\n case 'green':\n return Math.max(...numbers);\n case 'yellow':\n case 'red':\n return Math.min(...numbers);\n }\n /* v8 ignore next */\n return label.default_value;\n}\n\n// Convert Gerrit date format to ISO format\nexport function convertGerritDateToISO(date: string): string {\n return date.replace(' ', 'T');\n}\n"],"mappings":";;;;;;;;AAYA,MAAa,qBAAqB;AAElC,MAAa,wBAAwB;AAErC,MAAM,mBAAmB;;;;;AAMzB,MAAa,0BAA0B,KAAK;AAE5C,MAAa,0BAAiD;CAC5D;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,iBACd,YACA,UACA,
|
|
1
|
+
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/gerrit/utils.ts"],"sourcesContent":["import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus, PrState } from '../../../types/index.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { toLongCommitSha } from '../../../util/schema-utils/git.ts';\nimport { joinUrlParts, parseUrl } from '../../../util/url.ts';\nimport { hashBody } from '../pr-body.ts';\nimport type { GitUrlOption, Pr } from '../types.ts';\nimport type { GerritChange, GerritLabelTypeInfo } from './schema.ts';\nimport type { GerritChangeStatus, GerritRequestDetail } from './types.ts';\n\nexport const MIN_GERRIT_VERSION = '3.0.0';\n\nexport const TAG_PULL_REQUEST_BODY = 'pull-request';\n\nconst DEFAULT_SSH_PORT = `29418`;\n\n/**\n * Max comment size in Gerrit (16kiB by default)\n * https://gerrit-review.googlesource.com/Documentation/config-gerrit.html#change:~:text=change.commentSizeLimit\n */\nexport const MAX_GERRIT_COMMENT_SIZE = 16 * 1024;\n\nexport const REQUEST_DETAILS_FOR_PRS: GerritRequestDetail[] = [\n 'MESSAGES', // to get the pr body\n 'LABELS', // to get the reviewers\n 'DETAILED_ACCOUNTS', // to get the reviewers usernames\n 'CURRENT_REVISION', // to get the commit message\n 'COMMIT_FOOTERS', // to get the commit message\n] as const;\n\nexport function getGerritRepoUrl(\n repository: string,\n endpoint: string,\n gitUrl: GitUrlOption | undefined,\n username: string,\n): string {\n const endpointUrl = parseUrl(endpoint);\n if (!endpointUrl) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n\n const url =\n gitUrl === 'ssh'\n ? createSshUrl(endpointUrl, repository, username)\n : createHttpUrl(endpointUrl, endpoint, repository);\n logger.trace({ url }, 'using URL based on configured endpoint');\n\n return url;\n}\n\nfunction createSshUrl(url: URL, repository: string, username: string): string {\n return `ssh://${username}@${url.host}:${DEFAULT_SSH_PORT}/${repository}`;\n}\n\nfunction createHttpUrl(url: URL, endpoint: string, repository: string): string {\n // Find options for current host and determine Git endpoint\n const opts = hostRules.find({\n hostType: 'gerrit',\n url: endpoint,\n });\n\n if (!(opts.username && opts.password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n\n url.username = opts.username;\n url.password = opts.password;\n url.pathname = joinUrlParts(\n url.pathname,\n 'a',\n encodeURIComponent(repository),\n );\n return url.toString();\n}\n\nexport function mapPrStateToGerritFilter(state?: PrState): string | null {\n switch (state) {\n case 'merged':\n return 'status:merged';\n case 'open':\n return 'status:open';\n case 'closed':\n return 'status:abandoned';\n case '!open':\n return '-status:open';\n case 'all':\n default:\n return null;\n }\n}\n\nexport function mapGerritChangeToPr(\n change: GerritChange,\n knownProperties?: {\n sourceBranch?: string;\n prBody?: string;\n },\n): Pr | null {\n const sourceBranch =\n knownProperties?.sourceBranch ?? extractSourceBranch(change);\n if (!sourceBranch) {\n return null;\n }\n return {\n number: change._number,\n state: mapGerritChangeStateToPrState(change.status),\n sourceBranch,\n targetBranch: change.branch,\n title: change.subject,\n createdAt: convertGerritDateToISO(change.created),\n labels: change.hashtags,\n reviewers:\n change.reviewers?.REVIEWER?.map((reviewer) => reviewer.username!) ?? [],\n bodyStruct: {\n hash: hashBody(knownProperties?.prBody ?? findPullRequestBody(change)),\n },\n sha: toLongCommitSha(change.current_revision),\n };\n}\n\nexport function mapGerritChangeStateToPrState(\n state: GerritChangeStatus,\n): 'merged' | 'open' | 'closed' {\n switch (state) {\n case 'NEW':\n return 'open';\n case 'MERGED':\n return 'merged';\n case 'ABANDONED':\n return 'closed';\n }\n}\n\nexport function extractSourceBranch(change: GerritChange): string | undefined {\n let sourceBranch: string | undefined = undefined;\n\n if (change.current_revision) {\n const re = regEx(/^Renovate-Branch: (.+)$/m);\n const currentRevision = change.revisions![change.current_revision];\n const message = currentRevision.commit_with_footers;\n // v8 ignore else -- TODO: add test #40625\n if (message) {\n sourceBranch = re.exec(message)?.[1];\n }\n }\n\n return sourceBranch ?? undefined;\n}\n\nexport function findPullRequestBody(change: GerritChange): string | undefined {\n const msg = Array.from(change.messages ?? [])\n .reverse()\n .find((msg) => msg.tag === TAG_PULL_REQUEST_BODY);\n if (msg) {\n // Gerrit adds a \"Patch Set X:\" prefix to comments\n return msg.message.replace(/^Patch Set \\d+:\\n\\n/, '');\n }\n return undefined;\n}\n\nexport function mapBranchStatusToLabel(\n state: BranchStatus | 'UNKNOWN', // suppress default path code removal\n label: GerritLabelTypeInfo,\n): number {\n const numbers = Object.keys(label.values).map((x) => parseInt(x, 10));\n switch (state) {\n case 'green':\n return Math.max(...numbers);\n case 'yellow':\n case 'red':\n return Math.min(...numbers);\n }\n /* v8 ignore next */\n return label.default_value;\n}\n\n// Convert Gerrit date format to ISO format\nexport function convertGerritDateToISO(date: string): string {\n return date.replace(' ', 'T');\n}\n"],"mappings":";;;;;;;;AAYA,MAAa,qBAAqB;AAElC,MAAa,wBAAwB;AAErC,MAAM,mBAAmB;;;;;AAMzB,MAAa,0BAA0B,KAAK;AAE5C,MAAa,0BAAiD;CAC5D;CACA;CACA;CACA;CACA;AACF;AAEA,SAAgB,iBACd,YACA,UACA,QACA,UACQ;CACR,MAAM,cAAc,SAAS,QAAQ;CACrC,IAAI,CAAC,aACH,MAAM,IAAI,MAAM,0BAA0B;CAG5C,MAAM,MACJ,WAAW,QACP,aAAa,aAAa,YAAY,QAAQ,IAC9C,cAAc,aAAa,UAAU,UAAU;CACrD,OAAO,MAAM,EAAE,IAAI,GAAG,wCAAwC;CAE9D,OAAO;AACT;AAEA,SAAS,aAAa,KAAU,YAAoB,UAA0B;CAC5E,OAAO,SAAS,SAAS,GAAG,IAAI,KAAK,GAAG,iBAAiB,GAAG;AAC9D;AAEA,SAAS,cAAc,KAAU,UAAkB,YAA4B;CAE7E,MAAM,OAAOA,KAAe;EAC1B,UAAU;EACV,KAAK;CACP,CAAC;CAED,IAAI,EAAE,KAAK,YAAY,KAAK,WAC1B,MAAM,IAAI,MACR,4DACF;CAGF,IAAI,WAAW,KAAK;CACpB,IAAI,WAAW,KAAK;CACpB,IAAI,WAAW,aACb,IAAI,UACJ,KACA,mBAAmB,UAAU,CAC/B;CACA,OAAO,IAAI,SAAS;AACtB;AAEA,SAAgB,yBAAyB,OAAgC;CACvE,QAAQ,OAAR;EACE,KAAK,UACH,OAAO;EACT,KAAK,QACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,SACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,SAAgB,oBACd,QACA,iBAIW;CACX,MAAM,eACJ,iBAAiB,gBAAgB,oBAAoB,MAAM;CAC7D,IAAI,CAAC,cACH,OAAO;CAET,OAAO;EACL,QAAQ,OAAO;EACf,OAAO,8BAA8B,OAAO,MAAM;EAClD;EACA,cAAc,OAAO;EACrB,OAAO,OAAO;EACd,WAAW,uBAAuB,OAAO,OAAO;EAChD,QAAQ,OAAO;EACf,WACE,OAAO,WAAW,UAAU,KAAK,aAAa,SAAS,QAAS,KAAK,CAAC;EACxE,YAAY,EACV,MAAM,SAAS,iBAAiB,UAAU,oBAAoB,MAAM,CAAC,EACvE;EACA,KAAK,gBAAgB,OAAO,gBAAgB;CAC9C;AACF;AAEA,SAAgB,8BACd,OAC8B;CAC9B,QAAQ,OAAR;EACE,KAAK,OACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,aACH,OAAO;CACX;AACF;AAEA,SAAgB,oBAAoB,QAA0C;CAC5E,IAAI,eAAmC,KAAA;CAEvC,IAAI,OAAO,kBAAkB;EAC3B,MAAM,KAAK,MAAM,0BAA0B;EAE3C,MAAM,UADkB,OAAO,UAAW,OAAO,iBAClB,CAAC;;EAEhC,IAAI,SACF,eAAe,GAAG,KAAK,OAAO,CAAC,GAAG;CAEtC;CAEA,OAAO,gBAAgB,KAAA;AACzB;AAEA,SAAgB,oBAAoB,QAA0C;CAC5E,MAAM,MAAM,MAAM,KAAK,OAAO,YAAY,CAAC,CAAC,CAAC,CAC1C,QAAQ,CAAC,CACT,MAAM,QAAQ,IAAI,QAAQ,qBAAqB;CAClD,IAAI,KAEF,OAAO,IAAI,QAAQ,QAAQ,uBAAuB,EAAE;AAGxD;AAEA,SAAgB,uBACd,OACA,OACQ;CACR,MAAM,UAAU,OAAO,KAAK,MAAM,MAAM,CAAC,CAAC,KAAK,MAAM,SAAS,GAAG,EAAE,CAAC;CACpE,QAAQ,OAAR;EACE,KAAK,SACH,OAAO,KAAK,IAAI,GAAG,OAAO;EAC5B,KAAK;EACL,KAAK,OACH,OAAO,KAAK,IAAI,GAAG,OAAO;CAC9B;;CAEA,OAAO,MAAM;AACf;AAGA,SAAgB,uBAAuB,MAAsB;CAC3D,OAAO,KAAK,QAAQ,KAAK,GAAG;AAC9B"}
|
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
|
+
import { instrument } from "../../../instrumentation/index.js";
|
|
2
3
|
import { getInheritedOrGlobal } from "../../../util/common.js";
|
|
3
4
|
import { ExternalHostError } from "../../../types/errors/external-host-error.js";
|
|
4
5
|
import { getCache } from "../../../util/cache/repository/index.js";
|
|
@@ -7,59 +8,67 @@ import { platform } from "../../../modules/platform/index.js";
|
|
|
7
8
|
import { DateTime } from "luxon";
|
|
8
9
|
//#region lib/workers/repository/process/limits.ts
|
|
9
10
|
async function getPrHourlyCount(config) {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
11
|
+
return await instrument("getPrHourlyCount", async () => {
|
|
12
|
+
try {
|
|
13
|
+
const prList = await platform.getPrList();
|
|
14
|
+
const currentHourStart = DateTime.utc().startOf("hour");
|
|
15
|
+
logger.debug(`Calculating PRs created so far in this hour currentHourStart=${String(currentHourStart)}`);
|
|
16
|
+
const soFarThisHour = prList.filter((pr) => pr.sourceBranch !== getInheritedOrGlobal("onboardingBranch") && pr.sourceBranch.startsWith(config.branchPrefix) && DateTime.fromISO(pr.createdAt).toUTC() > currentHourStart);
|
|
17
|
+
logger.debug(`${soFarThisHour.length} PRs have been created so far in this hour.`);
|
|
18
|
+
return soFarThisHour.length;
|
|
19
|
+
} catch (err) {
|
|
20
|
+
// istanbul ignore if
|
|
21
|
+
if (err instanceof ExternalHostError) throw err;
|
|
22
|
+
logger.error({ err }, "Error checking PRs created per hour");
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
});
|
|
23
26
|
}
|
|
24
27
|
async function getConcurrentPrsCount(config, branches) {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
const
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
28
|
+
return await instrument("getConcurrentPrsCount", async () => {
|
|
29
|
+
let openPrCount = 0;
|
|
30
|
+
for (const { branchName } of branches) try {
|
|
31
|
+
const pr = await platform.getBranchPr(branchName, config.baseBranch);
|
|
32
|
+
if (pr && pr.sourceBranch !== getInheritedOrGlobal("onboardingBranch") && pr.state === "open") openPrCount++;
|
|
33
|
+
} catch (err) {
|
|
34
|
+
// istanbul ignore if
|
|
35
|
+
if (err instanceof ExternalHostError) throw err;
|
|
36
|
+
}
|
|
37
|
+
logger.debug(`${openPrCount} PRs are currently open`);
|
|
38
|
+
return openPrCount;
|
|
39
|
+
});
|
|
35
40
|
}
|
|
36
41
|
async function getCommitsHourlyCount(branches) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
if (
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
42
|
+
return await instrument("getCommitsHourlyCount", async () => {
|
|
43
|
+
try {
|
|
44
|
+
const currentHourStart = DateTime.utc().startOf("hour");
|
|
45
|
+
logger.debug(`Calculating commits so far in this hour currentHourStart=${String(currentHourStart)}, for ${branches.length} branches`);
|
|
46
|
+
const cachedBranches = getCache().branches ?? [];
|
|
47
|
+
let soFarThisHour = 0;
|
|
48
|
+
for (const branch of branches) {
|
|
49
|
+
const branchCache = cachedBranches.find((b) => b.branchName === branch.branchName);
|
|
50
|
+
if (branchCache?.commitTimestamp) {
|
|
51
|
+
if (DateTime.fromISO(branchCache.commitTimestamp).toUTC() > currentHourStart) soFarThisHour++;
|
|
52
|
+
} else {
|
|
53
|
+
const updateDate = await scm.getBranchUpdateDate(branch.branchName);
|
|
54
|
+
if (updateDate && updateDate > currentHourStart) soFarThisHour++;
|
|
55
|
+
}
|
|
49
56
|
}
|
|
57
|
+
logger.debug(`${soFarThisHour} commits so far in this hour.`);
|
|
58
|
+
return soFarThisHour;
|
|
59
|
+
} catch (err) {
|
|
60
|
+
logger.error({ err }, "Error checking commits per hour");
|
|
61
|
+
return 0;
|
|
50
62
|
}
|
|
51
|
-
|
|
52
|
-
return soFarThisHour;
|
|
53
|
-
} catch (err) {
|
|
54
|
-
logger.error({ err }, "Error checking commits per hour");
|
|
55
|
-
return 0;
|
|
56
|
-
}
|
|
63
|
+
});
|
|
57
64
|
}
|
|
58
65
|
async function getConcurrentBranchesCount(branches) {
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
66
|
+
return await instrument("getConcurrentBranchesCount", async () => {
|
|
67
|
+
let existingBranchCount = 0;
|
|
68
|
+
for (const branch of branches) if (await scm.branchExists(branch.branchName)) existingBranchCount++;
|
|
69
|
+
logger.debug(`${existingBranchCount} already existing branches found.`);
|
|
70
|
+
return existingBranchCount;
|
|
71
|
+
});
|
|
63
72
|
}
|
|
64
73
|
//#endregion
|
|
65
74
|
export { getCommitsHourlyCount, getConcurrentBranchesCount, getConcurrentPrsCount, getPrHourlyCount };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"limits.js","names":[],"sources":["../../../../lib/workers/repository/process/limits.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport type { BranchConfig } from '../../types.ts';\n\nexport async function getPrHourlyCount(\n config: RenovateConfig,\n): Promise<number> {\n try {\n
|
|
1
|
+
{"version":3,"file":"limits.js","names":[],"sources":["../../../../lib/workers/repository/process/limits.ts"],"sourcesContent":["import { DateTime } from 'luxon';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { instrument } from '../../../instrumentation/index.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { platform } from '../../../modules/platform/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../types/errors/external-host-error.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\nimport type { BranchConfig } from '../../types.ts';\n\nexport async function getPrHourlyCount(\n config: RenovateConfig,\n): Promise<number> {\n return await instrument('getPrHourlyCount', async () => {\n try {\n const prList = await platform.getPrList();\n const currentHourStart = DateTime.utc().startOf('hour');\n logger.debug(\n `Calculating PRs created so far in this hour currentHourStart=${String(currentHourStart)}`,\n );\n const soFarThisHour = prList.filter(\n (pr) =>\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch') &&\n pr.sourceBranch.startsWith(config.branchPrefix!) &&\n DateTime.fromISO(pr.createdAt!).toUTC() > currentHourStart,\n );\n logger.debug(\n `${soFarThisHour.length} PRs have been created so far in this hour.`,\n );\n return soFarThisHour.length;\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n }\n logger.error({ err }, 'Error checking PRs created per hour');\n return 0;\n }\n });\n}\n\nexport async function getConcurrentPrsCount(\n config: RenovateConfig,\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getConcurrentPrsCount', async () => {\n let openPrCount = 0;\n for (const { branchName } of branches) {\n try {\n const pr = await platform.getBranchPr(branchName, config.baseBranch);\n if (\n pr &&\n pr.sourceBranch !== getInheritedOrGlobal('onboardingBranch') &&\n pr.state === 'open'\n ) {\n openPrCount++;\n }\n } catch (err) {\n // istanbul ignore if\n if (err instanceof ExternalHostError) {\n throw err;\n } else {\n // no-op\n }\n }\n }\n\n logger.debug(`${openPrCount} PRs are currently open`);\n return openPrCount;\n });\n}\n\nexport async function getCommitsHourlyCount(\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getCommitsHourlyCount', async () => {\n try {\n const currentHourStart = DateTime.utc().startOf('hour');\n logger.debug(\n `Calculating commits so far in this hour currentHourStart=${String(currentHourStart)}, for ${branches.length} branches`,\n );\n\n const cache = getCache();\n const cachedBranches = cache.branches ?? [];\n\n let soFarThisHour = 0;\n for (const branch of branches) {\n // First try to get from cache\n const branchCache = cachedBranches.find(\n (b) => b.branchName === branch.branchName,\n );\n\n if (branchCache?.commitTimestamp) {\n const commitTime = DateTime.fromISO(\n branchCache.commitTimestamp,\n ).toUTC();\n if (commitTime > currentHourStart) {\n soFarThisHour++;\n }\n } else {\n // Fallback to SCM if not in cache (shouldn't happen often after initial run)\n const updateDate = await scm.getBranchUpdateDate(branch.branchName);\n if (updateDate && updateDate > currentHourStart) {\n soFarThisHour++;\n }\n }\n }\n logger.debug(`${soFarThisHour} commits so far in this hour.`);\n return soFarThisHour;\n } catch (err) {\n logger.error({ err }, 'Error checking commits per hour');\n return 0;\n }\n });\n}\n\nexport async function getConcurrentBranchesCount(\n branches: BranchConfig[],\n): Promise<number> {\n return await instrument('getConcurrentBranchesCount', async () => {\n let existingBranchCount = 0;\n for (const branch of branches) {\n if (await scm.branchExists(branch.branchName)) {\n existingBranchCount++;\n }\n }\n\n logger.debug(`${existingBranchCount} already existing branches found.`);\n return existingBranchCount;\n });\n}\n"],"mappings":";;;;;;;;;AAWA,eAAsB,iBACpB,QACiB;CACjB,OAAO,MAAM,WAAW,oBAAoB,YAAY;EACtD,IAAI;GACF,MAAM,SAAS,MAAM,SAAS,UAAU;GACxC,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,QAAQ,MAAM;GACtD,OAAO,MACL,gEAAgE,OAAO,gBAAgB,GACzF;GACA,MAAM,gBAAgB,OAAO,QAC1B,OACC,GAAG,iBAAiB,qBAAqB,kBAAkB,KAC3D,GAAG,aAAa,WAAW,OAAO,YAAa,KAC/C,SAAS,QAAQ,GAAG,SAAU,CAAC,CAAC,MAAM,IAAI,gBAC9C;GACA,OAAO,MACL,GAAG,cAAc,OAAO,4CAC1B;GACA,OAAO,cAAc;EACvB,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;GAER,OAAO,MAAM,EAAE,IAAI,GAAG,qCAAqC;GAC3D,OAAO;EACT;CACF,CAAC;AACH;AAEA,eAAsB,sBACpB,QACA,UACiB;CACjB,OAAO,MAAM,WAAW,yBAAyB,YAAY;EAC3D,IAAI,cAAc;EAClB,KAAK,MAAM,EAAE,gBAAgB,UAC3B,IAAI;GACF,MAAM,KAAK,MAAM,SAAS,YAAY,YAAY,OAAO,UAAU;GACnE,IACE,MACA,GAAG,iBAAiB,qBAAqB,kBAAkB,KAC3D,GAAG,UAAU,QAEb;EAEJ,SAAS,KAAK;;GAEZ,IAAI,eAAe,mBACjB,MAAM;EAIV;EAGF,OAAO,MAAM,GAAG,YAAY,wBAAwB;EACpD,OAAO;CACT,CAAC;AACH;AAEA,eAAsB,sBACpB,UACiB;CACjB,OAAO,MAAM,WAAW,yBAAyB,YAAY;EAC3D,IAAI;GACF,MAAM,mBAAmB,SAAS,IAAI,CAAC,CAAC,QAAQ,MAAM;GACtD,OAAO,MACL,4DAA4D,OAAO,gBAAgB,EAAE,QAAQ,SAAS,OAAO,UAC/G;GAGA,MAAM,iBADQ,SACa,CAAC,CAAC,YAAY,CAAC;GAE1C,IAAI,gBAAgB;GACpB,KAAK,MAAM,UAAU,UAAU;IAE7B,MAAM,cAAc,eAAe,MAChC,MAAM,EAAE,eAAe,OAAO,UACjC;IAEA,IAAI,aAAa;SACI,SAAS,QAC1B,YAAY,eACd,CAAC,CAAC,MACW,IAAI,kBACf;IAAA,OAEG;KAEL,MAAM,aAAa,MAAM,IAAI,oBAAoB,OAAO,UAAU;KAClE,IAAI,cAAc,aAAa,kBAC7B;IAEJ;GACF;GACA,OAAO,MAAM,GAAG,cAAc,8BAA8B;GAC5D,OAAO;EACT,SAAS,KAAK;GACZ,OAAO,MAAM,EAAE,IAAI,GAAG,iCAAiC;GACvD,OAAO;EACT;CACF,CAAC;AACH;AAEA,eAAsB,2BACpB,UACiB;CACjB,OAAO,MAAM,WAAW,8BAA8B,YAAY;EAChE,IAAI,sBAAsB;EAC1B,KAAK,MAAM,UAAU,UACnB,IAAI,MAAM,IAAI,aAAa,OAAO,UAAU,GAC1C;EAIJ,OAAO,MAAM,GAAG,oBAAoB,kCAAkC;EACtE,OAAO;CACT,CAAC;AACH"}
|
|
@@ -250,6 +250,7 @@ async function ensurePr(prConfig) {
|
|
|
250
250
|
oldPrTitle: existingPr.title,
|
|
251
251
|
newPrTitle: prTitle
|
|
252
252
|
}, "PR title changed");
|
|
253
|
+
else if (config.autoApprove) logger.debug({ prTitle }, "PR approval required");
|
|
253
254
|
else if (!config.committedFiles && !config.rebaseRequested) logger.debug({ prTitle }, "PR body changed");
|
|
254
255
|
if (GlobalConfig.get("dryRun")) {
|
|
255
256
|
logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isNumber } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const usePlatformAutomerge = Boolean(\n config.automerge &&\n (config.automergeType === 'pr' || config.automergeType === 'branch') &&\n config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeCommitMessage: config.commitMessage,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n currentReleaseHasAttestation: boolean | undefined,\n): void {\n const { packageName, depName, currentVersion, newVersion } = upgrade;\n const name = packageName ?? depName;\n\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n newRelease &&\n currentReleaseHasAttestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :stop_sign: **Caution**',\n '>',\n `> ${name} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.`,\n `> Verify that release ${newVersion} was published by the expected author.`,\n '\\n',\n ].join('\\n'),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n hasAttestation: currentReleaseHasAttestation,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n // skip cache when autoApprove is set, since new commits may have\n // reset platform approvals (e.g. GitLab's \"Remove all approvals\" setting)\n if (validatePrCache(prCache, prBodyFingerprint) && !config.autoApprove) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardCheck === 'approvePr') {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n dependencyDashboardCheck !== 'approvePr'\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n if (\n !dependencyDashboardCheck &&\n ((config.stabilityStatus && config.stabilityStatus !== 'yellow') ||\n (isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours))\n ) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n // fetch changelogs for matching upgrades.\n await embedChangelogs({\n upgrades: upgrades,\n stage: 'pr',\n });\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (typeof logJSON.error === 'undefined') {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n ) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :exclamation: **Important**',\n '> ',\n '> Release Notes retrieval for this PR were skipped because no github.com credentials were available. ',\n '> If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).',\n '\\n',\n ].join('\\n'),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(\n upgrade,\n currentReleaseHasAttestation,\n );\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n prepareLabels(config), // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n const configuredLabels = prepareLabels(config);\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate &&\n !config.autoApprove\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n }\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { labels: prepareLabels(config) },\n `DRY-RUN: Would create PR: ${prTitle}`,\n );\n pr = { number: 0 } as never;\n } else {\n try {\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig) &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: prepareLabels(config),\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue('ConcurrentPRs');\n incCountValue('HourlyPRs');\n logger.info(\n { pr: pr?.number, prTitle, labels: pr?.labels },\n 'PR created',\n );\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (\n err.body?.message === 'Validation failed' &&\n err.body.errors?.length &&\n err.body.errors.some((error: { message?: string }) =>\n error.message?.startsWith('A pull request already exists'),\n )\n ) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (err.statusCode === 502) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n // oxlint-disable-next-line typescript/prefer-optional-chain -- instanceof is not a null guard\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/index.ts"],"sourcesContent":["import { isArray, isNonEmptyArray, isNumber } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport {\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n} from '../../../../constants/error-messages.ts';\nimport { pkg } from '../../../../expose.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { ensureComment } from '../../../../modules/platform/comment.ts';\nimport type {\n PlatformPrOptions,\n Pr,\n PrDebugData,\n UpdatePrConfig,\n} from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport {\n getPrBodyStruct,\n hashBody,\n} from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedHours } from '../../../../util/date.ts';\nimport { stripEmojis } from '../../../../util/emoji.ts';\nimport { fingerprint } from '../../../../util/fingerprint.ts';\nimport { getBranchLastCommitTime } from '../../../../util/git/index.ts';\nimport { memoize } from '../../../../util/memoize.ts';\nimport { incCountValue, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchUpgradeConfig,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\nimport { getPrBody } from './body/index.ts';\nimport {\n getChangedLabels,\n prepareLabels,\n shouldUpdateLabels,\n} from './labels.ts';\nimport { addParticipants } from './participants.ts';\nimport { getPrCache, setPrCache } from './pr-cache.ts';\nimport {\n generatePrBodyFingerprintConfig,\n validatePrCache,\n} from './pr-fingerprint.ts';\nimport { tryReuseAutoclosedPr } from './pr-reuse.ts';\n\nexport function getPlatformPrOptions(\n config: RenovateConfig & PlatformPrOptions,\n): PlatformPrOptions {\n const usePlatformAutomerge = Boolean(\n config.automerge &&\n (config.automergeType === 'pr' || config.automergeType === 'branch') &&\n config.platformAutomerge,\n );\n\n return {\n autoApprove: !!config.autoApprove,\n automergeCommitMessage: config.commitMessage,\n automergeStrategy: config.automergeStrategy,\n azureWorkItemId: config.azureWorkItemId ?? 0,\n bbAutoResolvePrTasks: !!config.bbAutoResolvePrTasks,\n bbUseDefaultReviewers: !!config.bbUseDefaultReviewers,\n gitLabIgnoreApprovals: !!config.gitLabIgnoreApprovals,\n forkModeDisallowMaintainerEdits: !!config.forkModeDisallowMaintainerEdits,\n usePlatformAutomerge,\n };\n}\n\nexport interface ResultWithPr {\n type: 'with-pr';\n pr: Pr;\n}\n\nexport interface ResultWithoutPr {\n type: 'without-pr';\n prBlockedBy: PrBlockedBy;\n}\n\nexport type EnsurePrResult = ResultWithPr | ResultWithoutPr;\n\nexport function updatePrDebugData(\n targetBranch: string,\n labels: string[],\n debugData: PrDebugData | undefined,\n): PrDebugData {\n const createdByRenovateVersion = debugData?.createdInVer ?? pkg.version;\n const updatedByRenovateVersion = pkg.version;\n\n const updatedPrDebugData: PrDebugData = {\n createdInVer: createdByRenovateVersion,\n updatedInVer: updatedByRenovateVersion,\n targetBranch,\n };\n\n // Add labels to the debug data object.\n // When to add:\n // 1. Add it when a new PR is created, i.e., when debugData is undefined.\n // 2. Add it if an existing PR already has labels in the debug data, confirming that we can update its labels.\n if (!debugData || isArray(debugData.labels)) {\n updatedPrDebugData.labels = labels;\n }\n\n return updatedPrDebugData;\n}\n\nfunction hasNotIgnoredReviewers(pr: Pr, config: BranchConfig): boolean {\n if (\n isNonEmptyArray(config.ignoreReviewers) &&\n isNonEmptyArray(pr.reviewers)\n ) {\n const ignoreReviewers = new Set(config.ignoreReviewers);\n return (\n pr.reviewers.filter((reviewer) => !ignoreReviewers.has(reviewer)).length >\n 0\n );\n }\n return isNonEmptyArray(pr.reviewers);\n}\n\nfunction addPullRequestNoteIfAttestationHasBeenLost(\n upgrade: BranchUpgradeConfig,\n currentReleaseHasAttestation: boolean | undefined,\n): void {\n const { packageName, depName, currentVersion, newVersion } = upgrade;\n const name = packageName ?? depName;\n\n const newRelease = upgrade.releases?.find(\n (release) => release.version === newVersion,\n );\n\n if (\n newRelease &&\n currentReleaseHasAttestation === true &&\n newRelease.attestation !== true\n ) {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :stop_sign: **Caution**',\n '>',\n `> ${name} ${currentVersion} was released with an attestation, but ${newVersion} has no attestation.`,\n `> Verify that release ${newVersion} was published by the expected author.`,\n '\\n',\n ].join('\\n'),\n );\n }\n}\n\n// Ensures that PR exists with matching title/body\nexport async function ensurePr(\n prConfig: BranchConfig,\n): Promise<EnsurePrResult> {\n const config: BranchConfig = { ...prConfig };\n const filteredPrConfig = generatePrBodyFingerprintConfig(config);\n const prBodyFingerprint = fingerprint(filteredPrConfig);\n logger.trace({ config }, 'ensurePr');\n // If there is a group, it will use the config of the first upgrade in the array\n const {\n branchName,\n ignoreTests,\n internalChecksAsSuccess,\n prTitle = '',\n upgrades,\n hasAttestation: currentReleaseHasAttestation,\n } = config;\n const getBranchStatus = memoize(() =>\n resolveBranchStatus(branchName, !!internalChecksAsSuccess, ignoreTests),\n );\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n // Check if PR already exists\n const existingPr =\n (await platform.getBranchPr(branchName, config.baseBranch)) ??\n (await tryReuseAutoclosedPr(branchName, prTitle));\n const prCache = getPrCache(branchName);\n if (existingPr) {\n logger.debug('Found existing PR');\n if (existingPr.bodyStruct?.rebaseRequested) {\n logger.debug('PR rebase requested, so skipping cache check');\n } else if (prCache) {\n logger.trace({ prCache }, 'Found existing PR cache');\n // return if pr cache is valid and pr was not changed in the past 24hrs\n // skip cache when autoApprove is set, since new commits may have\n // reset platform approvals (e.g. GitLab's \"Remove all approvals\" setting)\n if (validatePrCache(prCache, prBodyFingerprint) && !config.autoApprove) {\n return { type: 'with-pr', pr: existingPr };\n }\n } else if (config.repositoryCache === 'enabled') {\n logger.debug('PR cache not found');\n }\n }\n config.upgrades = [];\n\n if (config.artifactErrors?.length) {\n logger.debug('Forcing PR because of artifact errors');\n config.forcePr = true;\n }\n\n if (dependencyDashboardCheck === 'approvePr') {\n logger.debug('Forcing PR because of dependency dashboard approval');\n config.forcePr = true;\n }\n\n if (!existingPr) {\n // Only create a PR if a branch automerge has failed\n if (\n config.automerge === true &&\n config.automergeType?.startsWith('branch') &&\n !config.forcePr\n ) {\n logger.debug(`Branch automerge is enabled`);\n if (\n config.stabilityStatus !== 'yellow' &&\n (await getBranchStatus()) === 'yellow' &&\n isNumber(config.prNotPendingHours)\n ) {\n logger.debug('Checking how long this branch has been pending');\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n if (getElapsedHours(lastCommitTime) >= config.prNotPendingHours) {\n logger.debug(\n `Branch exceeds prNotPending=${config.prNotPendingHours}, hours - forcing PR creation`,\n );\n config.forcePr = true;\n }\n }\n if (config.forcePr || (await getBranchStatus()) === 'red') {\n logger.debug(`Branch tests failed, so will create PR`);\n } else {\n // Branch should be automerged, so we don't want to create a PR\n return { type: 'without-pr', prBlockedBy: 'BranchAutomerge' };\n }\n }\n if (config.prCreation === 'status-success') {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) !== 'green') {\n logger.debug(`Branch status isn't green - not creating PR`);\n return { type: 'without-pr', prBlockedBy: 'AwaitingTests' };\n }\n logger.debug('Branch status success');\n } else if (\n config.prCreation === 'approval' &&\n dependencyDashboardCheck !== 'approvePr'\n ) {\n return { type: 'without-pr', prBlockedBy: 'NeedsApproval' };\n } else if (config.prCreation === 'not-pending' && !config.forcePr) {\n logger.debug('Checking branch combined status');\n if ((await getBranchStatus()) === 'yellow') {\n logger.debug(`Branch status is yellow - checking timeout`);\n const lastCommitTime = await getBranchLastCommitTime(branchName);\n const elapsedHours = getElapsedHours(lastCommitTime);\n if (\n !dependencyDashboardCheck &&\n ((config.stabilityStatus && config.stabilityStatus !== 'yellow') ||\n (isNumber(config.prNotPendingHours) &&\n elapsedHours < config.prNotPendingHours))\n ) {\n logger.debug(\n `Branch is ${elapsedHours} hours old - skipping PR creation as prNotPendingHours is set to ${config.prNotPendingHours}`,\n );\n return {\n type: 'without-pr',\n prBlockedBy: 'AwaitingTests',\n };\n }\n const prNotPendingHours = String(config.prNotPendingHours);\n logger.debug(\n `prNotPendingHours=${prNotPendingHours} threshold hit - creating PR`,\n );\n }\n logger.debug('Branch status success');\n }\n }\n\n const processedUpgrades: string[] = [];\n const commitRepos: string[] = [];\n\n function getRepoNameWithSourceDirectory(\n upgrade: BranchUpgradeConfig,\n ): string {\n // TODO: types (#22198)\n return `${upgrade.repoName!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n }\n\n // fetch changelogs for matching upgrades.\n await embedChangelogs({\n upgrades: upgrades,\n stage: 'pr',\n });\n\n // Get changelog and then generate template strings\n for (const upgrade of upgrades) {\n // TODO: types (#22198)\n const upgradeKey = `${upgrade.depType!}-${upgrade.depName!}-${upgrade.manager}-${upgrade.currentVersion ?? ''}-${upgrade.currentValue ?? ''}-${upgrade.newVersion ?? ''}-${upgrade.newValue ?? ''}`;\n if (processedUpgrades.includes(upgradeKey)) {\n continue;\n }\n processedUpgrades.push(upgradeKey);\n\n const logJSON = upgrade.logJSON;\n\n if (logJSON) {\n if (typeof logJSON.error === 'undefined') {\n if (logJSON.project) {\n upgrade.repoName = logJSON.project.repository;\n }\n upgrade.hasReleaseNotes = false;\n upgrade.releases = [];\n if (\n logJSON.hasReleaseNotes &&\n upgrade.repoName &&\n !commitRepos.includes(getRepoNameWithSourceDirectory(upgrade))\n ) {\n commitRepos.push(getRepoNameWithSourceDirectory(upgrade));\n upgrade.hasReleaseNotes = logJSON.hasReleaseNotes;\n if (logJSON.versions) {\n for (const version of logJSON.versions) {\n const release = { ...version };\n upgrade.releases.push(release);\n }\n }\n }\n } else if (logJSON.error === 'MissingGithubToken') {\n upgrade.prBodyNotes ??= [];\n upgrade.prBodyNotes.push(\n [\n '> :exclamation: **Important**',\n '> ',\n '> Release Notes retrieval for this PR were skipped because no github.com credentials were available. ',\n '> If you are self-hosted, please see [this instruction](https://github.com/renovatebot/renovate/blob/master/docs/usage/examples/self-hosting.md#githubcom-token-for-release-notes).',\n '\\n',\n ].join('\\n'),\n );\n }\n }\n\n addPullRequestNoteIfAttestationHasBeenLost(\n upgrade,\n currentReleaseHasAttestation,\n );\n\n config.upgrades.push(upgrade);\n }\n\n config.hasReleaseNotes = config.upgrades.some((upg) => upg.hasReleaseNotes);\n\n const releaseNotesSources: string[] = [];\n for (const upgrade of config.upgrades) {\n let notesSourceUrl = upgrade.releases?.[0]?.releaseNotes?.notesSourceUrl;\n // TODO: types (#22198)\n notesSourceUrl ??= `${upgrade.sourceUrl!}${\n upgrade.sourceDirectory ? `:${upgrade.sourceDirectory}` : ''\n }`;\n\n if (upgrade.hasReleaseNotes && notesSourceUrl) {\n if (releaseNotesSources.includes(notesSourceUrl)) {\n logger.debug(\n { depName: upgrade.depName },\n 'Removing duplicate release notes',\n );\n upgrade.hasReleaseNotes = false;\n } else {\n releaseNotesSources.push(notesSourceUrl);\n }\n }\n }\n\n const prBody = getPrBody(\n config,\n {\n debugData: updatePrDebugData(\n config.baseBranch,\n prepareLabels(config), // include labels in debug data\n existingPr?.bodyStruct?.debugData,\n ),\n },\n config,\n );\n\n try {\n if (existingPr) {\n logger.debug('Processing existing PR');\n\n if (\n !existingPr.hasAssignees &&\n !hasNotIgnoredReviewers(existingPr, config) &&\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) === 'red'\n ) {\n logger.debug(`Setting assignees and reviewers as status checks failed`);\n await addParticipants(config, existingPr);\n }\n // Check if existing PR needs updating\n const existingPrTitle = stripEmojis(existingPr.title);\n const existingPrBodyHash = existingPr.bodyStruct?.hash;\n const newPrTitle = stripEmojis(prTitle);\n const newPrBodyHash = hashBody(prBody);\n\n const prInitialLabels = existingPr.bodyStruct?.debugData?.labels;\n const prCurrentLabels = existingPr.labels;\n const configuredLabels = prepareLabels(config);\n\n const labelsNeedUpdate = shouldUpdateLabels(\n prInitialLabels,\n prCurrentLabels,\n configuredLabels,\n );\n\n if (\n existingPr?.targetBranch === config.baseBranch &&\n existingPrTitle === newPrTitle &&\n existingPrBodyHash === newPrBodyHash &&\n !labelsNeedUpdate &&\n !config.autoApprove\n ) {\n // adds or-cache for existing PRs\n setPrCache(branchName, prBodyFingerprint, false);\n logger.debug(\n `Pull Request #${existingPr.number} does not need updating`,\n );\n return { type: 'with-pr', pr: existingPr };\n }\n\n const updatePrConfig: UpdatePrConfig = {\n number: existingPr.number,\n prTitle,\n prBody,\n platformPrOptions: getPlatformPrOptions(config),\n };\n // PR must need updating\n if (existingPr?.targetBranch !== config.baseBranch) {\n logger.debug(\n {\n branchName,\n oldBaseBranch: existingPr?.targetBranch,\n newBaseBranch: config.baseBranch,\n },\n 'PR base branch has changed',\n );\n updatePrConfig.targetBranch = config.baseBranch;\n }\n\n if (labelsNeedUpdate) {\n logger.debug(\n {\n branchName,\n prCurrentLabels,\n configuredLabels,\n },\n 'PR labels have changed',\n );\n\n // Divide labels into three categories:\n // i) addLabels: Labels that need to be added\n // ii) removeLabels: Labels that need to be removed\n // iii) labels: New labels for the PR, replacing the old labels array entirely.\n // This distinction is necessary because different platforms update labels differently\n // For more details, refer to the updatePr function of each platform.\n\n const [addLabels, removeLabels] = getChangedLabels(\n prCurrentLabels,\n configuredLabels,\n );\n\n // for Gitea\n updatePrConfig.labels = configuredLabels;\n\n // for GitHub, GitLab\n updatePrConfig.addLabels = addLabels;\n updatePrConfig.removeLabels = removeLabels;\n }\n if (existingPrTitle !== newPrTitle) {\n logger.debug(\n {\n branchName,\n oldPrTitle: existingPr.title,\n newPrTitle: prTitle,\n },\n 'PR title changed',\n );\n } else if (config.autoApprove) {\n logger.debug({ prTitle }, 'PR approval required');\n } else if (!config.committedFiles && !config.rebaseRequested) {\n logger.debug(\n {\n prTitle,\n },\n 'PR body changed',\n );\n }\n\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would update PR #${existingPr.number}`);\n return { type: 'with-pr', pr: existingPr };\n }\n await platform.updatePr(updatePrConfig);\n logger.info({ pr: existingPr.number, prTitle }, `PR updated`);\n setPrCache(branchName, prBodyFingerprint, true);\n\n return {\n type: 'with-pr',\n pr: {\n ...existingPr,\n bodyStruct: getPrBodyStruct(prBody),\n title: prTitle,\n targetBranch: config.baseBranch,\n },\n };\n }\n logger.debug({ branch: branchName, prTitle }, `Creating PR`);\n if (config.updateType === 'rollback') {\n logger.info('Creating Rollback PR');\n }\n let pr: Pr | null;\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n { labels: prepareLabels(config) },\n `DRY-RUN: Would create PR: ${prTitle}`,\n );\n pr = { number: 0 } as never;\n } else {\n try {\n if (\n !dependencyDashboardCheck &&\n isLimitReached('ConcurrentPRs', prConfig) &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Skipping PR - limit reached');\n return { type: 'without-pr', prBlockedBy: 'RateLimited' };\n }\n pr = await platform.createPr({\n sourceBranch: branchName,\n targetBranch: config.baseBranch,\n prTitle,\n prBody,\n labels: prepareLabels(config),\n platformPrOptions: getPlatformPrOptions(config),\n draftPR: !!config.draftPR,\n milestone: config.milestone,\n });\n\n incCountValue('ConcurrentPRs');\n incCountValue('HourlyPRs');\n logger.info(\n { pr: pr?.number, prTitle, labels: pr?.labels },\n 'PR created',\n );\n } catch (err) {\n logger.debug({ err }, 'Pull request creation error');\n if (\n err.body?.message === 'Validation failed' &&\n err.body.errors?.length &&\n err.body.errors.some((error: { message?: string }) =>\n error.message?.startsWith('A pull request already exists'),\n )\n ) {\n logger.warn('A pull requests already exists');\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n if (err.statusCode === 502) {\n logger.warn(\n { branch: branchName },\n 'Deleting branch due to server error',\n );\n await scm.deleteBranch(branchName);\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n }\n }\n if (\n pr &&\n config.branchAutomergeFailureMessage &&\n !config.suppressNotifications?.includes('branchAutomergeFailure')\n ) {\n const topic = 'Branch automerge failure';\n let content =\n 'This PR was configured for branch automerge. However, this is not possible, so it has been raised as a PR instead.';\n if (config.branchAutomergeFailureMessage === 'branch status error') {\n content += '\\n___\\n * Branch has one or more failed status checks';\n }\n content = platform.massageMarkdown(content, config.rebaseLabel);\n logger.debug('Adding branch automerge failure message to PR');\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would add comment to PR #${pr.number}`);\n } else {\n await ensureComment({\n number: pr.number,\n topic,\n content,\n });\n }\n }\n // Skip assign and review if automerging PR\n if (pr) {\n if (\n config.automerge &&\n !config.assignAutomerge &&\n (await getBranchStatus()) !== 'red'\n ) {\n logger.debug(\n `Skipping assignees and reviewers as automerge=${config.automerge}`,\n );\n } else {\n await addParticipants(config, pr);\n }\n setPrCache(branchName, prBodyFingerprint, true);\n logger.debug(`Created Pull Request #${pr.number}`);\n return { type: 'with-pr', pr };\n }\n } catch (err) {\n if (\n // oxlint-disable-next-line typescript/prefer-optional-chain -- instanceof is not a null guard\n err instanceof ExternalHostError ||\n err.message === REPOSITORY_CHANGED ||\n err.message === PLATFORM_RATE_LIMIT_EXCEEDED ||\n err.message === PLATFORM_INTEGRATION_UNAUTHORIZED\n ) {\n logger.debug('Passing error up');\n throw err;\n }\n logger.warn({ err, prTitle }, 'Failed to ensure PR');\n }\n if (existingPr) {\n return { type: 'with-pr', pr: existingPr };\n }\n return { type: 'without-pr', prBlockedBy: 'Error' };\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "renovate",
|
|
3
3
|
"description": "Automated dependency updates. Flexible so you don't need to be.",
|
|
4
|
-
"version": "43.263.
|
|
4
|
+
"version": "43.263.4",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
7
7
|
"renovate": "dist/renovate.js",
|
|
@@ -269,7 +269,7 @@
|
|
|
269
269
|
"lint-staged": "17.0.8",
|
|
270
270
|
"markdownlint-cli2": "0.23.0",
|
|
271
271
|
"markdownlint-cli2-formatter-template": "0.0.4",
|
|
272
|
-
"memfs": "4.
|
|
272
|
+
"memfs": "4.62.0",
|
|
273
273
|
"nock": "14.0.16",
|
|
274
274
|
"npm-run-all2": "8.0.4",
|
|
275
275
|
"nyc": "18.0.0",
|
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 43.263.
|
|
3
|
+
"title": "JSON schema for Renovate 43.263.4 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "43.263.
|
|
5
|
+
"x-renovate-version": "43.263.4",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|