renovate 44.17.0 → 44.17.2

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 (456) hide show
  1. package/dist/config/migrations/custom/ignore-npmrc-file-migration.js +2 -1
  2. package/dist/config/migrations/custom/ignore-npmrc-file-migration.js.map +1 -1
  3. package/dist/config/migrations/custom/stability-days-migration.js +1 -3
  4. package/dist/config/migrations/custom/stability-days-migration.js.map +1 -1
  5. package/dist/config/options/index.js +1 -1
  6. package/dist/config/options/index.js.map +1 -1
  7. package/dist/config/secrets.js +2 -1
  8. package/dist/config/secrets.js.map +1 -1
  9. package/dist/config/validation.js +1 -3
  10. package/dist/config/validation.js.map +1 -1
  11. package/dist/config-validator.js +2 -1
  12. package/dist/config-validator.js.map +1 -1
  13. package/dist/expose.js.map +1 -1
  14. package/dist/global-config-option-defaults.generated.js +1 -1
  15. package/dist/global-config-option-defaults.generated.js.map +1 -1
  16. package/dist/modules/datasource/artifactory/index.js +2 -1
  17. package/dist/modules/datasource/artifactory/index.js.map +1 -1
  18. package/dist/modules/datasource/aws-eks-addon/index.js +2 -1
  19. package/dist/modules/datasource/aws-eks-addon/index.js.map +1 -1
  20. package/dist/modules/datasource/aws-machine-image/index.js +3 -2
  21. package/dist/modules/datasource/aws-machine-image/index.js.map +1 -1
  22. package/dist/modules/datasource/bazel/index.js +2 -1
  23. package/dist/modules/datasource/bazel/index.js.map +1 -1
  24. package/dist/modules/datasource/bitbucket-server-tags/index.js +4 -2
  25. package/dist/modules/datasource/bitbucket-server-tags/index.js.map +1 -1
  26. package/dist/modules/datasource/bitbucket-tags/index.js +2 -1
  27. package/dist/modules/datasource/bitbucket-tags/index.js.map +1 -1
  28. package/dist/modules/datasource/bitrise/index.js +2 -1
  29. package/dist/modules/datasource/bitrise/index.js.map +1 -1
  30. package/dist/modules/datasource/common.js +4 -2
  31. package/dist/modules/datasource/common.js.map +1 -1
  32. package/dist/modules/datasource/crate/index.js +12 -5
  33. package/dist/modules/datasource/crate/index.js.map +1 -1
  34. package/dist/modules/datasource/custom/formats/toml.js +2 -1
  35. package/dist/modules/datasource/custom/formats/toml.js.map +1 -1
  36. package/dist/modules/datasource/custom/formats/yaml.js +4 -2
  37. package/dist/modules/datasource/custom/formats/yaml.js.map +1 -1
  38. package/dist/modules/datasource/deb/checksum.js +2 -1
  39. package/dist/modules/datasource/deb/checksum.js.map +1 -1
  40. package/dist/modules/datasource/deb/packages.js +3 -1
  41. package/dist/modules/datasource/deb/packages.js.map +1 -1
  42. package/dist/modules/datasource/deno/index.js +2 -1
  43. package/dist/modules/datasource/deno/index.js.map +1 -1
  44. package/dist/modules/datasource/docker/common.js +3 -2
  45. package/dist/modules/datasource/docker/common.js.map +1 -1
  46. package/dist/modules/datasource/docker/dockerhub-cache.js +1 -1
  47. package/dist/modules/datasource/docker/dockerhub-cache.js.map +1 -1
  48. package/dist/modules/datasource/docker/index.js +11 -10
  49. package/dist/modules/datasource/docker/index.js.map +1 -1
  50. package/dist/modules/datasource/forgejo-tags/index.js +4 -2
  51. package/dist/modules/datasource/forgejo-tags/index.js.map +1 -1
  52. package/dist/modules/datasource/galaxy-collection/index.js +5 -3
  53. package/dist/modules/datasource/galaxy-collection/index.js.map +1 -1
  54. package/dist/modules/datasource/git-refs/base.js +2 -1
  55. package/dist/modules/datasource/git-refs/base.js.map +1 -1
  56. package/dist/modules/datasource/git-refs/index.js +1 -1
  57. package/dist/modules/datasource/git-refs/index.js.map +1 -1
  58. package/dist/modules/datasource/gitea-tags/index.js +4 -2
  59. package/dist/modules/datasource/gitea-tags/index.js.map +1 -1
  60. package/dist/modules/datasource/github-release-attachments/index.js +3 -2
  61. package/dist/modules/datasource/github-release-attachments/index.js.map +1 -1
  62. package/dist/modules/datasource/github-tags/index.js +1 -1
  63. package/dist/modules/datasource/github-tags/index.js.map +1 -1
  64. package/dist/modules/datasource/gitlab-tags/index.js +2 -1
  65. package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
  66. package/dist/modules/datasource/gitlab-tags/util.js +2 -1
  67. package/dist/modules/datasource/gitlab-tags/util.js.map +1 -1
  68. package/dist/modules/datasource/go/releases-goproxy.js +8 -5
  69. package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
  70. package/dist/modules/datasource/jenkins-plugins/index.js +1 -1
  71. package/dist/modules/datasource/jenkins-plugins/index.js.map +1 -1
  72. package/dist/modules/datasource/jsr/index.js +2 -1
  73. package/dist/modules/datasource/jsr/index.js.map +1 -1
  74. package/dist/modules/datasource/maven/index.js +3 -2
  75. package/dist/modules/datasource/maven/index.js.map +1 -1
  76. package/dist/modules/datasource/maven/util.js +1 -1
  77. package/dist/modules/datasource/maven/util.js.map +1 -1
  78. package/dist/modules/datasource/nuget/v2.js +3 -2
  79. package/dist/modules/datasource/nuget/v2.js.map +1 -1
  80. package/dist/modules/datasource/nuget/v3.js +9 -5
  81. package/dist/modules/datasource/nuget/v3.js.map +1 -1
  82. package/dist/modules/datasource/packagist/index.js +7 -4
  83. package/dist/modules/datasource/packagist/index.js.map +1 -1
  84. package/dist/modules/datasource/rpm/providers/common.js +3 -1
  85. package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
  86. package/dist/modules/datasource/rpm/repomd.js +2 -1
  87. package/dist/modules/datasource/rpm/repomd.js.map +1 -1
  88. package/dist/modules/datasource/ruby-version/index.js +2 -1
  89. package/dist/modules/datasource/ruby-version/index.js.map +1 -1
  90. package/dist/modules/datasource/rubygems/metadata-cache.js +1 -1
  91. package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
  92. package/dist/modules/datasource/sbt-package/index.js +8 -5
  93. package/dist/modules/datasource/sbt-package/index.js.map +1 -1
  94. package/dist/modules/datasource/sbt-package/util.js +2 -1
  95. package/dist/modules/datasource/sbt-package/util.js.map +1 -1
  96. package/dist/modules/datasource/terraform-module/index.js +4 -2
  97. package/dist/modules/datasource/terraform-module/index.js.map +1 -1
  98. package/dist/modules/datasource/terraform-module/utils.js +2 -1
  99. package/dist/modules/datasource/terraform-module/utils.js.map +1 -1
  100. package/dist/modules/datasource/terraform-provider/index.js +2 -1
  101. package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
  102. package/dist/modules/datasource/typst/schema.js +4 -2
  103. package/dist/modules/datasource/typst/schema.js.map +1 -1
  104. package/dist/modules/manager/ansible-galaxy/collections.js +2 -2
  105. package/dist/modules/manager/ansible-galaxy/collections.js.map +1 -1
  106. package/dist/modules/manager/ansible-galaxy/extract.js +5 -3
  107. package/dist/modules/manager/ansible-galaxy/extract.js.map +1 -1
  108. package/dist/modules/manager/bazel/artifacts.js +1 -1
  109. package/dist/modules/manager/bazel/artifacts.js.map +1 -1
  110. package/dist/modules/manager/bazel/parser.js +1 -1
  111. package/dist/modules/manager/bazel/parser.js.map +1 -1
  112. package/dist/modules/manager/bazel/rules/index.js +7 -2
  113. package/dist/modules/manager/bazel/rules/index.js.map +1 -1
  114. package/dist/modules/manager/bazel-module/extract.js +2 -1
  115. package/dist/modules/manager/bazel-module/extract.js.map +1 -1
  116. package/dist/modules/manager/bazel-module/parser/extension-tags.js +3 -2
  117. package/dist/modules/manager/bazel-module/parser/extension-tags.js.map +1 -1
  118. package/dist/modules/manager/bazel-module/rules.js +1 -3
  119. package/dist/modules/manager/bazel-module/rules.js.map +1 -1
  120. package/dist/modules/manager/bitbucket-pipelines/extract.js +5 -3
  121. package/dist/modules/manager/bitbucket-pipelines/extract.js.map +1 -1
  122. package/dist/modules/manager/buildkite/extract.js +1 -1
  123. package/dist/modules/manager/buildkite/extract.js.map +1 -1
  124. package/dist/modules/manager/bun/extract.js +2 -1
  125. package/dist/modules/manager/bun/extract.js.map +1 -1
  126. package/dist/modules/manager/bundler/artifacts.js +3 -2
  127. package/dist/modules/manager/bundler/artifacts.js.map +1 -1
  128. package/dist/modules/manager/cargo/artifacts.js +3 -2
  129. package/dist/modules/manager/cargo/artifacts.js.map +1 -1
  130. package/dist/modules/manager/cocoapods/artifacts.js +2 -1
  131. package/dist/modules/manager/cocoapods/artifacts.js.map +1 -1
  132. package/dist/modules/manager/composer/update-locked.js +1 -1
  133. package/dist/modules/manager/composer/update-locked.js.map +1 -1
  134. package/dist/modules/manager/conan/artifacts.js +4 -2
  135. package/dist/modules/manager/conan/artifacts.js.map +1 -1
  136. package/dist/modules/manager/custom/jsonata/index.js +1 -3
  137. package/dist/modules/manager/custom/jsonata/index.js.map +1 -1
  138. package/dist/modules/manager/custom/jsonata/utils.js +1 -3
  139. package/dist/modules/manager/custom/jsonata/utils.js.map +1 -1
  140. package/dist/modules/manager/custom/regex/index.js +1 -3
  141. package/dist/modules/manager/custom/regex/index.js.map +1 -1
  142. package/dist/modules/manager/custom/regex/strategies.js +7 -6
  143. package/dist/modules/manager/custom/regex/strategies.js.map +1 -1
  144. package/dist/modules/manager/custom/regex/utils.js +1 -3
  145. package/dist/modules/manager/custom/regex/utils.js.map +1 -1
  146. package/dist/modules/manager/docker-compose/extract.js +2 -2
  147. package/dist/modules/manager/docker-compose/extract.js.map +1 -1
  148. package/dist/modules/manager/droneci/extract.js +1 -1
  149. package/dist/modules/manager/droneci/extract.js.map +1 -1
  150. package/dist/modules/manager/flux/artifacts.js +5 -3
  151. package/dist/modules/manager/flux/artifacts.js.map +1 -1
  152. package/dist/modules/manager/flux/extract.js +2 -6
  153. package/dist/modules/manager/flux/extract.js.map +1 -1
  154. package/dist/modules/manager/git-submodules/extract.js +5 -4
  155. package/dist/modules/manager/git-submodules/extract.js.map +1 -1
  156. package/dist/modules/manager/github-actions/extract.js +2 -1
  157. package/dist/modules/manager/github-actions/extract.js.map +1 -1
  158. package/dist/modules/manager/gitlabci/extract.js +1 -1
  159. package/dist/modules/manager/gitlabci/extract.js.map +1 -1
  160. package/dist/modules/manager/gitlabci/schema.js +2 -1
  161. package/dist/modules/manager/gitlabci/schema.js.map +1 -1
  162. package/dist/modules/manager/gitlabci-include/extract.js +1 -1
  163. package/dist/modules/manager/gitlabci-include/extract.js.map +1 -1
  164. package/dist/modules/manager/gleam/artifacts.js +2 -1
  165. package/dist/modules/manager/gleam/artifacts.js.map +1 -1
  166. package/dist/modules/manager/gomod/artifacts.js +2 -1
  167. package/dist/modules/manager/gomod/artifacts.js.map +1 -1
  168. package/dist/modules/manager/gradle/artifacts.js +3 -1
  169. package/dist/modules/manager/gradle/artifacts.js.map +1 -1
  170. package/dist/modules/manager/gradle/extract/catalog.js +3 -1
  171. package/dist/modules/manager/gradle/extract/catalog.js.map +1 -1
  172. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js +2 -1
  173. package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js.map +1 -1
  174. package/dist/modules/manager/gradle/extract.js +4 -2
  175. package/dist/modules/manager/gradle/extract.js.map +1 -1
  176. package/dist/modules/manager/gradle/parser/handlers.js +4 -2
  177. package/dist/modules/manager/gradle/parser/handlers.js.map +1 -1
  178. package/dist/modules/manager/gradle/parser/registry-urls.js +3 -2
  179. package/dist/modules/manager/gradle/parser/registry-urls.js.map +1 -1
  180. package/dist/modules/manager/gradle-wrapper/utils.js +2 -1
  181. package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
  182. package/dist/modules/manager/helm-values/extract.js +1 -1
  183. package/dist/modules/manager/helm-values/extract.js.map +1 -1
  184. package/dist/modules/manager/helmfile/utils.js +3 -2
  185. package/dist/modules/manager/helmfile/utils.js.map +1 -1
  186. package/dist/modules/manager/helmsman/extract.js +1 -1
  187. package/dist/modules/manager/helmsman/extract.js.map +1 -1
  188. package/dist/modules/manager/helmv3/artifacts.js +3 -2
  189. package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
  190. package/dist/modules/manager/jenkins/extract.js +1 -1
  191. package/dist/modules/manager/jenkins/extract.js.map +1 -1
  192. package/dist/modules/manager/jsonnet-bundler/artifacts.js +1 -1
  193. package/dist/modules/manager/jsonnet-bundler/artifacts.js.map +1 -1
  194. package/dist/modules/manager/kustomize/artifacts.js +3 -4
  195. package/dist/modules/manager/kustomize/artifacts.js.map +1 -1
  196. package/dist/modules/manager/kustomize/extract.js +1 -1
  197. package/dist/modules/manager/kustomize/extract.js.map +1 -1
  198. package/dist/modules/manager/leiningen/extract.js +2 -1
  199. package/dist/modules/manager/leiningen/extract.js.map +1 -1
  200. package/dist/modules/manager/maven/extract.js +6 -6
  201. package/dist/modules/manager/maven/extract.js.map +1 -1
  202. package/dist/modules/manager/maven-wrapper/artifacts.js +4 -1
  203. package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
  204. package/dist/modules/manager/meteor/extract.js +1 -1
  205. package/dist/modules/manager/meteor/extract.js.map +1 -1
  206. package/dist/modules/manager/mix/artifacts.js +2 -1
  207. package/dist/modules/manager/mix/artifacts.js.map +1 -1
  208. package/dist/modules/manager/nix/extract.js +0 -1
  209. package/dist/modules/manager/nix/extract.js.map +1 -1
  210. package/dist/modules/manager/npm/artifacts.js +2 -1
  211. package/dist/modules/manager/npm/artifacts.js.map +1 -1
  212. package/dist/modules/manager/npm/extract/common/package-file.js +1 -1
  213. package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
  214. package/dist/modules/manager/npm/extract/pnpm.js +2 -1
  215. package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
  216. package/dist/modules/manager/npm/extract/yarn.js +3 -2
  217. package/dist/modules/manager/npm/extract/yarn.js.map +1 -1
  218. package/dist/modules/manager/npm/post-update/index.js +9 -7
  219. package/dist/modules/manager/npm/post-update/index.js.map +1 -1
  220. package/dist/modules/manager/npm/post-update/npm.js +7 -4
  221. package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
  222. package/dist/modules/manager/npm/post-update/pnpm.js +1 -1
  223. package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
  224. package/dist/modules/manager/npm/update/dependency/index.js +2 -1
  225. package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
  226. package/dist/modules/manager/npm/update/index.js +5 -0
  227. package/dist/modules/manager/npm/update/index.js.map +1 -0
  228. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +1 -1
  229. package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
  230. package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js +21 -16
  231. package/dist/modules/manager/npm/update/locked-dependency/package-lock/index.js.map +1 -1
  232. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js +2 -2
  233. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js.map +1 -1
  234. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js +1 -1
  235. package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/index.js.map +1 -1
  236. package/dist/modules/manager/npm/utils.js +3 -3
  237. package/dist/modules/manager/npm/utils.js.map +1 -1
  238. package/dist/modules/manager/nuget/artifacts.js +2 -1
  239. package/dist/modules/manager/nuget/artifacts.js.map +1 -1
  240. package/dist/modules/manager/nuget/update.js +2 -1
  241. package/dist/modules/manager/nuget/update.js.map +1 -1
  242. package/dist/modules/manager/pep621/processors/pdm.js +2 -1
  243. package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
  244. package/dist/modules/manager/pep621/schema.js +2 -1
  245. package/dist/modules/manager/pep621/schema.js.map +1 -1
  246. package/dist/modules/manager/pip-compile/artifacts.js +2 -1
  247. package/dist/modules/manager/pip-compile/artifacts.js.map +1 -1
  248. package/dist/modules/manager/pip_requirements/artifacts.js +5 -3
  249. package/dist/modules/manager/pip_requirements/artifacts.js.map +1 -1
  250. package/dist/modules/manager/pipenv/extract.js +2 -1
  251. package/dist/modules/manager/pipenv/extract.js.map +1 -1
  252. package/dist/modules/manager/poetry/artifacts.js +3 -2
  253. package/dist/modules/manager/poetry/artifacts.js.map +1 -1
  254. package/dist/modules/manager/poetry/extract.js +2 -1
  255. package/dist/modules/manager/poetry/extract.js.map +1 -1
  256. package/dist/modules/manager/pre-commit/extract.js +5 -3
  257. package/dist/modules/manager/pre-commit/extract.js.map +1 -1
  258. package/dist/modules/manager/puppet/puppetfile-parser.js +2 -1
  259. package/dist/modules/manager/puppet/puppetfile-parser.js.map +1 -1
  260. package/dist/modules/manager/quadlet/extract.js +2 -1
  261. package/dist/modules/manager/quadlet/extract.js.map +1 -1
  262. package/dist/modules/manager/sbt/extract.js +1 -1
  263. package/dist/modules/manager/sbt/extract.js.map +1 -1
  264. package/dist/modules/manager/swift/extract.js +4 -6
  265. package/dist/modules/manager/swift/extract.js.map +1 -1
  266. package/dist/modules/manager/terraform/lockfile/index.js +4 -3
  267. package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
  268. package/dist/modules/manager/terraform/util.js +2 -1
  269. package/dist/modules/manager/terraform/util.js.map +1 -1
  270. package/dist/modules/manager/terragrunt/extract.js +3 -9
  271. package/dist/modules/manager/terragrunt/extract.js.map +1 -1
  272. package/dist/modules/manager/tflint-plugin/extract.js +1 -1
  273. package/dist/modules/manager/tflint-plugin/extract.js.map +1 -1
  274. package/dist/modules/manager/vendir/artifacts.js +3 -2
  275. package/dist/modules/manager/vendir/artifacts.js.map +1 -1
  276. package/dist/modules/platform/azure/index.js +8 -7
  277. package/dist/modules/platform/azure/index.js.map +1 -1
  278. package/dist/modules/platform/bitbucket/comments.js +2 -2
  279. package/dist/modules/platform/bitbucket/comments.js.map +1 -1
  280. package/dist/modules/platform/bitbucket/index.js +9 -8
  281. package/dist/modules/platform/bitbucket/index.js.map +1 -1
  282. package/dist/modules/platform/bitbucket-server/index.js +8 -9
  283. package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
  284. package/dist/modules/platform/codecommit/codecommit-client.js +8 -5
  285. package/dist/modules/platform/codecommit/codecommit-client.js.map +1 -1
  286. package/dist/modules/platform/codecommit/index.js +5 -5
  287. package/dist/modules/platform/codecommit/index.js.map +1 -1
  288. package/dist/modules/platform/forgejo/forgejo-helper.js +5 -3
  289. package/dist/modules/platform/forgejo/forgejo-helper.js.map +1 -1
  290. package/dist/modules/platform/forgejo/index.js +15 -8
  291. package/dist/modules/platform/forgejo/index.js.map +1 -1
  292. package/dist/modules/platform/gerrit/client.js +2 -1
  293. package/dist/modules/platform/gerrit/client.js.map +1 -1
  294. package/dist/modules/platform/gerrit/index.js +4 -2
  295. package/dist/modules/platform/gerrit/index.js.map +1 -1
  296. package/dist/modules/platform/gerrit/utils.js +1 -1
  297. package/dist/modules/platform/gerrit/utils.js.map +1 -1
  298. package/dist/modules/platform/gitea/gitea-helper.js +5 -3
  299. package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
  300. package/dist/modules/platform/gitea/index.js +16 -9
  301. package/dist/modules/platform/gitea/index.js.map +1 -1
  302. package/dist/modules/platform/github/index.js +27 -24
  303. package/dist/modules/platform/github/index.js.map +1 -1
  304. package/dist/modules/platform/github/massage-markdown-links.js +1 -1
  305. package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
  306. package/dist/modules/platform/github/pr.js +1 -1
  307. package/dist/modules/platform/github/pr.js.map +1 -1
  308. package/dist/modules/platform/github/schema.js +3 -2
  309. package/dist/modules/platform/github/schema.js.map +1 -1
  310. package/dist/modules/platform/gitlab/index.js +19 -14
  311. package/dist/modules/platform/gitlab/index.js.map +1 -1
  312. package/dist/modules/platform/local/scm.js +1 -1
  313. package/dist/modules/platform/local/scm.js.map +1 -1
  314. package/dist/modules/platform/util.js +2 -1
  315. package/dist/modules/platform/util.js.map +1 -1
  316. package/dist/modules/versioning/cargo/index.js +1 -1
  317. package/dist/modules/versioning/cargo/index.js.map +1 -1
  318. package/dist/modules/versioning/conan/index.js +4 -2
  319. package/dist/modules/versioning/conan/index.js.map +1 -1
  320. package/dist/modules/versioning/nixpkgs/index.js +2 -1
  321. package/dist/modules/versioning/nixpkgs/index.js.map +1 -1
  322. package/dist/modules/versioning/nuget/index.js +4 -2
  323. package/dist/modules/versioning/nuget/index.js.map +1 -1
  324. package/dist/modules/versioning/nuget/range.js +4 -2
  325. package/dist/modules/versioning/nuget/range.js.map +1 -1
  326. package/dist/modules/versioning/pep440/range.js +1 -1
  327. package/dist/modules/versioning/pep440/range.js.map +1 -1
  328. package/dist/modules/versioning/perl/index.js +1 -1
  329. package/dist/modules/versioning/perl/index.js.map +1 -1
  330. package/dist/modules/versioning/poetry/index.js +2 -2
  331. package/dist/modules/versioning/poetry/index.js.map +1 -1
  332. package/dist/modules/versioning/rez/index.js +5 -5
  333. package/dist/modules/versioning/rez/index.js.map +1 -1
  334. package/dist/modules/versioning/ruby/strategies/bump.js +3 -2
  335. package/dist/modules/versioning/ruby/strategies/bump.js.map +1 -1
  336. package/dist/modules/versioning/ruby/strategies/replace.js +3 -2
  337. package/dist/modules/versioning/ruby/strategies/replace.js.map +1 -1
  338. package/dist/modules/versioning/ruby/strategies/widen.js +3 -2
  339. package/dist/modules/versioning/ruby/strategies/widen.js.map +1 -1
  340. package/dist/util/cache/package/index.js +3 -1
  341. package/dist/util/cache/package/index.js.map +1 -1
  342. package/dist/util/cache/package/with-cache.js +7 -4
  343. package/dist/util/cache/package/with-cache.js.map +1 -1
  344. package/dist/util/cache/repository/impl/base.js +3 -2
  345. package/dist/util/cache/repository/impl/base.js.map +1 -1
  346. package/dist/util/cache/repository/impl/local.js +2 -1
  347. package/dist/util/cache/repository/impl/local.js.map +1 -1
  348. package/dist/util/cache/repository/impl/s3.js +4 -1
  349. package/dist/util/cache/repository/impl/s3.js.map +1 -1
  350. package/dist/util/date.js +1 -1
  351. package/dist/util/date.js.map +1 -1
  352. package/dist/util/emoji.js +6 -2
  353. package/dist/util/emoji.js.map +1 -1
  354. package/dist/util/exec/common.js +1 -1
  355. package/dist/util/exec/common.js.map +1 -1
  356. package/dist/util/exec/docker/index.js +2 -1
  357. package/dist/util/exec/docker/index.js.map +1 -1
  358. package/dist/util/exec/hermit.js +2 -1
  359. package/dist/util/exec/hermit.js.map +1 -1
  360. package/dist/util/exec/index.js +1 -1
  361. package/dist/util/exec/index.js.map +1 -1
  362. package/dist/util/fs/index.js +2 -1
  363. package/dist/util/fs/index.js.map +1 -1
  364. package/dist/util/git/index.js +32 -34
  365. package/dist/util/git/index.js.map +1 -1
  366. package/dist/util/git/url.js +2 -3
  367. package/dist/util/git/url.js.map +1 -1
  368. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js +4 -2
  369. package/dist/util/github/graphql/cache-strategies/memory-cache-strategy.js.map +1 -1
  370. package/dist/util/github/graphql/datasource-fetcher.js +3 -1
  371. package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
  372. package/dist/util/http/cache/memory-http-cache-provider.js +2 -1
  373. package/dist/util/http/cache/memory-http-cache-provider.js.map +1 -1
  374. package/dist/util/http/github.js +3 -2
  375. package/dist/util/http/github.js.map +1 -1
  376. package/dist/util/http/http.js +2 -1
  377. package/dist/util/http/http.js.map +1 -1
  378. package/dist/util/http/index.js +1 -0
  379. package/dist/util/http/index.js.map +1 -1
  380. package/dist/util/http/www-authenticate.js +1 -3
  381. package/dist/util/http/www-authenticate.js.map +1 -1
  382. package/dist/util/mutex.js +1 -1
  383. package/dist/util/mutex.js.map +1 -1
  384. package/dist/util/schema-utils/index.js +1 -1
  385. package/dist/util/schema-utils/index.js.map +1 -1
  386. package/dist/util/toml.js +2 -1
  387. package/dist/util/toml.js.map +1 -1
  388. package/dist/util/yaml.js +4 -2
  389. package/dist/util/yaml.js.map +1 -1
  390. package/dist/workers/global/config/parse/util.js.map +1 -1
  391. package/dist/workers/global/index.js +2 -2
  392. package/dist/workers/global/index.js.map +1 -1
  393. package/dist/workers/repository/changelog/index.js +2 -1
  394. package/dist/workers/repository/changelog/index.js.map +1 -1
  395. package/dist/workers/repository/config-migration/branch/rebase.js +2 -1
  396. package/dist/workers/repository/config-migration/branch/rebase.js.map +1 -1
  397. package/dist/workers/repository/error-config.js +1 -1
  398. package/dist/workers/repository/error-config.js.map +1 -1
  399. package/dist/workers/repository/finalize/prune.js +1 -1
  400. package/dist/workers/repository/finalize/prune.js.map +1 -1
  401. package/dist/workers/repository/finalize/repository-statistics.js +1 -4
  402. package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
  403. package/dist/workers/repository/index.js +8 -5
  404. package/dist/workers/repository/index.js.map +1 -1
  405. package/dist/workers/repository/init/vulnerability.js +1 -1
  406. package/dist/workers/repository/init/vulnerability.js.map +1 -1
  407. package/dist/workers/repository/onboarding/branch/config.js +2 -1
  408. package/dist/workers/repository/onboarding/branch/config.js.map +1 -1
  409. package/dist/workers/repository/onboarding/branch/create.js +2 -1
  410. package/dist/workers/repository/onboarding/branch/create.js.map +1 -1
  411. package/dist/workers/repository/onboarding/branch/index.js +2 -1
  412. package/dist/workers/repository/onboarding/branch/index.js.map +1 -1
  413. package/dist/workers/repository/onboarding/pr/index.js +3 -1
  414. package/dist/workers/repository/onboarding/pr/index.js.map +1 -1
  415. package/dist/workers/repository/process/lookup/filter-checks.js +2 -1
  416. package/dist/workers/repository/process/lookup/filter-checks.js.map +1 -1
  417. package/dist/workers/repository/process/lookup/filter.js +1 -1
  418. package/dist/workers/repository/process/lookup/filter.js.map +1 -1
  419. package/dist/workers/repository/process/lookup/generate.js +1 -1
  420. package/dist/workers/repository/process/lookup/generate.js.map +1 -1
  421. package/dist/workers/repository/process/lookup/index.js +6 -3
  422. package/dist/workers/repository/process/lookup/index.js.map +1 -1
  423. package/dist/workers/repository/process/lookup/rollback.js +1 -1
  424. package/dist/workers/repository/process/lookup/rollback.js.map +1 -1
  425. package/dist/workers/repository/process/vulnerabilities.js +2 -1
  426. package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
  427. package/dist/workers/repository/process/write.js +8 -4
  428. package/dist/workers/repository/process/write.js.map +1 -1
  429. package/dist/workers/repository/reconfigure/validate.js +2 -1
  430. package/dist/workers/repository/reconfigure/validate.js.map +1 -1
  431. package/dist/workers/repository/update/branch/auto-replace.js +1 -1
  432. package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
  433. package/dist/workers/repository/update/branch/bump-versions.js +2 -1
  434. package/dist/workers/repository/update/branch/bump-versions.js.map +1 -1
  435. package/dist/workers/repository/update/branch/index.js +3 -1
  436. package/dist/workers/repository/update/branch/index.js.map +1 -1
  437. package/dist/workers/repository/update/pr/automerge.js +1 -1
  438. package/dist/workers/repository/update/pr/automerge.js.map +1 -1
  439. package/dist/workers/repository/update/pr/body/updates-table.js +1 -1
  440. package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
  441. package/dist/workers/repository/update/pr/changelog/github/index.js +2 -1
  442. package/dist/workers/repository/update/pr/changelog/github/index.js.map +1 -1
  443. package/dist/workers/repository/update/pr/changelog/github/source.js +2 -1
  444. package/dist/workers/repository/update/pr/changelog/github/source.js.map +1 -1
  445. package/dist/workers/repository/update/pr/changelog/index.js +1 -1
  446. package/dist/workers/repository/update/pr/changelog/index.js.map +1 -1
  447. package/dist/workers/repository/update/pr/changelog/release-notes.js +5 -5
  448. package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
  449. package/dist/workers/repository/update/pr/changelog/releases.js +1 -1
  450. package/dist/workers/repository/update/pr/changelog/releases.js.map +1 -1
  451. package/dist/workers/repository/update/pr/index.js +6 -3
  452. package/dist/workers/repository/update/pr/index.js.map +1 -1
  453. package/dist/workers/repository/update/pr/pr-reuse.js +1 -1
  454. package/dist/workers/repository/update/pr/pr-reuse.js.map +1 -1
  455. package/package.json +1 -1
  456. package/renovate-schema.json +2 -2
@@ -1 +1 @@
1
- {"version":3,"file":"auto-replace.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/auto-replace.ts"],"sourcesContent":["// TODO #22198\nimport { isNumber, isString, isUndefined } from '@sindresorhus/is';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { extractPackageFile } from '../../../../modules/manager/index.ts';\nimport type { PackageDependency } from '../../../../modules/manager/types.ts';\nimport { writeLocalFile } from '../../../../util/fs/index.ts';\nimport { escapeRegExp, regEx } from '../../../../util/regex.ts';\nimport { matchAt, replaceAt } from '../../../../util/string.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchUpgradeConfig } from '../../../types.ts';\n\nexport async function confirmIfDepUpdated(\n upgrade: BranchUpgradeConfig,\n newContent: string,\n): Promise<boolean> {\n const { manager, packageFile, depIndex } = upgrade;\n let newUpgrade: PackageDependency;\n try {\n const newExtract = await extractPackageFile(\n manager,\n newContent,\n packageFile!,\n upgrade,\n );\n // istanbul ignore if\n if (!newExtract) {\n // TODO: fix types (#22198)\n logger.debug(\n `Could not extract ${packageFile!} (manager=${manager}) after autoreplace. Did the autoreplace make the file unparseable?`,\n );\n logger.trace(\n { packageFile, content: newContent },\n 'packageFile content after autoreplace',\n );\n return false;\n }\n // istanbul ignore if\n if (!newExtract.deps?.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has no deps array. Did the autoreplace make the file unparseable?`,\n );\n return false;\n }\n // istanbul ignore if\n if (isNumber(depIndex) && depIndex >= newExtract.deps.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has fewer deps than expected.`,\n );\n return false;\n }\n newUpgrade = newExtract.deps[depIndex!];\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ manager, packageFile, err }, 'Failed to parse newContent');\n }\n\n if (!newUpgrade!) {\n logger.debug(`No newUpgrade in ${packageFile!}`);\n return false;\n }\n\n if (\n upgrade.depName !== newUpgrade.depName &&\n upgrade.newName !== newUpgrade.depName\n ) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName mismatch',\n );\n return false;\n }\n\n if (upgrade.newName && upgrade.newName !== newUpgrade.depName) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName is not updated',\n );\n return false;\n }\n\n if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) {\n // accept reshaped values produced by autoReplaceStringTemplate\n let templateMatchesExtractedValue = false;\n if (upgrade.autoReplaceStringTemplate) {\n try {\n const compiledValue = compile(\n upgrade.autoReplaceStringTemplate,\n upgrade,\n false,\n );\n templateMatchesExtractedValue =\n compiledValue === newUpgrade.currentValue;\n } catch (err) {\n logger.debug(\n { err, manager, packageFile },\n 'Failed to compile autoReplaceStringTemplate in confirmIfDepUpdated',\n );\n }\n }\n if (!templateMatchesExtractedValue) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newValue,\n foundValue: newUpgrade.currentValue,\n },\n 'Value is not updated',\n );\n return false;\n }\n }\n\n if (\n upgrade.newDigest &&\n (upgrade.isPinDigest === true || upgrade.currentDigest) &&\n upgrade.newDigest !== newUpgrade.currentDigest\n ) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newDigest,\n foundValue: newUpgrade.currentDigest,\n },\n 'Digest is not updated',\n );\n return false;\n }\n\n return true;\n}\n\nfunction getDepsSignature(deps: PackageDependency[]): string {\n // TODO: types (#22198)\n return deps\n .map(\n (dep) =>\n `${(dep.depName ?? dep.packageName)!}${(dep.packageName ??\n dep.depName)!}`,\n )\n .join(',');\n}\n\nfunction firstIndexOf(\n existingContent: string,\n depName: string,\n currentValue: string,\n position = 0,\n): number {\n const depIndex = existingContent.indexOf(depName, position);\n const valIndex = existingContent.indexOf(currentValue, position);\n const index = depIndex < valIndex ? depIndex : valIndex;\n if (index < 0) {\n return position === 0 ? -1 : existingContent.length;\n }\n return index;\n}\n\nexport async function checkBranchDepsMatchBaseDeps(\n upgrade: BranchUpgradeConfig,\n branchContent: string,\n): Promise<boolean> {\n const { baseDeps, manager, packageFile } = upgrade;\n try {\n const res = await extractPackageFile(\n manager,\n branchContent,\n packageFile!,\n upgrade,\n )!;\n const branchDeps = res!.deps;\n return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps);\n } catch /* istanbul ignore next */ {\n logger.info(\n { manager, packageFile },\n 'Failed to parse branchContent - rebasing',\n );\n return false;\n }\n}\n\nasync function checkExistingBranch(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n): Promise<string | null> {\n const { packageFile, depName } = upgrade;\n if (!(await checkBranchDepsMatchBaseDeps(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after deps list has changed',\n );\n return null;\n }\n if (!(await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing after outdated branch dep found',\n );\n return null;\n }\n // TODO: fix types (#22198)\n logger.debug(`Branch dep ${depName!} in ${packageFile!} is already updated`);\n return existingContent;\n}\n\nexport async function doAutoReplace(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n reuseExistingBranch: boolean,\n firstUpdate = true,\n): Promise<string | null> {\n const {\n packageFile,\n depName,\n depNameTemplate,\n newName,\n currentValue,\n currentValueTemplate,\n newValue,\n currentDigest,\n currentDigestShort,\n newDigest,\n autoReplaceGlobalMatch,\n autoReplaceStringTemplate,\n } = upgrade;\n /*\n If replacement support for more managers is added,\n please also update the list in docs/usage/configuration-options.md\n at replacementName and replacementVersion\n */\n if (reuseExistingBranch) {\n return await checkExistingBranch(upgrade, existingContent);\n }\n const valueChanging =\n isString(currentValue) && isString(newValue) && currentValue !== newValue;\n const digestChanging =\n isString(currentDigest) &&\n isString(newDigest) &&\n currentDigest !== newDigest;\n let replaceWithoutReplaceString =\n isString(newName) &&\n newName !== depName &&\n (isUndefined(upgrade.replaceString) ||\n !upgrade.replaceString?.includes(depName!));\n // fallback must contain the field being updated, else the replacement is\n // a no-op for managers where value and digest live in separate tokens\n let replaceString = upgrade.replaceString;\n if (isUndefined(replaceString)) {\n if (valueChanging && digestChanging) {\n // no single fallback covers both — use the per-field path\n replaceWithoutReplaceString = true;\n replaceString = currentValue;\n } else if (digestChanging) {\n replaceString = currentDigest;\n } else {\n replaceString = currentValue ?? currentDigest;\n }\n }\n logger.trace({ depName, replaceString }, 'autoReplace replaceString');\n let searchIndex: number;\n if (replaceWithoutReplaceString) {\n searchIndex = firstIndexOf(existingContent, depName!, currentValue!);\n } else {\n searchIndex = existingContent.indexOf(replaceString!);\n }\n if (searchIndex === -1) {\n logger.info(\n { packageFile, depName, existingContent, replaceString },\n 'Cannot find replaceString in current file content. Was it already updated?',\n );\n return existingContent;\n }\n try {\n let newString: string;\n if (autoReplaceStringTemplate && !newName) {\n newString = compile(autoReplaceStringTemplate, upgrade, false);\n } else {\n newString = replaceString!;\n\n const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';\n if (currentValue && newValue && currentValue !== newValue) {\n if (!newString.includes(currentValue)) {\n logger.debug(\n { stringToReplace: newString, currentValue, currentValueTemplate },\n 'currentValue not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),\n newValue,\n );\n }\n if (depName && newName && depName !== newName) {\n if (!newString.includes(depName)) {\n logger.debug(\n { stringToReplace: newString, depName, depNameTemplate },\n 'depName not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(depName), autoReplaceRegExpFlag),\n newName,\n );\n }\n if (currentDigest && newDigest && currentDigest !== newDigest) {\n if (!newString.includes(currentDigest)) {\n logger.debug(\n { stringToReplace: newString, currentDigest },\n 'currentDigest not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),\n newDigest,\n );\n } else if (\n currentDigestShort &&\n newDigest &&\n currentDigestShort !== newDigest &&\n // Only use short digest replacement when there's no full currentDigest\n // that already matches newDigest (otherwise we'd incorrectly replace\n // part of an already-correct digest)\n !(currentDigest && currentDigest === newDigest)\n ) {\n if (!newString.includes(currentDigestShort)) {\n logger.debug(\n { stringToReplace: newString, currentDigestShort },\n 'currentDigestShort not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),\n newDigest,\n );\n }\n }\n if (!firstUpdate && (await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Package file is already updated - no work to do',\n );\n return existingContent;\n }\n logger.debug(\n { packageFile, depName },\n `Starting search at index ${searchIndex}`,\n );\n let newContent = existingContent;\n let nameReplaced = !newName;\n let valueReplaced = !newValue;\n let digestReplaced = !newDigest;\n let startIndex = searchIndex;\n // Iterate through the rest of the file\n for (; searchIndex < newContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (replaceWithoutReplaceString) {\n // look for depName and currentValue\n if (newName && matchAt(newContent, searchIndex, depName!)) {\n logger.debug(\n { packageFile, depName },\n `Found depName at index ${searchIndex}`,\n );\n if (nameReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // replace with newName\n newContent = replaceAt(newContent, searchIndex, depName!, newName);\n await writeLocalFile(upgrade.packageFile!, newContent);\n nameReplaced = true;\n searchIndex += newName.length - 1;\n } else if (\n newValue &&\n matchAt(newContent, searchIndex, currentValue!)\n ) {\n logger.debug(\n { packageFile, currentValue },\n `Found currentValue at index ${searchIndex}`,\n );\n if (valueReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentValue!,\n newValue,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n valueReplaced = true;\n searchIndex += newValue.length - 1;\n } else if (\n newDigest &&\n matchAt(newContent, searchIndex, currentDigest!)\n ) {\n logger.debug(\n { packageFile, currentDigest },\n `Found currentDigest at index ${searchIndex}`,\n );\n if (digestReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentDigest!,\n newDigest,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n digestReplaced = true;\n searchIndex += newDigest.length - 1;\n }\n if (nameReplaced && valueReplaced && digestReplaced) {\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n }\n } else if (matchAt(newContent, searchIndex, replaceString!)) {\n logger.debug(\n { packageFile, depName },\n `Found match at index ${searchIndex}`,\n );\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n replaceString!,\n newString,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n }\n }\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ packageFile, depName, err }, 'doAutoReplace error');\n }\n // istanbul ignore next\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"auto-replace.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/auto-replace.ts"],"sourcesContent":["// TODO #22198\nimport { isNumber, isString, isUndefined } from '@sindresorhus/is';\nimport { WORKER_FILE_UPDATE_FAILED } from '../../../../constants/error-messages.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { extractPackageFile } from '../../../../modules/manager/index.ts';\nimport type { PackageDependency } from '../../../../modules/manager/types.ts';\nimport { writeLocalFile } from '../../../../util/fs/index.ts';\nimport { escapeRegExp, regEx } from '../../../../util/regex.ts';\nimport { matchAt, replaceAt } from '../../../../util/string.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchUpgradeConfig } from '../../../types.ts';\n\nexport async function confirmIfDepUpdated(\n upgrade: BranchUpgradeConfig,\n newContent: string,\n): Promise<boolean> {\n const { manager, packageFile, depIndex } = upgrade;\n let newUpgrade: PackageDependency;\n try {\n const newExtract = await extractPackageFile(\n manager,\n newContent,\n packageFile!,\n upgrade,\n );\n // istanbul ignore if\n if (!newExtract) {\n // TODO: fix types (#22198)\n logger.debug(\n `Could not extract ${packageFile!} (manager=${manager}) after autoreplace. Did the autoreplace make the file unparseable?`,\n );\n logger.trace(\n { packageFile, content: newContent },\n 'packageFile content after autoreplace',\n );\n return false;\n }\n // istanbul ignore if\n if (!newExtract.deps?.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has no deps array. Did the autoreplace make the file unparseable?`,\n );\n return false;\n }\n // istanbul ignore if\n if (isNumber(depIndex) && depIndex >= newExtract.deps.length) {\n logger.debug(\n `Extracted ${packageFile!} after autoreplace has fewer deps than expected.`,\n );\n return false;\n }\n newUpgrade = newExtract.deps[depIndex!];\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ manager, packageFile, err }, 'Failed to parse newContent');\n }\n\n if (!newUpgrade!) {\n logger.debug(`No newUpgrade in ${packageFile!}`);\n return false;\n }\n\n if (\n upgrade.depName !== newUpgrade.depName &&\n upgrade.newName !== newUpgrade.depName\n ) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName mismatch',\n );\n return false;\n }\n\n if (upgrade.newName && upgrade.newName !== newUpgrade.depName) {\n logger.debug(\n {\n manager,\n packageFile,\n currentDepName: upgrade.depName,\n newDepName: newUpgrade.depName,\n },\n 'depName is not updated',\n );\n return false;\n }\n\n if (upgrade.newValue && upgrade.newValue !== newUpgrade.currentValue) {\n // accept reshaped values produced by autoReplaceStringTemplate\n let templateMatchesExtractedValue = false;\n if (upgrade.autoReplaceStringTemplate) {\n try {\n const compiledValue = compile(\n upgrade.autoReplaceStringTemplate,\n upgrade,\n false,\n );\n templateMatchesExtractedValue =\n compiledValue === newUpgrade.currentValue;\n } catch (err) {\n logger.debug(\n { err, manager, packageFile },\n 'Failed to compile autoReplaceStringTemplate in confirmIfDepUpdated',\n );\n }\n }\n if (!templateMatchesExtractedValue) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newValue,\n foundValue: newUpgrade.currentValue,\n },\n 'Value is not updated',\n );\n return false;\n }\n }\n\n if (\n upgrade.newDigest &&\n (upgrade.isPinDigest === true || upgrade.currentDigest) &&\n upgrade.newDigest !== newUpgrade.currentDigest\n ) {\n logger.debug(\n {\n depName: upgrade.depName,\n manager,\n packageFile,\n expectedValue: upgrade.newDigest,\n foundValue: newUpgrade.currentDigest,\n },\n 'Digest is not updated',\n );\n return false;\n }\n\n return true;\n}\n\nfunction getDepsSignature(deps: PackageDependency[]): string {\n // TODO: types (#22198)\n return deps\n .map(\n (dep) =>\n `${(dep.depName ?? dep.packageName)!}${(dep.packageName ??\n dep.depName)!}`,\n )\n .join(',');\n}\n\nfunction firstIndexOf(\n existingContent: string,\n depName: string,\n currentValue: string,\n position = 0,\n): number {\n const depIndex = existingContent.indexOf(depName, position);\n const valIndex = existingContent.indexOf(currentValue, position);\n const index = depIndex < valIndex ? depIndex : valIndex;\n if (index < 0) {\n return position === 0 ? -1 : existingContent.length;\n }\n return index;\n}\n\nexport async function checkBranchDepsMatchBaseDeps(\n upgrade: BranchUpgradeConfig,\n branchContent: string,\n): Promise<boolean> {\n const { baseDeps, manager, packageFile } = upgrade;\n try {\n const res = await extractPackageFile(\n manager,\n branchContent,\n packageFile!,\n upgrade,\n )!;\n const branchDeps = res!.deps;\n return getDepsSignature(baseDeps!) === getDepsSignature(branchDeps);\n } catch /* istanbul ignore next */ {\n logger.info(\n { manager, packageFile },\n 'Failed to parse branchContent - rebasing',\n );\n return false;\n }\n}\n\nasync function checkExistingBranch(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n): Promise<string | null> {\n const { packageFile, depName } = upgrade;\n if (!(await checkBranchDepsMatchBaseDeps(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing branch after deps list has changed',\n );\n return null;\n }\n if (!(await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Rebasing after outdated branch dep found',\n );\n return null;\n }\n // TODO: fix types (#22198)\n logger.debug(`Branch dep ${depName!} in ${packageFile!} is already updated`);\n return existingContent;\n}\n\nexport async function doAutoReplace(\n upgrade: BranchUpgradeConfig,\n existingContent: string,\n reuseExistingBranch: boolean,\n firstUpdate = true,\n): Promise<string | null> {\n const {\n packageFile,\n depName,\n depNameTemplate,\n newName,\n currentValue,\n currentValueTemplate,\n newValue,\n currentDigest,\n currentDigestShort,\n newDigest,\n autoReplaceGlobalMatch,\n autoReplaceStringTemplate,\n } = upgrade;\n /*\n If replacement support for more managers is added,\n please also update the list in docs/usage/configuration-options.md\n at replacementName and replacementVersion\n */\n if (reuseExistingBranch) {\n return await checkExistingBranch(upgrade, existingContent);\n }\n const valueChanging =\n isString(currentValue) && isString(newValue) && currentValue !== newValue;\n const digestChanging =\n isString(currentDigest) &&\n isString(newDigest) &&\n currentDigest !== newDigest;\n let replaceWithoutReplaceString =\n isString(newName) &&\n newName !== depName &&\n (isUndefined(upgrade.replaceString) ||\n !upgrade.replaceString?.includes(depName!));\n // fallback must contain the field being updated, else the replacement is\n // a no-op for managers where value and digest live in separate tokens\n let replaceString = upgrade.replaceString;\n if (isUndefined(replaceString)) {\n if (valueChanging && digestChanging) {\n // no single fallback covers both — use the per-field path\n replaceWithoutReplaceString = true;\n replaceString = currentValue;\n } else if (digestChanging) {\n replaceString = currentDigest;\n } else {\n replaceString = currentValue ?? currentDigest;\n }\n }\n logger.trace({ depName, replaceString }, 'autoReplace replaceString');\n let searchIndex: number;\n if (replaceWithoutReplaceString) {\n searchIndex = firstIndexOf(existingContent, depName!, currentValue!);\n } else {\n searchIndex = existingContent.indexOf(replaceString!);\n }\n if (searchIndex === -1) {\n logger.info(\n { packageFile, depName, existingContent, replaceString },\n 'Cannot find replaceString in current file content. Was it already updated?',\n );\n return existingContent;\n }\n try {\n let newString: string;\n if (autoReplaceStringTemplate && !newName) {\n newString = compile(autoReplaceStringTemplate, upgrade, false);\n } else {\n newString = replaceString!;\n\n const autoReplaceRegExpFlag = autoReplaceGlobalMatch ? 'g' : '';\n if (currentValue && newValue && currentValue !== newValue) {\n if (!newString.includes(currentValue)) {\n logger.debug(\n { stringToReplace: newString, currentValue, currentValueTemplate },\n 'currentValue not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentValue), autoReplaceRegExpFlag),\n newValue,\n );\n }\n if (depName && newName && depName !== newName) {\n if (!newString.includes(depName)) {\n logger.debug(\n { stringToReplace: newString, depName, depNameTemplate },\n 'depName not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(depName), autoReplaceRegExpFlag),\n newName,\n );\n }\n if (currentDigest && newDigest && currentDigest !== newDigest) {\n if (!newString.includes(currentDigest)) {\n logger.debug(\n { stringToReplace: newString, currentDigest },\n 'currentDigest not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigest), autoReplaceRegExpFlag),\n newDigest,\n );\n } else if (\n currentDigestShort &&\n newDigest &&\n currentDigestShort !== newDigest &&\n // Only use short digest replacement when there's no full currentDigest\n // that already matches newDigest (otherwise we'd incorrectly replace\n // part of an already-correct digest)\n !(currentDigest && currentDigest === newDigest)\n ) {\n if (!newString.includes(currentDigestShort)) {\n logger.debug(\n { stringToReplace: newString, currentDigestShort },\n 'currentDigestShort not found in string to replace',\n );\n }\n newString = newString.replace(\n regEx(escapeRegExp(currentDigestShort), autoReplaceRegExpFlag),\n newDigest,\n );\n }\n }\n if (!firstUpdate && (await confirmIfDepUpdated(upgrade, existingContent))) {\n logger.debug(\n { packageFile, depName },\n 'Package file is already updated - no work to do',\n );\n return existingContent;\n }\n logger.debug(\n { packageFile, depName },\n `Starting search at index ${searchIndex}`,\n );\n let newContent = existingContent;\n let nameReplaced = !newName;\n let valueReplaced = !newValue;\n let digestReplaced = !newDigest;\n let startIndex = searchIndex;\n // Iterate through the rest of the file\n for (; searchIndex < newContent.length; searchIndex += 1) {\n // First check if we have a hit for the old version\n if (replaceWithoutReplaceString) {\n // look for depName and currentValue\n if (newName && matchAt(newContent, searchIndex, depName!)) {\n logger.debug(\n { packageFile, depName },\n `Found depName at index ${searchIndex}`,\n );\n if (nameReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // replace with newName\n newContent = replaceAt(newContent, searchIndex, depName!, newName);\n await writeLocalFile(upgrade.packageFile!, newContent);\n nameReplaced = true;\n searchIndex += newName.length - 1;\n } else if (\n newValue &&\n matchAt(newContent, searchIndex, currentValue!)\n ) {\n logger.debug(\n { packageFile, currentValue },\n `Found currentValue at index ${searchIndex}`,\n );\n if (valueReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentValue!,\n newValue,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n valueReplaced = true;\n searchIndex += newValue.length - 1;\n } else if (\n newDigest &&\n matchAt(newContent, searchIndex, currentDigest!)\n ) {\n logger.debug(\n { packageFile, currentDigest },\n `Found currentDigest at index ${searchIndex}`,\n );\n if (digestReplaced) {\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n continue;\n }\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n currentDigest!,\n newDigest,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n digestReplaced = true;\n searchIndex += newDigest.length - 1;\n }\n if (nameReplaced && valueReplaced && digestReplaced) {\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n startIndex = firstIndexOf(\n existingContent,\n depName!,\n currentValue!,\n startIndex + 1,\n );\n searchIndex = startIndex - 1;\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n nameReplaced = !newName;\n valueReplaced = !newValue;\n digestReplaced = !newDigest;\n }\n } else if (matchAt(newContent, searchIndex, replaceString!)) {\n logger.debug(\n { packageFile, depName },\n `Found match at index ${searchIndex}`,\n );\n // Now test if the result matches\n newContent = replaceAt(\n newContent,\n searchIndex,\n replaceString!,\n newString,\n );\n await writeLocalFile(upgrade.packageFile!, newContent);\n if (await confirmIfDepUpdated(upgrade, newContent)) {\n return newContent;\n }\n await writeLocalFile(upgrade.packageFile!, existingContent);\n newContent = existingContent;\n }\n }\n } catch (err) {\n /* istanbul ignore next */\n logger.debug({ packageFile, depName, err }, 'doAutoReplace error');\n }\n // istanbul ignore next\n throw new Error(WORKER_FILE_UPDATE_FAILED);\n}\n"],"mappings":"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"}
@@ -12,7 +12,8 @@ async function bumpVersions(config) {
12
12
  const bumpVersions = config.bumpVersions;
13
13
  if (!bumpVersions?.length) return;
14
14
  if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) return;
15
- const fileList = getFilteredFileList(config, await scm.getFileList());
15
+ const allFiles = await scm.getFileList();
16
+ const fileList = getFilteredFileList(config, allFiles);
16
17
  const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);
17
18
  const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);
18
19
  for (const bumpVersionConfig of bumpVersions) await bumpVersion(bumpVersionConfig, config, fileList, packageFileChanges, artifactFileChanges);
@@ -1 +1 @@
1
- {"version":3,"file":"bump-versions.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/bump-versions.ts"],"sourcesContent":["import { type ReleaseType, inc } from 'semver';\nimport type { BumpVersionConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { matchRegexOrGlobList } from '../../../../util/string-match.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport { getFilteredFileList } from '../../extract/file-match.ts';\n\ntype ParseFileChangesResult =\n | { state: 'modified'; content: string | null }\n | { state: 'deleted' }\n | { state: 'unmodified' };\n\nexport async function bumpVersions(config: BranchConfig): Promise<void> {\n const bumpVersions = config.bumpVersions;\n if (!bumpVersions?.length) {\n return;\n }\n\n // skip if no packageFiles or artifacts have been updated\n if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) {\n return;\n }\n\n const allFiles = await scm.getFileList();\n const fileList = getFilteredFileList(config, allFiles);\n\n const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);\n const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);\n\n for (const bumpVersionConfig of bumpVersions) {\n await bumpVersion(\n bumpVersionConfig,\n config,\n fileList,\n packageFileChanges,\n artifactFileChanges,\n );\n }\n\n // update the config with the new files\n config.updatedPackageFiles = Object.values(packageFileChanges).flat();\n config.updatedArtifacts = Object.values(artifactFileChanges).flat();\n}\n\nasync function bumpVersion(\n config: BumpVersionConfig,\n branchConfig: BranchConfig,\n fileList: string[],\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<void> {\n const rawBumpType = config.bumpType ?? 'patch';\n\n // all log messages should be prefixed with this string to facilitate easier logLevelRemapping\n const bumpVersionsDescr = config.name\n ? `bumpVersions(${config.name})`\n : 'bumpVersions';\n\n const files: string[] = [];\n try {\n files.push(\n ...getMatchedFiles(\n bumpVersionsDescr,\n config.filePatterns,\n branchConfig,\n fileList,\n ),\n );\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate matched files for bumpVersions: ${e.message}`,\n );\n return;\n }\n\n if (!files.length) {\n logger.debug(`${bumpVersionsDescr}: filePatterns did not match any files`);\n return;\n }\n\n logger.trace(\n { files },\n `${bumpVersionsDescr}: Found ${files.length} files to bump versions`,\n );\n\n // keeping this only for logging purposes\n const matchStrings: string[] = [];\n\n // prepare the matchStrings\n const matchStringsRegexes: RegExp[] = [];\n for (const matchString of config.matchStrings) {\n try {\n const templated = compile(matchString, branchConfig);\n matchStrings.push(templated);\n matchStringsRegexes.push(regEx(templated));\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to compile matchString for ${bumpVersionsDescr}: ${e.message}`,\n matchString,\n );\n }\n }\n\n logger.trace({ matchStrings }, `${bumpVersionsDescr}: Compiled matchStrings`);\n\n for (const filePath of files) {\n let fileBumped = false;\n\n const fileContents = await getFileContent(\n bumpVersionsDescr,\n filePath,\n packageFiles,\n artifactFiles,\n );\n if (!fileContents) {\n continue;\n }\n\n for (const matchStringRegex of matchStringsRegexes) {\n // extracting the version from the file\n const regexResult = matchStringRegex.exec(fileContents);\n if (!regexResult) {\n continue;\n }\n const version = regexResult.groups?.version;\n if (!version) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No version found`,\n );\n continue;\n }\n\n // getting new version\n let newVersion: string | null = null;\n try {\n const bumpType = compile(rawBumpType, branchConfig);\n\n // Handle 'sync' type - use version from branch upgrades\n if (bumpType === 'sync') {\n if (branchConfig.upgrades?.length) {\n // Use the newVersion from the first upgrade\n newVersion = branchConfig.upgrades[0].newVersion ?? null;\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No newVersion found in branch upgrades for sync type`,\n );\n continue;\n }\n } else {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No upgrades found in branch config for sync type`,\n );\n continue;\n }\n } else {\n // Existing logic for major/minor/patch\n const parts = regEx('^(?<major>\\\\d+)(?:\\\\.(?<minor>\\\\d+))?$').exec(\n version,\n );\n if (parts?.groups) {\n const { major, minor } = parts.groups;\n if (bumpType === 'major') {\n newVersion = `${parseInt(major, 10) + 1}${minor ? `.0` : ''}`;\n } else if (bumpType === 'minor') {\n newVersion = `${major}.${parseInt(minor, 10) + 1}`;\n } else {\n throw new Error(\n `Unsupported bump type for {major}.{minor} version: ${bumpType}`,\n );\n }\n } else {\n newVersion = inc(version, bumpType as ReleaseType);\n }\n }\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate new version for ${bumpVersionsDescr}: ${e.message}`,\n filePath,\n );\n }\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: Could not bump version`,\n );\n continue;\n }\n\n // replace the content of the `version` group with newVersion\n const newFileContents: string = fileContents\n .toString()\n .replace(matchStringRegex, (match, ...groups) => {\n const { version } = groups.pop();\n return match.replace(version, newVersion);\n });\n\n // update the file. Add it to the buckets if exists or create a new artifact update\n if (packageFiles[filePath]) {\n packageFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n } else {\n artifactFiles[filePath] ??= [];\n artifactFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n }\n\n fileBumped = true;\n }\n\n if (!fileBumped) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No match found for bumping version`,\n );\n }\n }\n}\n\n/**\n * Get files that match ANY of the fileMatches pattern. fileMatches are compiled with the branchConfig.\n * @param bumpVersionsDescr log description for the bump version config\n * @param filePatternTemplates list of regex patterns\n * @param branchConfig compile metadata\n * @param fileList list of files to match against\n */\nfunction getMatchedFiles(\n bumpVersionsDescr: string,\n filePatternTemplates: string[],\n branchConfig: BranchConfig,\n fileList: string[],\n): string[] {\n // prepare file regex\n const filePatterns: string[] = [];\n for (const filePatternTemplateElement of filePatternTemplates) {\n const filePattern = compile(filePatternTemplateElement, branchConfig);\n filePatterns.push(filePattern);\n }\n\n logger.trace({ filePatterns }, `${bumpVersionsDescr}: Compiled filePatterns`);\n\n // get files that match the fileMatch\n const files: string[] = [];\n for (const file of fileList) {\n if (matchRegexOrGlobList(file, filePatterns)) {\n files.push(file);\n }\n }\n return files;\n}\n\nfunction fileChangeListToMap(\n list: FileChange[] | undefined,\n): Record<string, FileChange[]> {\n const record: Record<string, FileChange[]> = {};\n for (const fileChange of coerceArray(list)) {\n record[fileChange.path] ??= [];\n record[fileChange.path].push(fileChange);\n }\n return record;\n}\n\nfunction addArtifactError(\n branchConfig: BranchConfig,\n message: string,\n fileName?: string,\n): void {\n branchConfig.artifactErrors ??= [];\n branchConfig.artifactErrors.push({\n stderr: message,\n fileName,\n });\n}\n\nasync function getFileContent(\n bumpVersionsDescr: string,\n filePath: string,\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<string | null> {\n const packageFileChanges = parseFileChanges(filePath, packageFiles);\n const artifactFileChanges = parseFileChanges(filePath, artifactFiles);\n\n // skip if the file is deleted as it virtually doesn't exist\n if (\n packageFileChanges.state === 'deleted' ||\n artifactFileChanges.state === 'deleted'\n ) {\n return null;\n }\n\n if (packageFileChanges.state === 'modified') {\n const lastChange = packageFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n if (artifactFileChanges.state === 'modified') {\n const lastChange = artifactFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n\n try {\n return await readLocalFile(filePath, 'utf8');\n } catch (e) {\n logger.warn(\n { file: filePath, bumpVersionsDescr, err: e },\n 'bumpVersions: Could not read file',\n );\n return null;\n }\n}\n\nfunction parseFileChanges(\n filePath: string,\n changeRecord: Record<string, FileChange[]>,\n): ParseFileChangesResult {\n const changes = coerceArray(changeRecord[filePath]);\n\n // skip if we can fetch from record\n if (!changes.length) {\n return { state: 'unmodified' };\n }\n\n const lastChange = changes.at(-1)!;\n if (lastChange.type === 'deletion') {\n return { state: 'deleted' };\n }\n return {\n state: 'modified',\n content: lastChange.contents?.toString() ?? null,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"bump-versions.js","names":[],"sources":["../../../../../lib/workers/repository/update/branch/bump-versions.ts"],"sourcesContent":["import { type ReleaseType, inc } from 'semver';\nimport type { BumpVersionConfig } from '../../../../config/types.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { coerceArray } from '../../../../util/array.ts';\nimport { readLocalFile } from '../../../../util/fs/index.ts';\nimport type { FileChange } from '../../../../util/git/types.ts';\nimport { regEx } from '../../../../util/regex.ts';\nimport { matchRegexOrGlobList } from '../../../../util/string-match.ts';\nimport { compile } from '../../../../util/template/index.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport { getFilteredFileList } from '../../extract/file-match.ts';\n\ntype ParseFileChangesResult =\n | { state: 'modified'; content: string | null }\n | { state: 'deleted' }\n | { state: 'unmodified' };\n\nexport async function bumpVersions(config: BranchConfig): Promise<void> {\n const bumpVersions = config.bumpVersions;\n if (!bumpVersions?.length) {\n return;\n }\n\n // skip if no packageFiles or artifacts have been updated\n if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) {\n return;\n }\n\n const allFiles = await scm.getFileList();\n const fileList = getFilteredFileList(config, allFiles);\n\n const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);\n const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);\n\n for (const bumpVersionConfig of bumpVersions) {\n await bumpVersion(\n bumpVersionConfig,\n config,\n fileList,\n packageFileChanges,\n artifactFileChanges,\n );\n }\n\n // update the config with the new files\n config.updatedPackageFiles = Object.values(packageFileChanges).flat();\n config.updatedArtifacts = Object.values(artifactFileChanges).flat();\n}\n\nasync function bumpVersion(\n config: BumpVersionConfig,\n branchConfig: BranchConfig,\n fileList: string[],\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<void> {\n const rawBumpType = config.bumpType ?? 'patch';\n\n // all log messages should be prefixed with this string to facilitate easier logLevelRemapping\n const bumpVersionsDescr = config.name\n ? `bumpVersions(${config.name})`\n : 'bumpVersions';\n\n const files: string[] = [];\n try {\n files.push(\n ...getMatchedFiles(\n bumpVersionsDescr,\n config.filePatterns,\n branchConfig,\n fileList,\n ),\n );\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate matched files for bumpVersions: ${e.message}`,\n );\n return;\n }\n\n if (!files.length) {\n logger.debug(`${bumpVersionsDescr}: filePatterns did not match any files`);\n return;\n }\n\n logger.trace(\n { files },\n `${bumpVersionsDescr}: Found ${files.length} files to bump versions`,\n );\n\n // keeping this only for logging purposes\n const matchStrings: string[] = [];\n\n // prepare the matchStrings\n const matchStringsRegexes: RegExp[] = [];\n for (const matchString of config.matchStrings) {\n try {\n const templated = compile(matchString, branchConfig);\n matchStrings.push(templated);\n matchStringsRegexes.push(regEx(templated));\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to compile matchString for ${bumpVersionsDescr}: ${e.message}`,\n matchString,\n );\n }\n }\n\n logger.trace({ matchStrings }, `${bumpVersionsDescr}: Compiled matchStrings`);\n\n for (const filePath of files) {\n let fileBumped = false;\n\n const fileContents = await getFileContent(\n bumpVersionsDescr,\n filePath,\n packageFiles,\n artifactFiles,\n );\n if (!fileContents) {\n continue;\n }\n\n for (const matchStringRegex of matchStringsRegexes) {\n // extracting the version from the file\n const regexResult = matchStringRegex.exec(fileContents);\n if (!regexResult) {\n continue;\n }\n const version = regexResult.groups?.version;\n if (!version) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No version found`,\n );\n continue;\n }\n\n // getting new version\n let newVersion: string | null = null;\n try {\n const bumpType = compile(rawBumpType, branchConfig);\n\n // Handle 'sync' type - use version from branch upgrades\n if (bumpType === 'sync') {\n if (branchConfig.upgrades?.length) {\n // Use the newVersion from the first upgrade\n newVersion = branchConfig.upgrades[0].newVersion ?? null;\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No newVersion found in branch upgrades for sync type`,\n );\n continue;\n }\n } else {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No upgrades found in branch config for sync type`,\n );\n continue;\n }\n } else {\n // Existing logic for major/minor/patch\n const parts = regEx('^(?<major>\\\\d+)(?:\\\\.(?<minor>\\\\d+))?$').exec(\n version,\n );\n if (parts?.groups) {\n const { major, minor } = parts.groups;\n if (bumpType === 'major') {\n newVersion = `${parseInt(major, 10) + 1}${minor ? `.0` : ''}`;\n } else if (bumpType === 'minor') {\n newVersion = `${major}.${parseInt(minor, 10) + 1}`;\n } else {\n throw new Error(\n `Unsupported bump type for {major}.{minor} version: ${bumpType}`,\n );\n }\n } else {\n newVersion = inc(version, bumpType as ReleaseType);\n }\n }\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate new version for ${bumpVersionsDescr}: ${e.message}`,\n filePath,\n );\n }\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: Could not bump version`,\n );\n continue;\n }\n\n // replace the content of the `version` group with newVersion\n const newFileContents: string = fileContents\n .toString()\n .replace(matchStringRegex, (match, ...groups) => {\n const { version } = groups.pop();\n return match.replace(version, newVersion);\n });\n\n // update the file. Add it to the buckets if exists or create a new artifact update\n if (packageFiles[filePath]) {\n packageFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n } else {\n artifactFiles[filePath] ??= [];\n artifactFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n }\n\n fileBumped = true;\n }\n\n if (!fileBumped) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No match found for bumping version`,\n );\n }\n }\n}\n\n/**\n * Get files that match ANY of the fileMatches pattern. fileMatches are compiled with the branchConfig.\n * @param bumpVersionsDescr log description for the bump version config\n * @param filePatternTemplates list of regex patterns\n * @param branchConfig compile metadata\n * @param fileList list of files to match against\n */\nfunction getMatchedFiles(\n bumpVersionsDescr: string,\n filePatternTemplates: string[],\n branchConfig: BranchConfig,\n fileList: string[],\n): string[] {\n // prepare file regex\n const filePatterns: string[] = [];\n for (const filePatternTemplateElement of filePatternTemplates) {\n const filePattern = compile(filePatternTemplateElement, branchConfig);\n filePatterns.push(filePattern);\n }\n\n logger.trace({ filePatterns }, `${bumpVersionsDescr}: Compiled filePatterns`);\n\n // get files that match the fileMatch\n const files: string[] = [];\n for (const file of fileList) {\n if (matchRegexOrGlobList(file, filePatterns)) {\n files.push(file);\n }\n }\n return files;\n}\n\nfunction fileChangeListToMap(\n list: FileChange[] | undefined,\n): Record<string, FileChange[]> {\n const record: Record<string, FileChange[]> = {};\n for (const fileChange of coerceArray(list)) {\n record[fileChange.path] ??= [];\n record[fileChange.path].push(fileChange);\n }\n return record;\n}\n\nfunction addArtifactError(\n branchConfig: BranchConfig,\n message: string,\n fileName?: string,\n): void {\n branchConfig.artifactErrors ??= [];\n branchConfig.artifactErrors.push({\n stderr: message,\n fileName,\n });\n}\n\nasync function getFileContent(\n bumpVersionsDescr: string,\n filePath: string,\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<string | null> {\n const packageFileChanges = parseFileChanges(filePath, packageFiles);\n const artifactFileChanges = parseFileChanges(filePath, artifactFiles);\n\n // skip if the file is deleted as it virtually doesn't exist\n if (\n packageFileChanges.state === 'deleted' ||\n artifactFileChanges.state === 'deleted'\n ) {\n return null;\n }\n\n if (packageFileChanges.state === 'modified') {\n const lastChange = packageFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n if (artifactFileChanges.state === 'modified') {\n const lastChange = artifactFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n\n try {\n return await readLocalFile(filePath, 'utf8');\n } catch (e) {\n logger.warn(\n { file: filePath, bumpVersionsDescr, err: e },\n 'bumpVersions: Could not read file',\n );\n return null;\n }\n}\n\nfunction parseFileChanges(\n filePath: string,\n changeRecord: Record<string, FileChange[]>,\n): ParseFileChangesResult {\n const changes = coerceArray(changeRecord[filePath]);\n\n // skip if we can fetch from record\n if (!changes.length) {\n return { state: 'unmodified' };\n }\n\n const lastChange = changes.at(-1)!;\n if (lastChange.type === 'deletion') {\n return { state: 'deleted' };\n }\n return {\n state: 'modified',\n content: lastChange.contents?.toString() ?? null,\n };\n}\n"],"mappings":"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"}
@@ -493,7 +493,9 @@ async function processBranch(branchConfig, forceRebase = false) {
493
493
  commitSha
494
494
  };
495
495
  }
496
- if (mergeStatus === "stale" && ["conflicted", "never"].includes(config.rebaseWhen) && !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel))) {
496
+ if (mergeStatus === "stale" && ["conflicted", "never"].includes(config.rebaseWhen) &&
497
+ /* v8 ignore next -- needs test */
498
+ !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel))) {
497
499
  logger.warn("Branch cannot automerge because it is behind base branch and rebaseWhen setting disallows rebasing - raising a PR instead");
498
500
  config.forcePr = true;
499
501
  config.branchAutomergeFailureMessage = mergeStatus;
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/update/branch/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type MinimumReleaseAgeBehaviour,\n type RenovateConfig,\n type UpdateType,\n} from '../../../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n MANAGER_LOCKFILE_ERROR,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n WORKER_FILE_UPDATE_FAILED,\n} from '../../../../constants/error-messages.ts';\nimport { logger, removeMeta } from '../../../../logger/index.ts';\nimport { getAdditionalFiles } from '../../../../modules/manager/npm/post-update/index.ts';\nimport {\n ensureComment,\n ensureCommentRemoval,\n} from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedMs } from '../../../../util/date.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { filterValidCommitTrailers } from '../../../../util/git/commit-trailers.ts';\nimport {\n getMergeConfidenceLevel,\n isActiveConfidenceLevel,\n satisfiesConfidenceLevel,\n} from '../../../../util/merge-confidence/index.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { toMs } from '../../../../util/pretty-time.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { getCount, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchResult,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { checkAutoMerge } from '../pr/automerge.ts';\nimport { ensurePr, getPlatformPrOptions } from '../pr/index.ts';\nimport { setArtifactErrorStatus } from './artifacts.ts';\nimport { tryBranchAutomerge } from './automerge.ts';\nimport { bumpVersions } from './bump-versions.ts';\nimport { prAlreadyExisted } from './check-existing.ts';\nimport { commitFilesToBranch } from './commit.ts';\nimport executePostUpgradeCommands from './execute-post-upgrade-commands.ts';\nimport { getUpdatedPackageFiles } from './get-updated.ts';\nimport { handleClosedPr, handleModifiedPr } from './handle-existing.ts';\nimport { shouldReuseExistingBranch } from './reuse.ts';\nimport { isScheduledNow } from './schedule.ts';\nimport { setConfidence, setStability } from './status-checks.ts';\n\nasync function setBranchStatusChecks(config: BranchConfig): Promise<void> {\n await setStability(config);\n await setConfidence(config);\n}\n\nasync function rebaseCheck(\n config: RenovateConfig,\n branchPr: Pr,\n): Promise<boolean> {\n const titleRebase = branchPr.title?.startsWith('rebase!');\n if (titleRebase) {\n logger.debug(\n `Manual rebase requested via PR title for #${branchPr.number}`,\n );\n return true;\n }\n const labelRebase = !!branchPr.labels?.includes(config.rebaseLabel!);\n if (labelRebase) {\n logger.debug(\n `Manual rebase requested via PR labels for #${branchPr.number}`,\n );\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would delete label ${config.rebaseLabel!} from #${\n branchPr.number\n }`,\n );\n } else {\n await platform.deleteLabel(branchPr.number, config.rebaseLabel!);\n }\n return true;\n }\n const prRebaseChecked = !!branchPr.bodyStruct?.rebaseRequested;\n if (prRebaseChecked) {\n logger.debug(\n `Manual rebase requested via PR checkbox for #${branchPr.number}`,\n );\n return true;\n }\n\n return false;\n}\n\nasync function deleteBranchSilently(branchName: string): Promise<void> {\n try {\n await scm.deleteBranch(branchName);\n } catch (err) {\n /* v8 ignore next -- needs test */\n logger.debug({ branchName, err }, 'Branch auto-remove failed');\n }\n}\n\nfunction userChangedTargetBranch(pr: Pr): boolean {\n const oldTargetBranch = pr.bodyStruct?.debugData?.targetBranch;\n if (oldTargetBranch && pr.targetBranch) {\n return pr.targetBranch !== oldTargetBranch;\n }\n return false;\n}\n\nexport interface ProcessBranchResult {\n branchExists: boolean;\n updatesVerified?: boolean;\n prBlockedBy?: PrBlockedBy;\n prNo?: number;\n result: BranchResult;\n commitSha?: string | null;\n}\n\nexport async function processBranch(\n branchConfig: BranchConfig,\n forceRebase = false,\n): Promise<ProcessBranchResult> {\n let commitSha: string | null = null;\n let config: BranchConfig = { ...branchConfig };\n logger.trace({ config }, 'processBranch()');\n let branchExists = await scm.branchExists(config.branchName);\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n let updatesVerified = false;\n if (!branchExists && config.branchPrefix !== config.branchPrefixOld) {\n const branchName = config.branchName.replace(\n config.branchPrefix!,\n config.branchPrefixOld!,\n );\n branchExists = await scm.branchExists(branchName);\n // v8 ignore else -- TODO: add test #40625\n if (branchExists) {\n config.branchName = branchName;\n logger.debug('Found existing branch with branchPrefixOld');\n }\n }\n\n if (\n !branchExists &&\n branchConfig.minimumGroupSize &&\n branchConfig.minimumGroupSize > branchConfig.upgrades.length &&\n !dependencyDashboardCheck\n ) {\n logger.debug(\n `Skipping branch creation as minimumGroupSize: ${branchConfig.minimumGroupSize} is not met`,\n );\n return {\n branchExists: false,\n result: 'minimum-group-size-not-met',\n };\n }\n\n let branchPr = await platform.getBranchPr(\n config.branchName,\n config.baseBranch,\n );\n logger.debug(`branchExists=${branchExists}`);\n logger.debug(`dependencyDashboardCheck=${dependencyDashboardCheck!}`);\n if (branchPr) {\n config.rebaseRequested = await rebaseCheck(config, branchPr);\n logger.debug(`PR rebase requested=${config.rebaseRequested}`);\n }\n const keepUpdatedLabel = config.keepUpdatedLabel;\n const artifactErrorTopic = emojify(':warning: Artifact update problem');\n const artifactNoticeTopic = emojify(\n ':information_source: Artifact update notice',\n );\n try {\n // Check if branch already existed\n const existingPr =\n !branchPr || config.automerge\n ? await prAlreadyExisted(config)\n : undefined;\n if (existingPr?.state === 'merged') {\n logger.debug(`Matching PR #${existingPr.number} was merged previously`);\n if (config.automerge) {\n logger.debug('Disabling automerge because PR was merged previously');\n config.automerge = false;\n config.automergedPreviously = true;\n }\n } else if (!branchPr && existingPr && !dependencyDashboardCheck) {\n logger.debug(\n { prTitle: config.prTitle },\n `Closed PR #${existingPr.number} already exists. Skipping branch.`,\n );\n await handleClosedPr(config, existingPr);\n return {\n branchExists: false,\n prNo: existingPr.number,\n result: 'already-existed',\n };\n }\n if (\n !branchExists &&\n branchConfig.pendingChecks &&\n !dependencyDashboardCheck\n ) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because internalChecksFilter was not met`,\n );\n return {\n branchExists: false,\n result: 'pending',\n };\n }\n if (!branchExists) {\n if (config.mode === 'silent' && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because mode=silent`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n if (config.dependencyDashboardApproval && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because dependencyDashboardApproval=true`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n }\n\n logger.debug(\n `Open PR Count: ${getCount('ConcurrentPRs')}, Existing Branch Count: ${getCount('Branches')}, Hourly PR Count: ${getCount('HourlyPRs')}, Hourly Commit Count: ${getCount('HourlyCommits')}`,\n );\n\n if (\n !branchExists &&\n isLimitReached('Branches', branchConfig) &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached branch limit - skipping branch creation');\n return {\n branchExists,\n result: 'branch-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('Commits') &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached commits per run limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-per-run-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('HourlyCommits', branchConfig) &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached hourly commits limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-hourly-limit-reached',\n };\n }\n if (branchExists) {\n // check if branch is labelled to stop\n config.stopUpdating = branchPr?.labels?.includes(\n config.stopUpdatingLabel!,\n );\n\n const prRebaseChecked = !!branchPr?.bodyStruct?.rebaseRequested;\n\n if (branchExists && !dependencyDashboardCheck && !prRebaseChecked) {\n if (config.stopUpdating) {\n logger.info(\n 'Branch updating is skipped because stopUpdatingLabel is present in config',\n );\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n\n if (config.pendingChecks) {\n logger.info(\n 'Branch updating is skipped because internalChecksFilter was not met',\n );\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'pending',\n };\n }\n }\n\n logger.debug('Checking if PR has been edited');\n const branchIsModified = await scm.isBranchModified(\n config.branchName,\n config.baseBranch,\n );\n if (branchPr) {\n logger.debug(`Found existing branch PR #${branchPr.number}`);\n if (branchPr.state !== 'open') {\n logger.debug(\n 'PR has been closed or merged since this run started - aborting',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n if (branchIsModified || userChangedTargetBranch(branchPr)) {\n logger.debug(`PR has been edited, PrNo:${branchPr.number}`);\n await handleModifiedPr(config, branchPr);\n if (!(!!dependencyDashboardCheck || config.rebaseRequested)) {\n return {\n branchExists,\n prNo: branchPr.number,\n result: 'pr-edited',\n };\n }\n }\n } else if (branchIsModified) {\n const oldPr = await platform.findPr({\n branchName: config.branchName,\n state: '!open',\n targetBranch: config.baseBranch,\n });\n if (!oldPr) {\n logger.debug('Branch has been edited but found no PR - skipping');\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n const branchSha = await scm.getBranchCommit(config.branchName);\n const oldPrSha = oldPr?.sha;\n if (!oldPrSha || oldPrSha === branchSha) {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR matching this branch - will override it',\n );\n } else {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR but the SHA is different',\n );\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n }\n }\n\n // Check schedule\n config.isScheduledNow = isScheduledNow(config, 'schedule');\n if (!config.isScheduledNow && !dependencyDashboardCheck) {\n if (!branchExists) {\n logger.debug('Skipping branch creation as not within schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n if (config.updateNotScheduled === false && !config.rebaseRequested) {\n logger.debug('Skipping branch update as not within schedule');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'update-not-scheduled',\n };\n }\n if (\n !branchPr &&\n !(config.automerge && config.automergeType === 'branch') // if branch is configured for automerge there's no need for a PR\n ) {\n logger.debug('Skipping PR creation out of schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n logger.debug(\n 'Branch + PR exists but is not scheduled -- will update if necessary',\n );\n }\n //stability checks\n if (\n config.upgrades.some(\n (upgrade) =>\n isNonEmptyString(upgrade.minimumReleaseAge) ||\n isActiveConfidenceLevel(upgrade.minimumConfidence!),\n )\n ) {\n const depNamesWithoutReleaseTimestamp: Record<\n MinimumReleaseAgeBehaviour,\n {\n depName: string;\n updateType: UpdateType;\n }[]\n > = {\n 'timestamp-required': [],\n 'timestamp-optional': [],\n };\n\n // Only set a stability status check if one or more of the updates contain\n // both a minimumReleaseAge setting and a releaseTimestamp\n config.stabilityStatus = 'green';\n // Default to 'success' but set 'pending' if any update is pending\n for (const upgrade of config.upgrades) {\n const minimumReleaseAgeMs = isNonEmptyString(upgrade.minimumReleaseAge)\n ? coerceNumber(toMs(upgrade.minimumReleaseAge), 0)\n : 0;\n\n if (minimumReleaseAgeMs) {\n const minimumReleaseAgeBehaviour: MinimumReleaseAgeBehaviour =\n upgrade.minimumReleaseAgeBehaviour ?? 'timestamp-required';\n\n // regardless of the value of `minimumReleaseAgeBehaviour`, if there is a timestamp, we will process it according to `minimumReleaseAge`\n if (upgrade.releaseTimestamp) {\n const timeElapsed = getElapsedMs(upgrade.releaseTimestamp);\n if (timeElapsed < minimumReleaseAgeMs) {\n logger.debug(\n {\n depName: upgrade.depName,\n timeElapsed,\n minimumReleaseAge: upgrade.minimumReleaseAge,\n },\n 'Update has not passed minimum release age',\n );\n config.stabilityStatus = 'yellow';\n continue;\n }\n } else {\n // if we're set to `minimumReleaseAgeBehaviour=timestamp-required`, and there isn't a timestamp, always mark the update as pending\n if (minimumReleaseAgeBehaviour === 'timestamp-required') {\n depNamesWithoutReleaseTimestamp['timestamp-required'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n config.stabilityStatus = 'yellow';\n continue;\n } else {\n // if there is no timestamp, and we're running in `optional` mode, we can allow it, but make sure to warn the user\n depNamesWithoutReleaseTimestamp['timestamp-optional'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n }\n }\n }\n const datasource = upgrade.datasource!;\n const depName = upgrade.depName!;\n const packageName = upgrade.packageName!;\n const minimumConfidence = upgrade.minimumConfidence!;\n const updateType = upgrade.updateType!;\n const currentVersion = upgrade.currentVersion!;\n const newVersion = upgrade.newVersion!;\n if (isActiveConfidenceLevel(minimumConfidence)) {\n const confidence =\n (await getMergeConfidenceLevel(\n datasource,\n packageName,\n currentVersion,\n newVersion,\n updateType,\n )) ?? 'neutral';\n if (satisfiesConfidenceLevel(confidence, minimumConfidence)) {\n config.confidenceStatus = 'green';\n } else {\n logger.debug(\n { depName, confidence, minimumConfidence },\n 'Update does not meet minimum confidence scores',\n );\n config.confidenceStatus = 'yellow';\n continue;\n }\n }\n }\n\n if (depNamesWithoutReleaseTimestamp['timestamp-required'].length) {\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-required'] },\n `Marking ${depNamesWithoutReleaseTimestamp['timestamp-required'].length} release(s) as pending, as they do not have a releaseTimestamp and we're running with minimumReleaseAgeBehaviour=timestamp-required`,\n );\n }\n if (depNamesWithoutReleaseTimestamp['timestamp-optional'].length) {\n logger.once.warn(\n \"Some upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-optional'] },\n `${depNamesWithoutReleaseTimestamp['timestamp-optional'].length} upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding`,\n );\n }\n\n // Don't create a branch if we know it will be status 'pending'\n if (\n !dependencyDashboardCheck &&\n !branchExists &&\n config.stabilityStatus === 'yellow' &&\n ['not-pending', 'status-success'].includes(config.prCreation!)\n ) {\n logger.debug(\n 'Skipping branch creation due to internal status checks not met',\n );\n return {\n branchExists,\n result: 'pending',\n };\n }\n }\n\n let userRebaseRequested =\n dependencyDashboardCheck === 'rebase' ||\n !!config.dependencyDashboardRebaseAllOpen ||\n !!config.rebaseRequested;\n const userApproveAllPendingPR = !!config.dependencyDashboardAllPending;\n const userOpenAllRateLimtedPR = !!config.dependencyDashboardAllRateLimited;\n const userOpenAllSchedulePendingPR =\n !!config.dependencyDashboardAllAwaitingSchedule;\n\n if (forceRebase) {\n logger.debug('Force rebase because branch needs updating');\n config.reuseExistingBranch = false;\n } else if (userRebaseRequested) {\n logger.debug('User has requested rebase');\n config.reuseExistingBranch = false;\n } else if (dependencyDashboardCheck === 'global-config') {\n logger.debug(`Manual create/rebase requested via checkedBranches`);\n config.reuseExistingBranch = false;\n userRebaseRequested = true;\n } else if (userApproveAllPendingPR) {\n logger.debug(\n 'A user manually approved all pending PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllRateLimtedPR) {\n logger.debug(\n 'A user manually approved all rate-limited PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllSchedulePendingPR) {\n logger.debug(\n 'A user manually requested all awaiting schedule PRs via the Dependency Dashboard.',\n );\n } else if (\n branchExists &&\n config.rebaseWhen === 'never' &&\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel)) &&\n !dependencyDashboardCheck\n ) {\n logger.debug('rebaseWhen=never so skipping branch update check');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n // if the base branch has been changed by user in renovate config, rebase onto the new baseBranch\n // we have already confirmed earlier that branch isn't modified, so its safe to use targetBranch here\n else if (\n branchPr?.targetBranch &&\n branchPr.targetBranch !== config.baseBranch\n ) {\n logger.debug(\n 'Base branch changed by user, rebasing the branch onto new base',\n );\n config.reuseExistingBranch = false;\n } else if (config.cacheFingerprintMatch === 'no-match') {\n logger.debug(\n 'Cache fingerprint does not match, cannot reuse existing branch',\n );\n config.reuseExistingBranch = false;\n } else {\n config = await shouldReuseExistingBranch(config);\n }\n // TODO: types (#22198)\n logger.debug(`Using reuseExistingBranch: ${config.reuseExistingBranch!}`);\n if (\n !(\n config.reuseExistingBranch && config.cacheFingerprintMatch === 'matched'\n )\n ) {\n await scm.checkoutBranch(config.baseBranch);\n const res = await getUpdatedPackageFiles(config);\n if (res.artifactErrors && config.artifactErrors) {\n res.artifactErrors = config.artifactErrors.concat(res.artifactErrors);\n }\n config = { ...config, ...res };\n if (config.updatedPackageFiles?.length) {\n logger.debug(\n `Updated ${config.updatedPackageFiles.length} package files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No package files need updating');\n }\n const additionalFiles = await getAdditionalFiles(\n config,\n branchConfig.packageFiles!,\n );\n config.artifactErrors = (config.artifactErrors ?? []).concat(\n additionalFiles.artifactErrors,\n );\n config.artifactNotices = (config.artifactNotices ?? []).concat(\n additionalFiles.artifactNotices ?? [],\n );\n config.updatedArtifacts = (config.updatedArtifacts ?? []).concat(\n additionalFiles.updatedArtifacts,\n );\n if (config.updatedArtifacts?.length) {\n logger.debug(\n {\n updatedArtifacts: config.updatedArtifacts.map((f) =>\n f.type === 'deletion' ? `${f.path} (delete)` : f.path,\n ),\n },\n `Updated ${config.updatedArtifacts.length} lock files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No updated lock files in branch');\n }\n\n await embedChangelogs({\n upgrades: config.upgrades,\n stage: 'branch',\n });\n\n const postUpgradeCommandResults =\n await executePostUpgradeCommands(config);\n\n if (postUpgradeCommandResults !== null) {\n const { updatedArtifacts, artifactErrors } = postUpgradeCommandResults;\n config.updatedArtifacts = updatedArtifacts;\n config.artifactErrors = artifactErrors;\n }\n\n // modifies the file changes in place to allow having a version bump in a packageFile or artifact\n await bumpVersions(config);\n\n removeMeta(['dep']);\n\n if (config.artifactErrors?.length) {\n if (config.releaseTimestamp) {\n logger.debug(`Branch timestamp: ${config.releaseTimestamp}`);\n const releaseTimestamp = DateTime.fromISO(config.releaseTimestamp);\n if (releaseTimestamp.plus({ hours: 2 }) < DateTime.local()) {\n logger.debug(\n 'PR is older than 2 hours, raise PR with lock file errors',\n );\n } else if (branchExists) {\n logger.debug(\n 'PR is less than 2 hours old but branchExists so updating anyway',\n );\n } else {\n logger.debug(\n 'PR is less than 2 hours old - raise error instead of PR',\n );\n throw new Error(MANAGER_LOCKFILE_ERROR);\n }\n } else {\n logger.debug('PR has no releaseTimestamp');\n }\n } else if (config.updatedArtifacts?.length && branchPr) {\n // If there are artifacts, no errors, and an existing PR then ensure any artifacts error comment is removed\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure comment removal in PR #${branchPr.number}`,\n );\n } else {\n // Remove artifacts error comment only if this run has successfully updated artifacts\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactErrorTopic,\n });\n\n // v8 ignore else -- TODO: add test #40625\n if (!config.artifactNotices?.length) {\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactNoticeTopic,\n });\n }\n }\n }\n const forcedManually = userRebaseRequested || !branchExists;\n\n config.isConflicted ??=\n branchExists &&\n (await scm.isBranchConflicted(config.baseBranch, config.branchName));\n config.forceCommit = forcedManually || config.isConflicted;\n\n // compile commit message with body, which maybe needs changelogs\n if (config.commitBody) {\n // changelog is on first upgrade\n config.commitMessage = `${config.commitMessage!}\\n\\n${template.compile(\n config.commitBody,\n {\n ...config,\n logJSON: config.upgrades[0].logJSON,\n releases: config.upgrades[0].releases,\n },\n )}`;\n\n logger.trace(`commitMessage: ${JSON.stringify(config.commitMessage)}`);\n }\n\n if (config.commitTrailers) {\n // Template expansions can produce broken trailers\n config.commitTrailers = filterValidCommitTrailers(\n config.commitTrailers.map((trailer) =>\n template.compile(trailer, config),\n ),\n );\n logger.trace(\n `commitTrailers: ${JSON.stringify(config.commitTrailers)}`,\n );\n }\n\n commitSha = await commitFilesToBranch(config);\n // Checkout to base branch to ensure that the next branch processing always starts with git being on the baseBranch\n // baseBranch is not checked out at the start of processBranch() due to pull/16246\n await scm.checkoutBranch(config.baseBranch);\n updatesVerified = true;\n\n // only update artifact status if branch was updated\n // also do before platform automerge reattempt\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n }\n\n if (branchPr) {\n const platformPrOptions = getPlatformPrOptions(config);\n if (\n commitSha &&\n platformPrOptions.usePlatformAutomerge &&\n platform.reattemptPlatformAutomerge\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would reattempt platform automerge for PR #${branchPr.number}`,\n );\n } else {\n await platform.reattemptPlatformAutomerge({\n number: branchPr.number,\n platformPrOptions,\n });\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (platform.refreshPr) {\n await platform.refreshPr(branchPr.number);\n }\n }\n if (!commitSha && !branchExists) {\n return {\n branchExists,\n result: 'no-work',\n };\n }\n if (commitSha) {\n const action = branchExists ? 'updated' : 'created';\n logger.info({ commitSha }, `Branch ${action}`);\n }\n await setBranchStatusChecks(config);\n // new commit means status check are pretty sure pending but maybe not reported yet\n // if PR has not been created + new commit + prCreation !== immediate skip\n // but do not break when there are artifact errors\n if (\n !branchPr &&\n !config.artifactErrors?.length &&\n !userRebaseRequested &&\n commitSha &&\n config.prCreation !== 'immediate'\n ) {\n logger.debug(`Branch status pending, current sha: ${commitSha}`);\n return {\n branchExists: true,\n updatesVerified,\n result: 'pending',\n commitSha,\n };\n }\n\n // Try to automerge branch and finish if successful, but only if branch already existed before this run\n // skip if we have a non-immediate pr and there is an existing PR,\n // we want to update the PR and skip the Auto merge since status checks aren't done yet\n if (!config.artifactErrors?.length && (!commitSha || config.ignoreTests)) {\n const mergeStatus = await tryBranchAutomerge(config);\n logger.debug(`mergeStatus=${mergeStatus}`);\n if (mergeStatus === 'automerged') {\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would delete branch${config.branchName}`);\n } else {\n await deleteBranchSilently(config.branchName);\n }\n logger.debug('Branch is automerged - returning');\n return { branchExists: false, result: 'automerged' };\n }\n if (mergeStatus === 'off schedule') {\n if (userRebaseRequested) {\n config.forcePr = true;\n } else {\n logger.debug(\n 'Branch cannot automerge now because automergeSchedule is off schedule - skipping',\n );\n return {\n branchExists,\n result: 'not-scheduled',\n commitSha,\n };\n }\n }\n if (\n mergeStatus === 'stale' &&\n ['conflicted', 'never'].includes(config.rebaseWhen!) &&\n /* v8 ignore next -- needs test */\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel))\n ) {\n logger.warn(\n 'Branch cannot automerge because it is behind base branch and rebaseWhen setting disallows rebasing - raising a PR instead',\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n if (\n mergeStatus === 'automerge aborted - PR exists' ||\n mergeStatus === 'branch status error' ||\n mergeStatus === 'failed'\n ) {\n logger.debug(\n `Branch automerge not possible, mergeStatus:${mergeStatus}`,\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (err.statusCode === 404) {\n logger.debug({ err }, 'Received a 404 error - aborting run');\n throw new Error(REPOSITORY_CHANGED);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.debug('Passing rate-limit-exceeded error up');\n throw err;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.debug('Passing repository-changed error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message?.startsWith('remote: Invalid username or password')) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (\n err.message?.startsWith(\n 'ssh_exchange_identification: Connection closed by remote host',\n )\n ) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.debug('Passing bad-credentials error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.debug('Passing integration-unauthorized error up');\n throw err;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n logger.debug('Passing lockfile-error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message?.includes('space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n /* v8 ignore if -- needs test */\n if (err.message === SYSTEM_INSUFFICIENT_DISK_SPACE) {\n logger.debug('Passing disk-space error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message.startsWith('Resource not accessible by integration')) {\n logger.debug('Passing 403 error up');\n throw err;\n }\n /* v8 ignore next -- needs test */\n if (err.message === WORKER_FILE_UPDATE_FAILED) {\n logger.warn('Error updating branch: update failure');\n } else if (err.message.startsWith('bundler-')) {\n // we have already warned inside the bundler artifacts error handling, so just return\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n } else if (err.message?.includes('fatal: Authentication failed')) {\n throw new Error(PLATFORM_AUTHENTICATION_ERROR);\n } else if (err.message?.includes('fatal: bad revision')) {\n logger.debug({ err }, 'Aborting job due to bad revision error');\n throw new Error(REPOSITORY_CHANGED);\n } else if (err.message === CONFIG_VALIDATION) {\n logger.debug('Passing config validation error up');\n throw err;\n } else if (err.message === TEMPORARY_ERROR) {\n logger.debug('Passing TEMPORARY_ERROR error up');\n throw err;\n } else if (!(err instanceof ExternalHostError)) {\n logger.warn({ err }, `Error updating branch`);\n }\n // Don't throw here - we don't want to stop the other renovations\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n }\n try {\n logger.debug('Ensuring PR');\n logger.debug(\n `There are ${config.errors!.length} errors and ${\n config.warnings!.length\n } warnings`,\n );\n const ensurePrResult = await ensurePr(config);\n if (ensurePrResult.type === 'without-pr') {\n const { prBlockedBy } = ensurePrResult;\n branchPr = null;\n if (prBlockedBy === 'RateLimited' && !config.isVulnerabilityAlert) {\n logger.debug('Reached PR limit - skipping PR creation');\n return {\n branchExists,\n prBlockedBy,\n result: 'pr-limit-reached',\n commitSha,\n };\n }\n // TODO: ensurePr should check for automerge itself (#9719)\n if (prBlockedBy === 'NeedsApproval') {\n return {\n branchExists,\n prBlockedBy,\n result: 'needs-pr-approval',\n commitSha,\n };\n }\n if (prBlockedBy === 'AwaitingTests') {\n return {\n branchExists,\n prBlockedBy,\n result: 'pending',\n commitSha,\n };\n }\n if (prBlockedBy === 'BranchAutomerge') {\n return {\n branchExists,\n prBlockedBy,\n result: 'done',\n commitSha,\n };\n }\n if (prBlockedBy === 'Error') {\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n logger.warn({ prBlockedBy }, 'Unknown PrBlockedBy result');\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n // v8 ignore else -- TODO: add test #40625\n if (ensurePrResult.type === 'with-pr') {\n const { pr } = ensurePrResult;\n branchPr = pr;\n // Retry setting branch statuses after PR/MR creation so that\n // platforms using MR pipelines (e.g. GitLab) have a pipeline to\n // associate the status with. The earlier call may have been\n // skipped if no pipeline existed yet.\n await setBranchStatusChecks(config);\n\n // only update artifact status if branch was updated\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n if (config.artifactErrors?.length) {\n logger.warn(\n { artifactErrors: config.artifactErrors },\n 'artifactErrors',\n );\n let content = `Renovate failed to update `;\n content +=\n config.artifactErrors.length > 1 ? 'artifacts' : 'an artifact';\n content += ' related to this branch. ';\n content += template.compile(\n config.userStrings!.artifactErrorWarning,\n config,\n );\n content += emojify(\n `\\n\\n:recycle: Renovate will retry this branch, including artifacts, only when one of the following happens:\\n\\n`,\n );\n content +=\n ' - any of the package files in this branch needs updating, or \\n';\n content += ' - the branch becomes conflicted, or\\n';\n content +=\n ' - you click the rebase/retry checkbox if found above, or\\n';\n content +=\n ' - you rename this PR\\'s title to start with \"rebase!\" to trigger it manually';\n content += '\\n\\nThe artifact failure details are included below:\\n\\n';\n // TODO: types (#22198)\n config.artifactErrors.forEach((error) => {\n content += `##### File name: ${error.fileName!}\\n\\n`;\n content += `\\`\\`\\`\\n${error.stderr!}\\n\\`\\`\\`\\n\\n`;\n });\n content = platform.massageMarkdown(content, config.rebaseLabel);\n // v8 ignore else -- TODO: add test #40625\n if (\n !(\n config.suppressNotifications!.includes('artifactErrors') ||\n config.suppressNotifications!.includes('lockFileErrors')\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure lock file error comment in PR #${pr.number}`,\n );\n } else {\n await ensureComment({\n number: pr.number,\n topic: artifactErrorTopic,\n content,\n });\n }\n }\n } else {\n if (config.artifactNotices?.length) {\n const contentLines: string[] = [];\n for (const notice of config.artifactNotices) {\n contentLines.push(`##### File name: ${notice.file}`);\n contentLines.push(notice.message);\n }\n const content = contentLines.join('\\n\\n');\n await ensureComment({\n number: pr.number,\n topic: artifactNoticeTopic,\n content,\n });\n }\n\n if (config.automerge) {\n logger.debug('PR is configured for automerge');\n // skip automerge if there is a new commit since status checks aren't done yet\n // v8 ignore else -- TODO: add test #40625\n if (config.ignoreTests === true || !commitSha) {\n logger.debug('checking auto-merge');\n const prAutomergeResult = await checkAutoMerge(pr, config);\n if (prAutomergeResult?.automerged) {\n return {\n branchExists,\n result: 'automerged',\n commitSha,\n };\n }\n }\n } else {\n logger.debug('PR is not configured for automerge');\n }\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (\n err instanceof ExternalHostError ||\n [PLATFORM_RATE_LIMIT_EXCEEDED, REPOSITORY_CHANGED].includes(err.message)\n ) {\n logger.debug('Passing PR error up');\n throw err;\n }\n // Otherwise don't throw here - we don't want to stop the other renovations\n logger.error({ err }, `Error ensuring PR`);\n }\n if (!branchExists) {\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'pr-created',\n commitSha,\n };\n }\n return {\n branchExists,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'done',\n commitSha,\n };\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["template.compile"],"sources":["../../../../../lib/workers/repository/update/branch/index.ts"],"sourcesContent":["import { isNonEmptyString } from '@sindresorhus/is';\nimport { DateTime } from 'luxon';\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport {\n type MinimumReleaseAgeBehaviour,\n type RenovateConfig,\n type UpdateType,\n} from '../../../../config/types.ts';\nimport {\n CONFIG_VALIDATION,\n MANAGER_LOCKFILE_ERROR,\n PLATFORM_AUTHENTICATION_ERROR,\n PLATFORM_BAD_CREDENTIALS,\n PLATFORM_INTEGRATION_UNAUTHORIZED,\n PLATFORM_RATE_LIMIT_EXCEEDED,\n REPOSITORY_CHANGED,\n SYSTEM_INSUFFICIENT_DISK_SPACE,\n TEMPORARY_ERROR,\n WORKER_FILE_UPDATE_FAILED,\n} from '../../../../constants/error-messages.ts';\nimport { logger, removeMeta } from '../../../../logger/index.ts';\nimport { getAdditionalFiles } from '../../../../modules/manager/npm/post-update/index.ts';\nimport {\n ensureComment,\n ensureCommentRemoval,\n} from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport { ExternalHostError } from '../../../../types/errors/external-host-error.ts';\nimport { getElapsedMs } from '../../../../util/date.ts';\nimport { emojify } from '../../../../util/emoji.ts';\nimport { filterValidCommitTrailers } from '../../../../util/git/commit-trailers.ts';\nimport {\n getMergeConfidenceLevel,\n isActiveConfidenceLevel,\n satisfiesConfidenceLevel,\n} from '../../../../util/merge-confidence/index.ts';\nimport { coerceNumber } from '../../../../util/number.ts';\nimport { toMs } from '../../../../util/pretty-time.ts';\nimport * as template from '../../../../util/template/index.ts';\nimport { getCount, isLimitReached } from '../../../global/limits.ts';\nimport type {\n BranchConfig,\n BranchResult,\n PrBlockedBy,\n} from '../../../types.ts';\nimport { embedChangelogs } from '../../changelog/index.ts';\nimport { checkAutoMerge } from '../pr/automerge.ts';\nimport { ensurePr, getPlatformPrOptions } from '../pr/index.ts';\nimport { setArtifactErrorStatus } from './artifacts.ts';\nimport { tryBranchAutomerge } from './automerge.ts';\nimport { bumpVersions } from './bump-versions.ts';\nimport { prAlreadyExisted } from './check-existing.ts';\nimport { commitFilesToBranch } from './commit.ts';\nimport executePostUpgradeCommands from './execute-post-upgrade-commands.ts';\nimport { getUpdatedPackageFiles } from './get-updated.ts';\nimport { handleClosedPr, handleModifiedPr } from './handle-existing.ts';\nimport { shouldReuseExistingBranch } from './reuse.ts';\nimport { isScheduledNow } from './schedule.ts';\nimport { setConfidence, setStability } from './status-checks.ts';\n\nasync function setBranchStatusChecks(config: BranchConfig): Promise<void> {\n await setStability(config);\n await setConfidence(config);\n}\n\nasync function rebaseCheck(\n config: RenovateConfig,\n branchPr: Pr,\n): Promise<boolean> {\n const titleRebase = branchPr.title?.startsWith('rebase!');\n if (titleRebase) {\n logger.debug(\n `Manual rebase requested via PR title for #${branchPr.number}`,\n );\n return true;\n }\n const labelRebase = !!branchPr.labels?.includes(config.rebaseLabel!);\n if (labelRebase) {\n logger.debug(\n `Manual rebase requested via PR labels for #${branchPr.number}`,\n );\n /* v8 ignore next -- needs test */\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would delete label ${config.rebaseLabel!} from #${\n branchPr.number\n }`,\n );\n } else {\n await platform.deleteLabel(branchPr.number, config.rebaseLabel!);\n }\n return true;\n }\n const prRebaseChecked = !!branchPr.bodyStruct?.rebaseRequested;\n if (prRebaseChecked) {\n logger.debug(\n `Manual rebase requested via PR checkbox for #${branchPr.number}`,\n );\n return true;\n }\n\n return false;\n}\n\nasync function deleteBranchSilently(branchName: string): Promise<void> {\n try {\n await scm.deleteBranch(branchName);\n } catch (err) {\n /* v8 ignore next -- needs test */\n logger.debug({ branchName, err }, 'Branch auto-remove failed');\n }\n}\n\nfunction userChangedTargetBranch(pr: Pr): boolean {\n const oldTargetBranch = pr.bodyStruct?.debugData?.targetBranch;\n if (oldTargetBranch && pr.targetBranch) {\n return pr.targetBranch !== oldTargetBranch;\n }\n return false;\n}\n\nexport interface ProcessBranchResult {\n branchExists: boolean;\n updatesVerified?: boolean;\n prBlockedBy?: PrBlockedBy;\n prNo?: number;\n result: BranchResult;\n commitSha?: string | null;\n}\n\nexport async function processBranch(\n branchConfig: BranchConfig,\n forceRebase = false,\n): Promise<ProcessBranchResult> {\n let commitSha: string | null = null;\n let config: BranchConfig = { ...branchConfig };\n logger.trace({ config }, 'processBranch()');\n let branchExists = await scm.branchExists(config.branchName);\n const dependencyDashboardCheck =\n config.dependencyDashboardChecks?.[config.branchName];\n let updatesVerified = false;\n if (!branchExists && config.branchPrefix !== config.branchPrefixOld) {\n const branchName = config.branchName.replace(\n config.branchPrefix!,\n config.branchPrefixOld!,\n );\n branchExists = await scm.branchExists(branchName);\n // v8 ignore else -- TODO: add test #40625\n if (branchExists) {\n config.branchName = branchName;\n logger.debug('Found existing branch with branchPrefixOld');\n }\n }\n\n if (\n !branchExists &&\n branchConfig.minimumGroupSize &&\n branchConfig.minimumGroupSize > branchConfig.upgrades.length &&\n !dependencyDashboardCheck\n ) {\n logger.debug(\n `Skipping branch creation as minimumGroupSize: ${branchConfig.minimumGroupSize} is not met`,\n );\n return {\n branchExists: false,\n result: 'minimum-group-size-not-met',\n };\n }\n\n let branchPr = await platform.getBranchPr(\n config.branchName,\n config.baseBranch,\n );\n logger.debug(`branchExists=${branchExists}`);\n logger.debug(`dependencyDashboardCheck=${dependencyDashboardCheck!}`);\n if (branchPr) {\n config.rebaseRequested = await rebaseCheck(config, branchPr);\n logger.debug(`PR rebase requested=${config.rebaseRequested}`);\n }\n const keepUpdatedLabel = config.keepUpdatedLabel;\n const artifactErrorTopic = emojify(':warning: Artifact update problem');\n const artifactNoticeTopic = emojify(\n ':information_source: Artifact update notice',\n );\n try {\n // Check if branch already existed\n const existingPr =\n !branchPr || config.automerge\n ? await prAlreadyExisted(config)\n : undefined;\n if (existingPr?.state === 'merged') {\n logger.debug(`Matching PR #${existingPr.number} was merged previously`);\n if (config.automerge) {\n logger.debug('Disabling automerge because PR was merged previously');\n config.automerge = false;\n config.automergedPreviously = true;\n }\n } else if (!branchPr && existingPr && !dependencyDashboardCheck) {\n logger.debug(\n { prTitle: config.prTitle },\n `Closed PR #${existingPr.number} already exists. Skipping branch.`,\n );\n await handleClosedPr(config, existingPr);\n return {\n branchExists: false,\n prNo: existingPr.number,\n result: 'already-existed',\n };\n }\n if (\n !branchExists &&\n branchConfig.pendingChecks &&\n !dependencyDashboardCheck\n ) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because internalChecksFilter was not met`,\n );\n return {\n branchExists: false,\n result: 'pending',\n };\n }\n if (!branchExists) {\n if (config.mode === 'silent' && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because mode=silent`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n if (config.dependencyDashboardApproval && !dependencyDashboardCheck) {\n logger.debug(\n `Branch ${config.branchName} creation is disabled because dependencyDashboardApproval=true`,\n );\n return {\n branchExists,\n result: 'needs-approval',\n };\n }\n }\n\n logger.debug(\n `Open PR Count: ${getCount('ConcurrentPRs')}, Existing Branch Count: ${getCount('Branches')}, Hourly PR Count: ${getCount('HourlyPRs')}, Hourly Commit Count: ${getCount('HourlyCommits')}`,\n );\n\n if (\n !branchExists &&\n isLimitReached('Branches', branchConfig) &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached branch limit - skipping branch creation');\n return {\n branchExists,\n result: 'branch-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('Commits') &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached commits per run limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-per-run-limit-reached',\n };\n }\n if (\n !config.rebaseRequested &&\n isLimitReached('HourlyCommits', branchConfig) &&\n !dependencyDashboardCheck &&\n !config.isVulnerabilityAlert\n ) {\n logger.debug('Reached hourly commits limit - skipping branch');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'commit-hourly-limit-reached',\n };\n }\n if (branchExists) {\n // check if branch is labelled to stop\n config.stopUpdating = branchPr?.labels?.includes(\n config.stopUpdatingLabel!,\n );\n\n const prRebaseChecked = !!branchPr?.bodyStruct?.rebaseRequested;\n\n if (branchExists && !dependencyDashboardCheck && !prRebaseChecked) {\n if (config.stopUpdating) {\n logger.info(\n 'Branch updating is skipped because stopUpdatingLabel is present in config',\n );\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n\n if (config.pendingChecks) {\n logger.info(\n 'Branch updating is skipped because internalChecksFilter was not met',\n );\n return {\n branchExists: true,\n prNo: branchPr?.number,\n result: 'pending',\n };\n }\n }\n\n logger.debug('Checking if PR has been edited');\n const branchIsModified = await scm.isBranchModified(\n config.branchName,\n config.baseBranch,\n );\n if (branchPr) {\n logger.debug(`Found existing branch PR #${branchPr.number}`);\n if (branchPr.state !== 'open') {\n logger.debug(\n 'PR has been closed or merged since this run started - aborting',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n if (branchIsModified || userChangedTargetBranch(branchPr)) {\n logger.debug(`PR has been edited, PrNo:${branchPr.number}`);\n await handleModifiedPr(config, branchPr);\n if (!(!!dependencyDashboardCheck || config.rebaseRequested)) {\n return {\n branchExists,\n prNo: branchPr.number,\n result: 'pr-edited',\n };\n }\n }\n } else if (branchIsModified) {\n const oldPr = await platform.findPr({\n branchName: config.branchName,\n state: '!open',\n targetBranch: config.baseBranch,\n });\n if (!oldPr) {\n logger.debug('Branch has been edited but found no PR - skipping');\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n const branchSha = await scm.getBranchCommit(config.branchName);\n const oldPrSha = oldPr?.sha;\n if (!oldPrSha || oldPrSha === branchSha) {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR matching this branch - will override it',\n );\n } else {\n logger.debug(\n { oldPrNumber: oldPr.number, oldPrSha, branchSha },\n 'Found old PR but the SHA is different',\n );\n return {\n branchExists,\n result: 'pr-edited',\n };\n }\n }\n }\n\n // Check schedule\n config.isScheduledNow = isScheduledNow(config, 'schedule');\n if (!config.isScheduledNow && !dependencyDashboardCheck) {\n if (!branchExists) {\n logger.debug('Skipping branch creation as not within schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n if (config.updateNotScheduled === false && !config.rebaseRequested) {\n logger.debug('Skipping branch update as not within schedule');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'update-not-scheduled',\n };\n }\n if (\n !branchPr &&\n !(config.automerge && config.automergeType === 'branch') // if branch is configured for automerge there's no need for a PR\n ) {\n logger.debug('Skipping PR creation out of schedule');\n return {\n branchExists,\n result: 'not-scheduled',\n };\n }\n logger.debug(\n 'Branch + PR exists but is not scheduled -- will update if necessary',\n );\n }\n //stability checks\n if (\n config.upgrades.some(\n (upgrade) =>\n isNonEmptyString(upgrade.minimumReleaseAge) ||\n isActiveConfidenceLevel(upgrade.minimumConfidence!),\n )\n ) {\n const depNamesWithoutReleaseTimestamp: Record<\n MinimumReleaseAgeBehaviour,\n {\n depName: string;\n updateType: UpdateType;\n }[]\n > = {\n 'timestamp-required': [],\n 'timestamp-optional': [],\n };\n\n // Only set a stability status check if one or more of the updates contain\n // both a minimumReleaseAge setting and a releaseTimestamp\n config.stabilityStatus = 'green';\n // Default to 'success' but set 'pending' if any update is pending\n for (const upgrade of config.upgrades) {\n const minimumReleaseAgeMs = isNonEmptyString(upgrade.minimumReleaseAge)\n ? coerceNumber(toMs(upgrade.minimumReleaseAge), 0)\n : 0;\n\n if (minimumReleaseAgeMs) {\n const minimumReleaseAgeBehaviour: MinimumReleaseAgeBehaviour =\n upgrade.minimumReleaseAgeBehaviour ?? 'timestamp-required';\n\n // regardless of the value of `minimumReleaseAgeBehaviour`, if there is a timestamp, we will process it according to `minimumReleaseAge`\n if (upgrade.releaseTimestamp) {\n const timeElapsed = getElapsedMs(upgrade.releaseTimestamp);\n if (timeElapsed < minimumReleaseAgeMs) {\n logger.debug(\n {\n depName: upgrade.depName,\n timeElapsed,\n minimumReleaseAge: upgrade.minimumReleaseAge,\n },\n 'Update has not passed minimum release age',\n );\n config.stabilityStatus = 'yellow';\n continue;\n }\n } else {\n // if we're set to `minimumReleaseAgeBehaviour=timestamp-required`, and there isn't a timestamp, always mark the update as pending\n if (minimumReleaseAgeBehaviour === 'timestamp-required') {\n depNamesWithoutReleaseTimestamp['timestamp-required'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n config.stabilityStatus = 'yellow';\n continue;\n } else {\n // if there is no timestamp, and we're running in `optional` mode, we can allow it, but make sure to warn the user\n depNamesWithoutReleaseTimestamp['timestamp-optional'].push({\n depName: upgrade.depName!,\n updateType: upgrade.updateType!,\n });\n }\n }\n }\n const datasource = upgrade.datasource!;\n const depName = upgrade.depName!;\n const packageName = upgrade.packageName!;\n const minimumConfidence = upgrade.minimumConfidence!;\n const updateType = upgrade.updateType!;\n const currentVersion = upgrade.currentVersion!;\n const newVersion = upgrade.newVersion!;\n if (isActiveConfidenceLevel(minimumConfidence)) {\n const confidence =\n (await getMergeConfidenceLevel(\n datasource,\n packageName,\n currentVersion,\n newVersion,\n updateType,\n )) ?? 'neutral';\n if (satisfiesConfidenceLevel(confidence, minimumConfidence)) {\n config.confidenceStatus = 'green';\n } else {\n logger.debug(\n { depName, confidence, minimumConfidence },\n 'Update does not meet minimum confidence scores',\n );\n config.confidenceStatus = 'yellow';\n continue;\n }\n }\n }\n\n if (depNamesWithoutReleaseTimestamp['timestamp-required'].length) {\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-required'] },\n `Marking ${depNamesWithoutReleaseTimestamp['timestamp-required'].length} release(s) as pending, as they do not have a releaseTimestamp and we're running with minimumReleaseAgeBehaviour=timestamp-required`,\n );\n }\n if (depNamesWithoutReleaseTimestamp['timestamp-optional'].length) {\n logger.once.warn(\n \"Some upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding. See debug logs for more information\",\n );\n logger.once.debug(\n { updates: depNamesWithoutReleaseTimestamp['timestamp-optional'] },\n `${depNamesWithoutReleaseTimestamp['timestamp-optional'].length} upgrade(s) did not have a releaseTimestamp, but as we're running with minimumReleaseAgeBehaviour=timestamp-optional, proceeding`,\n );\n }\n\n // Don't create a branch if we know it will be status 'pending'\n if (\n !dependencyDashboardCheck &&\n !branchExists &&\n config.stabilityStatus === 'yellow' &&\n ['not-pending', 'status-success'].includes(config.prCreation!)\n ) {\n logger.debug(\n 'Skipping branch creation due to internal status checks not met',\n );\n return {\n branchExists,\n result: 'pending',\n };\n }\n }\n\n let userRebaseRequested =\n dependencyDashboardCheck === 'rebase' ||\n !!config.dependencyDashboardRebaseAllOpen ||\n !!config.rebaseRequested;\n const userApproveAllPendingPR = !!config.dependencyDashboardAllPending;\n const userOpenAllRateLimtedPR = !!config.dependencyDashboardAllRateLimited;\n const userOpenAllSchedulePendingPR =\n !!config.dependencyDashboardAllAwaitingSchedule;\n\n if (forceRebase) {\n logger.debug('Force rebase because branch needs updating');\n config.reuseExistingBranch = false;\n } else if (userRebaseRequested) {\n logger.debug('User has requested rebase');\n config.reuseExistingBranch = false;\n } else if (dependencyDashboardCheck === 'global-config') {\n logger.debug(`Manual create/rebase requested via checkedBranches`);\n config.reuseExistingBranch = false;\n userRebaseRequested = true;\n } else if (userApproveAllPendingPR) {\n logger.debug(\n 'A user manually approved all pending PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllRateLimtedPR) {\n logger.debug(\n 'A user manually approved all rate-limited PRs via the Dependency Dashboard.',\n );\n } else if (userOpenAllSchedulePendingPR) {\n logger.debug(\n 'A user manually requested all awaiting schedule PRs via the Dependency Dashboard.',\n );\n } else if (\n branchExists &&\n config.rebaseWhen === 'never' &&\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel)) &&\n !dependencyDashboardCheck\n ) {\n logger.debug('rebaseWhen=never so skipping branch update check');\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'no-work',\n };\n }\n // if the base branch has been changed by user in renovate config, rebase onto the new baseBranch\n // we have already confirmed earlier that branch isn't modified, so its safe to use targetBranch here\n else if (\n branchPr?.targetBranch &&\n branchPr.targetBranch !== config.baseBranch\n ) {\n logger.debug(\n 'Base branch changed by user, rebasing the branch onto new base',\n );\n config.reuseExistingBranch = false;\n } else if (config.cacheFingerprintMatch === 'no-match') {\n logger.debug(\n 'Cache fingerprint does not match, cannot reuse existing branch',\n );\n config.reuseExistingBranch = false;\n } else {\n config = await shouldReuseExistingBranch(config);\n }\n // TODO: types (#22198)\n logger.debug(`Using reuseExistingBranch: ${config.reuseExistingBranch!}`);\n if (\n !(\n config.reuseExistingBranch && config.cacheFingerprintMatch === 'matched'\n )\n ) {\n await scm.checkoutBranch(config.baseBranch);\n const res = await getUpdatedPackageFiles(config);\n if (res.artifactErrors && config.artifactErrors) {\n res.artifactErrors = config.artifactErrors.concat(res.artifactErrors);\n }\n config = { ...config, ...res };\n if (config.updatedPackageFiles?.length) {\n logger.debug(\n `Updated ${config.updatedPackageFiles.length} package files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No package files need updating');\n }\n const additionalFiles = await getAdditionalFiles(\n config,\n branchConfig.packageFiles!,\n );\n config.artifactErrors = (config.artifactErrors ?? []).concat(\n additionalFiles.artifactErrors,\n );\n config.artifactNotices = (config.artifactNotices ?? []).concat(\n additionalFiles.artifactNotices ?? [],\n );\n config.updatedArtifacts = (config.updatedArtifacts ?? []).concat(\n additionalFiles.updatedArtifacts,\n );\n if (config.updatedArtifacts?.length) {\n logger.debug(\n {\n updatedArtifacts: config.updatedArtifacts.map((f) =>\n f.type === 'deletion' ? `${f.path} (delete)` : f.path,\n ),\n },\n `Updated ${config.updatedArtifacts.length} lock files`,\n );\n if (config.reuseExistingBranch && !forceRebase) {\n logger.debug(\n 'Existing branch needs updating. Restarting processBranch() with a clean branch',\n );\n return processBranch(branchConfig, true);\n }\n } else {\n logger.debug('No updated lock files in branch');\n }\n\n await embedChangelogs({\n upgrades: config.upgrades,\n stage: 'branch',\n });\n\n const postUpgradeCommandResults =\n await executePostUpgradeCommands(config);\n\n if (postUpgradeCommandResults !== null) {\n const { updatedArtifacts, artifactErrors } = postUpgradeCommandResults;\n config.updatedArtifacts = updatedArtifacts;\n config.artifactErrors = artifactErrors;\n }\n\n // modifies the file changes in place to allow having a version bump in a packageFile or artifact\n await bumpVersions(config);\n\n removeMeta(['dep']);\n\n if (config.artifactErrors?.length) {\n if (config.releaseTimestamp) {\n logger.debug(`Branch timestamp: ${config.releaseTimestamp}`);\n const releaseTimestamp = DateTime.fromISO(config.releaseTimestamp);\n if (releaseTimestamp.plus({ hours: 2 }) < DateTime.local()) {\n logger.debug(\n 'PR is older than 2 hours, raise PR with lock file errors',\n );\n } else if (branchExists) {\n logger.debug(\n 'PR is less than 2 hours old but branchExists so updating anyway',\n );\n } else {\n logger.debug(\n 'PR is less than 2 hours old - raise error instead of PR',\n );\n throw new Error(MANAGER_LOCKFILE_ERROR);\n }\n } else {\n logger.debug('PR has no releaseTimestamp');\n }\n } else if (config.updatedArtifacts?.length && branchPr) {\n // If there are artifacts, no errors, and an existing PR then ensure any artifacts error comment is removed\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure comment removal in PR #${branchPr.number}`,\n );\n } else {\n // Remove artifacts error comment only if this run has successfully updated artifacts\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactErrorTopic,\n });\n\n // v8 ignore else -- TODO: add test #40625\n if (!config.artifactNotices?.length) {\n await ensureCommentRemoval({\n type: 'by-topic',\n number: branchPr.number,\n topic: artifactNoticeTopic,\n });\n }\n }\n }\n const forcedManually = userRebaseRequested || !branchExists;\n\n config.isConflicted ??=\n branchExists &&\n (await scm.isBranchConflicted(config.baseBranch, config.branchName));\n config.forceCommit = forcedManually || config.isConflicted;\n\n // compile commit message with body, which maybe needs changelogs\n if (config.commitBody) {\n // changelog is on first upgrade\n config.commitMessage = `${config.commitMessage!}\\n\\n${template.compile(\n config.commitBody,\n {\n ...config,\n logJSON: config.upgrades[0].logJSON,\n releases: config.upgrades[0].releases,\n },\n )}`;\n\n logger.trace(`commitMessage: ${JSON.stringify(config.commitMessage)}`);\n }\n\n if (config.commitTrailers) {\n // Template expansions can produce broken trailers\n config.commitTrailers = filterValidCommitTrailers(\n config.commitTrailers.map((trailer) =>\n template.compile(trailer, config),\n ),\n );\n logger.trace(\n `commitTrailers: ${JSON.stringify(config.commitTrailers)}`,\n );\n }\n\n commitSha = await commitFilesToBranch(config);\n // Checkout to base branch to ensure that the next branch processing always starts with git being on the baseBranch\n // baseBranch is not checked out at the start of processBranch() due to pull/16246\n await scm.checkoutBranch(config.baseBranch);\n updatesVerified = true;\n\n // only update artifact status if branch was updated\n // also do before platform automerge reattempt\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n }\n\n if (branchPr) {\n const platformPrOptions = getPlatformPrOptions(config);\n if (\n commitSha &&\n platformPrOptions.usePlatformAutomerge &&\n platform.reattemptPlatformAutomerge\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would reattempt platform automerge for PR #${branchPr.number}`,\n );\n } else {\n await platform.reattemptPlatformAutomerge({\n number: branchPr.number,\n platformPrOptions,\n });\n }\n }\n // v8 ignore else -- TODO: add test #40625\n if (platform.refreshPr) {\n await platform.refreshPr(branchPr.number);\n }\n }\n if (!commitSha && !branchExists) {\n return {\n branchExists,\n result: 'no-work',\n };\n }\n if (commitSha) {\n const action = branchExists ? 'updated' : 'created';\n logger.info({ commitSha }, `Branch ${action}`);\n }\n await setBranchStatusChecks(config);\n // new commit means status check are pretty sure pending but maybe not reported yet\n // if PR has not been created + new commit + prCreation !== immediate skip\n // but do not break when there are artifact errors\n if (\n !branchPr &&\n !config.artifactErrors?.length &&\n !userRebaseRequested &&\n commitSha &&\n config.prCreation !== 'immediate'\n ) {\n logger.debug(`Branch status pending, current sha: ${commitSha}`);\n return {\n branchExists: true,\n updatesVerified,\n result: 'pending',\n commitSha,\n };\n }\n\n // Try to automerge branch and finish if successful, but only if branch already existed before this run\n // skip if we have a non-immediate pr and there is an existing PR,\n // we want to update the PR and skip the Auto merge since status checks aren't done yet\n if (!config.artifactErrors?.length && (!commitSha || config.ignoreTests)) {\n const mergeStatus = await tryBranchAutomerge(config);\n logger.debug(`mergeStatus=${mergeStatus}`);\n if (mergeStatus === 'automerged') {\n if (GlobalConfig.get('dryRun')) {\n logger.info(`DRY-RUN: Would delete branch${config.branchName}`);\n } else {\n await deleteBranchSilently(config.branchName);\n }\n logger.debug('Branch is automerged - returning');\n return { branchExists: false, result: 'automerged' };\n }\n if (mergeStatus === 'off schedule') {\n if (userRebaseRequested) {\n config.forcePr = true;\n } else {\n logger.debug(\n 'Branch cannot automerge now because automergeSchedule is off schedule - skipping',\n );\n return {\n branchExists,\n result: 'not-scheduled',\n commitSha,\n };\n }\n }\n if (\n mergeStatus === 'stale' &&\n ['conflicted', 'never'].includes(config.rebaseWhen!) &&\n /* v8 ignore next -- needs test */\n !(keepUpdatedLabel && branchPr?.labels?.includes(keepUpdatedLabel))\n ) {\n logger.warn(\n 'Branch cannot automerge because it is behind base branch and rebaseWhen setting disallows rebasing - raising a PR instead',\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n if (\n mergeStatus === 'automerge aborted - PR exists' ||\n mergeStatus === 'branch status error' ||\n mergeStatus === 'failed'\n ) {\n logger.debug(\n `Branch automerge not possible, mergeStatus:${mergeStatus}`,\n );\n config.forcePr = true;\n config.branchAutomergeFailureMessage = mergeStatus;\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (err.statusCode === 404) {\n logger.debug({ err }, 'Received a 404 error - aborting run');\n throw new Error(REPOSITORY_CHANGED);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_RATE_LIMIT_EXCEEDED) {\n logger.debug('Passing rate-limit-exceeded error up');\n throw err;\n }\n if (err.message === REPOSITORY_CHANGED) {\n logger.debug('Passing repository-changed error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message?.startsWith('remote: Invalid username or password')) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (\n err.message?.startsWith(\n 'ssh_exchange_identification: Connection closed by remote host',\n )\n ) {\n logger.debug('Throwing bad credentials');\n throw new Error(PLATFORM_BAD_CREDENTIALS);\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_BAD_CREDENTIALS) {\n logger.debug('Passing bad-credentials error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message === PLATFORM_INTEGRATION_UNAUTHORIZED) {\n logger.debug('Passing integration-unauthorized error up');\n throw err;\n }\n if (err.message === MANAGER_LOCKFILE_ERROR) {\n logger.debug('Passing lockfile-error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message?.includes('space left on device')) {\n throw new Error(SYSTEM_INSUFFICIENT_DISK_SPACE);\n }\n /* v8 ignore if -- needs test */\n if (err.message === SYSTEM_INSUFFICIENT_DISK_SPACE) {\n logger.debug('Passing disk-space error up');\n throw err;\n }\n /* v8 ignore if -- needs test */\n if (err.message.startsWith('Resource not accessible by integration')) {\n logger.debug('Passing 403 error up');\n throw err;\n }\n /* v8 ignore next -- needs test */\n if (err.message === WORKER_FILE_UPDATE_FAILED) {\n logger.warn('Error updating branch: update failure');\n } else if (err.message.startsWith('bundler-')) {\n // we have already warned inside the bundler artifacts error handling, so just return\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n } else if (err.message?.includes('fatal: Authentication failed')) {\n throw new Error(PLATFORM_AUTHENTICATION_ERROR);\n } else if (err.message?.includes('fatal: bad revision')) {\n logger.debug({ err }, 'Aborting job due to bad revision error');\n throw new Error(REPOSITORY_CHANGED);\n } else if (err.message === CONFIG_VALIDATION) {\n logger.debug('Passing config validation error up');\n throw err;\n } else if (err.message === TEMPORARY_ERROR) {\n logger.debug('Passing TEMPORARY_ERROR error up');\n throw err;\n } else if (!(err instanceof ExternalHostError)) {\n logger.warn({ err }, `Error updating branch`);\n }\n // Don't throw here - we don't want to stop the other renovations\n return {\n branchExists,\n prNo: branchPr?.number,\n result: 'error',\n commitSha,\n };\n }\n try {\n logger.debug('Ensuring PR');\n logger.debug(\n `There are ${config.errors!.length} errors and ${\n config.warnings!.length\n } warnings`,\n );\n const ensurePrResult = await ensurePr(config);\n if (ensurePrResult.type === 'without-pr') {\n const { prBlockedBy } = ensurePrResult;\n branchPr = null;\n if (prBlockedBy === 'RateLimited' && !config.isVulnerabilityAlert) {\n logger.debug('Reached PR limit - skipping PR creation');\n return {\n branchExists,\n prBlockedBy,\n result: 'pr-limit-reached',\n commitSha,\n };\n }\n // TODO: ensurePr should check for automerge itself (#9719)\n if (prBlockedBy === 'NeedsApproval') {\n return {\n branchExists,\n prBlockedBy,\n result: 'needs-pr-approval',\n commitSha,\n };\n }\n if (prBlockedBy === 'AwaitingTests') {\n return {\n branchExists,\n prBlockedBy,\n result: 'pending',\n commitSha,\n };\n }\n if (prBlockedBy === 'BranchAutomerge') {\n return {\n branchExists,\n prBlockedBy,\n result: 'done',\n commitSha,\n };\n }\n if (prBlockedBy === 'Error') {\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n logger.warn({ prBlockedBy }, 'Unknown PrBlockedBy result');\n return {\n branchExists,\n prBlockedBy,\n result: 'error',\n commitSha,\n };\n }\n // v8 ignore else -- TODO: add test #40625\n if (ensurePrResult.type === 'with-pr') {\n const { pr } = ensurePrResult;\n branchPr = pr;\n // Retry setting branch statuses after PR/MR creation so that\n // platforms using MR pipelines (e.g. GitLab) have a pipeline to\n // associate the status with. The earlier call may have been\n // skipped if no pipeline existed yet.\n await setBranchStatusChecks(config);\n\n // only update artifact status if branch was updated\n if (commitSha) {\n await setArtifactErrorStatus(config);\n }\n if (config.artifactErrors?.length) {\n logger.warn(\n { artifactErrors: config.artifactErrors },\n 'artifactErrors',\n );\n let content = `Renovate failed to update `;\n content +=\n config.artifactErrors.length > 1 ? 'artifacts' : 'an artifact';\n content += ' related to this branch. ';\n content += template.compile(\n config.userStrings!.artifactErrorWarning,\n config,\n );\n content += emojify(\n `\\n\\n:recycle: Renovate will retry this branch, including artifacts, only when one of the following happens:\\n\\n`,\n );\n content +=\n ' - any of the package files in this branch needs updating, or \\n';\n content += ' - the branch becomes conflicted, or\\n';\n content +=\n ' - you click the rebase/retry checkbox if found above, or\\n';\n content +=\n ' - you rename this PR\\'s title to start with \"rebase!\" to trigger it manually';\n content += '\\n\\nThe artifact failure details are included below:\\n\\n';\n // TODO: types (#22198)\n config.artifactErrors.forEach((error) => {\n content += `##### File name: ${error.fileName!}\\n\\n`;\n content += `\\`\\`\\`\\n${error.stderr!}\\n\\`\\`\\`\\n\\n`;\n });\n content = platform.massageMarkdown(content, config.rebaseLabel);\n // v8 ignore else -- TODO: add test #40625\n if (\n !(\n config.suppressNotifications!.includes('artifactErrors') ||\n config.suppressNotifications!.includes('lockFileErrors')\n )\n ) {\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would ensure lock file error comment in PR #${pr.number}`,\n );\n } else {\n await ensureComment({\n number: pr.number,\n topic: artifactErrorTopic,\n content,\n });\n }\n }\n } else {\n if (config.artifactNotices?.length) {\n const contentLines: string[] = [];\n for (const notice of config.artifactNotices) {\n contentLines.push(`##### File name: ${notice.file}`);\n contentLines.push(notice.message);\n }\n const content = contentLines.join('\\n\\n');\n await ensureComment({\n number: pr.number,\n topic: artifactNoticeTopic,\n content,\n });\n }\n\n if (config.automerge) {\n logger.debug('PR is configured for automerge');\n // skip automerge if there is a new commit since status checks aren't done yet\n // v8 ignore else -- TODO: add test #40625\n if (config.ignoreTests === true || !commitSha) {\n logger.debug('checking auto-merge');\n const prAutomergeResult = await checkAutoMerge(pr, config);\n if (prAutomergeResult?.automerged) {\n return {\n branchExists,\n result: 'automerged',\n commitSha,\n };\n }\n }\n } else {\n logger.debug('PR is not configured for automerge');\n }\n }\n }\n } catch (err) {\n /* v8 ignore if -- needs test */\n if (\n err instanceof ExternalHostError ||\n [PLATFORM_RATE_LIMIT_EXCEEDED, REPOSITORY_CHANGED].includes(err.message)\n ) {\n logger.debug('Passing PR error up');\n throw err;\n }\n // Otherwise don't throw here - we don't want to stop the other renovations\n logger.error({ err }, `Error ensuring PR`);\n }\n if (!branchExists) {\n return {\n branchExists: true,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'pr-created',\n commitSha,\n };\n }\n return {\n branchExists,\n updatesVerified,\n prNo: branchPr?.number,\n result: 'done',\n commitSha,\n };\n}\n"],"mappings":"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"}
@@ -99,7 +99,7 @@ async function checkAutoMerge(pr, config) {
99
99
  try {
100
100
  await scm.deleteBranch(branchName);
101
101
  branchRemoved = true;
102
- } catch (err) /* istanbul ignore next */ {
102
+ } catch (err) /* istanbul ignore next */ {
103
103
  logger.warn({
104
104
  branchName,
105
105
  err
@@ -1 +1 @@
1
- {"version":3,"file":"automerge.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/automerge.ts"],"sourcesContent":["// TODO #22198\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n ensureComment,\n ensureCommentRemoval,\n} from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport { isScheduledNow } from '../branch/schedule.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\n\nexport type PrAutomergeBlockReason =\n | 'BranchModified'\n | 'BranchNotGreen'\n | 'Conflicted'\n | 'DryRun'\n | 'PlatformNotReady'\n | 'PlatformRejection'\n | 'off schedule';\n\nexport interface AutomergePrResult {\n automerged: boolean;\n branchRemoved?: boolean;\n prAutomergeBlockReason?: PrAutomergeBlockReason;\n}\n\nexport async function checkAutoMerge(\n pr: Pr,\n config: BranchConfig,\n): Promise<AutomergePrResult> {\n logger.trace({ config }, 'checkAutoMerge');\n const {\n branchName,\n baseBranch,\n automergeType,\n automergeStrategy,\n pruneBranchAfterAutomerge,\n automergeComment,\n ignoreTests,\n rebaseRequested,\n } = config;\n // Return if PR not ready for automerge\n if (!isScheduledNow(config, 'automergeSchedule')) {\n logger.debug(`PR automerge is off schedule`);\n return {\n automerged: false,\n prAutomergeBlockReason: 'off schedule',\n };\n }\n const isConflicted =\n config.isConflicted ??\n (await scm.isBranchConflicted(baseBranch, branchName));\n if (isConflicted) {\n logger.debug('PR is conflicted');\n return {\n automerged: false,\n prAutomergeBlockReason: 'Conflicted',\n };\n }\n if (!ignoreTests && pr.cannotMergeReason) {\n logger.debug(\n `Platform reported that PR is not ready for merge. Reason: [${pr.cannotMergeReason}]`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'PlatformNotReady',\n };\n }\n const branchStatus = await resolveBranchStatus(\n branchName,\n !!config.internalChecksAsSuccess,\n config.ignoreTests,\n );\n if (branchStatus !== 'green') {\n logger.debug(\n `PR is not ready for merge (branch status is ${branchStatus})`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'BranchNotGreen',\n };\n }\n if (await scm.isBranchModified(branchName, baseBranch)) {\n logger.debug('PR is ready for automerge but has been modified');\n return {\n automerged: false,\n prAutomergeBlockReason: 'BranchModified',\n };\n }\n if (automergeType === 'pr-comment') {\n // TODO: types (#22198)\n logger.debug(`Applying automerge comment: ${automergeComment!}`);\n // istanbul ignore if\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would add PR automerge comment to PR #${pr.number}`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'DryRun',\n };\n }\n if (rebaseRequested) {\n await ensureCommentRemoval({\n type: 'by-content',\n number: pr.number,\n content: automergeComment!,\n });\n }\n await ensureComment({\n number: pr.number,\n topic: null,\n content: automergeComment!,\n });\n return { automerged: true, branchRemoved: false };\n }\n // Let's merge this\n // istanbul ignore if\n if (GlobalConfig.get('dryRun')) {\n // TODO: types (#22198)\n logger.info(\n `DRY-RUN: Would merge PR #${\n pr.number\n } with strategy \"${automergeStrategy!}\"`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'DryRun',\n };\n }\n // TODO: types (#22198)\n logger.debug(`Automerging #${pr.number} with strategy ${automergeStrategy!}`);\n const res = await platform.mergePr({\n branchName,\n id: pr.number,\n strategy: automergeStrategy,\n });\n if (res) {\n logger.info({ pr: pr.number, prTitle: pr.title }, 'PR automerged');\n if (!pruneBranchAfterAutomerge) {\n logger.info('Skipping pruning of merged branch');\n return { automerged: true, branchRemoved: false };\n }\n let branchRemoved = false;\n try {\n await scm.deleteBranch(branchName);\n branchRemoved = true;\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ branchName, err }, 'Branch auto-remove failed');\n }\n return { automerged: true, branchRemoved };\n }\n return {\n automerged: false,\n prAutomergeBlockReason: 'PlatformRejection',\n };\n}\n"],"mappings":";;;;;;;;AA6BA,eAAsB,eACpB,IACA,QAC4B;CAC5B,OAAO,MAAM,EAAE,OAAO,GAAG,gBAAgB;CACzC,MAAM,EACJ,YACA,YACA,eACA,mBACA,2BACA,kBACA,aACA,oBACE;CAEJ,IAAI,CAAC,eAAe,QAAQ,mBAAmB,GAAG;EAChD,OAAO,MAAM,8BAA8B;EAC3C,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CAIA,IAFE,OAAO,gBACN,MAAM,IAAI,mBAAmB,YAAY,UAAU,GACpC;EAChB,OAAO,MAAM,kBAAkB;EAC/B,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,IAAI,CAAC,eAAe,GAAG,mBAAmB;EACxC,OAAO,MACL,8DAA8D,GAAG,kBAAkB,EACrF;EACA,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,MAAM,eAAe,MAAM,oBACzB,YACA,CAAC,CAAC,OAAO,yBACT,OAAO,WACT;CACA,IAAI,iBAAiB,SAAS;EAC5B,OAAO,MACL,+CAA+C,aAAa,EAC9D;EACA,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,IAAI,MAAM,IAAI,iBAAiB,YAAY,UAAU,GAAG;EACtD,OAAO,MAAM,iDAAiD;EAC9D,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,IAAI,kBAAkB,cAAc;EAElC,OAAO,MAAM,+BAA+B,kBAAmB;;EAE/D,IAAI,aAAa,IAAI,QAAQ,GAAG;GAC9B,OAAO,KACL,kDAAkD,GAAG,QACvD;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB;GAC1B;EACF;EACA,IAAI,iBACF,MAAM,qBAAqB;GACzB,MAAM;GACN,QAAQ,GAAG;GACX,SAAS;EACX,CAAC;EAEH,MAAM,cAAc;GAClB,QAAQ,GAAG;GACX,OAAO;GACP,SAAS;EACX,CAAC;EACD,OAAO;GAAE,YAAY;GAAM,eAAe;EAAM;CAClD;;CAGA,IAAI,aAAa,IAAI,QAAQ,GAAG;EAE9B,OAAO,KACL,4BACE,GAAG,OACJ,kBAAkB,kBAAmB,EACxC;EACA,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CAEA,OAAO,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,mBAAoB;CAM5E,IAAI,MALc,SAAS,QAAQ;EACjC;EACA,IAAI,GAAG;EACP,UAAU;CACZ,CAAC,GACQ;EACP,OAAO,KAAK;GAAE,IAAI,GAAG;GAAQ,SAAS,GAAG;EAAM,GAAG,eAAe;EACjE,IAAI,CAAC,2BAA2B;GAC9B,OAAO,KAAK,mCAAmC;GAC/C,OAAO;IAAE,YAAY;IAAM,eAAe;GAAM;EAClD;EACA,IAAI,gBAAgB;EACpB,IAAI;GACF,MAAM,IAAI,aAAa,UAAU;GACjC,gBAAgB;EAClB,SAAS,kCAAgC;GACvC,OAAO,KAAK;IAAE;IAAY;GAAI,GAAG,2BAA2B;EAC9D;EACA,OAAO;GAAE,YAAY;GAAM;EAAc;CAC3C;CACA,OAAO;EACL,YAAY;EACZ,wBAAwB;CAC1B;AACF"}
1
+ {"version":3,"file":"automerge.js","names":[],"sources":["../../../../../lib/workers/repository/update/pr/automerge.ts"],"sourcesContent":["// TODO #22198\nimport { GlobalConfig } from '../../../../config/global.ts';\nimport { logger } from '../../../../logger/index.ts';\nimport {\n ensureComment,\n ensureCommentRemoval,\n} from '../../../../modules/platform/comment.ts';\nimport type { Pr } from '../../../../modules/platform/index.ts';\nimport { platform } from '../../../../modules/platform/index.ts';\nimport { scm } from '../../../../modules/platform/scm.ts';\nimport type { BranchConfig } from '../../../types.ts';\nimport { isScheduledNow } from '../branch/schedule.ts';\nimport { resolveBranchStatus } from '../branch/status-checks.ts';\n\nexport type PrAutomergeBlockReason =\n | 'BranchModified'\n | 'BranchNotGreen'\n | 'Conflicted'\n | 'DryRun'\n | 'PlatformNotReady'\n | 'PlatformRejection'\n | 'off schedule';\n\nexport interface AutomergePrResult {\n automerged: boolean;\n branchRemoved?: boolean;\n prAutomergeBlockReason?: PrAutomergeBlockReason;\n}\n\nexport async function checkAutoMerge(\n pr: Pr,\n config: BranchConfig,\n): Promise<AutomergePrResult> {\n logger.trace({ config }, 'checkAutoMerge');\n const {\n branchName,\n baseBranch,\n automergeType,\n automergeStrategy,\n pruneBranchAfterAutomerge,\n automergeComment,\n ignoreTests,\n rebaseRequested,\n } = config;\n // Return if PR not ready for automerge\n if (!isScheduledNow(config, 'automergeSchedule')) {\n logger.debug(`PR automerge is off schedule`);\n return {\n automerged: false,\n prAutomergeBlockReason: 'off schedule',\n };\n }\n const isConflicted =\n config.isConflicted ??\n (await scm.isBranchConflicted(baseBranch, branchName));\n if (isConflicted) {\n logger.debug('PR is conflicted');\n return {\n automerged: false,\n prAutomergeBlockReason: 'Conflicted',\n };\n }\n if (!ignoreTests && pr.cannotMergeReason) {\n logger.debug(\n `Platform reported that PR is not ready for merge. Reason: [${pr.cannotMergeReason}]`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'PlatformNotReady',\n };\n }\n const branchStatus = await resolveBranchStatus(\n branchName,\n !!config.internalChecksAsSuccess,\n config.ignoreTests,\n );\n if (branchStatus !== 'green') {\n logger.debug(\n `PR is not ready for merge (branch status is ${branchStatus})`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'BranchNotGreen',\n };\n }\n if (await scm.isBranchModified(branchName, baseBranch)) {\n logger.debug('PR is ready for automerge but has been modified');\n return {\n automerged: false,\n prAutomergeBlockReason: 'BranchModified',\n };\n }\n if (automergeType === 'pr-comment') {\n // TODO: types (#22198)\n logger.debug(`Applying automerge comment: ${automergeComment!}`);\n // istanbul ignore if\n if (GlobalConfig.get('dryRun')) {\n logger.info(\n `DRY-RUN: Would add PR automerge comment to PR #${pr.number}`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'DryRun',\n };\n }\n if (rebaseRequested) {\n await ensureCommentRemoval({\n type: 'by-content',\n number: pr.number,\n content: automergeComment!,\n });\n }\n await ensureComment({\n number: pr.number,\n topic: null,\n content: automergeComment!,\n });\n return { automerged: true, branchRemoved: false };\n }\n // Let's merge this\n // istanbul ignore if\n if (GlobalConfig.get('dryRun')) {\n // TODO: types (#22198)\n logger.info(\n `DRY-RUN: Would merge PR #${\n pr.number\n } with strategy \"${automergeStrategy!}\"`,\n );\n return {\n automerged: false,\n prAutomergeBlockReason: 'DryRun',\n };\n }\n // TODO: types (#22198)\n logger.debug(`Automerging #${pr.number} with strategy ${automergeStrategy!}`);\n const res = await platform.mergePr({\n branchName,\n id: pr.number,\n strategy: automergeStrategy,\n });\n if (res) {\n logger.info({ pr: pr.number, prTitle: pr.title }, 'PR automerged');\n if (!pruneBranchAfterAutomerge) {\n logger.info('Skipping pruning of merged branch');\n return { automerged: true, branchRemoved: false };\n }\n let branchRemoved = false;\n try {\n await scm.deleteBranch(branchName);\n branchRemoved = true;\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ branchName, err }, 'Branch auto-remove failed');\n }\n return { automerged: true, branchRemoved };\n }\n return {\n automerged: false,\n prAutomergeBlockReason: 'PlatformRejection',\n };\n}\n"],"mappings":";;;;;;;;AA6BA,eAAsB,eACpB,IACA,QAC4B;CAC5B,OAAO,MAAM,EAAE,OAAO,GAAG,gBAAgB;CACzC,MAAM,EACJ,YACA,YACA,eACA,mBACA,2BACA,kBACA,aACA,oBACE;CAEJ,IAAI,CAAC,eAAe,QAAQ,mBAAmB,GAAG;EAChD,OAAO,MAAM,8BAA8B;EAC3C,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CAIA,IAFE,OAAO,gBACN,MAAM,IAAI,mBAAmB,YAAY,UAAU,GACpC;EAChB,OAAO,MAAM,kBAAkB;EAC/B,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,IAAI,CAAC,eAAe,GAAG,mBAAmB;EACxC,OAAO,MACL,8DAA8D,GAAG,kBAAkB,EACrF;EACA,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,MAAM,eAAe,MAAM,oBACzB,YACA,CAAC,CAAC,OAAO,yBACT,OAAO,WACT;CACA,IAAI,iBAAiB,SAAS;EAC5B,OAAO,MACL,+CAA+C,aAAa,EAC9D;EACA,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,IAAI,MAAM,IAAI,iBAAiB,YAAY,UAAU,GAAG;EACtD,OAAO,MAAM,iDAAiD;EAC9D,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CACA,IAAI,kBAAkB,cAAc;EAElC,OAAO,MAAM,+BAA+B,kBAAmB;;EAE/D,IAAI,aAAa,IAAI,QAAQ,GAAG;GAC9B,OAAO,KACL,kDAAkD,GAAG,QACvD;GACA,OAAO;IACL,YAAY;IACZ,wBAAwB;GAC1B;EACF;EACA,IAAI,iBACF,MAAM,qBAAqB;GACzB,MAAM;GACN,QAAQ,GAAG;GACX,SAAS;EACX,CAAC;EAEH,MAAM,cAAc;GAClB,QAAQ,GAAG;GACX,OAAO;GACP,SAAS;EACX,CAAC;EACD,OAAO;GAAE,YAAY;GAAM,eAAe;EAAM;CAClD;;CAGA,IAAI,aAAa,IAAI,QAAQ,GAAG;EAE9B,OAAO,KACL,4BACE,GAAG,OACJ,kBAAkB,kBAAmB,EACxC;EACA,OAAO;GACL,YAAY;GACZ,wBAAwB;EAC1B;CACF;CAEA,OAAO,MAAM,gBAAgB,GAAG,OAAO,iBAAiB,mBAAoB;CAM5E,IAAI,MALc,SAAS,QAAQ;EACjC;EACA,IAAI,GAAG;EACP,UAAU;CACZ,CAAC,GACQ;EACP,OAAO,KAAK;GAAE,IAAI,GAAG;GAAQ,SAAS,GAAG;EAAM,GAAG,eAAe;EACjE,IAAI,CAAC,2BAA2B;GAC9B,OAAO,KAAK,mCAAmC;GAC/C,OAAO;IAAE,YAAY;IAAM,eAAe;GAAM;EAClD;EACA,IAAI,gBAAgB;EACpB,IAAI;GACF,MAAM,IAAI,aAAa,UAAU;GACjC,gBAAgB;EAClB,SAAS,gCAAgC;GACvC,OAAO,KAAK;IAAE;IAAY;GAAI,GAAG,2BAA2B;EAC9D;EACA,OAAO;GAAE,YAAY;GAAM;EAAc;CAC3C;CACA,OAAO;EACL,YAAY;EACZ,wBAAwB;CAC1B;AACF"}
@@ -37,7 +37,7 @@ function getPrUpdatesTable(config) {
37
37
  // istanbul ignore else
38
38
  if (value) res[header] = compile(value, upgrade).replace(regEx(/``/g), "");
39
39
  else res[header] = "";
40
- } catch (err) /* istanbul ignore next */ {
40
+ } catch (err) /* istanbul ignore next */ {
41
41
  logger.warn({
42
42
  header,
43
43
  value,
@@ -1 +1 @@
1
- {"version":3,"file":"updates-table.js","names":["template\n .compile"],"sources":["../../../../../../lib/workers/repository/update/pr/body/updates-table.ts"],"sourcesContent":["import { logger } from '../../../../../logger/index.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport * as template from '../../../../../util/template/index.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../../types.ts';\n\ninterface TableDefinition {\n header: string;\n value: string | undefined;\n}\n\nfunction getRowDefinition(\n prBodyColumns: string[],\n upgrade: BranchUpgradeConfig,\n): TableDefinition[] {\n const res: TableDefinition[] = [];\n if (upgrade.prBodyDefinitions) {\n for (const header of prBodyColumns) {\n const value = upgrade.prBodyDefinitions[header];\n res.push({ header, value });\n }\n }\n return res;\n}\n\nfunction getNonEmptyColumns(\n prBodyColumns: string[],\n rows: Record<string, string>[],\n): string[] {\n const res: string[] = [];\n for (const header of prBodyColumns) {\n for (const row of rows) {\n if (row[header]?.length && !res.includes(header)) {\n res.push(header);\n }\n }\n }\n return res;\n}\n\nfunction getHeaderLabel(header: string, config: BranchConfig): string {\n return config.prBodyHeadingDefinitions?.[header] ?? header;\n}\n\nexport function getPrUpdatesTable(config: BranchConfig): string {\n if (config.prBodyColumns === undefined) {\n logger.warn('getPrUpdatesTable - prBodyColumns is undefined');\n return '';\n }\n\n const tableKeyValuePairs: Record<string, Record<string, string>> = {};\n for (const upgrade of config.upgrades) {\n if (upgrade) {\n // Create a key based on the properties which are significant in the updates table\n const key = `${upgrade.depName ?? ''}_${upgrade.depType ?? ''}_${upgrade.newValue ?? ''}_${upgrade.newVersion ?? ''}_${upgrade.currentValue ?? ''}_${upgrade.currentVersion ?? ''}_${upgrade.updateType}`;\n\n const res: Record<string, string> = {};\n const rowDefinition = getRowDefinition(config.prBodyColumns, upgrade);\n for (const column of rowDefinition) {\n const { header, value } = column;\n try {\n // istanbul ignore else\n if (value) {\n res[header] = template\n .compile(value, upgrade)\n .replace(regEx(/``/g), '');\n } else {\n res[header] = '';\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ header, value, err }, 'Handlebars compilation error');\n }\n }\n\n if (tableKeyValuePairs[key]) {\n // compare the duplicate upgrades as per their table values\n // and select one with better values\n tableKeyValuePairs[key] = compareTableValues(\n tableKeyValuePairs[key],\n res,\n config.prBodyColumns,\n );\n } else {\n tableKeyValuePairs[key] = res;\n }\n }\n }\n\n const tableValues = Object.values(tableKeyValuePairs);\n const tableColumns = getNonEmptyColumns(config.prBodyColumns, tableValues);\n let res = '\\n\\nThis PR contains the following updates:\\n\\n';\n const headerCells = tableColumns.map((col) => getHeaderLabel(col, config));\n\n res += `| ${headerCells.join(' | ')} |\\n`;\n res += `|${tableColumns.map(() => '---|').join('')}\\n`;\n const rows = [];\n for (const row of tableValues) {\n let val = '|';\n for (const column of tableColumns) {\n const content = row[column]\n ? row[column]\n .replace(regEx(/^@/), '@&#8203;')\n .replace(regEx(/\\|/g), '\\\\|')\n : '';\n val += ` ${content} |`;\n }\n val += '\\n';\n rows.push(val);\n }\n const uniqueRows = [...new Set(rows)];\n res += uniqueRows.join('');\n res += '\\n\\n';\n return res;\n}\n\n// return the row with better table values\nfunction compareTableValues(\n a: Record<string, string>,\n b: Record<string, string>,\n prBodyColumns: string[],\n): Record<string, string> {\n let score = 0;\n\n for (const header of prBodyColumns) {\n if (!b[header] && !a[header]) {\n continue;\n }\n if (!b[header]) {\n score--;\n continue;\n }\n if (!a[header]) {\n score++;\n continue;\n }\n\n if (a[header] !== b[header]) {\n if (a[header].length < b[header].length) {\n score++;\n } else {\n score--;\n }\n }\n }\n return score > 0 ? b : a;\n}\n"],"mappings":";;;;AAUA,SAAS,iBACP,eACA,SACmB;CACnB,MAAM,MAAyB,CAAC;CAChC,IAAI,QAAQ,mBACV,KAAK,MAAM,UAAU,eAAe;EAClC,MAAM,QAAQ,QAAQ,kBAAkB;EACxC,IAAI,KAAK;GAAE;GAAQ;EAAM,CAAC;CAC5B;CAEF,OAAO;AACT;AAEA,SAAS,mBACP,eACA,MACU;CACV,MAAM,MAAgB,CAAC;CACvB,KAAK,MAAM,UAAU,eACnB,KAAK,MAAM,OAAO,MAChB,IAAI,IAAI,OAAO,EAAE,UAAU,CAAC,IAAI,SAAS,MAAM,GAC7C,IAAI,KAAK,MAAM;CAIrB,OAAO;AACT;AAEA,SAAS,eAAe,QAAgB,QAA8B;CACpE,OAAO,OAAO,2BAA2B,WAAW;AACtD;AAEA,SAAgB,kBAAkB,QAA8B;CAC9D,IAAI,OAAO,kBAAkB,KAAA,GAAW;EACtC,OAAO,KAAK,gDAAgD;EAC5D,OAAO;CACT;CAEA,MAAM,qBAA6D,CAAC;CACpE,KAAK,MAAM,WAAW,OAAO,UAC3B,IAAI,SAAS;EAEX,MAAM,MAAM,GAAG,QAAQ,WAAW,GAAG,GAAG,QAAQ,WAAW,GAAG,GAAG,QAAQ,YAAY,GAAG,GAAG,QAAQ,cAAc,GAAG,GAAG,QAAQ,gBAAgB,GAAG,GAAG,QAAQ,kBAAkB,GAAG,GAAG,QAAQ;EAE7L,MAAM,MAA8B,CAAC;EACrC,MAAM,gBAAgB,iBAAiB,OAAO,eAAe,OAAO;EACpE,KAAK,MAAM,UAAU,eAAe;GAClC,MAAM,EAAE,QAAQ,UAAU;GAC1B,IAAI;;IAEF,IAAI,OACF,IAAI,UAAUA,QACH,OAAO,OAAO,CAAC,CACvB,QAAQ,MAAM,KAAK,GAAG,EAAE;SAE3B,IAAI,UAAU;GAElB,SAAS,mCAAgC;IACvC,OAAO,KAAK;KAAE;KAAQ;KAAO;IAAI,GAAG,8BAA8B;GACpE;EACF;EAEA,IAAI,mBAAmB,MAGrB,mBAAmB,OAAO,mBACxB,mBAAmB,MACnB,KACA,OAAO,aACT;OAEA,mBAAmB,OAAO;CAE9B;CAGF,MAAM,cAAc,OAAO,OAAO,kBAAkB;CACpD,MAAM,eAAe,mBAAmB,OAAO,eAAe,WAAW;CACzE,IAAI,MAAM;CACV,MAAM,cAAc,aAAa,KAAK,QAAQ,eAAe,KAAK,MAAM,CAAC;CAEzE,OAAO,KAAK,YAAY,KAAK,KAAK,EAAE;CACpC,OAAO,IAAI,aAAa,UAAU,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE;CACnD,MAAM,OAAO,CAAC;CACd,KAAK,MAAM,OAAO,aAAa;EAC7B,IAAI,MAAM;EACV,KAAK,MAAM,UAAU,cAAc;GACjC,MAAM,UAAU,IAAI,UAChB,IAAI,OAAO,CACR,QAAQ,MAAM,IAAI,GAAG,UAAU,CAAC,CAChC,QAAQ,MAAM,KAAK,GAAG,KAAK,IAC9B;GACJ,OAAO,IAAI,QAAQ;EACrB;EACA,OAAO;EACP,KAAK,KAAK,GAAG;CACf;CACA,MAAM,aAAa,CAAC,GAAG,IAAI,IAAI,IAAI,CAAC;CACpC,OAAO,WAAW,KAAK,EAAE;CACzB,OAAO;CACP,OAAO;AACT;AAGA,SAAS,mBACP,GACA,GACA,eACwB;CACxB,IAAI,QAAQ;CAEZ,KAAK,MAAM,UAAU,eAAe;EAClC,IAAI,CAAC,EAAE,WAAW,CAAC,EAAE,SACnB;EAEF,IAAI,CAAC,EAAE,SAAS;GACd;GACA;EACF;EACA,IAAI,CAAC,EAAE,SAAS;GACd;GACA;EACF;EAEA,IAAI,EAAE,YAAY,EAAE,SAClB,IAAI,EAAE,OAAO,CAAC,SAAS,EAAE,OAAO,CAAC,QAC/B;OAEA;CAGN;CACA,OAAO,QAAQ,IAAI,IAAI;AACzB"}
1
+ {"version":3,"file":"updates-table.js","names":["template\n .compile"],"sources":["../../../../../../lib/workers/repository/update/pr/body/updates-table.ts"],"sourcesContent":["import { logger } from '../../../../../logger/index.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport * as template from '../../../../../util/template/index.ts';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../../types.ts';\n\ninterface TableDefinition {\n header: string;\n value: string | undefined;\n}\n\nfunction getRowDefinition(\n prBodyColumns: string[],\n upgrade: BranchUpgradeConfig,\n): TableDefinition[] {\n const res: TableDefinition[] = [];\n if (upgrade.prBodyDefinitions) {\n for (const header of prBodyColumns) {\n const value = upgrade.prBodyDefinitions[header];\n res.push({ header, value });\n }\n }\n return res;\n}\n\nfunction getNonEmptyColumns(\n prBodyColumns: string[],\n rows: Record<string, string>[],\n): string[] {\n const res: string[] = [];\n for (const header of prBodyColumns) {\n for (const row of rows) {\n if (row[header]?.length && !res.includes(header)) {\n res.push(header);\n }\n }\n }\n return res;\n}\n\nfunction getHeaderLabel(header: string, config: BranchConfig): string {\n return config.prBodyHeadingDefinitions?.[header] ?? header;\n}\n\nexport function getPrUpdatesTable(config: BranchConfig): string {\n if (config.prBodyColumns === undefined) {\n logger.warn('getPrUpdatesTable - prBodyColumns is undefined');\n return '';\n }\n\n const tableKeyValuePairs: Record<string, Record<string, string>> = {};\n for (const upgrade of config.upgrades) {\n if (upgrade) {\n // Create a key based on the properties which are significant in the updates table\n const key = `${upgrade.depName ?? ''}_${upgrade.depType ?? ''}_${upgrade.newValue ?? ''}_${upgrade.newVersion ?? ''}_${upgrade.currentValue ?? ''}_${upgrade.currentVersion ?? ''}_${upgrade.updateType}`;\n\n const res: Record<string, string> = {};\n const rowDefinition = getRowDefinition(config.prBodyColumns, upgrade);\n for (const column of rowDefinition) {\n const { header, value } = column;\n try {\n // istanbul ignore else\n if (value) {\n res[header] = template\n .compile(value, upgrade)\n .replace(regEx(/``/g), '');\n } else {\n res[header] = '';\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ header, value, err }, 'Handlebars compilation error');\n }\n }\n\n if (tableKeyValuePairs[key]) {\n // compare the duplicate upgrades as per their table values\n // and select one with better values\n tableKeyValuePairs[key] = compareTableValues(\n tableKeyValuePairs[key],\n res,\n config.prBodyColumns,\n );\n } else {\n tableKeyValuePairs[key] = res;\n }\n }\n }\n\n const tableValues = Object.values(tableKeyValuePairs);\n const tableColumns = getNonEmptyColumns(config.prBodyColumns, tableValues);\n let res = '\\n\\nThis PR contains the following updates:\\n\\n';\n const headerCells = tableColumns.map((col) => getHeaderLabel(col, config));\n\n res += `| ${headerCells.join(' | ')} |\\n`;\n res += `|${tableColumns.map(() => '---|').join('')}\\n`;\n const rows = [];\n for (const row of tableValues) {\n let val = '|';\n for (const column of tableColumns) {\n const content = row[column]\n ? row[column]\n .replace(regEx(/^@/), '@&#8203;')\n .replace(regEx(/\\|/g), '\\\\|')\n : '';\n val += ` ${content} |`;\n }\n val += '\\n';\n rows.push(val);\n }\n const uniqueRows = [...new Set(rows)];\n res += uniqueRows.join('');\n res += '\\n\\n';\n return res;\n}\n\n// return the row with better table values\nfunction compareTableValues(\n a: Record<string, string>,\n b: Record<string, string>,\n prBodyColumns: string[],\n): Record<string, string> {\n let score = 0;\n\n for (const header of prBodyColumns) {\n if (!b[header] && !a[header]) {\n continue;\n }\n if (!b[header]) {\n score--;\n continue;\n }\n if (!a[header]) {\n score++;\n continue;\n }\n\n if (a[header] !== b[header]) {\n if (a[header].length < b[header].length) {\n score++;\n } else {\n score--;\n }\n }\n }\n return score > 0 ? b : a;\n}\n"],"mappings":"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"}
@@ -27,9 +27,10 @@ async function getReleaseNotesMd(repository, apiBaseUrl, sourceDirectory) {
27
27
  const { path: changelogFile, sha } = files.sort((a, b) => compareChangelogFilePath(a.path, b.path)).shift();
28
28
  /* istanbul ignore if */
29
29
  if (files.length !== 0) logger.debug(`Multiple candidates for changelog file, using ${changelogFile}`);
30
+ const fileRes = await http.getJsonUnchecked(`${apiPrefix}/git/blobs/${sha}`, { cacheProvider: memCacheProvider });
30
31
  return {
31
32
  changelogFile,
32
- changelogMd: `${fromBase64((await http.getJsonUnchecked(`${apiPrefix}/git/blobs/${sha}`, { cacheProvider: memCacheProvider })).body.content)}\n#\n##`
33
+ changelogMd: `${fromBase64(fileRes.body.content)}\n#\n##`
33
34
  };
34
35
  }
35
36
  async function getReleaseList(project, _release) {