renovate 44.198.2 → 44.199.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.
Files changed (60) hide show
  1. package/dist/data/replacements.js +11 -0
  2. package/dist/modules/manager/fingerprint.generated.js +1 -1
  3. package/dist/modules/manager/fingerprint.generated.js.map +1 -1
  4. package/dist/modules/manager/git-submodules/update.js +8 -2
  5. package/dist/modules/manager/git-submodules/update.js.map +1 -1
  6. package/dist/modules/manager/types.d.ts +8 -1
  7. package/dist/util/http/github.d.ts +4 -0
  8. package/dist/util/http/github.js +8 -2
  9. package/dist/util/http/github.js.map +1 -1
  10. package/dist/workers/repository/config-migration/branch/commit-message.js +9 -9
  11. package/dist/workers/repository/config-migration/branch/commit-message.js.map +1 -1
  12. package/dist/workers/repository/config-migration/branch/create.js +13 -16
  13. package/dist/workers/repository/config-migration/branch/create.js.map +1 -1
  14. package/dist/workers/repository/config-migration/branch/rebase.js +15 -20
  15. package/dist/workers/repository/config-migration/branch/rebase.js.map +1 -1
  16. package/dist/workers/repository/config-migration/pr/index.js +13 -58
  17. package/dist/workers/repository/config-migration/pr/index.js.map +1 -1
  18. package/dist/workers/repository/model/commit-body.js +27 -0
  19. package/dist/workers/repository/model/commit-body.js.map +1 -0
  20. package/dist/workers/repository/model/commit-config-file.js +40 -0
  21. package/dist/workers/repository/model/commit-config-file.js.map +1 -0
  22. package/dist/workers/repository/model/commit-message-factory.js.map +1 -1
  23. package/dist/workers/repository/onboarding/branch/commit-message.js +8 -17
  24. package/dist/workers/repository/onboarding/branch/commit-message.js.map +1 -1
  25. package/dist/workers/repository/onboarding/branch/create.js +9 -27
  26. package/dist/workers/repository/onboarding/branch/create.js.map +1 -1
  27. package/dist/workers/repository/onboarding/branch/rebase.js +9 -15
  28. package/dist/workers/repository/onboarding/branch/rebase.js.map +1 -1
  29. package/dist/workers/repository/onboarding/common.js +5 -1
  30. package/dist/workers/repository/onboarding/common.js.map +1 -1
  31. package/dist/workers/repository/onboarding/pr/index.js +16 -65
  32. package/dist/workers/repository/onboarding/pr/index.js.map +1 -1
  33. package/dist/workers/repository/process/lookup/filter-checks.js +1 -1
  34. package/dist/workers/repository/update/branch/automerge.js +2 -2
  35. package/dist/workers/repository/update/branch/automerge.js.map +1 -1
  36. package/dist/workers/repository/update/branch/check-existing.js +61 -1
  37. package/dist/workers/repository/update/branch/check-existing.js.map +1 -1
  38. package/dist/workers/repository/update/branch/errors.js +90 -0
  39. package/dist/workers/repository/update/branch/errors.js.map +1 -0
  40. package/dist/workers/repository/update/branch/get-updated.js +8 -5
  41. package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
  42. package/dist/workers/repository/update/branch/index.js +43 -302
  43. package/dist/workers/repository/update/branch/index.js.map +1 -1
  44. package/dist/workers/repository/update/branch/pr-blocked-by.js +25 -0
  45. package/dist/workers/repository/update/branch/pr-blocked-by.js.map +1 -0
  46. package/dist/workers/repository/update/branch/reuse.js +84 -7
  47. package/dist/workers/repository/update/branch/reuse.js.map +1 -1
  48. package/dist/workers/repository/update/branch/status-checks.js +84 -2
  49. package/dist/workers/repository/update/branch/status-checks.js.map +1 -1
  50. package/dist/workers/repository/update/pr/body/controls.js +6 -2
  51. package/dist/workers/repository/update/pr/body/controls.js.map +1 -1
  52. package/dist/workers/repository/update/pr/body/footer.js.map +1 -1
  53. package/dist/workers/repository/update/pr/body/header.js.map +1 -1
  54. package/dist/workers/repository/update/pr/body/index.js +2 -2
  55. package/dist/workers/repository/update/pr/ensure-config-pr.js +75 -0
  56. package/dist/workers/repository/update/pr/ensure-config-pr.js.map +1 -0
  57. package/dist/workers/repository/update/pr/index.js +6 -5
  58. package/dist/workers/repository/update/pr/index.js.map +1 -1
  59. package/package.json +1 -1
  60. package/renovate-schema.json +2 -2
@@ -1,17 +1,13 @@
1
1
  import { GlobalConfig } from "../../../../config/global.js";
2
2
  import { logger } from "../../../../logger/index.js";
3
3
  import { joinUrlParts } from "../../../../util/url.js";
4
- import { compile } from "../../../../util/template/index.js";
5
4
  import { emojify } from "../../../../util/emoji.js";
6
- import { hashBody } from "../../../../modules/platform/pr-body.js";
7
- import { scm } from "../../../../modules/platform/scm.js";
8
5
  import { platform } from "../../../../modules/platform/index.js";
9
6
  import { getMigrationBranchName } from "../common.js";
10
7
  import { ConfigMigrationCommitMessageFactory } from "../branch/commit-message.js";
11
- import { prepareLabels } from "../../update/pr/labels.js";
12
- import { addParticipants } from "../../update/pr/participants.js";
13
- import { getPlatformPrOptions } from "../../update/pr/index.js";
14
- import { isString } from "@sindresorhus/is";
8
+ import { getPrFooter } from "../../update/pr/body/footer.js";
9
+ import { getPrHeader } from "../../update/pr/body/header.js";
10
+ import { ensureConfigPr } from "../../update/pr/ensure-config-pr.js";
15
11
  //#region lib/workers/repository/config-migration/pr/index.ts
16
12
  async function ensureConfigMigrationPr(config, migratedConfigData) {
17
13
  logger.debug("ensureConfigMigrationPr()");
@@ -31,57 +27,16 @@ ${filename.endsWith(".json5") ? `#### [PLEASE NOTE](${docsLink}): JSON5 config f
31
27
  :no_bell: **Ignore**: Close this PR and you won't be reminded about config migration again, but one day your current config may no longer be valid.
32
28
 
33
29
  :question: Got questions? Does something look wrong to you? Please don't hesitate to [request help here](${GlobalConfig.get("productLinks").help}).\n\n`);
34
- if (isString(config.prHeader)) prBody = `${compile(config.prHeader, config)}\n\n${prBody}`;
35
- if (isString(config.prFooter)) prBody = `${prBody}\n---\n\n${compile(config.prFooter, config)}\n`;
36
- logger.trace({ prBody }, "prBody");
37
- prBody = platform.massageMarkdown(prBody, config.rebaseLabel);
38
- if (existingPr) {
39
- logger.debug("Found open migration PR");
40
- const prBodyHash = hashBody(prBody);
41
- if (existingPr.bodyStruct?.hash === prBodyHash && existingPr.title === prTitle) {
42
- logger.debug(`Pr does not need updating, PrNo: ${existingPr.number}`);
43
- return existingPr;
44
- }
45
- if (GlobalConfig.get("dryRun")) logger.info("DRY-RUN: Would update migration PR");
46
- else {
47
- await platform.updatePr({
48
- number: existingPr.number,
49
- prTitle,
50
- prBody
51
- });
52
- logger.info({ pr: existingPr.number }, "Migration PR updated");
53
- }
54
- return existingPr;
55
- }
56
- logger.debug("Creating migration PR");
57
- const labels = prepareLabels(config);
58
- try {
59
- if (GlobalConfig.get("dryRun")) logger.info("DRY-RUN: Would create migration PR");
60
- else {
61
- const pr = await platform.createPr({
62
- sourceBranch: branchName,
63
- targetBranch: config.defaultBranch,
64
- prTitle,
65
- prBody,
66
- labels,
67
- platformPrOptions: getPlatformPrOptions({
68
- ...config,
69
- automerge: false
70
- })
71
- });
72
- logger.info({ pr: pr?.number }, "Migration PR created");
73
- if (pr) await addParticipants(config, pr);
74
- return pr;
75
- }
76
- } catch (err) {
77
- if (err.response?.statusCode === 422 && err.response?.body?.errors?.[0]?.message?.startsWith("A pull request already exists")) {
78
- logger.warn({ err }, "Migration PR already exists but cannot find it. It was probably created by a different user.");
79
- await scm.deleteBranch(branchName);
80
- return null;
81
- }
82
- throw err;
83
- }
84
- return null;
30
+ prBody = `${getPrHeader(config)}${prBody}${getPrFooter(config)}`;
31
+ return await ensureConfigPr({
32
+ branchName,
33
+ targetBranch: config.defaultBranch,
34
+ prTitle,
35
+ prBody,
36
+ config,
37
+ existingPr,
38
+ type: "migration"
39
+ });
85
40
  }
86
41
  //#endregion
87
42
  export { ensureConfigMigrationPr };
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/config-migration/pr/index.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { hashBody } from '../../../../modules/platform/pr-body.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { joinUrlParts } from '../../../../util/url.ts';\nimport { getPlatformPrOptions } from '../../update/pr/index.ts';\nimport { prepareLabels } from '../../update/pr/labels.ts';\nimport { addParticipants } from '../../update/pr/participants.ts';\nimport { ConfigMigrationCommitMessageFactory } from '../branch/commit-message.ts';\nimport type { MigratedData } from '../branch/migrated-data.ts';\nimport { getMigrationBranchName } from '../common.ts';\n\nexport async function ensureConfigMigrationPr(\n config: RenovateConfig,\n migratedConfigData: MigratedData,\n): Promise<Pr | null> {\n logger.debug('ensureConfigMigrationPr()');\n const docsLink = joinUrlParts(\n GlobalConfig.get('productLinks').documentation,\n 'configuration-options/#configmigration',\n );\n const branchName = getMigrationBranchName(config);\n const commitMessageFactory = new ConfigMigrationCommitMessageFactory(\n config,\n migratedConfigData.filename,\n );\n\n const prTitle = commitMessageFactory.getPrTitle();\n const existingPr = await platform.getBranchPr(branchName, config.baseBranch);\n const filename = migratedConfigData.filename;\n logger.debug('Filling in config migration PR template');\n let prBody = `The Renovate config in this repository needs migrating. Typically this is because one or more configuration options you are using have been renamed.\n\n You don't need to merge this PR right away, because Renovate will continue to migrate these fields internally each time it runs. But later some of these fields may be fully deprecated and the migrations removed. So it's a good idea to merge this migration PR soon. \\n\\n`;\n prBody += emojify(\n `\n\n${\n filename.endsWith('.json5')\n ? `#### [PLEASE NOTE](${docsLink}): ` +\n `JSON5 config file migrated! All comments & trailing commas were removed.`\n : ''\n}\n\n:no_bell: **Ignore**: Close this PR and you won't be reminded about config migration again, but one day your current config may no longer be valid.\n\n:question: Got questions? Does something look wrong to you? Please don't hesitate to [request help here](${\n GlobalConfig.get('productLinks').help\n }).\\n\\n`,\n );\n\n if (isString(config.prHeader)) {\n prBody = `${template.compile(config.prHeader, config)}\\n\\n${prBody}`;\n }\n if (isString(config.prFooter)) {\n prBody = `${prBody}\\n---\\n\\n${template.compile(config.prFooter, config)}\\n`;\n }\n logger.trace({ prBody }, 'prBody');\n\n prBody = platform.massageMarkdown(prBody, config.rebaseLabel);\n\n if (existingPr) {\n logger.debug('Found open migration PR');\n // Check if existing PR needs updating\n const prBodyHash = hashBody(prBody);\n if (\n existingPr.bodyStruct?.hash === prBodyHash &&\n existingPr.title === prTitle\n ) {\n logger.debug(`Pr does not need updating, PrNo: ${existingPr.number}`);\n return existingPr;\n }\n // PR must need updating\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would update migration PR');\n } else {\n await platform.updatePr({\n number: existingPr.number,\n prTitle,\n prBody,\n });\n logger.info({ pr: existingPr.number }, 'Migration PR updated');\n }\n return existingPr;\n }\n logger.debug('Creating migration PR');\n const labels = prepareLabels(config);\n try {\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would create migration PR');\n } else {\n const pr = await platform.createPr({\n sourceBranch: branchName,\n // TODO #22198\n targetBranch: config.defaultBranch!,\n prTitle,\n prBody,\n labels,\n platformPrOptions: getPlatformPrOptions({\n ...config,\n automerge: false,\n }),\n });\n logger.info({ pr: pr?.number }, 'Migration PR created');\n if (pr) {\n await addParticipants(config, pr);\n }\n\n return pr;\n }\n } catch (err) {\n if (\n err.response?.statusCode === 422 &&\n err.response?.body?.errors?.[0]?.message?.startsWith(\n 'A pull request already exists',\n )\n ) {\n logger.warn(\n { err },\n 'Migration PR already exists but cannot find it. It was probably created by a different user.',\n );\n await scm.deleteBranch(branchName);\n return null;\n }\n throw err;\n }\n\n return null;\n}\n"],"mappings":";;;;;;;;;;;;;;;AAkBA,eAAsB,wBACpB,QACA,oBACoB;CACpB,OAAO,MAAM,2BAA2B;CACxC,MAAM,WAAW,aACf,aAAa,IAAI,cAAc,CAAC,CAAC,eACjC,wCACF;CACA,MAAM,aAAa,uBAAuB,MAAM;CAMhD,MAAM,UAAU,IALiB,oCAC/B,QACA,mBAAmB,QAGc,CAAC,CAAC,WAAW;CAChD,MAAM,aAAa,MAAM,SAAS,YAAY,YAAY,OAAO,UAAU;CAC3E,MAAM,WAAW,mBAAmB;CACpC,OAAO,MAAM,yCAAyC;CACtD,IAAI,SAAS;;;CAGb,UAAU,QACR;;EAGF,SAAS,SAAS,QAAQ,IACtB,sBAAsB,SAAS,+EAE/B,GACL;;;;2GAKK,aAAa,IAAI,cAAc,CAAC,CAAC,KAClC,OACH;CAEA,IAAI,SAAS,OAAO,QAAQ,GAC1B,SAAS,GAAGA,QAAiB,OAAO,UAAU,MAAM,EAAE,MAAM;CAE9D,IAAI,SAAS,OAAO,QAAQ,GAC1B,SAAS,GAAG,OAAO,WAAWA,QAAiB,OAAO,UAAU,MAAM,EAAE;CAE1E,OAAO,MAAM,EAAE,OAAO,GAAG,QAAQ;CAEjC,SAAS,SAAS,gBAAgB,QAAQ,OAAO,WAAW;CAE5D,IAAI,YAAY;EACd,OAAO,MAAM,yBAAyB;EAEtC,MAAM,aAAa,SAAS,MAAM;EAClC,IACE,WAAW,YAAY,SAAS,cAChC,WAAW,UAAU,SACrB;GACA,OAAO,MAAM,oCAAoC,WAAW,QAAQ;GACpE,OAAO;EACT;EAEA,IAAI,aAAa,IAAI,QAAQ,GAC3B,OAAO,KAAK,oCAAoC;OAC3C;GACL,MAAM,SAAS,SAAS;IACtB,QAAQ,WAAW;IACnB;IACA;GACF,CAAC;GACD,OAAO,KAAK,EAAE,IAAI,WAAW,OAAO,GAAG,sBAAsB;EAC/D;EACA,OAAO;CACT;CACA,OAAO,MAAM,uBAAuB;CACpC,MAAM,SAAS,cAAc,MAAM;CACnC,IAAI;EACF,IAAI,aAAa,IAAI,QAAQ,GAC3B,OAAO,KAAK,oCAAoC;OAC3C;GACL,MAAM,KAAK,MAAM,SAAS,SAAS;IACjC,cAAc;IAEd,cAAc,OAAO;IACrB;IACA;IACA;IACA,mBAAmB,qBAAqB;KACtC,GAAG;KACH,WAAW;IACb,CAAC;GACH,CAAC;GACD,OAAO,KAAK,EAAE,IAAI,IAAI,OAAO,GAAG,sBAAsB;GACtD,IAAI,IACF,MAAM,gBAAgB,QAAQ,EAAE;GAGlC,OAAO;EACT;CACF,SAAS,KAAK;EACZ,IACE,IAAI,UAAU,eAAe,OAC7B,IAAI,UAAU,MAAM,SAAS,EAAE,EAAE,SAAS,WACxC,+BACF,GACA;GACA,OAAO,KACL,EAAE,IAAI,GACN,8FACF;GACA,MAAM,IAAI,aAAa,UAAU;GACjC,OAAO;EACT;EACA,MAAM;CACR;CAEA,OAAO;AACT"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../../../../lib/workers/repository/config-migration/pr/index.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { joinUrlParts } from '../../../../util/url.ts';\nimport { getPrFooter } from '../../update/pr/body/footer.ts';\nimport { getPrHeader } from '../../update/pr/body/header.ts';\nimport { ensureConfigPr } from '../../update/pr/ensure-config-pr.ts';\nimport { ConfigMigrationCommitMessageFactory } from '../branch/commit-message.ts';\nimport type { MigratedData } from '../branch/migrated-data.ts';\nimport { getMigrationBranchName } from '../common.ts';\n\nexport async function ensureConfigMigrationPr(\n config: RenovateConfig,\n migratedConfigData: MigratedData,\n): Promise<Pr | null> {\n logger.debug('ensureConfigMigrationPr()');\n const docsLink = joinUrlParts(\n GlobalConfig.get('productLinks').documentation,\n 'configuration-options/#configmigration',\n );\n const branchName = getMigrationBranchName(config);\n const commitMessageFactory = new ConfigMigrationCommitMessageFactory(\n config,\n migratedConfigData.filename,\n );\n\n const prTitle = commitMessageFactory.getPrTitle();\n const existingPr = await platform.getBranchPr(branchName, config.baseBranch);\n const filename = migratedConfigData.filename;\n logger.debug('Filling in config migration PR template');\n let prBody = `The Renovate config in this repository needs migrating. Typically this is because one or more configuration options you are using have been renamed.\n\n You don't need to merge this PR right away, because Renovate will continue to migrate these fields internally each time it runs. But later some of these fields may be fully deprecated and the migrations removed. So it's a good idea to merge this migration PR soon. \\n\\n`;\n prBody += emojify(\n `\n\n${\n filename.endsWith('.json5')\n ? `#### [PLEASE NOTE](${docsLink}): ` +\n `JSON5 config file migrated! All comments & trailing commas were removed.`\n : ''\n}\n\n:no_bell: **Ignore**: Close this PR and you won't be reminded about config migration again, but one day your current config may no longer be valid.\n\n:question: Got questions? Does something look wrong to you? Please don't hesitate to [request help here](${\n GlobalConfig.get('productLinks').help\n }).\\n\\n`,\n );\n\n prBody = `${getPrHeader(config)}${prBody}${getPrFooter(config)}`;\n\n return await ensureConfigPr({\n branchName,\n // TODO #22198\n targetBranch: config.defaultBranch!,\n prTitle,\n prBody,\n config,\n existingPr,\n type: 'migration',\n });\n}\n"],"mappings":";;;;;;;;;;;AAcA,eAAsB,wBACpB,QACA,oBACoB;CACpB,OAAO,MAAM,2BAA2B;CACxC,MAAM,WAAW,aACf,aAAa,IAAI,cAAc,CAAC,CAAC,eACjC,wCACF;CACA,MAAM,aAAa,uBAAuB,MAAM;CAMhD,MAAM,UAAU,IALiB,oCAC/B,QACA,mBAAmB,QAGc,CAAC,CAAC,WAAW;CAChD,MAAM,aAAa,MAAM,SAAS,YAAY,YAAY,OAAO,UAAU;CAC3E,MAAM,WAAW,mBAAmB;CACpC,OAAO,MAAM,yCAAyC;CACtD,IAAI,SAAS;;;CAGb,UAAU,QACR;;EAGF,SAAS,SAAS,QAAQ,IACtB,sBAAsB,SAAS,+EAE/B,GACL;;;;2GAKK,aAAa,IAAI,cAAc,CAAC,CAAC,KAClC,OACH;CAEA,SAAS,GAAG,YAAY,MAAM,IAAI,SAAS,YAAY,MAAM;CAE7D,OAAO,MAAM,eAAe;EAC1B;EAEA,cAAc,OAAO;EACrB;EACA;EACA;EACA;EACA,MAAM;CACR,CAAC;AACH"}
@@ -0,0 +1,27 @@
1
+ import { logger } from "../../../logger/index.js";
2
+ import { withoutUrlCredentials } from "../../../util/url.js";
3
+ import { compile } from "../../../util/template/index.js";
4
+ import { filterValidCommitTrailers } from "../../../util/git/commit-trailers.js";
5
+ //#region lib/workers/repository/model/commit-body.ts
6
+ /**
7
+ * Appends the compiled `commitBody` to `message`, without URL credentials, or returns `message` unchanged when no `commitBody` is configured.
8
+ */
9
+ function compileCommitBody(config, message, context) {
10
+ if (!config.commitBody) return message;
11
+ const compiledMessage = `${message}\n\n${withoutUrlCredentials(compile(config.commitBody, context))}`;
12
+ logger.trace(`commitMessage: ${JSON.stringify(compiledMessage)}`);
13
+ return compiledMessage;
14
+ }
15
+ /**
16
+ * Compiles `commitTrailers` without URL credentials and drops the ones that are invalid after compilation, or returns `undefined` when none are configured.
17
+ */
18
+ function compileCommitTrailers(config, context) {
19
+ if (!config.commitTrailers) return;
20
+ const trailers = filterValidCommitTrailers(config.commitTrailers.map((trailer) => withoutUrlCredentials(compile(trailer, context))));
21
+ logger.trace(`commitTrailers: ${JSON.stringify(trailers)}`);
22
+ return trailers;
23
+ }
24
+ //#endregion
25
+ export { compileCommitBody, compileCommitTrailers };
26
+
27
+ //# sourceMappingURL=commit-body.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-body.js","names":[],"sources":["../../../../lib/workers/repository/model/commit-body.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { filterValidCommitTrailers } from '../../../util/git/commit-trailers.ts';\nimport { compile } from '../../../util/template/index.ts';\nimport { withoutUrlCredentials } from '../../../util/url.ts';\n\n/**\n * Appends the compiled `commitBody` to `message`, without URL credentials, or returns `message` unchanged when no `commitBody` is configured.\n */\nexport function compileCommitBody(\n config: Pick<RenovateConfig, 'commitBody'>,\n message: string,\n context: object,\n): string {\n if (!config.commitBody) {\n return message;\n }\n\n const compiledMessage = `${message}\\n\\n${withoutUrlCredentials(compile(config.commitBody, context))}`;\n logger.trace(`commitMessage: ${JSON.stringify(compiledMessage)}`);\n return compiledMessage;\n}\n\n/**\n * Compiles `commitTrailers` without URL credentials and drops the ones that are invalid after compilation, or returns `undefined` when none are configured.\n */\nexport function compileCommitTrailers(\n config: Pick<RenovateConfig, 'commitTrailers'>,\n context: object,\n): string[] | undefined {\n if (!config.commitTrailers) {\n return undefined;\n }\n\n // Template expansions can produce broken trailers\n const trailers = filterValidCommitTrailers(\n config.commitTrailers.map((trailer) =>\n withoutUrlCredentials(compile(trailer, context)),\n ),\n );\n logger.trace(`commitTrailers: ${JSON.stringify(trailers)}`);\n return trailers;\n}\n"],"mappings":";;;;;;;;AASA,SAAgB,kBACd,QACA,SACA,SACQ;CACR,IAAI,CAAC,OAAO,YACV,OAAO;CAGT,MAAM,kBAAkB,GAAG,QAAQ,MAAM,sBAAsB,QAAQ,OAAO,YAAY,OAAO,CAAC;CAClG,OAAO,MAAM,kBAAkB,KAAK,UAAU,eAAe,GAAG;CAChE,OAAO;AACT;;;;AAKA,SAAgB,sBACd,QACA,SACsB;CACtB,IAAI,CAAC,OAAO,gBACV;CAIF,MAAM,WAAW,0BACf,OAAO,eAAe,KAAK,YACzB,sBAAsB,QAAQ,SAAS,OAAO,CAAC,CACjD,CACF;CACA,OAAO,MAAM,mBAAmB,KAAK,UAAU,QAAQ,GAAG;CAC1D,OAAO;AACT"}
@@ -0,0 +1,40 @@
1
+ import { GlobalConfig } from "../../../config/global.js";
2
+ import { logger } from "../../../logger/index.js";
3
+ import { scm } from "../../../modules/platform/scm.js";
4
+ import { compileCommitBody, compileCommitTrailers } from "./commit-body.js";
5
+ import { CommitMessageFactory } from "./commit-message-factory.js";
6
+ //#region lib/workers/repository/model/commit-config-file.ts
7
+ /**
8
+ * Builds the commit message for a commit which writes a Renovate config file: the shared prefix and semantic commit handling of `CommitMessageFactory`, with a subject supplied by the caller.
9
+ */
10
+ function createConfigFileCommitMessage(config, subject) {
11
+ const commitMessage = new CommitMessageFactory(config).create();
12
+ commitMessage.subject = subject;
13
+ return commitMessage.toString();
14
+ }
15
+ /**
16
+ * Commits a Renovate config file to its branch, shared by onboarding and config migration.
17
+ */
18
+ async function commitConfigFile({ config, branchName, getFiles, message, prTitle, force, dryRunMessage }) {
19
+ if (GlobalConfig.get("dryRun")) {
20
+ logger.info(dryRunMessage);
21
+ return null;
22
+ }
23
+ const templateContext = { gitAuthor: config.gitAuthor };
24
+ const commitMessage = compileCommitBody(config, message, templateContext);
25
+ const trailers = compileCommitTrailers(config, templateContext);
26
+ return await scm.commitAndPush({
27
+ baseBranch: config.baseBranch,
28
+ branchName,
29
+ files: await getFiles(),
30
+ message: commitMessage,
31
+ trailers,
32
+ platformCommit: config.platformCommit,
33
+ force,
34
+ prTitle
35
+ });
36
+ }
37
+ //#endregion
38
+ export { commitConfigFile, createConfigFileCommitMessage };
39
+
40
+ //# sourceMappingURL=commit-config-file.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-config-file.js","names":[],"sources":["../../../../lib/workers/repository/model/commit-config-file.ts"],"sourcesContent":["import { GlobalConfig } from '../../../config/global.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { scm } from '../../../modules/platform/scm.ts';\nimport type { FileChange } from '../../../util/git/types.ts';\nimport { compileCommitBody, compileCommitTrailers } from './commit-body.ts';\nimport type { CommitMessageConfig } from './commit-message-factory.ts';\nimport { CommitMessageFactory } from './commit-message-factory.ts';\n\n/**\n * Builds the commit message for a commit which writes a Renovate config file: the shared prefix and semantic commit handling of `CommitMessageFactory`, with a subject supplied by the caller.\n */\nexport function createConfigFileCommitMessage(\n config: CommitMessageConfig,\n subject: string,\n): string {\n const commitMessageFactory = new CommitMessageFactory(config);\n const commitMessage = commitMessageFactory.create();\n commitMessage.subject = subject;\n return commitMessage.toString();\n}\n\nexport interface CommitConfigFileConfig {\n /** Supplies `baseBranch`, `platformCommit`, `commitBody`, `commitTrailers` and `gitAuthor` */\n config: Partial<RenovateConfig>;\n branchName: string;\n /** Called after the dry run check */\n getFiles: () => FileChange[] | Promise<FileChange[]>;\n message: string;\n /** Only needed by Gerrit platform */\n prTitle: string;\n force?: boolean;\n /** Logged instead of committing when `dryRun` is enabled */\n dryRunMessage: string;\n}\n\n/**\n * Commits a Renovate config file to its branch, shared by onboarding and config migration.\n */\nexport async function commitConfigFile({\n config,\n branchName,\n getFiles,\n message,\n prTitle,\n force,\n dryRunMessage,\n}: CommitConfigFileConfig): Promise<string | null> {\n if (GlobalConfig.get('dryRun')) {\n logger.info(dryRunMessage);\n return null;\n }\n\n // only allow the gitAuthor template value in the commitBody and commitTrailers\n const templateContext = { gitAuthor: config.gitAuthor };\n const commitMessage = compileCommitBody(config, message, templateContext);\n const trailers = compileCommitTrailers(config, templateContext);\n\n return await scm.commitAndPush({\n baseBranch: config.baseBranch,\n branchName,\n files: await getFiles(),\n message: commitMessage,\n trailers,\n platformCommit: config.platformCommit,\n force,\n // Only needed by Gerrit platform\n prTitle,\n });\n}\n"],"mappings":";;;;;;;;;AAYA,SAAgB,8BACd,QACA,SACQ;CAER,MAAM,gBAAgB,IADW,qBAAqB,MACb,CAAC,CAAC,OAAO;CAClD,cAAc,UAAU;CACxB,OAAO,cAAc,SAAS;AAChC;;;;AAmBA,eAAsB,iBAAiB,EACrC,QACA,YACA,UACA,SACA,SACA,OACA,iBACiD;CACjD,IAAI,aAAa,IAAI,QAAQ,GAAG;EAC9B,OAAO,KAAK,aAAa;EACzB,OAAO;CACT;CAGA,MAAM,kBAAkB,EAAE,WAAW,OAAO,UAAU;CACtD,MAAM,gBAAgB,kBAAkB,QAAQ,SAAS,eAAe;CACxE,MAAM,WAAW,sBAAsB,QAAQ,eAAe;CAE9D,OAAO,MAAM,IAAI,cAAc;EAC7B,YAAY,OAAO;EACnB;EACA,OAAO,MAAM,SAAS;EACtB,SAAS;EACT;EACA,gBAAgB,OAAO;EACvB;EAEA;CACF,CAAC;AACH"}
@@ -1 +1 @@
1
- {"version":3,"file":"commit-message-factory.js","names":[],"sources":["../../../../lib/workers/repository/model/commit-message-factory.ts"],"sourcesContent":["import type { RenovateSharedConfig } from '../../../config/types.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { CommitMessage } from './commit-message.ts';\nimport { CustomCommitMessage } from './custom-commit-message.ts';\nimport { SemanticCommitMessage } from './semantic-commit-message.ts';\n\ntype CommitMessageConfig = Pick<\n RenovateSharedConfig,\n | 'commitMessagePrefix'\n | 'semanticCommits'\n | 'semanticCommitScope'\n | 'semanticCommitType'\n>;\n\nexport class CommitMessageFactory {\n private readonly _config: CommitMessageConfig;\n\n constructor(config: CommitMessageConfig) {\n this._config = config;\n }\n\n create(): CommitMessage {\n const message = this.areSemanticCommitsEnabled\n ? this.createSemanticCommitMessage()\n : this.createCustomCommitMessage();\n\n return message;\n }\n\n private createSemanticCommitMessage(): SemanticCommitMessage {\n const message = new SemanticCommitMessage();\n\n message.type = coerceString(this._config.semanticCommitType);\n message.scope = coerceString(this._config.semanticCommitScope);\n\n return message;\n }\n\n private createCustomCommitMessage(): CustomCommitMessage {\n const message = new CustomCommitMessage();\n message.prefix = this._config.commitMessagePrefix ?? '';\n\n return message;\n }\n\n private get areSemanticCommitsEnabled(): boolean {\n return (\n !this._config.commitMessagePrefix &&\n this._config.semanticCommits === 'enabled'\n );\n }\n}\n"],"mappings":";;;;AAcA,IAAa,uBAAb,MAAkC;CAChC;CAEA,YAAY,QAA6B;EACvC,KAAK,UAAU;CACjB;CAEA,SAAwB;EAKtB,OAJgB,KAAK,4BACjB,KAAK,4BAA4B,IACjC,KAAK,0BAA0B;CAGrC;CAEA,8BAA6D;EAC3D,MAAM,UAAU,IAAI,sBAAsB;EAE1C,QAAQ,OAAO,aAAa,KAAK,QAAQ,kBAAkB;EAC3D,QAAQ,QAAQ,aAAa,KAAK,QAAQ,mBAAmB;EAE7D,OAAO;CACT;CAEA,4BAAyD;EACvD,MAAM,UAAU,IAAI,oBAAoB;EACxC,QAAQ,SAAS,KAAK,QAAQ,uBAAuB;EAErD,OAAO;CACT;CAEA,IAAY,4BAAqC;EAC/C,OACE,CAAC,KAAK,QAAQ,uBACd,KAAK,QAAQ,oBAAoB;CAErC;AACF"}
1
+ {"version":3,"file":"commit-message-factory.js","names":[],"sources":["../../../../lib/workers/repository/model/commit-message-factory.ts"],"sourcesContent":["import type { RenovateSharedConfig } from '../../../config/types.ts';\nimport { coerceString } from '../../../util/string.ts';\nimport type { CommitMessage } from './commit-message.ts';\nimport { CustomCommitMessage } from './custom-commit-message.ts';\nimport { SemanticCommitMessage } from './semantic-commit-message.ts';\n\nexport type CommitMessageConfig = Pick<\n RenovateSharedConfig,\n | 'commitMessagePrefix'\n | 'semanticCommits'\n | 'semanticCommitScope'\n | 'semanticCommitType'\n>;\n\nexport class CommitMessageFactory {\n private readonly _config: CommitMessageConfig;\n\n constructor(config: CommitMessageConfig) {\n this._config = config;\n }\n\n create(): CommitMessage {\n const message = this.areSemanticCommitsEnabled\n ? this.createSemanticCommitMessage()\n : this.createCustomCommitMessage();\n\n return message;\n }\n\n private createSemanticCommitMessage(): SemanticCommitMessage {\n const message = new SemanticCommitMessage();\n\n message.type = coerceString(this._config.semanticCommitType);\n message.scope = coerceString(this._config.semanticCommitScope);\n\n return message;\n }\n\n private createCustomCommitMessage(): CustomCommitMessage {\n const message = new CustomCommitMessage();\n message.prefix = this._config.commitMessagePrefix ?? '';\n\n return message;\n }\n\n private get areSemanticCommitsEnabled(): boolean {\n return (\n !this._config.commitMessagePrefix &&\n this._config.semanticCommits === 'enabled'\n );\n }\n}\n"],"mappings":";;;;AAcA,IAAa,uBAAb,MAAkC;CAChC;CAEA,YAAY,QAA6B;EACvC,KAAK,UAAU;CACjB;CAEA,SAAwB;EAKtB,OAJgB,KAAK,4BACjB,KAAK,4BAA4B,IACjC,KAAK,0BAA0B;CAGrC;CAEA,8BAA6D;EAC3D,MAAM,UAAU,IAAI,sBAAsB;EAE1C,QAAQ,OAAO,aAAa,KAAK,QAAQ,kBAAkB;EAC3D,QAAQ,QAAQ,aAAa,KAAK,QAAQ,mBAAmB;EAE7D,OAAO;CACT;CAEA,4BAAyD;EACvD,MAAM,UAAU,IAAI,oBAAoB;EACxC,QAAQ,SAAS,KAAK,QAAQ,uBAAuB;EAErD,OAAO;CACT;CAEA,IAAY,4BAAqC;EAC/C,OACE,CAAC,KAAK,QAAQ,uBACd,KAAK,QAAQ,oBAAoB;CAErC;AACF"}
@@ -1,22 +1,13 @@
1
1
  import { getInheritedOrGlobal } from "../../../../util/common.js";
2
- import { CommitMessageFactory } from "../../model/commit-message-factory.js";
2
+ import { createConfigFileCommitMessage } from "../../model/commit-config-file.js";
3
+ import { isNonEmptyString } from "@sindresorhus/is";
3
4
  //#region lib/workers/repository/onboarding/branch/commit-message.ts
4
- var OnboardingCommitMessageFactory = class {
5
- config;
6
- configFile;
7
- constructor(config, configFile) {
8
- this.config = config;
9
- this.configFile = configFile;
10
- }
11
- create() {
12
- const onboardingCommitMessage = getInheritedOrGlobal("onboardingCommitMessage");
13
- const commitMessage = new CommitMessageFactory(this.config).create();
14
- if (onboardingCommitMessage) commitMessage.subject = onboardingCommitMessage;
15
- else commitMessage.subject = `add ${this.configFile}`;
16
- return commitMessage;
17
- }
18
- };
5
+ function getOnboardingCommitMessage(config, configFile) {
6
+ const onboardingCommitMessage = getInheritedOrGlobal("onboardingCommitMessage");
7
+ const subject = isNonEmptyString(onboardingCommitMessage) ? onboardingCommitMessage : `add ${configFile}`;
8
+ return createConfigFileCommitMessage(config, subject);
9
+ }
19
10
  //#endregion
20
- export { OnboardingCommitMessageFactory };
11
+ export { getOnboardingCommitMessage };
21
12
 
22
13
  //# sourceMappingURL=commit-message.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"commit-message.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/branch/commit-message.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../../config/types.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport type { CommitMessage } from '../../model/commit-message.ts';\nimport { CommitMessageFactory } from '../../model/commit-message-factory.ts';\n\nexport class OnboardingCommitMessageFactory {\n private readonly config: RenovateConfig;\n\n private readonly configFile: string;\n\n constructor(config: RenovateConfig, configFile: string) {\n this.config = config;\n this.configFile = configFile;\n }\n\n create(): CommitMessage {\n const onboardingCommitMessage = getInheritedOrGlobal(\n 'onboardingCommitMessage',\n );\n const commitMessageFactory = new CommitMessageFactory(this.config);\n const commitMessage = commitMessageFactory.create();\n\n if (onboardingCommitMessage) {\n commitMessage.subject = onboardingCommitMessage;\n } else {\n commitMessage.subject = `add ${this.configFile}`;\n }\n\n return commitMessage;\n }\n}\n"],"mappings":";;;AAKA,IAAa,iCAAb,MAA4C;CAC1C;CAEA;CAEA,YAAY,QAAwB,YAAoB;EACtD,KAAK,SAAS;EACd,KAAK,aAAa;CACpB;CAEA,SAAwB;EACtB,MAAM,0BAA0B,qBAC9B,yBACF;EAEA,MAAM,gBAAgB,IADW,qBAAqB,KAAK,MAClB,CAAC,CAAC,OAAO;EAElD,IAAI,yBACF,cAAc,UAAU;OAExB,cAAc,UAAU,OAAO,KAAK;EAGtC,OAAO;CACT;AACF"}
1
+ {"version":3,"file":"commit-message.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/branch/commit-message.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { createConfigFileCommitMessage } from '../../model/commit-config-file.ts';\n\nexport function getOnboardingCommitMessage(\n config: RenovateConfig,\n configFile: string,\n): string {\n const onboardingCommitMessage = getInheritedOrGlobal(\n 'onboardingCommitMessage',\n );\n const subject = isNonEmptyString(onboardingCommitMessage)\n ? onboardingCommitMessage\n : `add ${configFile}`;\n\n return createConfigFileCommitMessage(config, subject);\n}\n"],"mappings":";;;;AAKA,SAAgB,2BACd,QACA,YACQ;CACR,MAAM,0BAA0B,qBAC9B,yBACF;CACA,MAAM,UAAU,iBAAiB,uBAAuB,IACpD,0BACA,OAAO;CAEX,OAAO,8BAA8B,QAAQ,OAAO;AACtD"}
@@ -1,45 +1,27 @@
1
- import { GlobalConfig } from "../../../../config/global.js";
2
- import { coerceArray } from "../../../../util/array.js";
3
1
  import { logger } from "../../../../logger/index.js";
4
2
  import { getInheritedOrGlobal } from "../../../../util/common.js";
5
- import { compile } from "../../../../util/template/index.js";
6
- import { filterValidCommitTrailers } from "../../../../util/git/commit-trailers.js";
7
- import { scm } from "../../../../modules/platform/scm.js";
3
+ import { commitConfigFile } from "../../model/commit-config-file.js";
8
4
  import { getOnboardingConfigContents } from "./config.js";
9
- import { getDefaultConfigFileName, getSemanticCommitPrTitle } from "../common.js";
10
- import { OnboardingCommitMessageFactory } from "./commit-message.js";
5
+ import { getDefaultConfigFileName, getOnboardingPrTitle } from "../common.js";
6
+ import { getOnboardingCommitMessage } from "./commit-message.js";
11
7
  //#region lib/workers/repository/onboarding/branch/create.ts
12
8
  async function createOnboardingBranch(config) {
13
9
  logger.debug("createOnboardingBranch()");
14
10
  const configFile = getDefaultConfigFileName();
15
11
  const contents = await getOnboardingConfigContents(config, configFile);
16
12
  logger.debug("Creating onboarding branch");
17
- let commitMessage = new OnboardingCommitMessageFactory(config, configFile).create().toString();
18
- if (config.commitBody) {
19
- commitMessage = `${commitMessage}\n\n${compile(config.commitBody, { gitAuthor: config.gitAuthor })}`;
20
- logger.trace(`commitMessage: ${commitMessage}`);
21
- }
22
- const compiledTrailers = coerceArray(config.commitTrailers).map((trailer) => compile(trailer, { gitAuthor: config.gitAuthor }));
23
- const trailers = filterValidCommitTrailers(compiledTrailers);
24
- // istanbul ignore if
25
- if (GlobalConfig.get("dryRun")) {
26
- logger.info("DRY-RUN: Would commit files to onboarding branch");
27
- return null;
28
- }
29
- const prTitle = config.semanticCommits === "enabled" ? getSemanticCommitPrTitle(config) : getInheritedOrGlobal("onboardingPrTitle");
30
- return scm.commitAndPush({
31
- baseBranch: config.baseBranch,
13
+ return await commitConfigFile({
14
+ config,
32
15
  branchName: getInheritedOrGlobal("onboardingBranch"),
33
- files: [{
16
+ getFiles: () => [{
34
17
  type: "addition",
35
18
  path: configFile,
36
19
  contents
37
20
  }],
38
- message: commitMessage,
39
- trailers,
40
- platformCommit: config.platformCommit,
21
+ message: getOnboardingCommitMessage(config, configFile),
22
+ prTitle: getOnboardingPrTitle(config),
41
23
  force: true,
42
- prTitle
24
+ dryRunMessage: "DRY-RUN: Would commit files to onboarding branch"
43
25
  });
44
26
  }
45
27
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"create.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/branch/create.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { filterValidCommitTrailers } from '../../../../util/git/commit-trailers.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport {\n getDefaultConfigFileName,\n getSemanticCommitPrTitle,\n} from '../common.ts';\nimport { OnboardingCommitMessageFactory } from './commit-message.ts';\nimport { getOnboardingConfigContents } from './config.ts';\n\nexport async function createOnboardingBranch(\n config: Partial<RenovateConfig>,\n): Promise<string | null> {\n logger.debug('createOnboardingBranch()');\n const configFile = getDefaultConfigFileName();\n // TODO #22198\n const contents = await getOnboardingConfigContents(config, configFile);\n logger.debug('Creating onboarding branch');\n\n const commitMessageFactory = new OnboardingCommitMessageFactory(\n config,\n configFile,\n );\n let commitMessage = commitMessageFactory.create().toString();\n\n if (config.commitBody) {\n commitMessage = `${commitMessage}\\n\\n${compile(\n config.commitBody,\n // only allow gitAuthor template value in the commitBody\n { gitAuthor: config.gitAuthor },\n )}`;\n\n logger.trace(`commitMessage: ${commitMessage}`);\n }\n\n // only allow gitAuthor template value in the commitTrailers\n const compiledTrailers = coerceArray(config.commitTrailers).map((trailer) =>\n compile(trailer, { gitAuthor: config.gitAuthor }),\n );\n const trailers = filterValidCommitTrailers(compiledTrailers);\n\n // istanbul ignore if\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would commit files to onboarding branch');\n return null;\n }\n\n const prTitle =\n config.semanticCommits === 'enabled'\n ? getSemanticCommitPrTitle(config)\n : getInheritedOrGlobal('onboardingPrTitle')!;\n\n return scm.commitAndPush({\n baseBranch: config.baseBranch,\n branchName: getInheritedOrGlobal('onboardingBranch')!,\n files: [\n {\n type: 'addition',\n // TODO #22198\n path: configFile,\n contents,\n },\n ],\n message: commitMessage,\n trailers,\n platformCommit: config.platformCommit,\n force: true,\n // Only needed by Gerrit platform\n prTitle,\n });\n}\n"],"mappings":";;;;;;;;;;;AAeA,eAAsB,uBACpB,QACwB;CACxB,OAAO,MAAM,0BAA0B;CACvC,MAAM,aAAa,yBAAyB;CAE5C,MAAM,WAAW,MAAM,4BAA4B,QAAQ,UAAU;CACrE,OAAO,MAAM,4BAA4B;CAMzC,IAAI,gBAAgB,IAJa,+BAC/B,QACA,UAEqC,CAAC,CAAC,OAAO,CAAC,CAAC,SAAS;CAE3D,IAAI,OAAO,YAAY;EACrB,gBAAgB,GAAG,cAAc,MAAM,QACrC,OAAO,YAEP,EAAE,WAAW,OAAO,UAAU,CAChC;EAEA,OAAO,MAAM,kBAAkB,eAAe;CAChD;CAGA,MAAM,mBAAmB,YAAY,OAAO,cAAc,CAAC,CAAC,KAAK,YAC/D,QAAQ,SAAS,EAAE,WAAW,OAAO,UAAU,CAAC,CAClD;CACA,MAAM,WAAW,0BAA0B,gBAAgB;;CAG3D,IAAI,aAAa,IAAI,QAAQ,GAAG;EAC9B,OAAO,KAAK,kDAAkD;EAC9D,OAAO;CACT;CAEA,MAAM,UACJ,OAAO,oBAAoB,YACvB,yBAAyB,MAAM,IAC/B,qBAAqB,mBAAmB;CAE9C,OAAO,IAAI,cAAc;EACvB,YAAY,OAAO;EACnB,YAAY,qBAAqB,kBAAkB;EACnD,OAAO,CACL;GACE,MAAM;GAEN,MAAM;GACN;EACF,CACF;EACA,SAAS;EACT;EACA,gBAAgB,OAAO;EACvB,OAAO;EAEP;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"create.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/branch/create.ts"],"sourcesContent":["import type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { commitConfigFile } from '../../model/commit-config-file.ts';\nimport { getDefaultConfigFileName, getOnboardingPrTitle } from '../common.ts';\nimport { getOnboardingCommitMessage } from './commit-message.ts';\nimport { getOnboardingConfigContents } from './config.ts';\n\nexport async function createOnboardingBranch(\n config: Partial<RenovateConfig>,\n): Promise<string | null> {\n logger.debug('createOnboardingBranch()');\n const configFile = getDefaultConfigFileName();\n // TODO #22198\n const contents = await getOnboardingConfigContents(config, configFile);\n logger.debug('Creating onboarding branch');\n\n return await commitConfigFile({\n config,\n branchName: getInheritedOrGlobal('onboardingBranch')!,\n // TODO #22198\n getFiles: () => [{ type: 'addition', path: configFile, contents }],\n message: getOnboardingCommitMessage(config, configFile),\n prTitle: getOnboardingPrTitle(config),\n force: true,\n dryRunMessage: 'DRY-RUN: Would commit files to onboarding branch',\n });\n}\n"],"mappings":";;;;;;;AAQA,eAAsB,uBACpB,QACwB;CACxB,OAAO,MAAM,0BAA0B;CACvC,MAAM,aAAa,yBAAyB;CAE5C,MAAM,WAAW,MAAM,4BAA4B,QAAQ,UAAU;CACrE,OAAO,MAAM,4BAA4B;CAEzC,OAAO,MAAM,iBAAiB;EAC5B;EACA,YAAY,qBAAqB,kBAAkB;EAEnD,gBAAgB,CAAC;GAAE,MAAM;GAAY,MAAM;GAAY;EAAS,CAAC;EACjE,SAAS,2BAA2B,QAAQ,UAAU;EACtD,SAAS,qBAAqB,MAAM;EACpC,OAAO;EACP,eAAe;CACjB,CAAC;AACH"}
@@ -2,10 +2,10 @@ import { GlobalConfig } from "../../../../config/global.js";
2
2
  import { logger } from "../../../../logger/index.js";
3
3
  import { toSha256 } from "../../../../util/hash.js";
4
4
  import { getInheritedOrGlobal } from "../../../../util/common.js";
5
- import { scm } from "../../../../modules/platform/scm.js";
5
+ import { commitConfigFile } from "../../model/commit-config-file.js";
6
6
  import { getOnboardingConfigContents } from "./config.js";
7
- import { getDefaultConfigFileName, getSemanticCommitPrTitle } from "../common.js";
8
- import { OnboardingCommitMessageFactory } from "./commit-message.js";
7
+ import { getDefaultConfigFileName, getOnboardingPrTitle } from "../common.js";
8
+ import { getOnboardingCommitMessage } from "./commit-message.js";
9
9
  //#region lib/workers/repository/onboarding/branch/rebase.ts
10
10
  async function rebaseOnboardingBranch(config, previousConfigHash) {
11
11
  logger.debug("Checking if onboarding branch needs rebasing");
@@ -30,23 +30,17 @@ async function rebaseOnboardingBranch(config, previousConfigHash) {
30
30
  previousConfigHash,
31
31
  currentConfigHash
32
32
  }, "Rebasing onboarding branch");
33
- if (GlobalConfig.get("dryRun")) {
34
- logger.info("DRY-RUN: Would rebase files in onboarding branch");
35
- return null;
36
- }
37
- const commitMessage = new OnboardingCommitMessageFactory(config, configFile).create();
38
- const prTitle = config.semanticCommits === "enabled" ? getSemanticCommitPrTitle(config) : getInheritedOrGlobal("onboardingPrTitle");
39
- return scm.commitAndPush({
40
- baseBranch: config.baseBranch,
33
+ return await commitConfigFile({
34
+ config,
41
35
  branchName: getInheritedOrGlobal("onboardingBranch"),
42
- files: [{
36
+ getFiles: () => [{
43
37
  type: "addition",
44
38
  path: configFile,
45
39
  contents
46
40
  }],
47
- message: commitMessage.toString(),
48
- platformCommit: config.platformCommit,
49
- prTitle
41
+ message: getOnboardingCommitMessage(config, configFile),
42
+ prTitle: getOnboardingPrTitle(config),
43
+ dryRunMessage: "DRY-RUN: Would rebase files in onboarding branch"
50
44
  });
51
45
  }
52
46
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"rebase.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/branch/rebase.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport {\n getDefaultConfigFileName,\n getSemanticCommitPrTitle,\n} from '../common.ts';\nimport { OnboardingCommitMessageFactory } from './commit-message.ts';\nimport { getOnboardingConfigContents } from './config.ts';\n\nexport async function rebaseOnboardingBranch(\n config: RenovateConfig,\n previousConfigHash: string | undefined,\n): Promise<string | null> {\n logger.debug('Checking if onboarding branch needs rebasing');\n\n // skip platforms that do not support html comments in pr\n const platform = GlobalConfig.get('platform');\n if (!['github', 'gitea', 'gitlab', 'forgejo'].includes(platform)) {\n logger.debug(\n `Skipping rebase as ${platform} does not support html comments`,\n );\n return null;\n }\n\n const configFile = getDefaultConfigFileName();\n const contents = await getOnboardingConfigContents(config, configFile);\n const currentConfigHash = toSha256(contents);\n\n if (previousConfigHash === currentConfigHash) {\n logger.debug('No rebase needed');\n return null;\n }\n logger.debug(\n { previousConfigHash, currentConfigHash },\n 'Rebasing onboarding branch',\n );\n\n if (GlobalConfig.get('dryRun')) {\n logger.info('DRY-RUN: Would rebase files in onboarding branch');\n return null;\n }\n\n const commitMessageFactory = new OnboardingCommitMessageFactory(\n config,\n configFile,\n );\n const commitMessage = commitMessageFactory.create();\n\n const prTitle =\n config.semanticCommits === 'enabled'\n ? getSemanticCommitPrTitle(config)\n : getInheritedOrGlobal('onboardingPrTitle')!;\n\n // TODO #22198\n return scm.commitAndPush({\n baseBranch: config.baseBranch,\n branchName: getInheritedOrGlobal('onboardingBranch')!,\n files: [\n {\n type: 'addition',\n path: configFile,\n contents,\n },\n ],\n message: commitMessage.toString(),\n platformCommit: config.platformCommit,\n // Only needed by Gerrit platform\n prTitle,\n });\n}\n"],"mappings":";;;;;;;;;AAaA,eAAsB,uBACpB,QACA,oBACwB;CACxB,OAAO,MAAM,8CAA8C;CAG3D,MAAM,WAAW,aAAa,IAAI,UAAU;CAC5C,IAAI,CAAC;EAAC;EAAU;EAAS;EAAU;CAAS,CAAC,CAAC,SAAS,QAAQ,GAAG;EAChE,OAAO,MACL,sBAAsB,SAAS,gCACjC;EACA,OAAO;CACT;CAEA,MAAM,aAAa,yBAAyB;CAC5C,MAAM,WAAW,MAAM,4BAA4B,QAAQ,UAAU;CACrE,MAAM,oBAAoB,SAAS,QAAQ;CAE3C,IAAI,uBAAuB,mBAAmB;EAC5C,OAAO,MAAM,kBAAkB;EAC/B,OAAO;CACT;CACA,OAAO,MACL;EAAE;EAAoB;CAAkB,GACxC,4BACF;CAEA,IAAI,aAAa,IAAI,QAAQ,GAAG;EAC9B,OAAO,KAAK,kDAAkD;EAC9D,OAAO;CACT;CAMA,MAAM,gBAAgB,IAJW,+BAC/B,QACA,UAEuC,CAAC,CAAC,OAAO;CAElD,MAAM,UACJ,OAAO,oBAAoB,YACvB,yBAAyB,MAAM,IAC/B,qBAAqB,mBAAmB;CAG9C,OAAO,IAAI,cAAc;EACvB,YAAY,OAAO;EACnB,YAAY,qBAAqB,kBAAkB;EACnD,OAAO,CACL;GACE,MAAM;GACN,MAAM;GACN;EACF,CACF;EACA,SAAS,cAAc,SAAS;EAChC,gBAAgB,OAAO;EAEvB;CACF,CAAC;AACH"}
1
+ {"version":3,"file":"rebase.js","names":[],"sources":["../../../../../lib/workers/repository/onboarding/branch/rebase.ts"],"sourcesContent":["import { GlobalConfig } from '../../../../config/global.ts';\nimport type { RenovateConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { getInheritedOrGlobal } from '../../../../util/common.ts';\nimport { toSha256 } from '../../../../util/hash.ts';\nimport { commitConfigFile } from '../../model/commit-config-file.ts';\nimport { getDefaultConfigFileName, getOnboardingPrTitle } from '../common.ts';\nimport { getOnboardingCommitMessage } from './commit-message.ts';\nimport { getOnboardingConfigContents } from './config.ts';\n\nexport async function rebaseOnboardingBranch(\n config: RenovateConfig,\n previousConfigHash: string | undefined,\n): Promise<string | null> {\n logger.debug('Checking if onboarding branch needs rebasing');\n\n // skip platforms that do not support html comments in pr\n const platform = GlobalConfig.get('platform');\n if (!['github', 'gitea', 'gitlab', 'forgejo'].includes(platform)) {\n logger.debug(\n `Skipping rebase as ${platform} does not support html comments`,\n );\n return null;\n }\n\n const configFile = getDefaultConfigFileName();\n const contents = await getOnboardingConfigContents(config, configFile);\n const currentConfigHash = toSha256(contents);\n\n if (previousConfigHash === currentConfigHash) {\n logger.debug('No rebase needed');\n return null;\n }\n logger.debug(\n { previousConfigHash, currentConfigHash },\n 'Rebasing onboarding branch',\n );\n\n return await commitConfigFile({\n config,\n branchName: getInheritedOrGlobal('onboardingBranch')!,\n // TODO #22198\n getFiles: () => [{ type: 'addition', path: configFile, contents }],\n message: getOnboardingCommitMessage(config, configFile),\n prTitle: getOnboardingPrTitle(config),\n dryRunMessage: 'DRY-RUN: Would rebase files in onboarding branch',\n });\n}\n"],"mappings":";;;;;;;;;AAUA,eAAsB,uBACpB,QACA,oBACwB;CACxB,OAAO,MAAM,8CAA8C;CAG3D,MAAM,WAAW,aAAa,IAAI,UAAU;CAC5C,IAAI,CAAC;EAAC;EAAU;EAAS;EAAU;CAAS,CAAC,CAAC,SAAS,QAAQ,GAAG;EAChE,OAAO,MACL,sBAAsB,SAAS,gCACjC;EACA,OAAO;CACT;CAEA,MAAM,aAAa,yBAAyB;CAC5C,MAAM,WAAW,MAAM,4BAA4B,QAAQ,UAAU;CACrE,MAAM,oBAAoB,SAAS,QAAQ;CAE3C,IAAI,uBAAuB,mBAAmB;EAC5C,OAAO,MAAM,kBAAkB;EAC/B,OAAO;CACT;CACA,OAAO,MACL;EAAE;EAAoB;CAAkB,GACxC,4BACF;CAEA,OAAO,MAAM,iBAAiB;EAC5B;EACA,YAAY,qBAAqB,kBAAkB;EAEnD,gBAAgB,CAAC;GAAE,MAAM;GAAY,MAAM;GAAY;EAAS,CAAC;EACjE,SAAS,2BAA2B,QAAQ,UAAU;EACtD,SAAS,qBAAqB,MAAM;EACpC,eAAe;CACjB,CAAC;AACH"}
@@ -6,6 +6,10 @@ import { getInheritedOrGlobal } from "../../../util/common.js";
6
6
  function getSemanticCommitPrTitle(config) {
7
7
  return `${config.semanticCommitType ?? "chore"}: ${getInheritedOrGlobal("onboardingPrTitle")}`;
8
8
  }
9
+ function getOnboardingPrTitle(config) {
10
+ if (config.semanticCommits === "enabled") return getSemanticCommitPrTitle(config);
11
+ return getInheritedOrGlobal("onboardingPrTitle");
12
+ }
9
13
  function getDefaultConfigFileName() {
10
14
  const configFileNames = getConfigFileNames();
11
15
  const onboardingConfigFileName = getInheritedOrGlobal("onboardingConfigFileName");
@@ -34,6 +38,6 @@ var OnboardingState = class OnboardingState {
34
38
  }
35
39
  };
36
40
  //#endregion
37
- export { OnboardingState, getDefaultConfigFileName, getSemanticCommitPrTitle };
41
+ export { OnboardingState, getDefaultConfigFileName, getOnboardingPrTitle, getSemanticCommitPrTitle };
38
42
 
39
43
  //# sourceMappingURL=common.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"common.js","names":["memCache.get"],"sources":["../../../../lib/workers/repository/onboarding/common.ts"],"sourcesContent":["import { getConfigFileNames } from '../../../config/app-strings.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\n\nexport function getSemanticCommitPrTitle(config: RenovateConfig): string {\n return `${config.semanticCommitType ?? 'chore'}: ${getInheritedOrGlobal('onboardingPrTitle')}`;\n}\n\nexport function getDefaultConfigFileName(): string {\n const configFileNames = getConfigFileNames();\n const onboardingConfigFileName = getInheritedOrGlobal(\n 'onboardingConfigFileName',\n );\n return configFileNames.includes(onboardingConfigFileName!)\n ? onboardingConfigFileName!\n : configFileNames[0];\n}\n\nexport class OnboardingState {\n private static readonly cacheKey = 'OnboardingState';\n private static readonly skipKey = 'OnboardingStateValid';\n\n static get prUpdateRequested(): boolean {\n const updateRequested = !!memCache.get<boolean | undefined>(\n OnboardingState.cacheKey,\n );\n logger.trace(\n { value: updateRequested },\n 'Get OnboardingState.prUpdateRequested',\n );\n return updateRequested;\n }\n\n static set prUpdateRequested(value: boolean) {\n logger.trace({ value }, 'Set OnboardingState.prUpdateRequested');\n memCache.set(OnboardingState.cacheKey, value);\n }\n\n static get onboardingCacheValid(): boolean {\n const cacheValid = !!memCache.get<boolean | undefined>(\n OnboardingState.skipKey,\n );\n logger.trace(\n { value: cacheValid },\n 'Get OnboardingState.onboardingCacheValid',\n );\n return cacheValid;\n }\n\n static set onboardingCacheValid(value: boolean) {\n logger.trace({ value }, 'Set OnboardingState.onboardingCacheValid');\n memCache.set(OnboardingState.skipKey, value);\n }\n}\n"],"mappings":";;;;;AAMA,SAAgB,yBAAyB,QAAgC;CACvE,OAAO,GAAG,OAAO,sBAAsB,QAAQ,IAAI,qBAAqB,mBAAmB;AAC7F;AAEA,SAAgB,2BAAmC;CACjD,MAAM,kBAAkB,mBAAmB;CAC3C,MAAM,2BAA2B,qBAC/B,0BACF;CACA,OAAO,gBAAgB,SAAS,wBAAyB,IACrD,2BACA,gBAAgB;AACtB;AAEA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAwB,WAAW;CACnC,OAAwB,UAAU;CAElC,WAAW,oBAA6B;EACtC,MAAM,kBAAkB,CAAC,CAACA,IACxB,gBAAgB,QAClB;EACA,OAAO,MACL,EAAE,OAAO,gBAAgB,GACzB,uCACF;EACA,OAAO;CACT;CAEA,WAAW,kBAAkB,OAAgB;EAC3C,OAAO,MAAM,EAAE,MAAM,GAAG,uCAAuC;EAC/D,IAAa,gBAAgB,UAAU,KAAK;CAC9C;CAEA,WAAW,uBAAgC;EACzC,MAAM,aAAa,CAAC,CAACA,IACnB,gBAAgB,OAClB;EACA,OAAO,MACL,EAAE,OAAO,WAAW,GACpB,0CACF;EACA,OAAO;CACT;CAEA,WAAW,qBAAqB,OAAgB;EAC9C,OAAO,MAAM,EAAE,MAAM,GAAG,0CAA0C;EAClE,IAAa,gBAAgB,SAAS,KAAK;CAC7C;AACF"}
1
+ {"version":3,"file":"common.js","names":["memCache.get"],"sources":["../../../../lib/workers/repository/onboarding/common.ts"],"sourcesContent":["import { getConfigFileNames } from '../../../config/app-strings.ts';\nimport type { RenovateConfig } from '../../../config/types.ts';\nimport { logger } from '../../../logger/index.ts';\nimport * as memCache from '../../../util/cache/memory/index.ts';\nimport { getInheritedOrGlobal } from '../../../util/common.ts';\n\nexport function getSemanticCommitPrTitle(config: RenovateConfig): string {\n return `${config.semanticCommitType ?? 'chore'}: ${getInheritedOrGlobal('onboardingPrTitle')}`;\n}\n\nexport function getOnboardingPrTitle(config: RenovateConfig): string {\n if (config.semanticCommits === 'enabled') {\n return getSemanticCommitPrTitle(config);\n }\n // TODO #22198\n return getInheritedOrGlobal('onboardingPrTitle')!;\n}\n\nexport function getDefaultConfigFileName(): string {\n const configFileNames = getConfigFileNames();\n const onboardingConfigFileName = getInheritedOrGlobal(\n 'onboardingConfigFileName',\n );\n return configFileNames.includes(onboardingConfigFileName!)\n ? onboardingConfigFileName!\n : configFileNames[0];\n}\n\nexport class OnboardingState {\n private static readonly cacheKey = 'OnboardingState';\n private static readonly skipKey = 'OnboardingStateValid';\n\n static get prUpdateRequested(): boolean {\n const updateRequested = !!memCache.get<boolean | undefined>(\n OnboardingState.cacheKey,\n );\n logger.trace(\n { value: updateRequested },\n 'Get OnboardingState.prUpdateRequested',\n );\n return updateRequested;\n }\n\n static set prUpdateRequested(value: boolean) {\n logger.trace({ value }, 'Set OnboardingState.prUpdateRequested');\n memCache.set(OnboardingState.cacheKey, value);\n }\n\n static get onboardingCacheValid(): boolean {\n const cacheValid = !!memCache.get<boolean | undefined>(\n OnboardingState.skipKey,\n );\n logger.trace(\n { value: cacheValid },\n 'Get OnboardingState.onboardingCacheValid',\n );\n return cacheValid;\n }\n\n static set onboardingCacheValid(value: boolean) {\n logger.trace({ value }, 'Set OnboardingState.onboardingCacheValid');\n memCache.set(OnboardingState.skipKey, value);\n }\n}\n"],"mappings":";;;;;AAMA,SAAgB,yBAAyB,QAAgC;CACvE,OAAO,GAAG,OAAO,sBAAsB,QAAQ,IAAI,qBAAqB,mBAAmB;AAC7F;AAEA,SAAgB,qBAAqB,QAAgC;CACnE,IAAI,OAAO,oBAAoB,WAC7B,OAAO,yBAAyB,MAAM;CAGxC,OAAO,qBAAqB,mBAAmB;AACjD;AAEA,SAAgB,2BAAmC;CACjD,MAAM,kBAAkB,mBAAmB;CAC3C,MAAM,2BAA2B,qBAC/B,0BACF;CACA,OAAO,gBAAgB,SAAS,wBAAyB,IACrD,2BACA,gBAAgB;AACtB;AAEA,IAAa,kBAAb,MAAa,gBAAgB;CAC3B,OAAwB,WAAW;CACnC,OAAwB,UAAU;CAElC,WAAW,oBAA6B;EACtC,MAAM,kBAAkB,CAAC,CAACA,IACxB,gBAAgB,QAClB;EACA,OAAO,MACL,EAAE,OAAO,gBAAgB,GACzB,uCACF;EACA,OAAO;CACT;CAEA,WAAW,kBAAkB,OAAgB;EAC3C,OAAO,MAAM,EAAE,MAAM,GAAG,uCAAuC;EAC/D,IAAa,gBAAgB,UAAU,KAAK;CAC9C;CAEA,WAAW,uBAAgC;EACzC,MAAM,aAAa,CAAC,CAACA,IACnB,gBAAgB,OAClB;EACA,OAAO,MACL,EAAE,OAAO,WAAW,GACpB,0CACF;EACA,OAAO;CACT;CAEA,WAAW,qBAAqB,OAAgB;EAC9C,OAAO,MAAM,EAAE,MAAM,GAAG,0CAA0C;EAClE,IAAa,gBAAgB,SAAS,KAAK;CAC7C;AACF"}
@@ -3,25 +3,23 @@ import { GlobalConfig } from "../../../../config/global.js";
3
3
  import { logger } from "../../../../logger/index.js";
4
4
  import { toSha256 } from "../../../../util/hash.js";
5
5
  import { getInheritedOrGlobal } from "../../../../util/common.js";
6
- import { compile } from "../../../../util/template/index.js";
7
6
  import { getFile } from "../../../../util/git/index.js";
8
7
  import { getElapsedDays } from "../../../../util/date.js";
9
8
  import { emojify } from "../../../../util/emoji.js";
10
- import { hashBody } from "../../../../modules/platform/pr-body.js";
11
- import { scm } from "../../../../modules/platform/scm.js";
12
9
  import { platform } from "../../../../modules/platform/index.js";
13
10
  import { isOnboardingBranchConflicted } from "../branch/onboarding-branch-cache.js";
14
- import { OnboardingState, getDefaultConfigFileName, getSemanticCommitPrTitle } from "../common.js";
11
+ import { OnboardingState, getDefaultConfigFileName, getOnboardingPrTitle } from "../common.js";
12
+ import { getPrFooter } from "../../update/pr/body/footer.js";
13
+ import { getPrHeader } from "../../update/pr/body/header.js";
15
14
  import { ensureComment } from "../../../../modules/platform/comment.js";
16
15
  import { getDepWarningsOnboardingPR, getErrors, getWarnings } from "../../errors-warnings.js";
17
- import { prepareLabels } from "../../update/pr/labels.js";
18
- import { addParticipants } from "../../update/pr/participants.js";
19
- import { getPlatformPrOptions } from "../../update/pr/index.js";
16
+ import { getRebaseCheckbox } from "../../update/pr/body/controls.js";
17
+ import { ensureConfigPr } from "../../update/pr/ensure-config-pr.js";
20
18
  import { getBaseBranchDesc } from "./base-branch.js";
21
19
  import { getConfigDesc } from "./config-description.js";
22
20
  import { getPackageFilesDesc, getPackageFilesSummary } from "./package-files.js";
23
21
  import { getExpectedPrList, getExpectedPrListSummary } from "./pr-list.js";
24
- import { isNumber, isString } from "@sindresorhus/is";
22
+ import { isNumber } from "@sindresorhus/is";
25
23
  //#region lib/workers/repository/onboarding/pr/index.ts
26
24
  /**
27
25
  * Given an existing PR, if onboardingAutoCloseAge has passed, close the PR.
@@ -109,10 +107,7 @@ function fillOnboardingPrBody(prTemplate, sections) {
109
107
  return prBody;
110
108
  }
111
109
  function finalizeOnboardingPrBody(prBody, config, onboardingConfigHashComment) {
112
- let finalPrBody = prBody;
113
- if (isString(config.prHeader)) finalPrBody = `${compile(config.prHeader, config)}\n\n${finalPrBody}`;
114
- if (isString(config.prFooter)) finalPrBody = `${finalPrBody}\n---\n\n${compile(config.prFooter, config)}\n`;
115
- return finalPrBody + onboardingConfigHashComment;
110
+ return `${getPrHeader(config)}${prBody}${getPrFooter(config)}${onboardingConfigHashComment}`;
116
111
  }
117
112
  async function ensureOnboardingPr(config, packageFiles, branches) {
118
113
  if (config.onboardingRebaseCheckbox && !OnboardingState.prUpdateRequested) return "onboarding";
@@ -171,61 +166,17 @@ async function ensureOnboardingPr(config, packageFiles, branches) {
171
166
  }), config, onboardingConfigHashComment);
172
167
  } else prBody = prBody.replace(prList, prListSummary);
173
168
  }
174
- logger.trace(`prBody:\n${prBody}`);
175
- prBody = platform.massageMarkdown(prBody, config.rebaseLabel);
176
- if (existingPr) {
177
- logger.debug("Found open onboarding PR");
178
- const prBodyHash = hashBody(prBody);
179
- if (existingPr.bodyStruct?.hash === prBodyHash) {
180
- logger.debug(`Pull Request #${existingPr.number} does not need updating`);
181
- return "onboarding";
182
- }
183
- if (GlobalConfig.get("dryRun")) logger.info("DRY-RUN: Would update onboarding PR");
184
- else {
185
- await platform.updatePr({
186
- number: existingPr.number,
187
- prTitle: existingPr.title,
188
- prBody
189
- });
190
- logger.info({ pr: existingPr.number }, "Onboarding PR updated");
191
- }
192
- return "onboarding";
193
- }
194
- logger.debug("Creating onboarding PR");
195
- const labels = prepareLabels(config);
196
- try {
197
- if (GlobalConfig.get("dryRun")) logger.info("DRY-RUN: Would create onboarding PR");
198
- else {
199
- const prTitle = config.semanticCommits === "enabled" ? getSemanticCommitPrTitle(config) : getInheritedOrGlobal("onboardingPrTitle");
200
- const pr = await platform.createPr({
201
- sourceBranch: onboardingBranch,
202
- targetBranch: config.defaultBranch,
203
- prTitle,
204
- prBody,
205
- labels,
206
- platformPrOptions: getPlatformPrOptions({
207
- ...config,
208
- automerge: false
209
- })
210
- });
211
- logger.info({ pr: `Pull Request #${pr.number}` }, "Onboarding PR created");
212
- await addParticipants(config, pr);
213
- }
214
- } catch (err) {
215
- if (err.response?.statusCode === 422 && err.response?.body?.errors?.[0]?.message?.startsWith("A pull request already exists")) {
216
- logger.warn("Onboarding PR already exists but cannot find it. It was probably created by a different user.");
217
- await scm.deleteBranch(onboardingBranch);
218
- return "onboarding";
219
- }
220
- throw err;
221
- }
169
+ await ensureConfigPr({
170
+ branchName: onboardingBranch,
171
+ targetBranch: config.defaultBranch,
172
+ prTitle: existingPr?.title ?? getOnboardingPrTitle(config),
173
+ prBody,
174
+ config,
175
+ existingPr,
176
+ type: "onboarding"
177
+ });
222
178
  return "onboarding";
223
179
  }
224
- function getRebaseCheckbox(onboardingRebaseCheckbox) {
225
- let rebaseCheckBox = "";
226
- if (onboardingRebaseCheckbox) rebaseCheckBox = `\n\n---\n\n - [ ] <!-- rebase-check -->If you want to rebase/retry this PR, click this checkbox.\n`;
227
- return rebaseCheckBox;
228
- }
229
180
  async function getOnboardingConfigHashComment() {
230
181
  const configFile = getDefaultConfigFileName();
231
182
  const existingContents = await getFile(configFile, getInheritedOrGlobal("onboardingBranch")) ?? "";