renovate 39.242.1 → 39.243.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.
@@ -29,6 +29,7 @@ export interface GerritChange {
29
29
  change_id: string;
30
30
  subject: string;
31
31
  status: GerritChangeStatus;
32
+ created: string;
32
33
  submittable?: boolean;
33
34
  _number: number;
34
35
  labels?: Record<string, GerritLabelInfo>;
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/modules/platform/gerrit/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { FindPRConfig } from '../types';\n\nexport interface GerritFindPRConfig extends FindPRConfig {\n label?: string;\n}\n\n/**\n * The Interfaces for the Gerrit API Responses ({@link https://gerrit-review.googlesource.com/Documentation/rest-api.html | REST-API})\n * minimized to only needed properties.\n *\n * @packageDocumentation\n */\n\nexport interface GerritProjectInfo {\n id: string;\n name: string;\n state?: 'ACTIVE' | 'READ_ONLY' | 'HIDDEN';\n labels?: Record<string, GerritLabelTypeInfo>;\n}\n\nexport interface GerritLabelTypeInfo {\n values: Record<number, string>;\n default_value: number;\n}\n\nexport interface GerritBranchInfo {\n ref: string;\n revision: string;\n}\n\nexport type GerritChangeStatus = 'NEW' | 'MERGED' | 'ABANDONED';\n\nexport type GerritReviewersType = 'REVIEWER' | 'CC' | 'REMOVED';\n\nexport interface GerritChange {\n branch: string;\n change_id: string;\n subject: string;\n status: GerritChangeStatus;\n submittable?: boolean;\n _number: number;\n labels?: Record<string, GerritLabelInfo>;\n reviewers?: Record<GerritReviewersType, GerritAccountInfo[]>;\n messages?: GerritChangeMessageInfo[];\n current_revision: string;\n /**\n * All patch sets of this change as a map that maps the commit ID of the patch set to a RevisionInfo entity.\n */\n revisions: Record<string, GerritRevisionInfo>;\n problems: unknown[];\n}\n\nexport interface GerritCommitInfo {\n message: string;\n}\n\nexport interface GerritRevisionInfo {\n uploader: GerritAccountInfo;\n /**\n * The Git reference for the patch set.\n */\n ref: string;\n actions?: Record<string, GerritActionInfo>;\n commit: GerritCommitInfo;\n}\n\nexport interface GerritChangeMessageInfo {\n id: string;\n message: string;\n tag?: string;\n}\n\nexport interface GerritLabelInfo {\n approved?: GerritAccountInfo;\n rejected?: GerritAccountInfo;\n /** If true, the label blocks submit operation. If not set, the default is false. */\n blocking?: boolean;\n}\n\nexport interface GerritActionInfo {\n method?: string;\n enabled?: boolean;\n}\n\nexport interface GerritAccountInfo {\n _account_id: number;\n username?: string;\n}\n\nexport interface GerritMergeableInfo {\n submit_type:\n | 'MERGE_IF_NECESSARY'\n | 'FAST_FORWARD_ONLY'\n | 'REBASE_IF_NECESSARY'\n | 'REBASE_ALWAYS'\n | 'MERGE_ALWAYS'\n | 'CHERRY_PICK';\n mergeable: boolean;\n}\n"]}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../lib/modules/platform/gerrit/types.ts"],"names":[],"mappings":"","sourcesContent":["import type { FindPRConfig } from '../types';\n\nexport interface GerritFindPRConfig extends FindPRConfig {\n label?: string;\n}\n\n/**\n * The Interfaces for the Gerrit API Responses ({@link https://gerrit-review.googlesource.com/Documentation/rest-api.html | REST-API})\n * minimized to only needed properties.\n *\n * @packageDocumentation\n */\n\nexport interface GerritProjectInfo {\n id: string;\n name: string;\n state?: 'ACTIVE' | 'READ_ONLY' | 'HIDDEN';\n labels?: Record<string, GerritLabelTypeInfo>;\n}\n\nexport interface GerritLabelTypeInfo {\n values: Record<number, string>;\n default_value: number;\n}\n\nexport interface GerritBranchInfo {\n ref: string;\n revision: string;\n}\n\nexport type GerritChangeStatus = 'NEW' | 'MERGED' | 'ABANDONED';\n\nexport type GerritReviewersType = 'REVIEWER' | 'CC' | 'REMOVED';\n\nexport interface GerritChange {\n branch: string;\n change_id: string;\n subject: string;\n status: GerritChangeStatus;\n created: string;\n submittable?: boolean;\n _number: number;\n labels?: Record<string, GerritLabelInfo>;\n reviewers?: Record<GerritReviewersType, GerritAccountInfo[]>;\n messages?: GerritChangeMessageInfo[];\n current_revision: string;\n /**\n * All patch sets of this change as a map that maps the commit ID of the patch set to a RevisionInfo entity.\n */\n revisions: Record<string, GerritRevisionInfo>;\n problems: unknown[];\n}\n\nexport interface GerritCommitInfo {\n message: string;\n}\n\nexport interface GerritRevisionInfo {\n uploader: GerritAccountInfo;\n /**\n * The Git reference for the patch set.\n */\n ref: string;\n actions?: Record<string, GerritActionInfo>;\n commit: GerritCommitInfo;\n}\n\nexport interface GerritChangeMessageInfo {\n id: string;\n message: string;\n tag?: string;\n}\n\nexport interface GerritLabelInfo {\n approved?: GerritAccountInfo;\n rejected?: GerritAccountInfo;\n /** If true, the label blocks submit operation. If not set, the default is false. */\n blocking?: boolean;\n}\n\nexport interface GerritActionInfo {\n method?: string;\n enabled?: boolean;\n}\n\nexport interface GerritAccountInfo {\n _account_id: number;\n username?: string;\n}\n\nexport interface GerritMergeableInfo {\n submit_type:\n | 'MERGE_IF_NECESSARY'\n | 'FAST_FORWARD_ONLY'\n | 'REBASE_IF_NECESSARY'\n | 'REBASE_ALWAYS'\n | 'MERGE_ALWAYS'\n | 'CHERRY_PICK';\n mergeable: boolean;\n}\n"]}
@@ -57,6 +57,7 @@ function mapGerritChangeToPr(change) {
57
57
  sourceBranch: extractSourceBranch(change) ?? change.branch,
58
58
  targetBranch: change.branch,
59
59
  title: change.subject,
60
+ createdAt: change.created?.replace(' ', 'T'),
60
61
  reviewers: change.reviewers?.REVIEWER?.filter((reviewer) => typeof reviewer.username === 'string').map((reviewer) => reviewer.username) ?? [],
61
62
  bodyStruct: {
62
63
  hash: (0, pr_body_1.hashBody)(findPullRequestBody(change)),
@@ -1 +1 @@
1
- {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/modules/platform/gerrit/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { BranchStatus, PrState } from '../../../types';\nimport * as hostRules from '../../../util/host-rules';\nimport { regEx } from '../../../util/regex';\nimport { joinUrlParts, parseUrl } from '../../../util/url';\nimport { hashBody } from '../pr-body';\nimport type { Pr } from '../types';\nimport type {\n GerritChange,\n GerritChangeStatus,\n GerritLabelTypeInfo,\n} from './types';\n\nexport const TAG_PULL_REQUEST_BODY = 'pull-request';\n\nexport function getGerritRepoUrl(repository: string, endpoint: 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 const url = parseUrl(endpoint);\n if (!url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n if (!(opts.username && opts.password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\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 logger.trace(\n { url: url.toString() },\n 'using URL based on configured endpoint',\n );\n return url.toString();\n}\n\nexport function mapPrStateToGerritFilter(state?: PrState): string {\n switch (state) {\n case 'closed':\n return 'status:closed';\n case 'merged':\n return 'status:merged';\n case '!open':\n return '-status:open';\n case 'open':\n return 'status:open';\n case 'all':\n default:\n return '-is:wip';\n }\n}\n\nexport function mapGerritChangeToPr(change: GerritChange): Pr {\n return {\n number: change._number,\n state: mapGerritChangeStateToPrState(change.status),\n sourceBranch: extractSourceBranch(change) ?? change.branch,\n targetBranch: change.branch,\n title: change.subject,\n reviewers:\n change.reviewers?.REVIEWER?.filter(\n (reviewer) => typeof reviewer.username === 'string',\n ).map((reviewer) => reviewer.username!) ?? [],\n bodyStruct: {\n hash: hashBody(findPullRequestBody(change)),\n },\n };\n}\n\nexport function mapGerritChangeStateToPrState(\n state: GerritChangeStatus | 'UNKNOWN', // suppress default path code removal\n): PrState {\n switch (state) {\n case 'NEW':\n return 'open';\n case 'MERGED':\n return 'merged';\n case 'ABANDONED':\n return 'closed';\n }\n return 'all';\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 message = change.revisions[change.current_revision]?.commit?.message;\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 return msg.message.replace(/^Patch Set \\d+:\\n\\n/, ''); //TODO: check how to get rid of the auto-added prefix?\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"]}
1
+ {"version":3,"file":"utils.js","sourceRoot":"","sources":["../../../../lib/modules/platform/gerrit/utils.ts"],"names":[],"mappings":"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","sourcesContent":["import { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages';\nimport { logger } from '../../../logger';\nimport type { BranchStatus, PrState } from '../../../types';\nimport * as hostRules from '../../../util/host-rules';\nimport { regEx } from '../../../util/regex';\nimport { joinUrlParts, parseUrl } from '../../../util/url';\nimport { hashBody } from '../pr-body';\nimport type { Pr } from '../types';\nimport type {\n GerritChange,\n GerritChangeStatus,\n GerritLabelTypeInfo,\n} from './types';\n\nexport const TAG_PULL_REQUEST_BODY = 'pull-request';\n\nexport function getGerritRepoUrl(repository: string, endpoint: 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 const url = parseUrl(endpoint);\n if (!url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n if (!(opts.username && opts.password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\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 logger.trace(\n { url: url.toString() },\n 'using URL based on configured endpoint',\n );\n return url.toString();\n}\n\nexport function mapPrStateToGerritFilter(state?: PrState): string {\n switch (state) {\n case 'closed':\n return 'status:closed';\n case 'merged':\n return 'status:merged';\n case '!open':\n return '-status:open';\n case 'open':\n return 'status:open';\n case 'all':\n default:\n return '-is:wip';\n }\n}\n\nexport function mapGerritChangeToPr(change: GerritChange): Pr {\n return {\n number: change._number,\n state: mapGerritChangeStateToPrState(change.status),\n sourceBranch: extractSourceBranch(change) ?? change.branch,\n targetBranch: change.branch,\n title: change.subject,\n createdAt: change.created?.replace(' ', 'T'),\n reviewers:\n change.reviewers?.REVIEWER?.filter(\n (reviewer) => typeof reviewer.username === 'string',\n ).map((reviewer) => reviewer.username!) ?? [],\n bodyStruct: {\n hash: hashBody(findPullRequestBody(change)),\n },\n };\n}\n\nexport function mapGerritChangeStateToPrState(\n state: GerritChangeStatus | 'UNKNOWN', // suppress default path code removal\n): PrState {\n switch (state) {\n case 'NEW':\n return 'open';\n case 'MERGED':\n return 'merged';\n case 'ABANDONED':\n return 'closed';\n }\n return 'all';\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 message = change.revisions[change.current_revision]?.commit?.message;\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 return msg.message.replace(/^Patch Set \\d+:\\n\\n/, ''); //TODO: check how to get rid of the auto-added prefix?\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"]}
@@ -1,7 +1,11 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.getPrConfigDescription = getPrConfigDescription;
4
+ const tslib_1 = require("tslib");
5
+ const croner_1 = require("croner");
6
+ const cronstrue_1 = tslib_1.__importDefault(require("cronstrue"));
4
7
  const emoji_1 = require("../../../../../util/emoji");
8
+ const string_1 = require("../../../../../util/string");
5
9
  function getPrConfigDescription(config) {
6
10
  let prBody = `\n\n---\n\n### Configuration\n\n`;
7
11
  prBody += (0, emoji_1.emojify)(`:date: **Schedule**: `);
@@ -46,7 +50,8 @@ function getPrConfigDescription(config) {
46
50
  function scheduleToString(schedule, timezone) {
47
51
  let scheduleString = '';
48
52
  if (schedule && schedule[0] !== 'at any time') {
49
- scheduleString += `"${String(schedule)}"`;
53
+ scheduleString =
54
+ getReadableCronSchedule(schedule) ?? `"${String(schedule)}"`;
50
55
  if (timezone) {
51
56
  scheduleString += ` in timezone ${timezone}`;
52
57
  }
@@ -59,4 +64,24 @@ function scheduleToString(schedule, timezone) {
59
64
  }
60
65
  return scheduleString;
61
66
  }
67
+ /**
68
+ * Return human-readable cron schedule summary if the schedule is a valid cron
69
+ * else return null
70
+ */
71
+ function getReadableCronSchedule(scheduleText) {
72
+ // assuming if one schedule is cron the others in the array will be cron too
73
+ try {
74
+ new croner_1.CronPattern(scheduleText[0]); // validate cron
75
+ return scheduleText
76
+ .map((cron) => (0, string_1.capitalize)(cronstrue_1.default
77
+ .toString(cron, {
78
+ throwExceptionOnParseError: false,
79
+ })
80
+ .replace('Every minute, ', '')) + ` ( ${cron} )`)
81
+ .join(', ');
82
+ }
83
+ catch {
84
+ return null;
85
+ }
86
+ }
62
87
  //# sourceMappingURL=config-description.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"config-description.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/body/config-description.ts"],"names":[],"mappings":";;AAGA,wDA0CC;AA7CD,qDAAoD;AAGpD,SAAgB,sBAAsB,CAAC,MAAoB;IACzD,IAAI,MAAM,GAAG,kCAAkC,CAAC;IAChD,MAAM,IAAI,IAAA,eAAO,EAAC,uBAAuB,CAAC,CAAC;IAC3C,MAAM;QACJ,oBAAoB,GAAG,gBAAgB,CAAC,MAAM,CAAC,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAC5E,MAAM;QACJ,gBAAgB;YAChB,gBAAgB,CAAC,MAAM,CAAC,iBAAiB,EAAE,MAAM,CAAC,QAAQ,CAAC;YAC3D,GAAG,CAAC;IAEN,MAAM,IAAI,MAAM,CAAC;IACjB,MAAM,IAAI,IAAA,eAAO,EAAC,0CAA0C,CAAC,CAAC;IAC9D,IAAI,MAAM,CAAC,SAAS,EAAE,CAAC;QACrB,MAAM,IAAI,UAAU,CAAC;IACvB,CAAC;SAAM,IAAI,MAAM,CAAC,oBAAoB,EAAE,CAAC;QACvC,MAAM,IAAI,2DAA2D,CAAC;IACxE,CAAC;SAAM,CAAC;QACN,MAAM;YACJ,wEAAwE,CAAC;IAC7E,CAAC;IACD,MAAM,IAAI,MAAM,CAAC;IACjB,MAAM,IAAI,IAAA,eAAO,EAAC,0BAA0B,CAAC,CAAC;IAC9C,IAAI,MAAM,CAAC,UAAU,KAAK,oBAAoB,EAAE,CAAC;QAC/C,MAAM,IAAI,mCAAmC,CAAC;IAChD,CAAC;SAAM,IAAI,MAAM,CAAC,UAAU,KAAK,OAAO,IAAI,MAAM,CAAC,YAAY,EAAE,CAAC;QAChE,MAAM,IAAI,OAAO,CAAC;IACpB,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,gCAAgC,CAAC;IAC7C,CAAC;IACD,MAAM,IAAI,8CAA8C,CAAC;IACzD,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;QAC1B,MAAM,IAAI,IAAA,eAAO,EACf,yFAAyF,MAAM,CAAC,YAAY,EAAE,IAAI,4BAA4B,CAC/I,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,IAAA,eAAO,EACf,uEACE,MAAM,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,eACjD,aAAa,CACd,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,QAA8B,EAC9B,QAA4B;IAE5B,IAAI,cAAc,GAAG,EAAE,CAAC;IACxB,IAAI,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,KAAK,aAAa,EAAE,CAAC;QAC9C,cAAc,IAAI,IAAI,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC1C,IAAI,QAAQ,EAAE,CAAC;YACb,cAAc,IAAI,gBAAgB,QAAQ,EAAE,CAAC;QAC/C,CAAC;aAAM,CAAC;YACN,cAAc,IAAI,QAAQ,CAAC;QAC7B,CAAC;IACH,CAAC;SAAM,CAAC;QACN,cAAc,IAAI,mCAAmC,CAAC;IACxD,CAAC;IACD,OAAO,cAAc,CAAC;AACxB,CAAC","sourcesContent":["import { emojify } from '../../../../../util/emoji';\nimport type { BranchConfig } from '../../../../types';\n\nexport function getPrConfigDescription(config: BranchConfig): string {\n let prBody = `\\n\\n---\\n\\n### Configuration\\n\\n`;\n prBody += emojify(`:date: **Schedule**: `);\n prBody +=\n 'Branch creation - ' + scheduleToString(config.schedule, config.timezone);\n prBody +=\n ', Automerge - ' +\n scheduleToString(config.automergeSchedule, config.timezone) +\n '.';\n\n prBody += '\\n\\n';\n prBody += emojify(':vertical_traffic_light: **Automerge**: ');\n if (config.automerge) {\n prBody += 'Enabled.';\n } else if (config.automergedPreviously) {\n prBody += 'Disabled because a matching PR was automerged previously.';\n } else {\n prBody +=\n 'Disabled by config. Please merge this manually once you are satisfied.';\n }\n prBody += '\\n\\n';\n prBody += emojify(':recycle: **Rebasing**: ');\n if (config.rebaseWhen === 'behind-base-branch') {\n prBody += 'Whenever PR is behind base branch';\n } else if (config.rebaseWhen === 'never' || config.stopUpdating) {\n prBody += 'Never';\n } else {\n prBody += 'Whenever PR becomes conflicted';\n }\n prBody += `, or you tick the rebase/retry checkbox.\\n\\n`;\n if (config.recreateClosed) {\n prBody += emojify(\n `:ghost: **Immortal**: This PR will be recreated if closed unmerged. Get [config help](${config.productLinks?.help}) if that's undesired.\\n\\n`,\n );\n } else {\n prBody += emojify(\n `:no_bell: **Ignore**: Close this PR and you won't be reminded about ${\n config.upgrades.length === 1 ? 'this update' : 'these updates'\n } again.\\n\\n`,\n );\n }\n return prBody;\n}\n\nfunction scheduleToString(\n schedule: string[] | undefined,\n timezone: string | undefined,\n): string {\n let scheduleString = '';\n if (schedule && schedule[0] !== 'at any time') {\n scheduleString += `\"${String(schedule)}\"`;\n if (timezone) {\n scheduleString += ` in timezone ${timezone}`;\n } else {\n scheduleString += ` (UTC)`;\n }\n } else {\n scheduleString += 'At any time (no schedule defined)';\n }\n return scheduleString;\n}\n"]}
1
+ {"version":3,"file":"config-description.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/body/config-description.ts"],"names":[],"mappings":"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","sourcesContent":["import { CronPattern } from 'croner';\nimport cronstrue from 'cronstrue';\nimport { emojify } from '../../../../../util/emoji';\nimport { capitalize } from '../../../../../util/string';\nimport type { BranchConfig } from '../../../../types';\n\nexport function getPrConfigDescription(config: BranchConfig): string {\n let prBody = `\\n\\n---\\n\\n### Configuration\\n\\n`;\n prBody += emojify(`:date: **Schedule**: `);\n prBody +=\n 'Branch creation - ' + scheduleToString(config.schedule, config.timezone);\n prBody +=\n ', Automerge - ' +\n scheduleToString(config.automergeSchedule, config.timezone) +\n '.';\n\n prBody += '\\n\\n';\n prBody += emojify(':vertical_traffic_light: **Automerge**: ');\n if (config.automerge) {\n prBody += 'Enabled.';\n } else if (config.automergedPreviously) {\n prBody += 'Disabled because a matching PR was automerged previously.';\n } else {\n prBody +=\n 'Disabled by config. Please merge this manually once you are satisfied.';\n }\n prBody += '\\n\\n';\n prBody += emojify(':recycle: **Rebasing**: ');\n if (config.rebaseWhen === 'behind-base-branch') {\n prBody += 'Whenever PR is behind base branch';\n } else if (config.rebaseWhen === 'never' || config.stopUpdating) {\n prBody += 'Never';\n } else {\n prBody += 'Whenever PR becomes conflicted';\n }\n prBody += `, or you tick the rebase/retry checkbox.\\n\\n`;\n if (config.recreateClosed) {\n prBody += emojify(\n `:ghost: **Immortal**: This PR will be recreated if closed unmerged. Get [config help](${config.productLinks?.help}) if that's undesired.\\n\\n`,\n );\n } else {\n prBody += emojify(\n `:no_bell: **Ignore**: Close this PR and you won't be reminded about ${\n config.upgrades.length === 1 ? 'this update' : 'these updates'\n } again.\\n\\n`,\n );\n }\n return prBody;\n}\n\nfunction scheduleToString(\n schedule: string[] | undefined,\n timezone: string | undefined,\n): string {\n let scheduleString = '';\n if (schedule && schedule[0] !== 'at any time') {\n scheduleString =\n getReadableCronSchedule(schedule) ?? `\"${String(schedule)}\"`;\n if (timezone) {\n scheduleString += ` in timezone ${timezone}`;\n } else {\n scheduleString += ` (UTC)`;\n }\n } else {\n scheduleString += 'At any time (no schedule defined)';\n }\n return scheduleString;\n}\n\n/**\n * Return human-readable cron schedule summary if the schedule is a valid cron\n * else return null\n */\nfunction getReadableCronSchedule(scheduleText: string[]): string | null {\n // assuming if one schedule is cron the others in the array will be cron too\n try {\n new CronPattern(scheduleText[0]); // validate cron\n return scheduleText\n .map(\n (cron) =>\n capitalize(\n cronstrue\n .toString(cron, {\n throwExceptionOnParseError: false,\n })\n .replace('Every minute, ', ''),\n ) + ` ( ${cron} )`,\n )\n .join(', ');\n } catch {\n return null;\n }\n}\n"]}
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": "39.242.1",
4
+ "version": "39.243.0",
5
5
  "type": "commonjs",
6
6
  "bin": {
7
7
  "renovate": "dist/renovate.js",