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
@@ -45,7 +45,8 @@ async function isOrg(organization) {
45
45
  }
46
46
  }
47
47
  async function searchRepos(params, options) {
48
- const url = `${API_PATH}/repos/search?${getQueryString(params)}`;
48
+ const query = getQueryString(params);
49
+ const url = `${API_PATH}/repos/search?${query}`;
49
50
  const res = await forgejoHttp.getJson(url, {
50
51
  ...options,
51
52
  paginate: true
@@ -139,10 +140,11 @@ async function closeIssue(repoPath, idx, options) {
139
140
  });
140
141
  }
141
142
  async function searchIssues(repoPath, params, options) {
142
- const url = `${API_PATH}/repos/${repoPath}/issues?${getQueryString({
143
+ const query = getQueryString({
143
144
  ...params,
144
145
  type: "issues"
145
- })}`;
146
+ });
147
+ const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;
146
148
  return (await forgejoHttp.getJson(url, {
147
149
  ...options,
148
150
  paginate: true
@@ -1 +1 @@
1
- {"version":3,"file":"forgejo-helper.js","names":[],"sources":["../../../../lib/modules/platform/forgejo/forgejo-helper.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { ForgejoHttpOptions } from '../../../util/http/forgejo.ts';\nimport { ForgejoHttp } from '../../../util/http/forgejo.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport {\n Branch,\n Comment,\n CommitStatus,\n type CommitStatusType,\n Issue,\n Label,\n PR,\n Repo,\n RepoContents,\n RepoSearchResults,\n User,\n Version,\n} from './schema.ts';\nimport type {\n CombinedCommitStatus,\n CommentCreateParams,\n CommitStatusCreateParams,\n IssueCreateParams,\n IssueSearchParams,\n IssueUpdateLabelsParams,\n IssueUpdateParams,\n PRCreateParams,\n PRMergeParams,\n PRUpdateParams,\n PrReviewersParams,\n RepoSearchParams,\n} from './types.ts';\nimport { API_PATH } from './utils.ts';\n\nexport const forgejoHttp = new ForgejoHttp();\n\nfunction urlEscape(raw: string): string {\n return encodeURIComponent(raw);\n}\nconst commitStatusStates: CommitStatusType[] = [\n 'unknown',\n 'success',\n 'pending',\n 'warning',\n 'failure',\n 'error',\n];\n\nexport async function getCurrentUser(\n options: ForgejoHttpOptions = {},\n): Promise<User> {\n const url = `${API_PATH}/user`;\n const res = await forgejoHttp.getJson(url, options, User);\n return res.body;\n}\n\nexport async function getVersion(\n options: ForgejoHttpOptions = {},\n): Promise<string> {\n const url = `${API_PATH}/version`;\n const res = await forgejoHttp.getJson(url, options, Version);\n return res.body.version;\n}\n\nexport async function isOrg(organization: string): Promise<boolean> {\n const repoCache = getCache();\n repoCache.platform ??= {};\n repoCache.platform.forgejo ??= {};\n repoCache.platform.forgejo.orgs ??= {};\n const cached = repoCache.platform.forgejo.orgs[organization];\n if (isBoolean(cached)) {\n return cached;\n }\n try {\n const url = `${API_PATH}/orgs/${organization}`;\n const res = await forgejoHttp.getJsonUnchecked(url);\n repoCache.platform.forgejo.orgs[organization] = res.statusCode === 200;\n return res.statusCode === 200;\n } catch (err) {\n if (err.statusCode === 404) {\n return false;\n }\n // throw other errors\n throw err;\n }\n}\n\nexport async function searchRepos(\n params: RepoSearchParams,\n options?: ForgejoHttpOptions,\n): Promise<Repo[]> {\n const query = getQueryString(params);\n const url = `${API_PATH}/repos/search?${query}`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n RepoSearchResults,\n );\n\n if (!res.body.ok) {\n throw new Error(\n 'Unable to search for repositories, ok flag has not been set',\n );\n }\n\n return res.body.data;\n}\n\nexport async function orgListRepos(\n organization: string,\n options?: ForgejoHttpOptions,\n): Promise<Repo[]> {\n const url = `${API_PATH}/orgs/${organization}/repos`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Repo),\n );\n\n return res.body;\n}\n\nexport async function getRepo(\n repoPath: string,\n options: ForgejoHttpOptions = {},\n): Promise<Repo> {\n const url = `${API_PATH}/repos/${repoPath}`;\n const res = await forgejoHttp.getJson(url, options, Repo);\n return res.body;\n}\n\nexport async function getRepoContents(\n repoPath: string,\n filePath: string,\n ref?: string | null,\n options: ForgejoHttpOptions = {},\n): Promise<RepoContents> {\n const query = getQueryString(ref ? { ref } : {});\n const url = `${API_PATH}/repos/${repoPath}/contents/${urlEscape(\n filePath,\n )}?${query}`;\n const res = await forgejoHttp.getJson(url, options, RepoContents);\n\n return res.body;\n}\n\nexport async function createPR(\n repoPath: string,\n params: PRCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function updatePR(\n repoPath: string,\n idx: number,\n params: PRUpdateParams,\n options?: ForgejoHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function closePR(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n await updatePR(repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function mergePR(\n repoPath: string,\n idx: number,\n params: PRMergeParams,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/merge`;\n await forgejoHttp.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function getPR(\n repoPath: string,\n idx: number,\n options: ForgejoHttpOptions = {},\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await forgejoHttp.getJson(url, options, PR);\n return res.body;\n}\n\nexport async function getPRByBranch(\n repoPath: string,\n base: string,\n head: string,\n options: ForgejoHttpOptions = {},\n): Promise<PR | null> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${base}/${head}`;\n try {\n const res = await forgejoHttp.getJson(url, options, PR);\n return res.body;\n } catch (err) {\n logger.trace({ err }, 'Error while fetching PR');\n if (err.statusCode !== 404) {\n logger.debug({ err }, 'Error while fetching PR');\n }\n return null;\n }\n}\n\nexport async function requestPrReviewers(\n repoPath: string,\n idx: number,\n params: PrReviewersParams,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/requested_reviewers`;\n await forgejoHttp.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function createIssue(\n repoPath: string,\n params: IssueCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssue(\n repoPath: string,\n idx: number,\n params: IssueUpdateParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssueLabels(\n repoPath: string,\n idx: number,\n params: IssueUpdateLabelsParams,\n options?: ForgejoHttpOptions,\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}/labels`;\n const res = await forgejoHttp.putJson(\n url,\n {\n ...options,\n body: params,\n },\n z.array(Label),\n );\n\n return res.body;\n}\n\nexport async function closeIssue(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n await updateIssue(repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function searchIssues(\n repoPath: string,\n params: IssueSearchParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue[]> {\n const query = getQueryString({ ...params, type: 'issues' });\n const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Issue),\n );\n\n return res.body;\n}\n\nexport async function getIssue(\n repoPath: string,\n idx: number,\n options: ForgejoHttpOptions = {},\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await forgejoHttp.getJson(url, options, Issue);\n return res.body;\n}\n\nexport async function getRepoLabels(\n repoPath: string,\n options: ForgejoHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/labels`;\n const res = await forgejoHttp.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function getOrgLabels(\n orgName: string,\n options: ForgejoHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/orgs/${orgName}/labels`;\n const res = await forgejoHttp.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function unassignLabel(\n repoPath: string,\n issue: number,\n label: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/labels/${label}`;\n await forgejoHttp.deleteJson(url, options);\n}\n\nexport async function createComment(\n repoPath: string,\n issue: number,\n body: string,\n options?: ForgejoHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function updateComment(\n repoPath: string,\n idx: number,\n body: string,\n options?: ForgejoHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function deleteComment(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n await forgejoHttp.deleteJson(url, options);\n}\n\nexport async function getComments(\n repoPath: string,\n issue: number,\n options: ForgejoHttpOptions = {},\n): Promise<Comment[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await forgejoHttp.getJson(url, options, z.array(Comment));\n\n return res.body;\n}\n\nexport async function createCommitStatus(\n repoPath: string,\n branchCommit: string,\n params: CommitStatusCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<CommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/statuses/${branchCommit}`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n CommitStatus,\n );\n\n return res.body;\n}\n\nexport const forgejoToRenovateStatusMapping: Record<\n CommitStatusType,\n BranchStatus\n> = {\n unknown: 'yellow',\n success: 'green',\n pending: 'yellow',\n warning: 'red',\n failure: 'red',\n error: 'red',\n};\n\nexport const renovateToForgejoStatusMapping: Record<\n BranchStatus,\n CommitStatusType\n> = {\n green: 'success',\n yellow: 'pending',\n red: 'failure',\n};\n\nfunction filterStatus(data: CommitStatus[]): CommitStatus[] {\n const ret: Record<string, CommitStatus> = {};\n for (const i of data) {\n if (!ret[i.context] || ret[i.context].id < i.id) {\n ret[i.context] = i;\n }\n }\n return Object.values(ret);\n}\n\nexport async function getCombinedCommitStatus(\n repoPath: string,\n branchName: string,\n options?: ForgejoHttpOptions,\n): Promise<CombinedCommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/commits/${urlEscape(\n branchName,\n )}/statuses`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(CommitStatus),\n );\n\n let worstState = 0;\n const statuses = filterStatus(res.body);\n for (const cs of statuses) {\n worstState = Math.max(worstState, commitStatusStates.indexOf(cs.status));\n }\n\n return {\n worstStatus: commitStatusStates[worstState],\n statuses,\n };\n}\n\nexport async function getBranch(\n repoPath: string,\n branchName: string,\n options: ForgejoHttpOptions = {},\n): Promise<Branch> {\n const url = `${API_PATH}/repos/${repoPath}/branches/${urlEscape(branchName)}`;\n const res = await forgejoHttp.getJson(url, options, Branch);\n\n return res.body;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"forgejo-helper.js","names":[],"sources":["../../../../lib/modules/platform/forgejo/forgejo-helper.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { ForgejoHttpOptions } from '../../../util/http/forgejo.ts';\nimport { ForgejoHttp } from '../../../util/http/forgejo.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport {\n Branch,\n Comment,\n CommitStatus,\n type CommitStatusType,\n Issue,\n Label,\n PR,\n Repo,\n RepoContents,\n RepoSearchResults,\n User,\n Version,\n} from './schema.ts';\nimport type {\n CombinedCommitStatus,\n CommentCreateParams,\n CommitStatusCreateParams,\n IssueCreateParams,\n IssueSearchParams,\n IssueUpdateLabelsParams,\n IssueUpdateParams,\n PRCreateParams,\n PRMergeParams,\n PRUpdateParams,\n PrReviewersParams,\n RepoSearchParams,\n} from './types.ts';\nimport { API_PATH } from './utils.ts';\n\nexport const forgejoHttp = new ForgejoHttp();\n\nfunction urlEscape(raw: string): string {\n return encodeURIComponent(raw);\n}\nconst commitStatusStates: CommitStatusType[] = [\n 'unknown',\n 'success',\n 'pending',\n 'warning',\n 'failure',\n 'error',\n];\n\nexport async function getCurrentUser(\n options: ForgejoHttpOptions = {},\n): Promise<User> {\n const url = `${API_PATH}/user`;\n const res = await forgejoHttp.getJson(url, options, User);\n return res.body;\n}\n\nexport async function getVersion(\n options: ForgejoHttpOptions = {},\n): Promise<string> {\n const url = `${API_PATH}/version`;\n const res = await forgejoHttp.getJson(url, options, Version);\n return res.body.version;\n}\n\nexport async function isOrg(organization: string): Promise<boolean> {\n const repoCache = getCache();\n repoCache.platform ??= {};\n repoCache.platform.forgejo ??= {};\n repoCache.platform.forgejo.orgs ??= {};\n const cached = repoCache.platform.forgejo.orgs[organization];\n if (isBoolean(cached)) {\n return cached;\n }\n try {\n const url = `${API_PATH}/orgs/${organization}`;\n const res = await forgejoHttp.getJsonUnchecked(url);\n repoCache.platform.forgejo.orgs[organization] = res.statusCode === 200;\n return res.statusCode === 200;\n } catch (err) {\n if (err.statusCode === 404) {\n return false;\n }\n // throw other errors\n throw err;\n }\n}\n\nexport async function searchRepos(\n params: RepoSearchParams,\n options?: ForgejoHttpOptions,\n): Promise<Repo[]> {\n const query = getQueryString(params);\n const url = `${API_PATH}/repos/search?${query}`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n RepoSearchResults,\n );\n\n if (!res.body.ok) {\n throw new Error(\n 'Unable to search for repositories, ok flag has not been set',\n );\n }\n\n return res.body.data;\n}\n\nexport async function orgListRepos(\n organization: string,\n options?: ForgejoHttpOptions,\n): Promise<Repo[]> {\n const url = `${API_PATH}/orgs/${organization}/repos`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Repo),\n );\n\n return res.body;\n}\n\nexport async function getRepo(\n repoPath: string,\n options: ForgejoHttpOptions = {},\n): Promise<Repo> {\n const url = `${API_PATH}/repos/${repoPath}`;\n const res = await forgejoHttp.getJson(url, options, Repo);\n return res.body;\n}\n\nexport async function getRepoContents(\n repoPath: string,\n filePath: string,\n ref?: string | null,\n options: ForgejoHttpOptions = {},\n): Promise<RepoContents> {\n const query = getQueryString(ref ? { ref } : {});\n const url = `${API_PATH}/repos/${repoPath}/contents/${urlEscape(\n filePath,\n )}?${query}`;\n const res = await forgejoHttp.getJson(url, options, RepoContents);\n\n return res.body;\n}\n\nexport async function createPR(\n repoPath: string,\n params: PRCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function updatePR(\n repoPath: string,\n idx: number,\n params: PRUpdateParams,\n options?: ForgejoHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function closePR(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n await updatePR(repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function mergePR(\n repoPath: string,\n idx: number,\n params: PRMergeParams,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/merge`;\n await forgejoHttp.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function getPR(\n repoPath: string,\n idx: number,\n options: ForgejoHttpOptions = {},\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await forgejoHttp.getJson(url, options, PR);\n return res.body;\n}\n\nexport async function getPRByBranch(\n repoPath: string,\n base: string,\n head: string,\n options: ForgejoHttpOptions = {},\n): Promise<PR | null> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${base}/${head}`;\n try {\n const res = await forgejoHttp.getJson(url, options, PR);\n return res.body;\n } catch (err) {\n logger.trace({ err }, 'Error while fetching PR');\n if (err.statusCode !== 404) {\n logger.debug({ err }, 'Error while fetching PR');\n }\n return null;\n }\n}\n\nexport async function requestPrReviewers(\n repoPath: string,\n idx: number,\n params: PrReviewersParams,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/requested_reviewers`;\n await forgejoHttp.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function createIssue(\n repoPath: string,\n params: IssueCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssue(\n repoPath: string,\n idx: number,\n params: IssueUpdateParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssueLabels(\n repoPath: string,\n idx: number,\n params: IssueUpdateLabelsParams,\n options?: ForgejoHttpOptions,\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}/labels`;\n const res = await forgejoHttp.putJson(\n url,\n {\n ...options,\n body: params,\n },\n z.array(Label),\n );\n\n return res.body;\n}\n\nexport async function closeIssue(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n await updateIssue(repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function searchIssues(\n repoPath: string,\n params: IssueSearchParams,\n options?: ForgejoHttpOptions,\n): Promise<Issue[]> {\n const query = getQueryString({ ...params, type: 'issues' });\n const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Issue),\n );\n\n return res.body;\n}\n\nexport async function getIssue(\n repoPath: string,\n idx: number,\n options: ForgejoHttpOptions = {},\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await forgejoHttp.getJson(url, options, Issue);\n return res.body;\n}\n\nexport async function getRepoLabels(\n repoPath: string,\n options: ForgejoHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/labels`;\n const res = await forgejoHttp.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function getOrgLabels(\n orgName: string,\n options: ForgejoHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/orgs/${orgName}/labels`;\n const res = await forgejoHttp.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function unassignLabel(\n repoPath: string,\n issue: number,\n label: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/labels/${label}`;\n await forgejoHttp.deleteJson(url, options);\n}\n\nexport async function createComment(\n repoPath: string,\n issue: number,\n body: string,\n options?: ForgejoHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function updateComment(\n repoPath: string,\n idx: number,\n body: string,\n options?: ForgejoHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n const res = await forgejoHttp.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function deleteComment(\n repoPath: string,\n idx: number,\n options?: ForgejoHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n await forgejoHttp.deleteJson(url, options);\n}\n\nexport async function getComments(\n repoPath: string,\n issue: number,\n options: ForgejoHttpOptions = {},\n): Promise<Comment[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await forgejoHttp.getJson(url, options, z.array(Comment));\n\n return res.body;\n}\n\nexport async function createCommitStatus(\n repoPath: string,\n branchCommit: string,\n params: CommitStatusCreateParams,\n options?: ForgejoHttpOptions,\n): Promise<CommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/statuses/${branchCommit}`;\n const res = await forgejoHttp.postJson(\n url,\n {\n ...options,\n body: params,\n },\n CommitStatus,\n );\n\n return res.body;\n}\n\nexport const forgejoToRenovateStatusMapping: Record<\n CommitStatusType,\n BranchStatus\n> = {\n unknown: 'yellow',\n success: 'green',\n pending: 'yellow',\n warning: 'red',\n failure: 'red',\n error: 'red',\n};\n\nexport const renovateToForgejoStatusMapping: Record<\n BranchStatus,\n CommitStatusType\n> = {\n green: 'success',\n yellow: 'pending',\n red: 'failure',\n};\n\nfunction filterStatus(data: CommitStatus[]): CommitStatus[] {\n const ret: Record<string, CommitStatus> = {};\n for (const i of data) {\n if (!ret[i.context] || ret[i.context].id < i.id) {\n ret[i.context] = i;\n }\n }\n return Object.values(ret);\n}\n\nexport async function getCombinedCommitStatus(\n repoPath: string,\n branchName: string,\n options?: ForgejoHttpOptions,\n): Promise<CombinedCommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/commits/${urlEscape(\n branchName,\n )}/statuses`;\n const res = await forgejoHttp.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(CommitStatus),\n );\n\n let worstState = 0;\n const statuses = filterStatus(res.body);\n for (const cs of statuses) {\n worstState = Math.max(worstState, commitStatusStates.indexOf(cs.status));\n }\n\n return {\n worstStatus: commitStatusStates[worstState],\n statuses,\n };\n}\n\nexport async function getBranch(\n repoPath: string,\n branchName: string,\n options: ForgejoHttpOptions = {},\n): Promise<Branch> {\n const url = `${API_PATH}/repos/${repoPath}/branches/${urlEscape(branchName)}`;\n const res = await forgejoHttp.getJson(url, options, Branch);\n\n return res.body;\n}\n"],"mappings":"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"}
@@ -150,12 +150,14 @@ const platform = {
150
150
  };
151
151
  },
152
152
  async getRawFile(fileName, repoName, branchOrTag) {
153
- const contents = await getRepoContents(repoName ?? config.repository, fileName, branchOrTag);
153
+ const repo = repoName ?? config.repository;
154
+ const contents = await getRepoContents(repo, fileName, branchOrTag);
154
155
  if (contents.type !== "file") return null;
155
156
  return contents.contentString ?? null;
156
157
  },
157
158
  async getJsonFile(fileName, repoName, branchOrTag) {
158
- return parseJson(await platform.getRawFile(fileName, repoName, branchOrTag), fileName);
159
+ const raw = await platform.getRawFile(fileName, repoName, branchOrTag);
160
+ return parseJson(raw, fileName);
159
161
  },
160
162
  async initRepo({ repository, cloneSubmodules, cloneSubmodulesFilter, gitUrl }) {
161
163
  let repo;
@@ -231,19 +233,22 @@ const platform = {
231
233
  try {
232
234
  if (config?.topics) {
233
235
  logger.debug({ topics: config.topics }, "Auto-discovering by topics");
234
- return deduplicateArray((await map(config.topics.map((topic) => {
236
+ const fetchRepoArgs = config.topics.map((topic) => {
235
237
  return {
236
238
  topic,
237
239
  sort: config.sort,
238
240
  order: config.order
239
241
  };
240
- }), fetchRepositories)).flat());
242
+ });
243
+ const repos = await map(fetchRepoArgs, fetchRepositories);
244
+ return deduplicateArray(repos.flat());
241
245
  }
242
246
  if (config?.namespaces) {
243
247
  logger.debug({ namespaces: config.namespaces }, "Auto-discovering by organization");
244
- return deduplicateArray((await map(config.namespaces, async (organization) => {
248
+ const repos = await map(config.namespaces, async (organization) => {
245
249
  return (await orgListRepos(organization)).filter((r) => !r.mirror && !r.archived).map((r) => r.full_name);
246
- })).flat());
250
+ });
251
+ return deduplicateArray(repos.flat());
247
252
  }
248
253
  return await fetchRepositories({
249
254
  sort: config?.sort,
@@ -300,7 +305,8 @@ const platform = {
300
305
  if (pr) logger.debug("Returning from cached PRs");
301
306
  else {
302
307
  logger.debug("PR not found in cached PRs - trying to fetch directly");
303
- pr = toRenovatePR(await getPR(config.repository, number), botUserName);
308
+ const gpr = await getPR(config.repository, number);
309
+ pr = toRenovatePR(gpr, botUserName);
304
310
  if (pr) await ForgejoPrCache.setPr(forgejoHttp, config.repository, config.ignorePrAuthor, botUserName, pr);
305
311
  }
306
312
  if (!pr) return null;
@@ -400,7 +406,8 @@ const platform = {
400
406
  prUpdateParams.labels = (await map(labels, lookupLabelByName)).filter(isNumber);
401
407
  if (labels.length !== prUpdateParams.labels.length) logger.warn("Some labels could not be looked up. Renovate may halt label updates assuming changes by others.");
402
408
  }
403
- const pr = toRenovatePR(await updatePR(config.repository, number, prUpdateParams), botUserName);
409
+ const gpr = await updatePR(config.repository, number, prUpdateParams);
410
+ const pr = toRenovatePR(gpr, botUserName);
404
411
  if (pr) await ForgejoPrCache.setPr(forgejoHttp, config.repository, config.ignorePrAuthor, botUserName, pr);
405
412
  },
406
413
  async mergePr({ id, strategy }) {
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["helper\n .getRepoLabels","helper\n .getOrgLabels","helper.searchRepos","helper.getCurrentUser","helper.getVersion","helper.getRepoContents","helper.getRepo","helper.isOrg","git.initRepo","helper.orgListRepos","git.getBranchCommit","helper.createCommitStatus","helper.renovateToForgejoStatusMapping","helper.getCombinedCommitStatus","helper.forgejoToRenovateStatusMapping","helper.getPR","helper.getPRByBranch","helper.createPR","helper.mergePR","helper.updatePR","helper\n .searchIssues","helper.getIssue","helper.closeIssue","helper.updateIssue","helper.updateIssueLabels","helper.createIssue","helper.unassignLabel","helper.getComments","helper.createComment","helper.updateComment","helper.deleteComment","helper.requestPrReviewers"],"sources":["../../../../lib/modules/platform/forgejo/index.ts"],"sourcesContent":["import { isNumber, isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport {\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CHANGED,\n REPOSITORY_EMPTY,\n REPOSITORY_MIRRORED,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { deduplicateArray } from '../../../util/array.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { setBaseUrl } from '../../../util/http/forgejo.ts';\nimport { map } from '../../../util/promises.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { getPrBodyStruct, hashBody } from '../pr-body.ts';\nimport type {\n AutodiscoverConfig,\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n FindPRConfig,\n Issue,\n MergePRConfig,\n Platform,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n RepoSortMethod,\n SortMethod,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as helper from './forgejo-helper.ts';\nimport { forgejoHttp } from './forgejo-helper.ts';\nimport { ForgejoPrCache } from './pr-cache.ts';\nimport type { Comment, Label, PRMergeMethod, Repo } from './schema.ts';\nimport type { CombinedCommitStatus, PRUpdateParams } from './types.ts';\nimport {\n DRAFT_PREFIX,\n getMergeMethod,\n getRepoUrl,\n isAllowed,\n smartLinks,\n toRenovatePR,\n trimTrailingApiPath,\n usableRepo,\n} from './utils.ts';\n\ninterface ForgejoRepoConfig {\n ignorePrAuthor: boolean;\n repository: string;\n mergeMethod: PRMergeMethod;\n\n issueList: Promise<Issue[]> | null;\n labelList: Promise<Label[]> | null;\n defaultBranch: string;\n cloneSubmodules: boolean;\n cloneSubmodulesFilter: string[] | undefined;\n hasIssuesEnabled: boolean;\n isOrgRepo: boolean;\n orgName: string;\n}\n\nexport const id = 'forgejo';\n\nconst defaults = {\n hostType: 'forgejo',\n endpoint: 'https://code.forgejo.org/',\n version: '0.0.0',\n};\n\nlet config: ForgejoRepoConfig = {} as any;\nlet botUserID: number;\nlet botUserName: string;\n\nexport function resetPlatform(): void {\n config = {} as any;\n botUserID = undefined as never;\n botUserName = undefined as never;\n defaults.hostType = 'forgejo';\n defaults.endpoint = 'https://code.forgejo.org/';\n defaults.version = '0.0.0';\n setBaseUrl(defaults.endpoint);\n}\n\nfunction toRenovateIssue(data: Issue): Issue {\n return {\n number: data.number,\n state: data.state,\n title: data.title,\n body: data.body,\n };\n}\n\nfunction matchesState(actual: string, expected: string): boolean {\n if (expected === 'all') {\n return true;\n }\n if (expected.startsWith('!')) {\n return actual !== expected.substring(1);\n }\n\n return actual === expected;\n}\n\nfunction findCommentByTopic(\n comments: Comment[],\n topic: string,\n): Comment | null {\n return comments.find((c) => c.body.startsWith(`### ${topic}\\n\\n`)) ?? null;\n}\n\nfunction findCommentByContent(\n comments: Comment[],\n content: string,\n): Comment | null {\n return comments.find((c) => c.body.trim() === content) ?? null;\n}\n\nfunction getLabelList(): Promise<Label[]> {\n if (config.labelList === null) {\n const repoLabels = helper\n .getRepoLabels(config.repository, {\n memCache: false,\n })\n .then((labels) => {\n logger.debug(`Retrieved ${labels.length} repo labels`);\n return labels;\n });\n\n const orgLabels = config.isOrgRepo\n ? helper\n .getOrgLabels(config.orgName, {\n memCache: false,\n })\n .then((labels) => {\n logger.debug(`Retrieved ${labels.length} org labels`);\n return labels;\n })\n .catch((err) => {\n // Will fail if owner of repo is not org\n logger.debug({ err }, `Unable to fetch organization labels`);\n return [] as Label[];\n })\n : Promise.resolve([]);\n\n config.labelList = Promise.all([repoLabels, orgLabels]).then((labels) =>\n ([] as Label[]).concat(...labels),\n );\n }\n\n return config.labelList;\n}\n\nasync function lookupLabelByName(name: string): Promise<number | null> {\n logger.debug(`lookupLabelByName(${name})`);\n const labelList = await getLabelList();\n return labelList.find((l) => l.name === name)?.id ?? null;\n}\n\ninterface FetchRepositoriesArgs {\n topic?: string;\n sort?: RepoSortMethod;\n order?: SortMethod;\n}\n\nasync function fetchRepositories({\n topic,\n sort,\n order,\n}: FetchRepositoriesArgs): Promise<string[]> {\n const repos = await helper.searchRepos({\n uid: botUserID,\n archived: false,\n ...(topic && {\n topic: true,\n q: topic,\n }),\n ...(sort && {\n sort,\n }),\n ...(order && {\n order,\n }),\n });\n return repos.filter(usableRepo).map((r) => r.full_name);\n}\n\nconst platform: Platform = {\n async initPlatform({\n endpoint,\n token,\n }: PlatformParams): Promise<PlatformResult> {\n if (!token) {\n throw new Error(\n 'Init: You must configure a Forgejo personal access token',\n );\n }\n\n if (endpoint) {\n let baseEndpoint = trimTrailingApiPath(endpoint);\n baseEndpoint = ensureTrailingSlash(baseEndpoint);\n defaults.endpoint = baseEndpoint;\n } else {\n logger.debug(`Using default Forgejo endpoint: ${defaults.endpoint}`);\n }\n setBaseUrl(defaults.endpoint);\n\n let gitAuthor: string;\n try {\n const user = await helper.getCurrentUser({ token });\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `full_name` can be emtpy string\n gitAuthor = `${user.full_name || user.login} <${user.email}>`;\n botUserID = user.id;\n botUserName = user.login;\n const env = getEnv();\n /* v8 ignore if: experimental feature */\n if (semver.valid(env.RENOVATE_X_PLATFORM_VERSION)) {\n defaults.version = env.RENOVATE_X_PLATFORM_VERSION!;\n } else {\n defaults.version = await helper.getVersion({ token });\n }\n\n logger.debug(`Forgejo version: ${defaults.version}`);\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Forgejo. Check your token',\n );\n throw new Error('Init: Authentication failure');\n }\n\n return {\n endpoint: defaults.endpoint,\n gitAuthor,\n };\n },\n\n async getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n ): Promise<string | null> {\n const repo = repoName ?? config.repository;\n const contents = await helper.getRepoContents(repo, fileName, branchOrTag);\n if (contents.type !== 'file') {\n return null;\n }\n return contents.contentString ?? null;\n },\n\n async getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n ): Promise<any> {\n // TODO #22198\n const raw = await platform.getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n },\n\n async initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n }: RepoParams): Promise<RepoResult> {\n let repo: Repo;\n\n config = {} as any;\n config.repository = repository;\n config.cloneSubmodules = !!cloneSubmodules;\n config.cloneSubmodulesFilter = cloneSubmodulesFilter;\n config.ignorePrAuthor = GlobalConfig.get('ignorePrAuthor');\n\n // Try to fetch information about repository\n try {\n repo = await helper.getRepo(repository);\n } catch (err) {\n logger.debug({ err }, 'Unknown Forgejo initRepo error');\n throw err;\n }\n\n // Ensure appropriate repository state and permissions\n if (repo.archived) {\n logger.debug('Repository is archived - aborting renovation');\n throw new Error(REPOSITORY_ARCHIVED);\n }\n if (repo.mirror) {\n logger.debug('Repository is a mirror - aborting renovation');\n throw new Error(REPOSITORY_MIRRORED);\n }\n if (!repo.permissions.pull || !repo.permissions.push) {\n logger.debug(\n 'Repository does not permit pull or push - aborting renovation',\n );\n throw new Error(REPOSITORY_ACCESS_FORBIDDEN);\n }\n if (repo.empty) {\n logger.debug('Repository is empty - aborting renovation');\n throw new Error(REPOSITORY_EMPTY);\n }\n\n if (repo.has_pull_requests === false) {\n logger.debug('Repo has disabled pull requests - aborting renovation');\n throw new Error(REPOSITORY_BLOCKED);\n }\n\n // similar to forgejo behaviour- if default merge style is allowed, use this;\n // else fall back to predefined order. Order chosen to minimize commits - see\n // https://github.com/renovatebot/renovate/pull/37768 for discussion.\n const preferredOrder: PRMergeMethod[] = [\n ...(repo.default_merge_style ? [repo.default_merge_style] : []),\n 'fast-forward-only',\n 'squash',\n 'merge',\n 'rebase',\n 'rebase-merge',\n ];\n\n const mergeStyle = preferredOrder.find((style) => isAllowed(style, repo));\n\n if (mergeStyle) {\n config.mergeMethod = mergeStyle;\n } else {\n logger.debug(\n 'Repository has no allowed merge methods - aborting renovation',\n );\n throw new Error(REPOSITORY_BLOCKED);\n }\n\n try {\n config.isOrgRepo = await helper.isOrg(repo.owner.login);\n } catch (err) {\n logger.debug({ err }, 'Forgejo initRepo() error');\n throw err;\n }\n\n // Determine author email and branches\n config.defaultBranch = repo.default_branch;\n logger.debug(`${repository} default branch = ${config.defaultBranch}`);\n\n const url = getRepoUrl(repo, gitUrl, defaults.endpoint);\n\n // Initialize Git storage\n await git.initRepo({\n ...config,\n url,\n });\n\n // Reset cached resources\n config.issueList = null;\n config.labelList = null;\n config.hasIssuesEnabled = !repo.external_tracker && repo.has_issues;\n config.orgName = repo.owner.login;\n\n return {\n defaultBranch: config.defaultBranch,\n isFork: !!repo.fork,\n repoFingerprint: repoFingerprint(repo.id, defaults.endpoint),\n };\n },\n\n async getRepos(config?: AutodiscoverConfig): Promise<string[]> {\n logger.debug('Auto-discovering Forgejo repositories');\n try {\n if (config?.topics) {\n logger.debug({ topics: config.topics }, 'Auto-discovering by topics');\n const fetchRepoArgs: FetchRepositoriesArgs[] = config.topics.map(\n (topic) => {\n return {\n topic,\n sort: config.sort,\n order: config.order,\n };\n },\n );\n const repos = await map(fetchRepoArgs, fetchRepositories);\n return deduplicateArray(repos.flat());\n }\n if (config?.namespaces) {\n logger.debug(\n { namespaces: config.namespaces },\n 'Auto-discovering by organization',\n );\n const repos = await map(\n config.namespaces,\n async (organization: string) => {\n const orgRepos = await helper.orgListRepos(organization);\n return orgRepos\n .filter((r) => !r.mirror && !r.archived)\n .map((r) => r.full_name);\n },\n );\n return deduplicateArray(repos.flat());\n }\n return await fetchRepositories({\n sort: config?.sort,\n order: config?.order,\n });\n } catch (err) {\n logger.error({ err }, 'Forgejo getRepos() error');\n throw err;\n }\n },\n\n async setBranchStatus({\n branchName,\n context,\n description,\n state,\n url: target_url,\n }: BranchStatusConfig): Promise<void> {\n try {\n // Create new status for branch commit\n const branchCommit = git.getBranchCommit(branchName);\n // TODO: check branchCommit\n\n await helper.createCommitStatus(config.repository, branchCommit!, {\n state: helper.renovateToForgejoStatusMapping[state] || 'pending',\n context,\n description,\n ...(target_url && { target_url }),\n });\n\n // Refresh caches by re-fetching commit status for branch\n await helper.getCombinedCommitStatus(config.repository, branchName, {\n memCache: false,\n });\n } catch (err) {\n logger.warn({ err }, 'Failed to set branch status');\n }\n },\n\n async getBranchStatus(\n branchName: string,\n internalChecksAsSuccess: boolean,\n ): Promise<BranchStatus> {\n let ccs: CombinedCommitStatus;\n try {\n ccs = await helper.getCombinedCommitStatus(config.repository, branchName);\n } catch (err) {\n if (err.statusCode === 404) {\n logger.debug(\n 'Received 404 when checking branch status, assuming branch deletion',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n\n logger.debug('Unknown error when checking branch status');\n throw err;\n }\n\n logger.debug({ ccs }, 'Branch status check result');\n if (\n !internalChecksAsSuccess &&\n ccs.worstStatus === 'success' &&\n ccs.statuses.every((status) => status.context?.startsWith('renovate/'))\n ) {\n logger.debug(\n 'Successful checks are all internal renovate/ checks, so returning \"pending\" branch status',\n );\n return 'yellow';\n }\n\n return helper.forgejoToRenovateStatusMapping[ccs.worstStatus];\n },\n\n async getBranchStatusCheck(\n branchName: string,\n context: string,\n ): Promise<BranchStatus | null> {\n const ccs = await helper.getCombinedCommitStatus(\n config.repository,\n branchName,\n );\n const cs = ccs.statuses.find((s) => s.context === context);\n if (!cs) {\n return null;\n } // no status check exists\n return helper.forgejoToRenovateStatusMapping[cs.status];\n },\n\n getPrList(): Promise<Pr[]> {\n return ForgejoPrCache.getPrs(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n );\n },\n\n async getPr(number: number): Promise<Pr | null> {\n // Search for pull request in cached list or attempt to query directly\n const prList = await platform.getPrList();\n let pr = prList.find((p) => p.number === number) ?? null;\n if (pr) {\n logger.debug('Returning from cached PRs');\n } else {\n logger.debug('PR not found in cached PRs - trying to fetch directly');\n const gpr = await helper.getPR(config.repository, number);\n pr = toRenovatePR(gpr, botUserName);\n\n // Add pull request to cache for further lookups / queries\n if (pr) {\n await ForgejoPrCache.setPr(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n pr,\n );\n }\n }\n\n // Abort and return null if no match was found\n if (!pr) {\n return null;\n }\n\n return pr;\n },\n\n async findPr({\n branchName,\n prTitle: title,\n state = 'all',\n includeOtherAuthors,\n targetBranch,\n }: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, ${title!}, ${state})`);\n if (includeOtherAuthors && isString(targetBranch)) {\n // do not use pr cache as it only fetches prs created by the bot account\n const pr = await helper.getPRByBranch(\n config.repository,\n targetBranch,\n branchName,\n );\n if (!pr) {\n return null;\n }\n\n return toRenovatePR(pr, null);\n }\n const prList = await platform.getPrList();\n const pr = prList.find(\n (p) =>\n p.sourceRepo === config.repository &&\n p.sourceBranch === branchName &&\n matchesState(p.state, state) &&\n (!title || p.title === title),\n );\n\n if (pr) {\n logger.debug(`Found PR #${pr.number}`);\n }\n return pr ?? null;\n },\n\n async createPr({\n sourceBranch,\n targetBranch,\n prTitle,\n prBody: rawBody,\n labels: labelNames,\n platformPrOptions,\n draftPR,\n }: CreatePRConfig): Promise<Pr> {\n let title = prTitle;\n const base = targetBranch;\n const head = sourceBranch;\n const body = sanitize(rawBody);\n if (draftPR) {\n title = DRAFT_PREFIX + title;\n }\n\n logger.debug(`Creating pull request: ${title} (${head} => ${base})`);\n try {\n const labels = Array.isArray(labelNames)\n ? await map(labelNames, lookupLabelByName)\n : [];\n const gpr = await helper.createPR(config.repository, {\n base,\n head,\n title,\n body,\n labels: labels.filter(isNumber),\n });\n\n if (platformPrOptions?.usePlatformAutomerge) {\n // Only Forgejo v10.0.0+ support delete_branch_after_merge.\n // This is required to not have undesired behavior when renovate finds existing branches on next run.\n // Codeberg usees git versioning like `11.0.1-99-c504062+gitea-1.22.0` so allow any version >= 10.0.0-0.\n if (semver.gte(defaults.version, '10.0.0-0')) {\n try {\n await helper.mergePR(config.repository, gpr.number, {\n Do:\n getMergeMethod(platformPrOptions?.automergeStrategy) ??\n config.mergeMethod,\n merge_when_checks_succeed: true,\n delete_branch_after_merge: true,\n });\n\n logger.debug(\n { prNumber: gpr.number },\n 'Forgejo-native automerge: success',\n );\n } catch (err) {\n logger.warn(\n { err, prNumber: gpr.number },\n 'Forgejo-native automerge: fail',\n );\n }\n } else {\n logger.debug(\n { prNumber: gpr.number },\n `Forgejo-native automerge: not supported on this version of Forgejo. Use 10.0.0 or newer.`,\n );\n }\n }\n\n const pr = toRenovatePR(gpr, botUserName);\n if (!pr) {\n throw new Error('Can not parse newly created Pull Request');\n }\n\n await ForgejoPrCache.setPr(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n pr,\n );\n return pr;\n } catch (err) {\n // When the user manually deletes a branch from Renovate, the PR remains but is no longer linked to any branch. In\n // the most recent versions of Forgejo, the PR gets automatically closed when that happens, but older versions do\n // not handle this properly and keep the PR open. As pushing a branch with the same name resurrects the PR, this\n // would cause a HTTP 409 conflict error, which we hereby gracefully handle.\n if (err.statusCode === 409) {\n logger.warn(\n { prTitle: title, sourceBranch },\n 'Attempting to gracefully recover from 409 Conflict response in createPr()',\n );\n\n // Refresh cached PR list and search for pull request with matching information\n ForgejoPrCache.forceSync();\n const pr = await platform.findPr({\n branchName: sourceBranch,\n state: 'open',\n });\n\n // If a valid PR was found, return and gracefully recover from the error. Otherwise, abort and throw error.\n // v8 ignore else -- TODO: add test #40625\n if (pr?.bodyStruct) {\n if (pr.title !== title || pr.bodyStruct.hash !== hashBody(body)) {\n logger.debug(\n `Recovered from 409 Conflict, but PR for ${sourceBranch} is outdated. Updating...`,\n );\n await platform.updatePr({\n number: pr.number,\n prTitle: title,\n prBody: body,\n });\n pr.title = title;\n pr.bodyStruct = getPrBodyStruct(body);\n } else {\n logger.debug(\n `Recovered from 409 Conflict and PR for ${sourceBranch} is up-to-date`,\n );\n }\n\n return pr;\n }\n }\n\n throw err;\n }\n },\n\n async updatePr({\n number,\n prTitle,\n prBody: body,\n labels,\n state,\n targetBranch,\n }: UpdatePrConfig): Promise<void> {\n let title = prTitle;\n if ((await getPrList()).find((pr) => pr.number === number)?.isDraft) {\n title = DRAFT_PREFIX + title;\n }\n\n const prUpdateParams: PRUpdateParams = {\n title,\n ...(body && { body }),\n ...(state && { state }),\n };\n if (targetBranch) {\n prUpdateParams.base = targetBranch;\n }\n\n /**\n * Update PR labels.\n * In the Forgejo API, labels are replaced on each update if the field is present.\n * If the field is not present (i.e., undefined), labels aren't updated.\n * However, the labels array must contain label IDs instead of names,\n * so a lookup is performed to fetch the details (including the ID) of each label.\n */\n if (Array.isArray(labels)) {\n prUpdateParams.labels = (await map(labels, lookupLabelByName)).filter(\n isNumber,\n );\n if (labels.length !== prUpdateParams.labels.length) {\n logger.warn(\n 'Some labels could not be looked up. Renovate may halt label updates assuming changes by others.',\n );\n }\n }\n\n const gpr = await helper.updatePR(\n config.repository,\n number,\n prUpdateParams,\n );\n const pr = toRenovatePR(gpr, botUserName);\n if (pr) {\n await ForgejoPrCache.setPr(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n pr,\n );\n }\n },\n\n async mergePr({ id, strategy }: MergePRConfig): Promise<boolean> {\n try {\n await helper.mergePR(config.repository, id, {\n Do: getMergeMethod(strategy) ?? config.mergeMethod,\n });\n return true;\n } catch (err) {\n logger.warn({ err, id }, 'Merging of PR failed');\n return false;\n }\n },\n\n getIssueList(): Promise<Issue[]> {\n if (config.hasIssuesEnabled === false) {\n return Promise.resolve([]);\n }\n config.issueList ??= helper\n .searchIssues(config.repository, { state: 'all' }, { memCache: false })\n .then((issues) => {\n const issueList = issues.map(toRenovateIssue);\n logger.debug(`Retrieved ${issueList.length} Issues`);\n return issueList;\n });\n\n return config.issueList;\n },\n\n async getIssue(number: number, memCache = true): Promise<Issue | null> {\n if (config.hasIssuesEnabled === false) {\n return null;\n }\n try {\n const body = (\n await helper.getIssue(config.repository, number, { memCache })\n ).body;\n return {\n number,\n body,\n };\n } catch (err) {\n logger.debug({ err, number }, 'Error getting issue');\n return null;\n }\n },\n\n async findIssue(title: string): Promise<Issue | null> {\n const issueList = await platform.getIssueList();\n const issue = issueList.find(\n (i) => i.state === 'open' && i.title === title,\n );\n\n if (!issue) {\n return null;\n }\n // TODO: types (#22198)\n logger.debug(`Found Issue #${issue.number!}`);\n // TODO #22198\n return getIssue!(issue.number!);\n },\n\n async ensureIssue({\n title,\n reuseTitle,\n body: content,\n labels: labelNames,\n shouldReOpen,\n once,\n }: EnsureIssueConfig): Promise<'updated' | 'created' | null> {\n logger.debug(`ensureIssue(${title})`);\n if (config.hasIssuesEnabled === false) {\n logger.info(\n 'Cannot ensure issue because issues are disabled in this repository',\n );\n return null;\n }\n try {\n const body = smartLinks(content);\n\n const issueList = await platform.getIssueList();\n let issues = issueList.filter((i) => i.title === title);\n if (!issues.length) {\n issues = issueList.filter((i) => i.title === reuseTitle);\n }\n\n const labels = Array.isArray(labelNames)\n ? (await Promise.all(labelNames.map(lookupLabelByName))).filter(\n isNumber,\n )\n : undefined;\n\n // Update any matching issues which currently exist\n if (issues.length) {\n let activeIssue = issues.find((i) => i.state === 'open');\n\n // If no active issue was found, decide if it shall be skipped, re-opened or updated without state change\n if (!activeIssue) {\n if (once) {\n logger.debug('Issue already closed - skipping update');\n return null;\n }\n if (shouldReOpen) {\n logger.debug('Reopening previously closed Issue');\n }\n\n // Pick the last issue in the list as the active one\n activeIssue = issues.at(-1)!;\n }\n\n // Close any duplicate issues\n for (const issue of issues) {\n if (issue.state === 'open' && issue.number !== activeIssue.number) {\n // TODO: types (#22198)\n logger.warn({ issueNo: issue.number! }, 'Closing duplicate issue');\n // TODO #22198\n await helper.closeIssue(config.repository, issue.number!);\n }\n }\n\n // Check if issue has already correct state\n if (\n activeIssue.title === title &&\n activeIssue.body === body &&\n activeIssue.state === 'open'\n ) {\n logger.debug(\n // TODO: types (#22198)\n `Issue #${activeIssue.number!} is open and up to date - nothing to do`,\n );\n return null;\n }\n\n if (shouldReOpen || activeIssue.state === 'open') {\n // Update issue body and re-open\n logger.debug(`Updating Issue #${activeIssue.number}`);\n const existingIssue = await helper.updateIssue(\n config.repository,\n // TODO #22198\n activeIssue.number!,\n {\n body,\n title,\n state: 'open',\n },\n );\n\n // Test whether the issues need to be updated\n const existingLabelIds = (existingIssue.labels ?? []).map(\n (label) => label.id,\n );\n if (\n labels &&\n (labels.length !== existingLabelIds.length ||\n labels.filter((labelId) => !existingLabelIds.includes(labelId))\n .length !== 0)\n ) {\n await helper.updateIssueLabels(\n config.repository,\n // TODO #22198\n activeIssue.number!,\n {\n labels,\n },\n );\n }\n\n return 'updated';\n }\n }\n\n // Create new issue and reset cache\n const issue = await helper.createIssue(config.repository, {\n body,\n title,\n labels,\n });\n logger.debug(`Created new Issue #${issue.number}`);\n config.issueList = null;\n\n return 'created';\n } catch (err) {\n logger.warn({ err }, 'Could not ensure issue');\n }\n\n return null;\n },\n\n async ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing(${title})`);\n if (config.hasIssuesEnabled === false) {\n return;\n }\n const issueList = await platform.getIssueList();\n for (const issue of issueList) {\n if (issue.state === 'open' && issue.title === title) {\n logger.debug(`Closing issue...issueNo: ${issue.number!}`);\n // TODO #22198\n await helper.closeIssue(config.repository, issue.number!);\n }\n }\n },\n\n async deleteLabel(issue: number, labelName: string): Promise<void> {\n logger.debug(`Deleting label ${labelName} from Issue #${issue}`);\n const label = await lookupLabelByName(labelName);\n if (label) {\n await helper.unassignLabel(config.repository, issue, label);\n } else {\n logger.warn({ issue, labelName }, 'Failed to lookup label for deletion');\n }\n },\n\n async ensureComment({\n number: issue,\n topic,\n content,\n }: EnsureCommentConfig): Promise<boolean> {\n try {\n let body = sanitize(content);\n const commentList = await helper.getComments(config.repository, issue);\n\n // Search comment by either topic or exact body\n let comment: Comment | null = null;\n if (topic) {\n comment = findCommentByTopic(commentList, topic);\n body = `### ${topic}\\n\\n${body}`;\n } else {\n comment = findCommentByContent(commentList, body);\n }\n\n // Create a new comment if no match has been found, otherwise update if necessary\n if (!comment) {\n comment = await helper.createComment(config.repository, issue, body);\n logger.info(\n { repository: config.repository, issue, comment: comment.id },\n 'Comment added',\n );\n } else if (comment.body === body) {\n logger.debug(`Comment #${comment.id} is already up-to-date`);\n } else {\n await helper.updateComment(config.repository, comment.id, body);\n logger.debug(\n { repository: config.repository, issue, comment: comment.id },\n 'Comment updated',\n );\n }\n\n return true;\n } catch (err) {\n logger.warn({ err, issue, subject: topic }, 'Error ensuring comment');\n return false;\n }\n },\n\n async ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n ): Promise<void> {\n const { number: issue } = deleteConfig;\n const key =\n deleteConfig.type === 'by-topic'\n ? deleteConfig.topic\n : deleteConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${issue} is removed`);\n const commentList = await helper.getComments(config.repository, issue);\n\n let comment: Comment | null = null;\n // v8 ignore else -- TODO: add test #40625\n if (deleteConfig.type === 'by-topic') {\n comment = findCommentByTopic(commentList, deleteConfig.topic);\n } else if (deleteConfig.type === 'by-content') {\n const body = sanitize(deleteConfig.content);\n comment = findCommentByContent(commentList, body);\n }\n\n // Abort and do nothing if no matching comment was found\n if (!comment) {\n return;\n }\n\n // Try to delete comment\n try {\n await helper.deleteComment(config.repository, comment.id);\n } catch (err) {\n logger.warn(\n { err, issue, config: deleteConfig },\n 'Error deleting comment',\n );\n }\n },\n\n async getBranchPr(branchName: string): Promise<Pr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const pr = await platform.findPr({ branchName, state: 'open' });\n return pr ? platform.getPr(pr.number) : null;\n },\n\n async addAssignees(number: number, assignees: string[]): Promise<void> {\n logger.debug(\n `Updating assignees '${assignees?.join(', ')}' on Issue #${number}`,\n );\n await helper.updateIssue(config.repository, number, {\n assignees,\n });\n },\n\n async addReviewers(number: number, reviewers: string[]): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers?.join(', ')}' to #${number}`);\n try {\n const teamReviewers = new Set(\n reviewers\n .filter((r) => r.startsWith('team:'))\n .map((r) => r.substring(5)),\n );\n const userReviewers = new Set(\n reviewers.filter((r) => !r.startsWith('team:')),\n );\n\n await helper.requestPrReviewers(config.repository, number, {\n reviewers: [...userReviewers],\n ...(teamReviewers.size && {\n team_reviewers: [...teamReviewers],\n }),\n });\n } catch (err) {\n logger.warn({ err, number, reviewers }, 'Failed to assign reviewer');\n }\n },\n\n massageMarkdown(prBody: string): string {\n return smartTruncate(smartLinks(prBody), maxBodyLength());\n },\n\n maxBodyLength,\n};\n\nexport function maxBodyLength(): number {\n return 1000000;\n}\n\n/* oxlint-disable typescript/unbound-method */\nexport const {\n addAssignees,\n addReviewers,\n createPr,\n deleteLabel,\n ensureComment,\n ensureCommentRemoval,\n ensureIssue,\n ensureIssueClosing,\n findIssue,\n findPr,\n getBranchPr,\n getBranchStatus,\n getBranchStatusCheck,\n getIssue,\n getRawFile,\n getJsonFile,\n getIssueList,\n getPr,\n massageMarkdown,\n getPrList,\n getRepos,\n initPlatform,\n initRepo,\n mergePr,\n setBranchStatus,\n updatePr,\n} = platform;\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["helper\n .getRepoLabels","helper\n .getOrgLabels","helper.searchRepos","helper.getCurrentUser","helper.getVersion","helper.getRepoContents","helper.getRepo","helper.isOrg","git.initRepo","helper.orgListRepos","git.getBranchCommit","helper.createCommitStatus","helper.renovateToForgejoStatusMapping","helper.getCombinedCommitStatus","helper.forgejoToRenovateStatusMapping","helper.getPR","helper.getPRByBranch","helper.createPR","helper.mergePR","helper.updatePR","helper\n .searchIssues","helper.getIssue","helper.closeIssue","helper.updateIssue","helper.updateIssueLabels","helper.createIssue","helper.unassignLabel","helper.getComments","helper.createComment","helper.updateComment","helper.deleteComment","helper.requestPrReviewers"],"sources":["../../../../lib/modules/platform/forgejo/index.ts"],"sourcesContent":["import { isNumber, isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport {\n REPOSITORY_ACCESS_FORBIDDEN,\n REPOSITORY_ARCHIVED,\n REPOSITORY_BLOCKED,\n REPOSITORY_CHANGED,\n REPOSITORY_EMPTY,\n REPOSITORY_MIRRORED,\n} from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { deduplicateArray } from '../../../util/array.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport { setBaseUrl } from '../../../util/http/forgejo.ts';\nimport { map } from '../../../util/promises.ts';\nimport { sanitize } from '../../../util/sanitize.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { getPrBodyStruct, hashBody } from '../pr-body.ts';\nimport type {\n AutodiscoverConfig,\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfig,\n EnsureIssueConfig,\n FindPRConfig,\n Issue,\n MergePRConfig,\n Platform,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n RepoSortMethod,\n SortMethod,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport * as helper from './forgejo-helper.ts';\nimport { forgejoHttp } from './forgejo-helper.ts';\nimport { ForgejoPrCache } from './pr-cache.ts';\nimport type { Comment, Label, PRMergeMethod, Repo } from './schema.ts';\nimport type { CombinedCommitStatus, PRUpdateParams } from './types.ts';\nimport {\n DRAFT_PREFIX,\n getMergeMethod,\n getRepoUrl,\n isAllowed,\n smartLinks,\n toRenovatePR,\n trimTrailingApiPath,\n usableRepo,\n} from './utils.ts';\n\ninterface ForgejoRepoConfig {\n ignorePrAuthor: boolean;\n repository: string;\n mergeMethod: PRMergeMethod;\n\n issueList: Promise<Issue[]> | null;\n labelList: Promise<Label[]> | null;\n defaultBranch: string;\n cloneSubmodules: boolean;\n cloneSubmodulesFilter: string[] | undefined;\n hasIssuesEnabled: boolean;\n isOrgRepo: boolean;\n orgName: string;\n}\n\nexport const id = 'forgejo';\n\nconst defaults = {\n hostType: 'forgejo',\n endpoint: 'https://code.forgejo.org/',\n version: '0.0.0',\n};\n\nlet config: ForgejoRepoConfig = {} as any;\nlet botUserID: number;\nlet botUserName: string;\n\nexport function resetPlatform(): void {\n config = {} as any;\n botUserID = undefined as never;\n botUserName = undefined as never;\n defaults.hostType = 'forgejo';\n defaults.endpoint = 'https://code.forgejo.org/';\n defaults.version = '0.0.0';\n setBaseUrl(defaults.endpoint);\n}\n\nfunction toRenovateIssue(data: Issue): Issue {\n return {\n number: data.number,\n state: data.state,\n title: data.title,\n body: data.body,\n };\n}\n\nfunction matchesState(actual: string, expected: string): boolean {\n if (expected === 'all') {\n return true;\n }\n if (expected.startsWith('!')) {\n return actual !== expected.substring(1);\n }\n\n return actual === expected;\n}\n\nfunction findCommentByTopic(\n comments: Comment[],\n topic: string,\n): Comment | null {\n return comments.find((c) => c.body.startsWith(`### ${topic}\\n\\n`)) ?? null;\n}\n\nfunction findCommentByContent(\n comments: Comment[],\n content: string,\n): Comment | null {\n return comments.find((c) => c.body.trim() === content) ?? null;\n}\n\nfunction getLabelList(): Promise<Label[]> {\n if (config.labelList === null) {\n const repoLabels = helper\n .getRepoLabels(config.repository, {\n memCache: false,\n })\n .then((labels) => {\n logger.debug(`Retrieved ${labels.length} repo labels`);\n return labels;\n });\n\n const orgLabels = config.isOrgRepo\n ? helper\n .getOrgLabels(config.orgName, {\n memCache: false,\n })\n .then((labels) => {\n logger.debug(`Retrieved ${labels.length} org labels`);\n return labels;\n })\n .catch((err) => {\n // Will fail if owner of repo is not org\n logger.debug({ err }, `Unable to fetch organization labels`);\n return [] as Label[];\n })\n : Promise.resolve([]);\n\n config.labelList = Promise.all([repoLabels, orgLabels]).then((labels) =>\n ([] as Label[]).concat(...labels),\n );\n }\n\n return config.labelList;\n}\n\nasync function lookupLabelByName(name: string): Promise<number | null> {\n logger.debug(`lookupLabelByName(${name})`);\n const labelList = await getLabelList();\n return labelList.find((l) => l.name === name)?.id ?? null;\n}\n\ninterface FetchRepositoriesArgs {\n topic?: string;\n sort?: RepoSortMethod;\n order?: SortMethod;\n}\n\nasync function fetchRepositories({\n topic,\n sort,\n order,\n}: FetchRepositoriesArgs): Promise<string[]> {\n const repos = await helper.searchRepos({\n uid: botUserID,\n archived: false,\n ...(topic && {\n topic: true,\n q: topic,\n }),\n ...(sort && {\n sort,\n }),\n ...(order && {\n order,\n }),\n });\n return repos.filter(usableRepo).map((r) => r.full_name);\n}\n\nconst platform: Platform = {\n async initPlatform({\n endpoint,\n token,\n }: PlatformParams): Promise<PlatformResult> {\n if (!token) {\n throw new Error(\n 'Init: You must configure a Forgejo personal access token',\n );\n }\n\n if (endpoint) {\n let baseEndpoint = trimTrailingApiPath(endpoint);\n baseEndpoint = ensureTrailingSlash(baseEndpoint);\n defaults.endpoint = baseEndpoint;\n } else {\n logger.debug(`Using default Forgejo endpoint: ${defaults.endpoint}`);\n }\n setBaseUrl(defaults.endpoint);\n\n let gitAuthor: string;\n try {\n const user = await helper.getCurrentUser({ token });\n // oxlint-disable-next-line typescript/prefer-nullish-coalescing -- `full_name` can be emtpy string\n gitAuthor = `${user.full_name || user.login} <${user.email}>`;\n botUserID = user.id;\n botUserName = user.login;\n const env = getEnv();\n /* v8 ignore if: experimental feature */\n if (semver.valid(env.RENOVATE_X_PLATFORM_VERSION)) {\n defaults.version = env.RENOVATE_X_PLATFORM_VERSION!;\n } else {\n defaults.version = await helper.getVersion({ token });\n }\n\n logger.debug(`Forgejo version: ${defaults.version}`);\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Forgejo. Check your token',\n );\n throw new Error('Init: Authentication failure');\n }\n\n return {\n endpoint: defaults.endpoint,\n gitAuthor,\n };\n },\n\n async getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n ): Promise<string | null> {\n const repo = repoName ?? config.repository;\n const contents = await helper.getRepoContents(repo, fileName, branchOrTag);\n if (contents.type !== 'file') {\n return null;\n }\n return contents.contentString ?? null;\n },\n\n async getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n ): Promise<any> {\n // TODO #22198\n const raw = await platform.getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n },\n\n async initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n }: RepoParams): Promise<RepoResult> {\n let repo: Repo;\n\n config = {} as any;\n config.repository = repository;\n config.cloneSubmodules = !!cloneSubmodules;\n config.cloneSubmodulesFilter = cloneSubmodulesFilter;\n config.ignorePrAuthor = GlobalConfig.get('ignorePrAuthor');\n\n // Try to fetch information about repository\n try {\n repo = await helper.getRepo(repository);\n } catch (err) {\n logger.debug({ err }, 'Unknown Forgejo initRepo error');\n throw err;\n }\n\n // Ensure appropriate repository state and permissions\n if (repo.archived) {\n logger.debug('Repository is archived - aborting renovation');\n throw new Error(REPOSITORY_ARCHIVED);\n }\n if (repo.mirror) {\n logger.debug('Repository is a mirror - aborting renovation');\n throw new Error(REPOSITORY_MIRRORED);\n }\n if (!repo.permissions.pull || !repo.permissions.push) {\n logger.debug(\n 'Repository does not permit pull or push - aborting renovation',\n );\n throw new Error(REPOSITORY_ACCESS_FORBIDDEN);\n }\n if (repo.empty) {\n logger.debug('Repository is empty - aborting renovation');\n throw new Error(REPOSITORY_EMPTY);\n }\n\n if (repo.has_pull_requests === false) {\n logger.debug('Repo has disabled pull requests - aborting renovation');\n throw new Error(REPOSITORY_BLOCKED);\n }\n\n // similar to forgejo behaviour- if default merge style is allowed, use this;\n // else fall back to predefined order. Order chosen to minimize commits - see\n // https://github.com/renovatebot/renovate/pull/37768 for discussion.\n const preferredOrder: PRMergeMethod[] = [\n ...(repo.default_merge_style ? [repo.default_merge_style] : []),\n 'fast-forward-only',\n 'squash',\n 'merge',\n 'rebase',\n 'rebase-merge',\n ];\n\n const mergeStyle = preferredOrder.find((style) => isAllowed(style, repo));\n\n if (mergeStyle) {\n config.mergeMethod = mergeStyle;\n } else {\n logger.debug(\n 'Repository has no allowed merge methods - aborting renovation',\n );\n throw new Error(REPOSITORY_BLOCKED);\n }\n\n try {\n config.isOrgRepo = await helper.isOrg(repo.owner.login);\n } catch (err) {\n logger.debug({ err }, 'Forgejo initRepo() error');\n throw err;\n }\n\n // Determine author email and branches\n config.defaultBranch = repo.default_branch;\n logger.debug(`${repository} default branch = ${config.defaultBranch}`);\n\n const url = getRepoUrl(repo, gitUrl, defaults.endpoint);\n\n // Initialize Git storage\n await git.initRepo({\n ...config,\n url,\n });\n\n // Reset cached resources\n config.issueList = null;\n config.labelList = null;\n config.hasIssuesEnabled = !repo.external_tracker && repo.has_issues;\n config.orgName = repo.owner.login;\n\n return {\n defaultBranch: config.defaultBranch,\n isFork: !!repo.fork,\n repoFingerprint: repoFingerprint(repo.id, defaults.endpoint),\n };\n },\n\n async getRepos(config?: AutodiscoverConfig): Promise<string[]> {\n logger.debug('Auto-discovering Forgejo repositories');\n try {\n if (config?.topics) {\n logger.debug({ topics: config.topics }, 'Auto-discovering by topics');\n const fetchRepoArgs: FetchRepositoriesArgs[] = config.topics.map(\n (topic) => {\n return {\n topic,\n sort: config.sort,\n order: config.order,\n };\n },\n );\n const repos = await map(fetchRepoArgs, fetchRepositories);\n return deduplicateArray(repos.flat());\n }\n if (config?.namespaces) {\n logger.debug(\n { namespaces: config.namespaces },\n 'Auto-discovering by organization',\n );\n const repos = await map(\n config.namespaces,\n async (organization: string) => {\n const orgRepos = await helper.orgListRepos(organization);\n return orgRepos\n .filter((r) => !r.mirror && !r.archived)\n .map((r) => r.full_name);\n },\n );\n return deduplicateArray(repos.flat());\n }\n return await fetchRepositories({\n sort: config?.sort,\n order: config?.order,\n });\n } catch (err) {\n logger.error({ err }, 'Forgejo getRepos() error');\n throw err;\n }\n },\n\n async setBranchStatus({\n branchName,\n context,\n description,\n state,\n url: target_url,\n }: BranchStatusConfig): Promise<void> {\n try {\n // Create new status for branch commit\n const branchCommit = git.getBranchCommit(branchName);\n // TODO: check branchCommit\n\n await helper.createCommitStatus(config.repository, branchCommit!, {\n state: helper.renovateToForgejoStatusMapping[state] || 'pending',\n context,\n description,\n ...(target_url && { target_url }),\n });\n\n // Refresh caches by re-fetching commit status for branch\n await helper.getCombinedCommitStatus(config.repository, branchName, {\n memCache: false,\n });\n } catch (err) {\n logger.warn({ err }, 'Failed to set branch status');\n }\n },\n\n async getBranchStatus(\n branchName: string,\n internalChecksAsSuccess: boolean,\n ): Promise<BranchStatus> {\n let ccs: CombinedCommitStatus;\n try {\n ccs = await helper.getCombinedCommitStatus(config.repository, branchName);\n } catch (err) {\n if (err.statusCode === 404) {\n logger.debug(\n 'Received 404 when checking branch status, assuming branch deletion',\n );\n throw new Error(REPOSITORY_CHANGED);\n }\n\n logger.debug('Unknown error when checking branch status');\n throw err;\n }\n\n logger.debug({ ccs }, 'Branch status check result');\n if (\n !internalChecksAsSuccess &&\n ccs.worstStatus === 'success' &&\n ccs.statuses.every((status) => status.context?.startsWith('renovate/'))\n ) {\n logger.debug(\n 'Successful checks are all internal renovate/ checks, so returning \"pending\" branch status',\n );\n return 'yellow';\n }\n\n return helper.forgejoToRenovateStatusMapping[ccs.worstStatus];\n },\n\n async getBranchStatusCheck(\n branchName: string,\n context: string,\n ): Promise<BranchStatus | null> {\n const ccs = await helper.getCombinedCommitStatus(\n config.repository,\n branchName,\n );\n const cs = ccs.statuses.find((s) => s.context === context);\n if (!cs) {\n return null;\n } // no status check exists\n return helper.forgejoToRenovateStatusMapping[cs.status];\n },\n\n getPrList(): Promise<Pr[]> {\n return ForgejoPrCache.getPrs(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n );\n },\n\n async getPr(number: number): Promise<Pr | null> {\n // Search for pull request in cached list or attempt to query directly\n const prList = await platform.getPrList();\n let pr = prList.find((p) => p.number === number) ?? null;\n if (pr) {\n logger.debug('Returning from cached PRs');\n } else {\n logger.debug('PR not found in cached PRs - trying to fetch directly');\n const gpr = await helper.getPR(config.repository, number);\n pr = toRenovatePR(gpr, botUserName);\n\n // Add pull request to cache for further lookups / queries\n if (pr) {\n await ForgejoPrCache.setPr(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n pr,\n );\n }\n }\n\n // Abort and return null if no match was found\n if (!pr) {\n return null;\n }\n\n return pr;\n },\n\n async findPr({\n branchName,\n prTitle: title,\n state = 'all',\n includeOtherAuthors,\n targetBranch,\n }: FindPRConfig): Promise<Pr | null> {\n logger.debug(`findPr(${branchName}, ${title!}, ${state})`);\n if (includeOtherAuthors && isString(targetBranch)) {\n // do not use pr cache as it only fetches prs created by the bot account\n const pr = await helper.getPRByBranch(\n config.repository,\n targetBranch,\n branchName,\n );\n if (!pr) {\n return null;\n }\n\n return toRenovatePR(pr, null);\n }\n const prList = await platform.getPrList();\n const pr = prList.find(\n (p) =>\n p.sourceRepo === config.repository &&\n p.sourceBranch === branchName &&\n matchesState(p.state, state) &&\n (!title || p.title === title),\n );\n\n if (pr) {\n logger.debug(`Found PR #${pr.number}`);\n }\n return pr ?? null;\n },\n\n async createPr({\n sourceBranch,\n targetBranch,\n prTitle,\n prBody: rawBody,\n labels: labelNames,\n platformPrOptions,\n draftPR,\n }: CreatePRConfig): Promise<Pr> {\n let title = prTitle;\n const base = targetBranch;\n const head = sourceBranch;\n const body = sanitize(rawBody);\n if (draftPR) {\n title = DRAFT_PREFIX + title;\n }\n\n logger.debug(`Creating pull request: ${title} (${head} => ${base})`);\n try {\n const labels = Array.isArray(labelNames)\n ? await map(labelNames, lookupLabelByName)\n : [];\n const gpr = await helper.createPR(config.repository, {\n base,\n head,\n title,\n body,\n labels: labels.filter(isNumber),\n });\n\n if (platformPrOptions?.usePlatformAutomerge) {\n // Only Forgejo v10.0.0+ support delete_branch_after_merge.\n // This is required to not have undesired behavior when renovate finds existing branches on next run.\n // Codeberg usees git versioning like `11.0.1-99-c504062+gitea-1.22.0` so allow any version >= 10.0.0-0.\n if (semver.gte(defaults.version, '10.0.0-0')) {\n try {\n await helper.mergePR(config.repository, gpr.number, {\n Do:\n getMergeMethod(platformPrOptions?.automergeStrategy) ??\n config.mergeMethod,\n merge_when_checks_succeed: true,\n delete_branch_after_merge: true,\n });\n\n logger.debug(\n { prNumber: gpr.number },\n 'Forgejo-native automerge: success',\n );\n } catch (err) {\n logger.warn(\n { err, prNumber: gpr.number },\n 'Forgejo-native automerge: fail',\n );\n }\n } else {\n logger.debug(\n { prNumber: gpr.number },\n `Forgejo-native automerge: not supported on this version of Forgejo. Use 10.0.0 or newer.`,\n );\n }\n }\n\n const pr = toRenovatePR(gpr, botUserName);\n if (!pr) {\n throw new Error('Can not parse newly created Pull Request');\n }\n\n await ForgejoPrCache.setPr(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n pr,\n );\n return pr;\n } catch (err) {\n // When the user manually deletes a branch from Renovate, the PR remains but is no longer linked to any branch. In\n // the most recent versions of Forgejo, the PR gets automatically closed when that happens, but older versions do\n // not handle this properly and keep the PR open. As pushing a branch with the same name resurrects the PR, this\n // would cause a HTTP 409 conflict error, which we hereby gracefully handle.\n if (err.statusCode === 409) {\n logger.warn(\n { prTitle: title, sourceBranch },\n 'Attempting to gracefully recover from 409 Conflict response in createPr()',\n );\n\n // Refresh cached PR list and search for pull request with matching information\n ForgejoPrCache.forceSync();\n const pr = await platform.findPr({\n branchName: sourceBranch,\n state: 'open',\n });\n\n // If a valid PR was found, return and gracefully recover from the error. Otherwise, abort and throw error.\n // v8 ignore else -- TODO: add test #40625\n if (pr?.bodyStruct) {\n if (pr.title !== title || pr.bodyStruct.hash !== hashBody(body)) {\n logger.debug(\n `Recovered from 409 Conflict, but PR for ${sourceBranch} is outdated. Updating...`,\n );\n await platform.updatePr({\n number: pr.number,\n prTitle: title,\n prBody: body,\n });\n pr.title = title;\n pr.bodyStruct = getPrBodyStruct(body);\n } else {\n logger.debug(\n `Recovered from 409 Conflict and PR for ${sourceBranch} is up-to-date`,\n );\n }\n\n return pr;\n }\n }\n\n throw err;\n }\n },\n\n async updatePr({\n number,\n prTitle,\n prBody: body,\n labels,\n state,\n targetBranch,\n }: UpdatePrConfig): Promise<void> {\n let title = prTitle;\n if ((await getPrList()).find((pr) => pr.number === number)?.isDraft) {\n title = DRAFT_PREFIX + title;\n }\n\n const prUpdateParams: PRUpdateParams = {\n title,\n ...(body && { body }),\n ...(state && { state }),\n };\n if (targetBranch) {\n prUpdateParams.base = targetBranch;\n }\n\n /**\n * Update PR labels.\n * In the Forgejo API, labels are replaced on each update if the field is present.\n * If the field is not present (i.e., undefined), labels aren't updated.\n * However, the labels array must contain label IDs instead of names,\n * so a lookup is performed to fetch the details (including the ID) of each label.\n */\n if (Array.isArray(labels)) {\n prUpdateParams.labels = (await map(labels, lookupLabelByName)).filter(\n isNumber,\n );\n if (labels.length !== prUpdateParams.labels.length) {\n logger.warn(\n 'Some labels could not be looked up. Renovate may halt label updates assuming changes by others.',\n );\n }\n }\n\n const gpr = await helper.updatePR(\n config.repository,\n number,\n prUpdateParams,\n );\n const pr = toRenovatePR(gpr, botUserName);\n if (pr) {\n await ForgejoPrCache.setPr(\n forgejoHttp,\n config.repository,\n config.ignorePrAuthor,\n botUserName,\n pr,\n );\n }\n },\n\n async mergePr({ id, strategy }: MergePRConfig): Promise<boolean> {\n try {\n await helper.mergePR(config.repository, id, {\n Do: getMergeMethod(strategy) ?? config.mergeMethod,\n });\n return true;\n } catch (err) {\n logger.warn({ err, id }, 'Merging of PR failed');\n return false;\n }\n },\n\n getIssueList(): Promise<Issue[]> {\n if (config.hasIssuesEnabled === false) {\n return Promise.resolve([]);\n }\n config.issueList ??= helper\n .searchIssues(config.repository, { state: 'all' }, { memCache: false })\n .then((issues) => {\n const issueList = issues.map(toRenovateIssue);\n logger.debug(`Retrieved ${issueList.length} Issues`);\n return issueList;\n });\n\n return config.issueList;\n },\n\n async getIssue(number: number, memCache = true): Promise<Issue | null> {\n if (config.hasIssuesEnabled === false) {\n return null;\n }\n try {\n const body = (\n await helper.getIssue(config.repository, number, { memCache })\n ).body;\n return {\n number,\n body,\n };\n } catch (err) {\n logger.debug({ err, number }, 'Error getting issue');\n return null;\n }\n },\n\n async findIssue(title: string): Promise<Issue | null> {\n const issueList = await platform.getIssueList();\n const issue = issueList.find(\n (i) => i.state === 'open' && i.title === title,\n );\n\n if (!issue) {\n return null;\n }\n // TODO: types (#22198)\n logger.debug(`Found Issue #${issue.number!}`);\n // TODO #22198\n return getIssue!(issue.number!);\n },\n\n async ensureIssue({\n title,\n reuseTitle,\n body: content,\n labels: labelNames,\n shouldReOpen,\n once,\n }: EnsureIssueConfig): Promise<'updated' | 'created' | null> {\n logger.debug(`ensureIssue(${title})`);\n if (config.hasIssuesEnabled === false) {\n logger.info(\n 'Cannot ensure issue because issues are disabled in this repository',\n );\n return null;\n }\n try {\n const body = smartLinks(content);\n\n const issueList = await platform.getIssueList();\n let issues = issueList.filter((i) => i.title === title);\n if (!issues.length) {\n issues = issueList.filter((i) => i.title === reuseTitle);\n }\n\n const labels = Array.isArray(labelNames)\n ? (await Promise.all(labelNames.map(lookupLabelByName))).filter(\n isNumber,\n )\n : undefined;\n\n // Update any matching issues which currently exist\n if (issues.length) {\n let activeIssue = issues.find((i) => i.state === 'open');\n\n // If no active issue was found, decide if it shall be skipped, re-opened or updated without state change\n if (!activeIssue) {\n if (once) {\n logger.debug('Issue already closed - skipping update');\n return null;\n }\n if (shouldReOpen) {\n logger.debug('Reopening previously closed Issue');\n }\n\n // Pick the last issue in the list as the active one\n activeIssue = issues.at(-1)!;\n }\n\n // Close any duplicate issues\n for (const issue of issues) {\n if (issue.state === 'open' && issue.number !== activeIssue.number) {\n // TODO: types (#22198)\n logger.warn({ issueNo: issue.number! }, 'Closing duplicate issue');\n // TODO #22198\n await helper.closeIssue(config.repository, issue.number!);\n }\n }\n\n // Check if issue has already correct state\n if (\n activeIssue.title === title &&\n activeIssue.body === body &&\n activeIssue.state === 'open'\n ) {\n logger.debug(\n // TODO: types (#22198)\n `Issue #${activeIssue.number!} is open and up to date - nothing to do`,\n );\n return null;\n }\n\n if (shouldReOpen || activeIssue.state === 'open') {\n // Update issue body and re-open\n logger.debug(`Updating Issue #${activeIssue.number}`);\n const existingIssue = await helper.updateIssue(\n config.repository,\n // TODO #22198\n activeIssue.number!,\n {\n body,\n title,\n state: 'open',\n },\n );\n\n // Test whether the issues need to be updated\n const existingLabelIds = (existingIssue.labels ?? []).map(\n (label) => label.id,\n );\n if (\n labels &&\n (labels.length !== existingLabelIds.length ||\n labels.filter((labelId) => !existingLabelIds.includes(labelId))\n .length !== 0)\n ) {\n await helper.updateIssueLabels(\n config.repository,\n // TODO #22198\n activeIssue.number!,\n {\n labels,\n },\n );\n }\n\n return 'updated';\n }\n }\n\n // Create new issue and reset cache\n const issue = await helper.createIssue(config.repository, {\n body,\n title,\n labels,\n });\n logger.debug(`Created new Issue #${issue.number}`);\n config.issueList = null;\n\n return 'created';\n } catch (err) {\n logger.warn({ err }, 'Could not ensure issue');\n }\n\n return null;\n },\n\n async ensureIssueClosing(title: string): Promise<void> {\n logger.debug(`ensureIssueClosing(${title})`);\n if (config.hasIssuesEnabled === false) {\n return;\n }\n const issueList = await platform.getIssueList();\n for (const issue of issueList) {\n if (issue.state === 'open' && issue.title === title) {\n logger.debug(`Closing issue...issueNo: ${issue.number!}`);\n // TODO #22198\n await helper.closeIssue(config.repository, issue.number!);\n }\n }\n },\n\n async deleteLabel(issue: number, labelName: string): Promise<void> {\n logger.debug(`Deleting label ${labelName} from Issue #${issue}`);\n const label = await lookupLabelByName(labelName);\n if (label) {\n await helper.unassignLabel(config.repository, issue, label);\n } else {\n logger.warn({ issue, labelName }, 'Failed to lookup label for deletion');\n }\n },\n\n async ensureComment({\n number: issue,\n topic,\n content,\n }: EnsureCommentConfig): Promise<boolean> {\n try {\n let body = sanitize(content);\n const commentList = await helper.getComments(config.repository, issue);\n\n // Search comment by either topic or exact body\n let comment: Comment | null = null;\n if (topic) {\n comment = findCommentByTopic(commentList, topic);\n body = `### ${topic}\\n\\n${body}`;\n } else {\n comment = findCommentByContent(commentList, body);\n }\n\n // Create a new comment if no match has been found, otherwise update if necessary\n if (!comment) {\n comment = await helper.createComment(config.repository, issue, body);\n logger.info(\n { repository: config.repository, issue, comment: comment.id },\n 'Comment added',\n );\n } else if (comment.body === body) {\n logger.debug(`Comment #${comment.id} is already up-to-date`);\n } else {\n await helper.updateComment(config.repository, comment.id, body);\n logger.debug(\n { repository: config.repository, issue, comment: comment.id },\n 'Comment updated',\n );\n }\n\n return true;\n } catch (err) {\n logger.warn({ err, issue, subject: topic }, 'Error ensuring comment');\n return false;\n }\n },\n\n async ensureCommentRemoval(\n deleteConfig: EnsureCommentRemovalConfig,\n ): Promise<void> {\n const { number: issue } = deleteConfig;\n const key =\n deleteConfig.type === 'by-topic'\n ? deleteConfig.topic\n : deleteConfig.content;\n logger.debug(`Ensuring comment \"${key}\" in #${issue} is removed`);\n const commentList = await helper.getComments(config.repository, issue);\n\n let comment: Comment | null = null;\n // v8 ignore else -- TODO: add test #40625\n if (deleteConfig.type === 'by-topic') {\n comment = findCommentByTopic(commentList, deleteConfig.topic);\n } else if (deleteConfig.type === 'by-content') {\n const body = sanitize(deleteConfig.content);\n comment = findCommentByContent(commentList, body);\n }\n\n // Abort and do nothing if no matching comment was found\n if (!comment) {\n return;\n }\n\n // Try to delete comment\n try {\n await helper.deleteComment(config.repository, comment.id);\n } catch (err) {\n logger.warn(\n { err, issue, config: deleteConfig },\n 'Error deleting comment',\n );\n }\n },\n\n async getBranchPr(branchName: string): Promise<Pr | null> {\n logger.debug(`getBranchPr(${branchName})`);\n const pr = await platform.findPr({ branchName, state: 'open' });\n return pr ? platform.getPr(pr.number) : null;\n },\n\n async addAssignees(number: number, assignees: string[]): Promise<void> {\n logger.debug(\n `Updating assignees '${assignees?.join(', ')}' on Issue #${number}`,\n );\n await helper.updateIssue(config.repository, number, {\n assignees,\n });\n },\n\n async addReviewers(number: number, reviewers: string[]): Promise<void> {\n logger.debug(`Adding reviewers '${reviewers?.join(', ')}' to #${number}`);\n try {\n const teamReviewers = new Set(\n reviewers\n .filter((r) => r.startsWith('team:'))\n .map((r) => r.substring(5)),\n );\n const userReviewers = new Set(\n reviewers.filter((r) => !r.startsWith('team:')),\n );\n\n await helper.requestPrReviewers(config.repository, number, {\n reviewers: [...userReviewers],\n ...(teamReviewers.size && {\n team_reviewers: [...teamReviewers],\n }),\n });\n } catch (err) {\n logger.warn({ err, number, reviewers }, 'Failed to assign reviewer');\n }\n },\n\n massageMarkdown(prBody: string): string {\n return smartTruncate(smartLinks(prBody), maxBodyLength());\n },\n\n maxBodyLength,\n};\n\nexport function maxBodyLength(): number {\n return 1000000;\n}\n\n/* oxlint-disable typescript/unbound-method */\nexport const {\n addAssignees,\n addReviewers,\n createPr,\n deleteLabel,\n ensureComment,\n ensureCommentRemoval,\n ensureIssue,\n ensureIssueClosing,\n findIssue,\n findPr,\n getBranchPr,\n getBranchStatus,\n getBranchStatusCheck,\n getIssue,\n getRawFile,\n getJsonFile,\n getIssueList,\n getPr,\n massageMarkdown,\n getPrList,\n getRepos,\n initPlatform,\n initRepo,\n mergePr,\n setBranchStatus,\n updatePr,\n} = platform;\n"],"mappings":"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"}
@@ -135,7 +135,8 @@ var GerritClient = class {
135
135
  const bytes = encoder.encode(msg);
136
136
  if (bytes.length > 16384) {
137
137
  const truncationNotice = "\n\n[Truncated by Renovate]";
138
- const maxContentBytes = MAX_GERRIT_COMMENT_SIZE - encoder.encode(truncationNotice).length;
138
+ const truncationNoticeBytes = encoder.encode(truncationNotice);
139
+ const maxContentBytes = MAX_GERRIT_COMMENT_SIZE - truncationNoticeBytes.length;
139
140
  const truncatedBytes = bytes.slice(0, maxContentBytes);
140
141
  msg = new TextDecoder().decode(truncatedBytes) + truncationNotice;
141
142
  }
@@ -1 +1 @@
1
- {"version":3,"file":"client.js","names":[],"sources":["../../../../lib/modules/platform/gerrit/client.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { z } from 'zod/v4';\nimport { REPOSITORY_ARCHIVED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { GerritHttp } from '../../../util/http/gerrit.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport type { GerritAccountInfo, GerritChangeMessageInfo } from './schema.ts';\nimport {\n GerritBranchInfo,\n GerritChange,\n GerritChangeMessages,\n GerritChanges,\n GerritMergeableInfo,\n GerritProjectInfo,\n GerritRepos,\n} from './schema.ts';\nimport type {\n GerritFindPRConfig,\n GerritHashtagsInput,\n GerritRequestDetail,\n} from './types.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n MIN_GERRIT_VERSION,\n mapPrStateToGerritFilter,\n} from './utils.ts';\n\nclass GerritClient {\n // memCache is disabled because GerritPrCache will provide a smarter caching\n private gerritHttp = new GerritHttp({ memCache: false });\n private gerritVersion = MIN_GERRIT_VERSION;\n\n setGerritVersion(version: string): void {\n this.gerritVersion = version;\n }\n\n async getGerritVersion(\n options: Pick<HttpOptions, 'username' | 'password'>,\n ): Promise<string> {\n const res = await this.gerritHttp.getJson(\n 'a/config/server/version',\n options,\n z.string(),\n );\n return res.body;\n }\n\n async getRepos(): Promise<string[]> {\n const res = await this.gerritHttp.getJson(\n 'a/projects/?type=CODE&state=ACTIVE',\n GerritRepos,\n );\n return Object.keys(res.body);\n }\n\n async getProjectInfo(repository: string): Promise<GerritProjectInfo> {\n const projectInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}`,\n GerritProjectInfo,\n );\n if (projectInfo.body.state !== 'ACTIVE') {\n throw new Error(REPOSITORY_ARCHIVED);\n }\n return projectInfo.body;\n }\n\n async getBranchInfo(repository: string): Promise<GerritBranchInfo> {\n const branchInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}/branches/HEAD`,\n GerritBranchInfo,\n );\n return branchInfo.body;\n }\n\n async getBranchChange(\n repository: string,\n config: Pick<\n GerritFindPRConfig,\n 'branchName' | 'state' | 'targetBranch' | 'requestDetails'\n >,\n ): Promise<GerritChange | null> {\n const changes = await this.findChanges(repository, {\n branchName: config.branchName,\n state: config.state,\n singleChange: config.targetBranch ? false : true,\n requestDetails: config.requestDetails,\n });\n\n if (changes.length === 0) {\n return null;\n }\n\n if (changes.length === 1) {\n return changes[0];\n }\n\n // If multiple changes are found, prefer the one matching the target branch\n if (config.targetBranch) {\n const change = changes.find((c) => c.branch === config.targetBranch);\n if (change) {\n return change;\n }\n }\n\n // Otherwise return the first one\n return changes[0];\n }\n\n async findChanges(\n repository: string,\n findPRConfig: GerritFindPRConfig,\n ): Promise<GerritChange[]> {\n const startOffset = findPRConfig.startOffset ?? 0;\n const pageLimit = findPRConfig.singleChange\n ? 1\n : (findPRConfig.pageLimit ?? 50);\n\n const query: Record<string, any> = {\n n: pageLimit,\n };\n if (findPRConfig.requestDetails) {\n query.o = findPRConfig.requestDetails;\n }\n\n const filters = this.buildSearchFilters(repository, findPRConfig);\n\n const allChanges: GerritChange[] = [];\n\n while (true) {\n query.S = allChanges.length + startOffset;\n const queryString = `q=${filters.join('+')}&${getQueryString(query)}`;\n const changes = await this.gerritHttp.getJson(\n `a/changes/?${queryString}`,\n GerritChanges,\n );\n\n logger.trace(\n `findChanges(${queryString},start=${query.S},limit=${query.n}) => ${changes.body.length}`,\n );\n\n const lastChange = changes.body.at(-1);\n let hasMoreChanges = false;\n if (lastChange?._more_changes) {\n hasMoreChanges = true;\n delete lastChange._more_changes;\n }\n\n allChanges.push(...changes.body);\n\n if (\n findPRConfig.singleChange ||\n findPRConfig.noPagination ||\n !hasMoreChanges\n ) {\n break;\n }\n }\n\n return allChanges;\n }\n\n async getChange(\n changeNumber: number,\n requestDetails?: GerritRequestDetail[],\n ): Promise<GerritChange> {\n const queryString = getQueryString({ o: requestDetails });\n const changes = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}?${queryString}`,\n GerritChange,\n );\n return changes.body;\n }\n\n async getMergeableInfo(change: GerritChange): Promise<GerritMergeableInfo> {\n const mergeable = await this.gerritHttp.getJson(\n `a/changes/${change._number}/revisions/current/mergeable`,\n GerritMergeableInfo,\n );\n return mergeable.body;\n }\n\n async abandonChange(changeNumber: number, message?: string): Promise<void> {\n await this.gerritHttp.postJson(`a/changes/${changeNumber}/abandon`, {\n body: {\n message,\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n });\n }\n\n async submitChange(changeNumber: number): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/submit`,\n );\n return change.body;\n }\n\n async getMessages(changeNumber: number): Promise<GerritChangeMessageInfo[]> {\n const messages = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}/messages`,\n GerritChangeMessages,\n );\n return messages.body;\n }\n\n async addMessage(\n changeNumber: number,\n fullMessage: string,\n tag?: string,\n ): Promise<void> {\n const message = this.normalizeMessage(fullMessage);\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n { body: { message, tag, notify: 'NONE' } },\n );\n }\n\n async checkForExistingMessage(\n changeNumber: number,\n newMessage: string,\n msgType?: string,\n ): Promise<boolean> {\n const messagesToSearch = await this.getMessages(changeNumber);\n\n return messagesToSearch.some(\n (existingMsg) =>\n (msgType === undefined || msgType === existingMsg.tag) &&\n existingMsg.message.includes(newMessage),\n );\n }\n\n async addMessageIfNotAlreadyExists(\n changeNumber: number,\n message: string,\n tag?: string,\n ): Promise<void> {\n const newMsg = this.normalizeMessage(message);\n if (!(await this.checkForExistingMessage(changeNumber, newMsg, tag))) {\n await this.addMessage(changeNumber, newMsg, tag);\n }\n }\n\n async setLabel(\n changeNumber: number,\n label: string,\n value: number,\n ): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n { body: { labels: { [label]: value }, notify: 'NONE' } },\n );\n }\n\n async setHashtags(\n changeNumber: number,\n hashtagsInput: GerritHashtagsInput,\n ): Promise<void> {\n const { add, remove } = hashtagsInput;\n if (isNonEmptyArray(add) || isNonEmptyArray(remove)) {\n await this.gerritHttp.postJson(`a/changes/${changeNumber}/hashtags`, {\n body: { add, remove },\n });\n }\n }\n\n async addReviewers(changeNumber: number, reviewers: string[]): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n {\n body: {\n reviewers: reviewers.map((r) => ({ reviewer: r })),\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n },\n );\n }\n\n async addAssignee(changeNumber: number, assignee: string): Promise<void> {\n await this.gerritHttp.putJson<GerritAccountInfo>(\n // TODO: use CCs instead as Gerrit 3.8+ no longer supports assignees\n `a/changes/${changeNumber}/assignee`,\n {\n body: { assignee },\n },\n );\n }\n\n async getFile(\n repo: string,\n branch: string,\n fileName: string,\n ): Promise<string> {\n const base64Content = await this.gerritHttp.getText(\n `a/projects/${encodeURIComponent(\n repo,\n )}/branches/${encodeURIComponent(branch)}/files/${encodeURIComponent(fileName)}/content`,\n );\n return Buffer.from(base64Content.body, 'base64').toString();\n }\n\n async moveChange(\n changeNumber: number,\n destinationBranch: string,\n ): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/move`,\n {\n body: {\n destination_branch: destinationBranch,\n },\n },\n );\n return change.body;\n }\n\n normalizeMessage(message: string): string {\n // Gerrit would trim it anyway\n let msg = message.trim();\n\n const encoder = new TextEncoder();\n const bytes = encoder.encode(msg);\n if (bytes.length > MAX_GERRIT_COMMENT_SIZE) {\n const truncationNotice = '\\n\\n[Truncated by Renovate]';\n const truncationNoticeBytes = encoder.encode(truncationNotice);\n const maxContentBytes =\n MAX_GERRIT_COMMENT_SIZE - truncationNoticeBytes.length;\n const truncatedBytes = bytes.slice(0, maxContentBytes);\n const decoded = new TextDecoder().decode(truncatedBytes);\n msg = decoded + truncationNotice;\n }\n\n return msg;\n }\n\n private buildSearchFilters(\n repository: string,\n searchConfig: GerritFindPRConfig,\n ): string[] {\n const filters = [\n 'owner:self',\n `project:${repository}`,\n '-is:wip',\n '-is:private',\n ];\n const filterState = mapPrStateToGerritFilter(searchConfig.state);\n if (filterState) {\n filters.push(filterState);\n }\n if (searchConfig.branchName) {\n filters.push(`footer:Renovate-Branch=${searchConfig.branchName}`);\n } else if (semver.gte(this.gerritVersion, '3.6.0')) {\n filters.push('hasfooter:Renovate-Branch');\n } else {\n filters.push('message:\"Renovate-Branch: \"');\n }\n if (searchConfig.targetBranch) {\n filters.push(`branch:${searchConfig.targetBranch}`);\n }\n if (searchConfig.label) {\n filters.push(`label:Code-Review=${searchConfig.label}`);\n }\n if (searchConfig.prTitle) {\n // Quotes in the search operators must be escaped with a backslash:\n // https://gerrit-review.googlesource.com/Documentation/user-search.html#search-operators\n const escapedTitle = searchConfig.prTitle.replaceAll('\"', '\\\\\"');\n if (semver.gte(this.gerritVersion, '3.8.0')) {\n filters.push(`subject:\"${escapedTitle}\"`);\n } else {\n filters.push(`message:\"${escapedTitle}\"`);\n }\n }\n return filters;\n }\n}\n\nexport const client = new GerritClient();\n"],"mappings":"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"}
1
+ {"version":3,"file":"client.js","names":[],"sources":["../../../../lib/modules/platform/gerrit/client.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { z } from 'zod/v4';\nimport { REPOSITORY_ARCHIVED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { GerritHttp } from '../../../util/http/gerrit.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport type { GerritAccountInfo, GerritChangeMessageInfo } from './schema.ts';\nimport {\n GerritBranchInfo,\n GerritChange,\n GerritChangeMessages,\n GerritChanges,\n GerritMergeableInfo,\n GerritProjectInfo,\n GerritRepos,\n} from './schema.ts';\nimport type {\n GerritFindPRConfig,\n GerritHashtagsInput,\n GerritRequestDetail,\n} from './types.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n MIN_GERRIT_VERSION,\n mapPrStateToGerritFilter,\n} from './utils.ts';\n\nclass GerritClient {\n // memCache is disabled because GerritPrCache will provide a smarter caching\n private gerritHttp = new GerritHttp({ memCache: false });\n private gerritVersion = MIN_GERRIT_VERSION;\n\n setGerritVersion(version: string): void {\n this.gerritVersion = version;\n }\n\n async getGerritVersion(\n options: Pick<HttpOptions, 'username' | 'password'>,\n ): Promise<string> {\n const res = await this.gerritHttp.getJson(\n 'a/config/server/version',\n options,\n z.string(),\n );\n return res.body;\n }\n\n async getRepos(): Promise<string[]> {\n const res = await this.gerritHttp.getJson(\n 'a/projects/?type=CODE&state=ACTIVE',\n GerritRepos,\n );\n return Object.keys(res.body);\n }\n\n async getProjectInfo(repository: string): Promise<GerritProjectInfo> {\n const projectInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}`,\n GerritProjectInfo,\n );\n if (projectInfo.body.state !== 'ACTIVE') {\n throw new Error(REPOSITORY_ARCHIVED);\n }\n return projectInfo.body;\n }\n\n async getBranchInfo(repository: string): Promise<GerritBranchInfo> {\n const branchInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}/branches/HEAD`,\n GerritBranchInfo,\n );\n return branchInfo.body;\n }\n\n async getBranchChange(\n repository: string,\n config: Pick<\n GerritFindPRConfig,\n 'branchName' | 'state' | 'targetBranch' | 'requestDetails'\n >,\n ): Promise<GerritChange | null> {\n const changes = await this.findChanges(repository, {\n branchName: config.branchName,\n state: config.state,\n singleChange: config.targetBranch ? false : true,\n requestDetails: config.requestDetails,\n });\n\n if (changes.length === 0) {\n return null;\n }\n\n if (changes.length === 1) {\n return changes[0];\n }\n\n // If multiple changes are found, prefer the one matching the target branch\n if (config.targetBranch) {\n const change = changes.find((c) => c.branch === config.targetBranch);\n if (change) {\n return change;\n }\n }\n\n // Otherwise return the first one\n return changes[0];\n }\n\n async findChanges(\n repository: string,\n findPRConfig: GerritFindPRConfig,\n ): Promise<GerritChange[]> {\n const startOffset = findPRConfig.startOffset ?? 0;\n const pageLimit = findPRConfig.singleChange\n ? 1\n : (findPRConfig.pageLimit ?? 50);\n\n const query: Record<string, any> = {\n n: pageLimit,\n };\n if (findPRConfig.requestDetails) {\n query.o = findPRConfig.requestDetails;\n }\n\n const filters = this.buildSearchFilters(repository, findPRConfig);\n\n const allChanges: GerritChange[] = [];\n\n while (true) {\n query.S = allChanges.length + startOffset;\n const queryString = `q=${filters.join('+')}&${getQueryString(query)}`;\n const changes = await this.gerritHttp.getJson(\n `a/changes/?${queryString}`,\n GerritChanges,\n );\n\n logger.trace(\n `findChanges(${queryString},start=${query.S},limit=${query.n}) => ${changes.body.length}`,\n );\n\n const lastChange = changes.body.at(-1);\n let hasMoreChanges = false;\n if (lastChange?._more_changes) {\n hasMoreChanges = true;\n delete lastChange._more_changes;\n }\n\n allChanges.push(...changes.body);\n\n if (\n findPRConfig.singleChange ||\n findPRConfig.noPagination ||\n !hasMoreChanges\n ) {\n break;\n }\n }\n\n return allChanges;\n }\n\n async getChange(\n changeNumber: number,\n requestDetails?: GerritRequestDetail[],\n ): Promise<GerritChange> {\n const queryString = getQueryString({ o: requestDetails });\n const changes = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}?${queryString}`,\n GerritChange,\n );\n return changes.body;\n }\n\n async getMergeableInfo(change: GerritChange): Promise<GerritMergeableInfo> {\n const mergeable = await this.gerritHttp.getJson(\n `a/changes/${change._number}/revisions/current/mergeable`,\n GerritMergeableInfo,\n );\n return mergeable.body;\n }\n\n async abandonChange(changeNumber: number, message?: string): Promise<void> {\n await this.gerritHttp.postJson(`a/changes/${changeNumber}/abandon`, {\n body: {\n message,\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n });\n }\n\n async submitChange(changeNumber: number): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/submit`,\n );\n return change.body;\n }\n\n async getMessages(changeNumber: number): Promise<GerritChangeMessageInfo[]> {\n const messages = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}/messages`,\n GerritChangeMessages,\n );\n return messages.body;\n }\n\n async addMessage(\n changeNumber: number,\n fullMessage: string,\n tag?: string,\n ): Promise<void> {\n const message = this.normalizeMessage(fullMessage);\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n { body: { message, tag, notify: 'NONE' } },\n );\n }\n\n async checkForExistingMessage(\n changeNumber: number,\n newMessage: string,\n msgType?: string,\n ): Promise<boolean> {\n const messagesToSearch = await this.getMessages(changeNumber);\n\n return messagesToSearch.some(\n (existingMsg) =>\n (msgType === undefined || msgType === existingMsg.tag) &&\n existingMsg.message.includes(newMessage),\n );\n }\n\n async addMessageIfNotAlreadyExists(\n changeNumber: number,\n message: string,\n tag?: string,\n ): Promise<void> {\n const newMsg = this.normalizeMessage(message);\n if (!(await this.checkForExistingMessage(changeNumber, newMsg, tag))) {\n await this.addMessage(changeNumber, newMsg, tag);\n }\n }\n\n async setLabel(\n changeNumber: number,\n label: string,\n value: number,\n ): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n { body: { labels: { [label]: value }, notify: 'NONE' } },\n );\n }\n\n async setHashtags(\n changeNumber: number,\n hashtagsInput: GerritHashtagsInput,\n ): Promise<void> {\n const { add, remove } = hashtagsInput;\n if (isNonEmptyArray(add) || isNonEmptyArray(remove)) {\n await this.gerritHttp.postJson(`a/changes/${changeNumber}/hashtags`, {\n body: { add, remove },\n });\n }\n }\n\n async addReviewers(changeNumber: number, reviewers: string[]): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n {\n body: {\n reviewers: reviewers.map((r) => ({ reviewer: r })),\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n },\n );\n }\n\n async addAssignee(changeNumber: number, assignee: string): Promise<void> {\n await this.gerritHttp.putJson<GerritAccountInfo>(\n // TODO: use CCs instead as Gerrit 3.8+ no longer supports assignees\n `a/changes/${changeNumber}/assignee`,\n {\n body: { assignee },\n },\n );\n }\n\n async getFile(\n repo: string,\n branch: string,\n fileName: string,\n ): Promise<string> {\n const base64Content = await this.gerritHttp.getText(\n `a/projects/${encodeURIComponent(\n repo,\n )}/branches/${encodeURIComponent(branch)}/files/${encodeURIComponent(fileName)}/content`,\n );\n return Buffer.from(base64Content.body, 'base64').toString();\n }\n\n async moveChange(\n changeNumber: number,\n destinationBranch: string,\n ): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/move`,\n {\n body: {\n destination_branch: destinationBranch,\n },\n },\n );\n return change.body;\n }\n\n normalizeMessage(message: string): string {\n // Gerrit would trim it anyway\n let msg = message.trim();\n\n const encoder = new TextEncoder();\n const bytes = encoder.encode(msg);\n if (bytes.length > MAX_GERRIT_COMMENT_SIZE) {\n const truncationNotice = '\\n\\n[Truncated by Renovate]';\n const truncationNoticeBytes = encoder.encode(truncationNotice);\n const maxContentBytes =\n MAX_GERRIT_COMMENT_SIZE - truncationNoticeBytes.length;\n const truncatedBytes = bytes.slice(0, maxContentBytes);\n const decoded = new TextDecoder().decode(truncatedBytes);\n msg = decoded + truncationNotice;\n }\n\n return msg;\n }\n\n private buildSearchFilters(\n repository: string,\n searchConfig: GerritFindPRConfig,\n ): string[] {\n const filters = [\n 'owner:self',\n `project:${repository}`,\n '-is:wip',\n '-is:private',\n ];\n const filterState = mapPrStateToGerritFilter(searchConfig.state);\n if (filterState) {\n filters.push(filterState);\n }\n if (searchConfig.branchName) {\n filters.push(`footer:Renovate-Branch=${searchConfig.branchName}`);\n } else if (semver.gte(this.gerritVersion, '3.6.0')) {\n filters.push('hasfooter:Renovate-Branch');\n } else {\n filters.push('message:\"Renovate-Branch: \"');\n }\n if (searchConfig.targetBranch) {\n filters.push(`branch:${searchConfig.targetBranch}`);\n }\n if (searchConfig.label) {\n filters.push(`label:Code-Review=${searchConfig.label}`);\n }\n if (searchConfig.prTitle) {\n // Quotes in the search operators must be escaped with a backslash:\n // https://gerrit-review.googlesource.com/Documentation/user-search.html#search-operators\n const escapedTitle = searchConfig.prTitle.replaceAll('\"', '\\\\\"');\n if (semver.gte(this.gerritVersion, '3.8.0')) {\n filters.push(`subject:\"${escapedTitle}\"`);\n } else {\n filters.push(`message:\"${escapedTitle}\"`);\n }\n }\n return filters;\n }\n}\n\nexport const client = new GerritClient();\n"],"mappings":"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"}
@@ -156,7 +156,8 @@ async function findPr(findPRConfig) {
156
156
  }
157
157
  async function getPr(number) {
158
158
  try {
159
- return mapGerritChangeToPr(await client.getChange(number, REQUEST_DETAILS_FOR_PRS));
159
+ const change = await client.getChange(number, REQUEST_DETAILS_FOR_PRS);
160
+ return mapGerritChangeToPr(change);
160
161
  } catch (err) {
161
162
  if (err.statusCode === 404) return null;
162
163
  throw err;
@@ -308,7 +309,8 @@ async function getRawFile(fileName, repoName, branchOrTag) {
308
309
  return await client.getFile(repo, branch, fileName);
309
310
  }
310
311
  async function getJsonFile(fileName, repoName, branchOrTag) {
311
- return parseJson(await getRawFile(fileName, repoName, branchOrTag), fileName);
312
+ const raw = await getRawFile(fileName, repoName, branchOrTag);
313
+ return parseJson(raw, fileName);
312
314
  }
313
315
  async function addReviewers(number, reviewers) {
314
316
  await client.addReviewers(number, reviewers);