renovate 44.35.5 → 44.36.0
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.
|
@@ -3,6 +3,7 @@ import { GlobalConfig } from "../../../../config/global.js";
|
|
|
3
3
|
import { logger } from "../../../../logger/index.js";
|
|
4
4
|
import { UpdateTypesOptions } from "../../../../config/types.js";
|
|
5
5
|
import { coerceNumber } from "../../../../util/number.js";
|
|
6
|
+
import { calcLimit } from "../../../global/limits.js";
|
|
6
7
|
import { emojify } from "../../../../util/emoji.js";
|
|
7
8
|
//#region lib/workers/repository/onboarding/pr/pr-list.ts
|
|
8
9
|
/** Priority order when rendering the `SummaryCategory`s in the summary view.
|
|
@@ -10,13 +11,43 @@ import { emojify } from "../../../../util/emoji.js";
|
|
|
10
11
|
* NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.
|
|
11
12
|
*/
|
|
12
13
|
const SUMMARY_CATEGORY_PRIORITY_ORDER = ["security", ...UpdateTypesOptions];
|
|
14
|
+
/**
|
|
15
|
+
* Resolves the concurrent limit that governs how many of the expected Pull Requests can be open at once,
|
|
16
|
+
* reusing the same `calcLimit()` used to enforce these limits (see `lib/workers/global/limits.ts`).
|
|
17
|
+
*
|
|
18
|
+
* `branchConcurrentLimit` only takes priority when it's been explicitly configured (it's `null` by default,
|
|
19
|
+
* in which case `calcLimit()` silently inherits the value of `prConcurrentLimit`) and is actually more
|
|
20
|
+
* restrictive - otherwise we'd misattribute the limit to a setting the user never touched.
|
|
21
|
+
*/
|
|
22
|
+
function resolveConcurrentLimit(config) {
|
|
23
|
+
const configAsUpgrade = {
|
|
24
|
+
branchName: "",
|
|
25
|
+
manager: "",
|
|
26
|
+
prConcurrentLimit: config.prConcurrentLimit,
|
|
27
|
+
branchConcurrentLimit: config.branchConcurrentLimit
|
|
28
|
+
};
|
|
29
|
+
const prConcurrentLimit = calcLimit([configAsUpgrade], "prConcurrentLimit");
|
|
30
|
+
const branchConcurrentLimit = calcLimit([configAsUpgrade], "branchConcurrentLimit");
|
|
31
|
+
if (typeof config.branchConcurrentLimit === "number" && branchConcurrentLimit > 0 && (prConcurrentLimit === 0 || branchConcurrentLimit < prConcurrentLimit)) return {
|
|
32
|
+
limit: branchConcurrentLimit,
|
|
33
|
+
key: "branchConcurrentLimit"
|
|
34
|
+
};
|
|
35
|
+
return {
|
|
36
|
+
limit: prConcurrentLimit,
|
|
37
|
+
key: "prConcurrentLimit"
|
|
38
|
+
};
|
|
39
|
+
}
|
|
13
40
|
function getExpectedPrList(config, branches) {
|
|
14
41
|
logger.debug("getExpectedPrList()");
|
|
15
42
|
logger.trace({ config });
|
|
16
43
|
let prDesc = `\n### What to Expect\n\n`;
|
|
17
44
|
if (!branches.length) return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\n`;
|
|
18
|
-
|
|
19
|
-
|
|
45
|
+
const { limit: concurrentLimit, key: concurrentLimitKey } = resolveConcurrentLimit(config);
|
|
46
|
+
if (concurrentLimit > 0 && concurrentLimit < branches.length) prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? "s" : ""}, up to a maximum of ${branches.length} over time (see [docs for \`${concurrentLimitKey}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimitKey.toLowerCase()})):\n\n`;
|
|
47
|
+
else {
|
|
48
|
+
prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;
|
|
49
|
+
prDesc += branches.length > 1 ? `s:\n\n` : `:\n\n`;
|
|
50
|
+
}
|
|
20
51
|
for (const branch of branches) {
|
|
21
52
|
const prTitleRe = regEx(/@([a-z]+\/[a-z]+)/);
|
|
22
53
|
prDesc += `<details>\n<summary>${branch.prTitle.replace(prTitleRe, "@​$1")}</summary>\n\n`;
|
|
@@ -158,6 +189,7 @@ function getExpectedPrListSummary(config, branches) {
|
|
|
158
189
|
const hasMultipleBaseBranches = sortedBases.length > 1;
|
|
159
190
|
const prHourlyLimit = coerceNumber(config.prHourlyLimit);
|
|
160
191
|
const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);
|
|
192
|
+
const concurrentLimit = resolveConcurrentLimit(config);
|
|
161
193
|
if (hasMultipleBaseBranches) {
|
|
162
194
|
let total = 0;
|
|
163
195
|
const parts = sortedBases.map((base) => {
|
|
@@ -166,11 +198,11 @@ function getExpectedPrListSummary(config, branches) {
|
|
|
166
198
|
const label = base ? `the \`${base}\` branch` : "the default branch";
|
|
167
199
|
return `${count} Pull Request${count > 1 ? "s" : ""} to ${label}`;
|
|
168
200
|
});
|
|
169
|
-
const
|
|
170
|
-
prDesc += `With your current configuration, Renovate will create ${parts.join(" and ")}${
|
|
201
|
+
const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, total);
|
|
202
|
+
prDesc += `With your current configuration, Renovate will create ${parts.join(" and ")}${limitsNotice}:\n\n`;
|
|
171
203
|
} else {
|
|
172
|
-
const
|
|
173
|
-
prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? "s" : ""}${
|
|
204
|
+
const limitsNotice = determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, stats.prCount);
|
|
205
|
+
prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? "s" : ""}${limitsNotice}:\n\n`;
|
|
174
206
|
}
|
|
175
207
|
const categoryColumns = getCategoryColumns(stats.presentCategories);
|
|
176
208
|
if (hasMultipleBaseBranches) {
|
|
@@ -194,14 +226,21 @@ function getExpectedPrListSummary(config, branches) {
|
|
|
194
226
|
prDesc += `\n**Security updates**:\n\n`;
|
|
195
227
|
for (const groupBranches of Object.values(stats.securityGroups)) prDesc += describeSecurityGroup(groupBranches);
|
|
196
228
|
}
|
|
229
|
+
if (concurrentLimit.limit > 0 && concurrentLimit.limit < stats.prCount) {
|
|
230
|
+
const notice = concurrentLimit.key === "branchConcurrentLimit" ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? "es" : ""} at a time, so not all Pull Requests will be opened straight away` : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? "s" : ""} open at a time, so not all of the above will be opened straight away`;
|
|
231
|
+
prDesc += emojify(`\n\n:children_crossing: ${notice}. See [docs for \`${concurrentLimit.key}\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.\n\n`);
|
|
232
|
+
}
|
|
197
233
|
if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < stats.prCount) prDesc += emojify(`\n\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`commitHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#commithourlylimit) for details.\n\n`);
|
|
198
234
|
else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < stats.prCount) prDesc += emojify(`\n\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \`prHourlyLimit\`](${GlobalConfig.get("productLinks").documentation}configuration-options/#prhourlylimit) for details.\n\n`);
|
|
199
235
|
return prDesc;
|
|
200
236
|
}
|
|
201
|
-
function
|
|
237
|
+
function determineLimitsNotice(concurrentLimit, prHourlyLimit, commitHourlyLimit, prCount) {
|
|
238
|
+
const clauses = [];
|
|
239
|
+
if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) clauses.push(concurrentLimit.key === "branchConcurrentLimit" ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? "es" : ""} open at a time` : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? "s" : ""} open at a time`);
|
|
240
|
+
if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < prCount) clauses.push(`a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? "s" : ""}/rebase${commitHourlyLimit > 1 ? "s" : ""} per hour`);
|
|
241
|
+
else if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < prCount) clauses.push(`a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? "s" : ""} per hour`);
|
|
242
|
+
if (clauses.length) return emojify(` (at ${clauses.join(" and ")})`);
|
|
202
243
|
if (commitHourlyLimit === 0 && prHourlyLimit === 0) return " (with no configured maximum of PRs per hour)";
|
|
203
|
-
if (commitHourlyLimit > 0 && commitHourlyLimit < 5 && commitHourlyLimit < prCount) return emojify(` (at a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? "s" : ""}/rebase${commitHourlyLimit > 1 ? "s" : ""} per hour)`);
|
|
204
|
-
if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < prCount) return emojify(` (at a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? "s" : ""} per hour)`);
|
|
205
244
|
return "";
|
|
206
245
|
}
|
|
207
246
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pr-list.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/pr/pr-list.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type RenovateConfig,\n type UpdateType,\n UpdateTypesOptions,\n} from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport type { BranchConfig } from '../../../types.ts';\n\n/**\n * The different categories of dependency updates to output, when providing the summary view.\n *\n * - `security`: if the upgrade is driven by a vulnerability alert\n * - `${updateType}`: if it's set. I.e. `major`\n * - `lockfileUpdate` when `isLockfileUpdate` is true, without an `updateType`\n * - `other`: otherwise\n */\ntype SummaryCategory = UpdateType | 'security' | 'other';\n\n/** Priority order when rendering the `SummaryCategory`s in the summary view.\n *\n * NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.\n */\nconst SUMMARY_CATEGORY_PRIORITY_ORDER: readonly SummaryCategory[] = [\n 'security',\n ...UpdateTypesOptions,\n // ... anything else\n];\n\nexport function getExpectedPrList(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrList()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;\n prDesc += branches.length > 1 ? `s:\\n\\n` : `:\\n\\n`;\n\n for (const branch of branches) {\n const prTitleRe = regEx(/@([a-z]+\\/[a-z]+)/);\n // TODO #22198\n prDesc += `<details>\\n<summary>${branch.prTitle!.replace(\n prTitleRe,\n '@​$1',\n )}</summary>\\n\\n`;\n if (branch.schedule?.length) {\n prDesc += ` - Schedule: ${JSON.stringify(branch.schedule)}\\n`;\n }\n prDesc += ` - Branch name: \\`${branch.branchName}\\`\\n`;\n prDesc += branch.baseBranch\n ? ` - Merge into: \\`${branch.baseBranch}\\`\\n`\n : '';\n const seen: string[] = [];\n for (const upgrade of branch.upgrades) {\n let text = '';\n if (upgrade.updateType === 'lockFileMaintenance') {\n text += ' - Regenerate lock files to use latest dependency versions';\n } else {\n if (upgrade.updateType === 'pin') {\n text += ' - Pin ';\n } else {\n text += ' - Upgrade ';\n }\n if (upgrade.sourceUrl) {\n // TODO: types (#22198)\n text += `[${upgrade.depName!}](${upgrade.sourceUrl})`;\n } else {\n text += upgrade.depName!.replace(prTitleRe, '@​$1');\n }\n // TODO: types (#22198)\n text += upgrade.isLockfileUpdate\n ? ` to \\`${upgrade.newVersion!}\\``\n : ` to \\`${upgrade.newDigest ?? upgrade.newValue!}\\``;\n text += '\\n';\n }\n if (!seen.includes(text)) {\n prDesc += text;\n seen.push(text);\n }\n }\n prDesc += '\\n\\n';\n prDesc += '</details>\\n\\n';\n }\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction getBranchUpgradeTypes(branch: BranchConfig): Set<SummaryCategory> {\n if (branch.isVulnerabilityAlert) {\n return new Set(['security']);\n }\n const types = new Set<SummaryCategory>();\n for (const upgrade of branch.upgrades) {\n if (upgrade.updateType) {\n types.add(upgrade.updateType);\n } else if (upgrade.isLockfileUpdate) {\n types.add('lockfileUpdate');\n } else {\n types.add('other');\n }\n }\n return types;\n}\n\n// Sort: default branch (empty string) first, then named branches alphabetically.\nfunction sortBaseBranches(bases: Iterable<string>): string[] {\n return [...bases].sort((a, b) => {\n if (a === b) {\n /* v8 ignore next -- base branches are unique Record keys; equal comparison cannot occur */\n return 0;\n }\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction describeSecurityGroup(groupBranches: BranchConfig[]): string {\n const firstUpgrade = groupBranches[0].upgrades[0];\n const depName = firstUpgrade?.depName ?? groupBranches[0].prTitle ?? '';\n const updateType = firstUpgrade?.updateType ?? 'unknown';\n const packageFiles = groupBranches\n .map((b) => ({ file: b.packageFile ?? '', manager: b.manager }))\n .filter((f) => f.file);\n const uniqueManagers = new Set(packageFiles.map((f) => f.manager));\n\n // Vulnerability alerts can match on datasource + packageName without a specific file (e.g. GitHub vulnerability alerts),\n // so we need to handle an absent packageFile\n if (packageFiles.length === 0) {\n const branchManagers = new Set(groupBranches.map((b) => b.manager));\n if (branchManagers.size === 1) {\n return `- \\`${depName}\\`, (${[...branchManagers][0]}, ${updateType})\\n`;\n }\n\n return `- \\`${depName}\\`, (${updateType}): ${[...branchManagers].sort().join(', ')}\\n`;\n }\n\n if (packageFiles.length === 1) {\n const file = packageFiles[0].file;\n const [manager] = uniqueManagers;\n return `- \\`${depName}\\`, (${manager}, ${updateType}): \\`${file}\\`\\n`;\n }\n\n if (uniqueManagers.size === 1) {\n const manager = [...uniqueManagers][0];\n const fileLines = packageFiles\n .map(({ file }) => ` - \\`${file}\\`\\n`)\n .join('');\n return `- \\`${depName}\\`, (${manager}, ${updateType}):\\n${fileLines}`;\n }\n\n const fileLines = packageFiles\n .map(({ file, manager }) => ` - \\`${file}\\` (${manager})\\n`)\n .join('');\n return `- \\`${depName}\\`, (${updateType}):\\n${fileLines}`;\n}\n\ninterface BranchStats {\n // PR count per base branch, deduplicated by branchName.\n prCountByBase: Record<string, number>;\n // base -> manager -> type -> count, deduplicated by branchName+manager+type.\n tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n >;\n // All upgrade types seen anywhere — drives the table columns.\n presentCategories: Set<SummaryCategory>;\n // Security branches grouped by branchName.\n securityGroups: Record<string, BranchConfig[]>;\n prCount: number;\n}\n\nfunction collectBranchStats(branches: BranchConfig[]): BranchStats {\n const prCountByBase: Record<string, number> = {};\n const tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n > = {};\n const presentTypes = new Set<SummaryCategory>();\n const securityGroups: Record<string, BranchConfig[]> = {};\n const seenPrs = new Set<string>();\n const seenTableKeys = new Set<string>();\n\n for (const branch of branches) {\n const base = branch.baseBranch ?? '';\n const { manager, branchName } = branch;\n const branchTypes = getBranchUpgradeTypes(branch);\n\n for (const type of branchTypes) {\n presentTypes.add(type);\n }\n\n if (!seenPrs.has(branchName)) {\n seenPrs.add(branchName);\n prCountByBase[base] = (prCountByBase[base] ?? 0) + 1;\n }\n\n tableStats[base] ??= {};\n const baseStats = tableStats[base];\n baseStats[manager] ??= {};\n const managerStats = baseStats[manager];\n for (const type of branchTypes) {\n const key = `${branchName}:${manager}:${type}`;\n if (seenTableKeys.has(key)) {\n continue;\n }\n seenTableKeys.add(key);\n managerStats[type] ??= 0;\n managerStats[type]++;\n }\n\n if (branch.isVulnerabilityAlert) {\n securityGroups[branchName] ??= [];\n securityGroups[branchName].push(branch);\n }\n }\n\n return {\n prCountByBase,\n tableStats,\n presentCategories: presentTypes,\n securityGroups,\n prCount: seenPrs.size,\n };\n}\n\nfunction getCategoryColumns(\n presentTypes: Set<SummaryCategory>,\n): SummaryCategory[] {\n const cols: SummaryCategory[] = SUMMARY_CATEGORY_PRIORITY_ORDER.filter((t) =>\n presentTypes.has(t),\n );\n // Append any present types not in the standard display order\n // (e.g. lockfileUpdate, bump).\n for (const t of presentTypes) {\n if (t !== 'other' && !cols.includes(t)) {\n cols.push(t);\n }\n }\n\n if (presentTypes.has('other')) {\n cols.push('other');\n }\n\n return cols;\n}\n\nfunction categoriesToColumnHeaders(cols: readonly string[]): string {\n /* v8 ignore next -- branches always have at least one upgrade, so cols is never empty in practice */\n if (cols.length === 0) {\n return '';\n }\n return ` | ${cols.join(' | ')}`;\n}\n\nfunction renderRowCounts(\n typeColumns: readonly SummaryCategory[],\n typeCounts: Partial<Record<SummaryCategory, number>>,\n): string {\n return categoriesToColumnHeaders(\n typeColumns.map((t) => `${typeCounts[t] ?? 0}`),\n );\n}\n\nfunction sumCategoryCounts(\n rows: Partial<Record<SummaryCategory, number>>[],\n categoryColumns: readonly SummaryCategory[],\n): Partial<Record<SummaryCategory, number>> {\n const sum: Partial<Record<SummaryCategory, number>> = {};\n for (const categoryCounts of rows) {\n for (const category of categoryColumns) {\n sum[category] = (sum[category] ?? 0) + (categoryCounts[category] ?? 0);\n }\n }\n return sum;\n}\n\nexport function getExpectedPrListSummary(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrListSummary()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n\n const stats = collectBranchStats(branches);\n const sortedBases = sortBaseBranches(Object.keys(stats.prCountByBase));\n const hasMultipleBaseBranches = sortedBases.length > 1;\n\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n\n if (hasMultipleBaseBranches) {\n let total = 0;\n const parts = sortedBases.map((base) => {\n const count = stats.prCountByBase[base];\n total += count;\n const label = base ? `the \\`${base}\\` branch` : 'the default branch';\n return `${count} Pull Request${count > 1 ? 's' : ''} to ${label}`;\n });\n const hourlyLimitsNotice = determineHourlyLimitsNotice(\n prHourlyLimit,\n commitHourlyLimit,\n total,\n );\n prDesc += `With your current configuration, Renovate will create ${parts.join(' and ')}${hourlyLimitsNotice}:\\n\\n`;\n } else {\n const hourlyLimitsNotice = determineHourlyLimitsNotice(\n prHourlyLimit,\n commitHourlyLimit,\n stats.prCount,\n );\n prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? 's' : ''}${hourlyLimitsNotice}:\\n\\n`;\n }\n\n const categoryColumns = getCategoryColumns(stats.presentCategories);\n if (hasMultipleBaseBranches) {\n prDesc += `| Branch | Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| --- | ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const base of sortedBases) {\n const label = base || '$default';\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[base],\n )) {\n prDesc += `| ${label} | ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats).flatMap((b) => Object.values(b)),\n categoryColumns,\n );\n prDesc += `| **Total** | ${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n } else {\n prDesc += `| Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[sortedBases[0]],\n )) {\n prDesc += `| ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats[sortedBases[0]]),\n categoryColumns,\n );\n prDesc += `| **Total**${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n }\n\n prDesc += `\\n<small>Note that a single PR can update multiple files and/or managers, so the above rows may not align with the number of PRs being listed above.</small>\\n`;\n\n // provide a summary of the given security updates, as they're likely more important to the user\n if (Object.keys(stats.securityGroups).length) {\n prDesc += `\\n**Security updates**:\\n\\n`;\n for (const groupBranches of Object.values(stats.securityGroups)) {\n prDesc += describeSecurityGroup(groupBranches);\n }\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction determineHourlyLimitsNotice(\n prHourlyLimit: number,\n commitHourlyLimit: number,\n prCount: number,\n): string {\n if (commitHourlyLimit === 0 && prHourlyLimit === 0) {\n return ' (with no configured maximum of PRs per hour)';\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < prCount\n ) {\n return emojify(\n ` (at a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? 's' : ''}/rebase${commitHourlyLimit > 1 ? 's' : ''} per hour)`,\n );\n }\n\n if (prHourlyLimit > 0 && prHourlyLimit < 5 && prHourlyLimit < prCount) {\n return emojify(\n ` (at a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? 's' : ''} per hour)`,\n );\n }\n\n return '';\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pr-list.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/pr/pr-list.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type RenovateConfig,\n type UpdateType,\n UpdateTypesOptions,\n} from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { calcLimit } from '../../../global/limits.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../types.ts';\n\n/**\n * The different categories of dependency updates to output, when providing the summary view.\n *\n * - `security`: if the upgrade is driven by a vulnerability alert\n * - `${updateType}`: if it's set. I.e. `major`\n * - `lockfileUpdate` when `isLockfileUpdate` is true, without an `updateType`\n * - `other`: otherwise\n */\ntype SummaryCategory = UpdateType | 'security' | 'other';\n\n/** Priority order when rendering the `SummaryCategory`s in the summary view.\n *\n * NOTE that this is not exhaustive - this is only the priority order for rendering, and other categories, such as `other` are placed after.\n */\nconst SUMMARY_CATEGORY_PRIORITY_ORDER: readonly SummaryCategory[] = [\n 'security',\n ...UpdateTypesOptions,\n // ... anything else\n];\n\ninterface ConcurrentLimit {\n limit: number;\n key: 'prConcurrentLimit' | 'branchConcurrentLimit';\n}\n\n/**\n * Resolves the concurrent limit that governs how many of the expected Pull Requests can be open at once,\n * reusing the same `calcLimit()` used to enforce these limits (see `lib/workers/global/limits.ts`).\n *\n * `branchConcurrentLimit` only takes priority when it's been explicitly configured (it's `null` by default,\n * in which case `calcLimit()` silently inherits the value of `prConcurrentLimit`) and is actually more\n * restrictive - otherwise we'd misattribute the limit to a setting the user never touched.\n */\nfunction resolveConcurrentLimit(config: RenovateConfig): ConcurrentLimit {\n const configAsUpgrade: BranchUpgradeConfig = {\n branchName: '',\n manager: '',\n prConcurrentLimit: config.prConcurrentLimit,\n branchConcurrentLimit: config.branchConcurrentLimit,\n };\n const prConcurrentLimit = calcLimit([configAsUpgrade], 'prConcurrentLimit');\n const branchConcurrentLimit = calcLimit(\n [configAsUpgrade],\n 'branchConcurrentLimit',\n );\n\n if (\n typeof config.branchConcurrentLimit === 'number' &&\n branchConcurrentLimit > 0 &&\n (prConcurrentLimit === 0 || branchConcurrentLimit < prConcurrentLimit)\n ) {\n return {\n limit: branchConcurrentLimit,\n key: 'branchConcurrentLimit',\n };\n }\n\n return { limit: prConcurrentLimit, key: 'prConcurrentLimit' };\n}\n\nexport function getExpectedPrList(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrList()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n const { limit: concurrentLimit, key: concurrentLimitKey } =\n resolveConcurrentLimit(config);\n if (concurrentLimit > 0 && concurrentLimit < branches.length) {\n prDesc += `With your current configuration, Renovate will create ${concurrentLimit} Pull Request${concurrentLimit > 1 ? 's' : ''}, up to a maximum of ${branches.length} over time (see [docs for \\`${concurrentLimitKey}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimitKey.toLowerCase()})):\\n\\n`;\n } else {\n prDesc += `With your current configuration, Renovate will create ${branches.length} Pull Request`;\n prDesc += branches.length > 1 ? `s:\\n\\n` : `:\\n\\n`;\n }\n\n for (const branch of branches) {\n const prTitleRe = regEx(/@([a-z]+\\/[a-z]+)/);\n // TODO #22198\n prDesc += `<details>\\n<summary>${branch.prTitle!.replace(\n prTitleRe,\n '@​$1',\n )}</summary>\\n\\n`;\n if (branch.schedule?.length) {\n prDesc += ` - Schedule: ${JSON.stringify(branch.schedule)}\\n`;\n }\n prDesc += ` - Branch name: \\`${branch.branchName}\\`\\n`;\n prDesc += branch.baseBranch\n ? ` - Merge into: \\`${branch.baseBranch}\\`\\n`\n : '';\n const seen: string[] = [];\n for (const upgrade of branch.upgrades) {\n let text = '';\n if (upgrade.updateType === 'lockFileMaintenance') {\n text += ' - Regenerate lock files to use latest dependency versions';\n } else {\n if (upgrade.updateType === 'pin') {\n text += ' - Pin ';\n } else {\n text += ' - Upgrade ';\n }\n if (upgrade.sourceUrl) {\n // TODO: types (#22198)\n text += `[${upgrade.depName!}](${upgrade.sourceUrl})`;\n } else {\n text += upgrade.depName!.replace(prTitleRe, '@​$1');\n }\n // TODO: types (#22198)\n text += upgrade.isLockfileUpdate\n ? ` to \\`${upgrade.newVersion!}\\``\n : ` to \\`${upgrade.newDigest ?? upgrade.newValue!}\\``;\n text += '\\n';\n }\n if (!seen.includes(text)) {\n prDesc += text;\n seen.push(text);\n }\n }\n prDesc += '\\n\\n';\n prDesc += '</details>\\n\\n';\n }\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < branches.length\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction getBranchUpgradeTypes(branch: BranchConfig): Set<SummaryCategory> {\n if (branch.isVulnerabilityAlert) {\n return new Set(['security']);\n }\n const types = new Set<SummaryCategory>();\n for (const upgrade of branch.upgrades) {\n if (upgrade.updateType) {\n types.add(upgrade.updateType);\n } else if (upgrade.isLockfileUpdate) {\n types.add('lockfileUpdate');\n } else {\n types.add('other');\n }\n }\n return types;\n}\n\n// Sort: default branch (empty string) first, then named branches alphabetically.\nfunction sortBaseBranches(bases: Iterable<string>): string[] {\n return [...bases].sort((a, b) => {\n if (a === b) {\n /* v8 ignore next -- base branches are unique Record keys; equal comparison cannot occur */\n return 0;\n }\n if (a === '') {\n return -1;\n }\n if (b === '') {\n return 1;\n }\n return a.localeCompare(b);\n });\n}\n\nfunction describeSecurityGroup(groupBranches: BranchConfig[]): string {\n const firstUpgrade = groupBranches[0].upgrades[0];\n const depName = firstUpgrade?.depName ?? groupBranches[0].prTitle ?? '';\n const updateType = firstUpgrade?.updateType ?? 'unknown';\n const packageFiles = groupBranches\n .map((b) => ({ file: b.packageFile ?? '', manager: b.manager }))\n .filter((f) => f.file);\n const uniqueManagers = new Set(packageFiles.map((f) => f.manager));\n\n // Vulnerability alerts can match on datasource + packageName without a specific file (e.g. GitHub vulnerability alerts),\n // so we need to handle an absent packageFile\n if (packageFiles.length === 0) {\n const branchManagers = new Set(groupBranches.map((b) => b.manager));\n if (branchManagers.size === 1) {\n return `- \\`${depName}\\`, (${[...branchManagers][0]}, ${updateType})\\n`;\n }\n\n return `- \\`${depName}\\`, (${updateType}): ${[...branchManagers].sort().join(', ')}\\n`;\n }\n\n if (packageFiles.length === 1) {\n const file = packageFiles[0].file;\n const [manager] = uniqueManagers;\n return `- \\`${depName}\\`, (${manager}, ${updateType}): \\`${file}\\`\\n`;\n }\n\n if (uniqueManagers.size === 1) {\n const manager = [...uniqueManagers][0];\n const fileLines = packageFiles\n .map(({ file }) => ` - \\`${file}\\`\\n`)\n .join('');\n return `- \\`${depName}\\`, (${manager}, ${updateType}):\\n${fileLines}`;\n }\n\n const fileLines = packageFiles\n .map(({ file, manager }) => ` - \\`${file}\\` (${manager})\\n`)\n .join('');\n return `- \\`${depName}\\`, (${updateType}):\\n${fileLines}`;\n}\n\ninterface BranchStats {\n // PR count per base branch, deduplicated by branchName.\n prCountByBase: Record<string, number>;\n // base -> manager -> type -> count, deduplicated by branchName+manager+type.\n tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n >;\n // All upgrade types seen anywhere — drives the table columns.\n presentCategories: Set<SummaryCategory>;\n // Security branches grouped by branchName.\n securityGroups: Record<string, BranchConfig[]>;\n prCount: number;\n}\n\nfunction collectBranchStats(branches: BranchConfig[]): BranchStats {\n const prCountByBase: Record<string, number> = {};\n const tableStats: Record<\n string,\n Record<string, Partial<Record<SummaryCategory, number>>>\n > = {};\n const presentTypes = new Set<SummaryCategory>();\n const securityGroups: Record<string, BranchConfig[]> = {};\n const seenPrs = new Set<string>();\n const seenTableKeys = new Set<string>();\n\n for (const branch of branches) {\n const base = branch.baseBranch ?? '';\n const { manager, branchName } = branch;\n const branchTypes = getBranchUpgradeTypes(branch);\n\n for (const type of branchTypes) {\n presentTypes.add(type);\n }\n\n if (!seenPrs.has(branchName)) {\n seenPrs.add(branchName);\n prCountByBase[base] = (prCountByBase[base] ?? 0) + 1;\n }\n\n tableStats[base] ??= {};\n const baseStats = tableStats[base];\n baseStats[manager] ??= {};\n const managerStats = baseStats[manager];\n for (const type of branchTypes) {\n const key = `${branchName}:${manager}:${type}`;\n if (seenTableKeys.has(key)) {\n continue;\n }\n seenTableKeys.add(key);\n managerStats[type] ??= 0;\n managerStats[type]++;\n }\n\n if (branch.isVulnerabilityAlert) {\n securityGroups[branchName] ??= [];\n securityGroups[branchName].push(branch);\n }\n }\n\n return {\n prCountByBase,\n tableStats,\n presentCategories: presentTypes,\n securityGroups,\n prCount: seenPrs.size,\n };\n}\n\nfunction getCategoryColumns(\n presentTypes: Set<SummaryCategory>,\n): SummaryCategory[] {\n const cols: SummaryCategory[] = SUMMARY_CATEGORY_PRIORITY_ORDER.filter((t) =>\n presentTypes.has(t),\n );\n // Append any present types not in the standard display order\n // (e.g. lockfileUpdate, bump).\n for (const t of presentTypes) {\n if (t !== 'other' && !cols.includes(t)) {\n cols.push(t);\n }\n }\n\n if (presentTypes.has('other')) {\n cols.push('other');\n }\n\n return cols;\n}\n\nfunction categoriesToColumnHeaders(cols: readonly string[]): string {\n /* v8 ignore next -- branches always have at least one upgrade, so cols is never empty in practice */\n if (cols.length === 0) {\n return '';\n }\n return ` | ${cols.join(' | ')}`;\n}\n\nfunction renderRowCounts(\n typeColumns: readonly SummaryCategory[],\n typeCounts: Partial<Record<SummaryCategory, number>>,\n): string {\n return categoriesToColumnHeaders(\n typeColumns.map((t) => `${typeCounts[t] ?? 0}`),\n );\n}\n\nfunction sumCategoryCounts(\n rows: Partial<Record<SummaryCategory, number>>[],\n categoryColumns: readonly SummaryCategory[],\n): Partial<Record<SummaryCategory, number>> {\n const sum: Partial<Record<SummaryCategory, number>> = {};\n for (const categoryCounts of rows) {\n for (const category of categoryColumns) {\n sum[category] = (sum[category] ?? 0) + (categoryCounts[category] ?? 0);\n }\n }\n return sum;\n}\n\nexport function getExpectedPrListSummary(\n config: RenovateConfig,\n branches: BranchConfig[],\n): string {\n logger.debug('getExpectedPrListSummary()');\n logger.trace({ config });\n let prDesc = `\\n### What to Expect\\n\\n`;\n if (!branches.length) {\n return `${prDesc}It looks like your repository dependencies are already up-to-date and no Pull Requests will be necessary right away.\\n`;\n }\n\n const stats = collectBranchStats(branches);\n const sortedBases = sortBaseBranches(Object.keys(stats.prCountByBase));\n const hasMultipleBaseBranches = sortedBases.length > 1;\n\n const prHourlyLimit = coerceNumber(config.prHourlyLimit);\n const commitHourlyLimit = coerceNumber(config.commitHourlyLimit);\n const concurrentLimit = resolveConcurrentLimit(config);\n\n if (hasMultipleBaseBranches) {\n let total = 0;\n const parts = sortedBases.map((base) => {\n const count = stats.prCountByBase[base];\n total += count;\n const label = base ? `the \\`${base}\\` branch` : 'the default branch';\n return `${count} Pull Request${count > 1 ? 's' : ''} to ${label}`;\n });\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n total,\n );\n prDesc += `With your current configuration, Renovate will create ${parts.join(' and ')}${limitsNotice}:\\n\\n`;\n } else {\n const limitsNotice = determineLimitsNotice(\n concurrentLimit,\n prHourlyLimit,\n commitHourlyLimit,\n stats.prCount,\n );\n prDesc += `With your current configuration, Renovate will create ${stats.prCount} Pull Request${stats.prCount > 1 ? 's' : ''}${limitsNotice}:\\n\\n`;\n }\n\n const categoryColumns = getCategoryColumns(stats.presentCategories);\n if (hasMultipleBaseBranches) {\n prDesc += `| Branch | Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| --- | ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const base of sortedBases) {\n const label = base || '$default';\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[base],\n )) {\n prDesc += `| ${label} | ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats).flatMap((b) => Object.values(b)),\n categoryColumns,\n );\n prDesc += `| **Total** | ${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n } else {\n prDesc += `| Manager${categoriesToColumnHeaders(categoryColumns)} |\\n`;\n prDesc += `| ---${categoryColumns.map(() => ' | ---').join('')} |\\n`;\n for (const [manager, typeCounts] of Object.entries(\n stats.tableStats[sortedBases[0]],\n )) {\n prDesc += `| ${manager}${renderRowCounts(categoryColumns, typeCounts)} |\\n`;\n }\n const sumRow = sumCategoryCounts(\n Object.values(stats.tableStats[sortedBases[0]]),\n categoryColumns,\n );\n prDesc += `| **Total**${renderRowCounts(categoryColumns, sumRow)} |\\n`;\n }\n\n prDesc += `\\n<small>Note that a single PR can update multiple files and/or managers, so the above rows may not align with the number of PRs being listed above.</small>\\n`;\n\n // provide a summary of the given security updates, as they're likely more important to the user\n if (Object.keys(stats.securityGroups).length) {\n prDesc += `\\n**Security updates**:\\n\\n`;\n for (const groupBranches of Object.values(stats.securityGroups)) {\n prDesc += describeSecurityGroup(groupBranches);\n }\n }\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < stats.prCount) {\n const notice =\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `Renovate will only work on ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} at a time, so not all Pull Requests will be opened straight away`\n : `Renovate will only keep ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time, so not all of the above will be opened straight away`;\n prDesc += emojify(\n `\\n\\n:children_crossing: ${notice}. See [docs for \\`${concurrentLimit.key}\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#${concurrentLimit.key.toLowerCase()}) for details.\\n\\n`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: Branch creation and rebasing will be limited to maximum ${commitHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`commitHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#commithourlylimit) for details.\\n\\n`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < stats.prCount\n ) {\n prDesc += emojify(\n `\\n\\n:children_crossing: PR creation will be limited to maximum ${prHourlyLimit} per hour, so it doesn't swamp any CI resources or overwhelm the project. See [docs for \\`prHourlyLimit\\`](${GlobalConfig.get('productLinks').documentation}configuration-options/#prhourlylimit) for details.\\n\\n`,\n );\n }\n return prDesc;\n}\n\nfunction determineLimitsNotice(\n concurrentLimit: ConcurrentLimit,\n prHourlyLimit: number,\n commitHourlyLimit: number,\n prCount: number,\n): string {\n const clauses: string[] = [];\n\n if (concurrentLimit.limit > 0 && concurrentLimit.limit < prCount) {\n clauses.push(\n concurrentLimit.key === 'branchConcurrentLimit'\n ? `a maximum of ${concurrentLimit.limit} branch${concurrentLimit.limit > 1 ? 'es' : ''} open at a time`\n : `a maximum of ${concurrentLimit.limit} Pull Request${concurrentLimit.limit > 1 ? 's' : ''} open at a time`,\n );\n }\n\n if (\n commitHourlyLimit > 0 &&\n commitHourlyLimit < 5 &&\n commitHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${commitHourlyLimit} PR${commitHourlyLimit > 1 ? 's' : ''}/rebase${commitHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n } else if (\n prHourlyLimit > 0 &&\n prHourlyLimit < 5 &&\n prHourlyLimit < prCount\n ) {\n clauses.push(\n `a maximum of ${prHourlyLimit} PR${prHourlyLimit > 1 ? 's' : ''} per hour`,\n );\n }\n\n if (clauses.length) {\n return emojify(` (at ${clauses.join(' and ')})`);\n }\n\n if (commitHourlyLimit === 0 && prHourlyLimit === 0) {\n return ' (with no configured maximum of PRs per hour)';\n }\n\n return '';\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
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 44.
|
|
3
|
+
"title": "JSON schema for Renovate 44.36.0 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.
|
|
5
|
+
"x-renovate-version": "44.36.0",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|