renovate 44.93.7 → 44.93.8
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.
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +7 -4
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/utils.js +2 -2
- package/dist/modules/platform/gitea/utils.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/source.js +6 -1
- package/dist/workers/repository/update/pr/changelog/source.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -43,7 +43,7 @@ hashMap.set("fleet", "4942d52e82f35c41e2d46cf76f426e2d91b350338cfc0bbcb97e8aaae2
|
|
|
43
43
|
hashMap.set("flux", "aad8c786c4a2b5820663027452eeb8fe84c3af8c8399261e85f0eade2e484fe8");
|
|
44
44
|
hashMap.set("fvm", "9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90");
|
|
45
45
|
hashMap.set("git-submodules", "df8bb92b2906d8cddda2d4b302ee503f8002e3554d32d74cef2f584fe891f38f");
|
|
46
|
-
hashMap.set("github-actions", "
|
|
46
|
+
hashMap.set("github-actions", "12dc3846a64c684de316a6140145fe1700c7b12f1f66a35405b41745ff1d4631");
|
|
47
47
|
hashMap.set("gitlabci", "a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672");
|
|
48
48
|
hashMap.set("gitlabci-include", "8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351");
|
|
49
49
|
hashMap.set("glasskube", "93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','0a264d6be73953d801510fdeff271e4071c274339569c6dab4e2a128eaf4869f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','ca7c2342c04489253cd8f38d294a4c1428010115c2be22b3e0812dacf9881244');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','a051fe5e7e4fef8208b5864131a2b52b4ae319936f1dd8ee5a4e1ef11359ec09');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c31bc0a0e23d32726bcc09aa67533ebc5058124bf89c88e09c837419f550801a');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','8ec4c3c8080a55e93b741cfa97779b47291734dc24d80529c887d3b2b823fc44');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','fe8136135c895dd08819f91a60cf105f8b951251b057092700101ace991ae1d7');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','f1294fb3866ff65a75d98fdef80b1df3d3a8856535b8c690d1799e1205e4b639');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','10ae4d7f8ff35faf3a3f9f25bf4c969ea960e19aaf8c012aee11f93f4d10533e');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','917fdbfbad58fd7f57933646a760d91768368df563ce5eaf34a2bba165164a12');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','e491725880d930dfd0d58db135b31c0cc5bb6ff5e87f9e813c78bc0cf03b580c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','4942d52e82f35c41e2d46cf76f426e2d91b350338cfc0bbcb97e8aaae2a1ac0b');\nhashMap.set('flux','aad8c786c4a2b5820663027452eeb8fe84c3af8c8399261e85f0eade2e484fe8');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','df8bb92b2906d8cddda2d4b302ee503f8002e3554d32d74cef2f584fe891f38f');\nhashMap.set('github-actions','dc9b84670ff9f2e3d058a1eafacb0b2093b8273d31b67547d0f5d44db5bc2952');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','de042f3b5a900346c5f2df41f793f1716dc12145c38705c3064c6a7150b49495');\nhashMap.set('gradle','9e3ff52ce4ad2555929acdd4d32c417c4ef8714c23a92f2893ecc580fa4d6064');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','7ee9dace4c036dfe113c0c0e46369d8b83a739caa831660142ca98d3236a180a');\nhashMap.set('helm-values','01069e887d4f3b55ca62a3c0dc66d8620264e1426207be9eb240a10c1ad5e412');\nhashMap.set('helmfile','28572dd24b6746ca7065ee467aa13bbc8c3e8c0f88ae48e33bce88468c600100');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','4a3cf47072978eb131d70cd13f3d0bbd4408b0290be2a798a4cbf6103189269b');\nhashMap.set('hermit','0fb25b7766c3a264fbb765ff75b1542b24136c4c9f933696d4a5aecfed637071');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','ca5f7520a3ce1082a94097425021cf51e02088157bcb3286c04d22f59fd0dd61');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','10f20b75f727142938939b2b3cd7e0f77c3a37567f2b8b7ef78cef9a4908936e');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','0f80f0b81f2197a7e588be5c115a32a826fc184593f4e879f7b60fafd97a977e');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','30c78bc1c29eeecbdedb4eacc52bd93eedfb07279fd385f893193dcac6196466');\nhashMap.set('nuget','b81fb0ca6cfeb86b004592b38ce176673e056d6a2ed41a9807afb0eb7ad405d2');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','52450676f8b0e05134b3e8947b832195ef40bcaec1ce43d71351a2f797b80d75');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','7e418b8bdaeed38c1372eb19e0ae1c64999000e128d8754e37368638037b4c5c');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','cd974eadd649ba8c9c2e3c7b564a49c8bb2ce95d6df043a7e942364f574c7613');\nhashMap.set('pixi','83f94ec64144ce2adad0901844ab1e9c1636bb5c77bd6578b22b98ab401d34b4');\nhashMap.set('poetry','b2b917c200d25e01a3a198deb3bf33353535f27430142111cfab816c03bb966d');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','6932c904b0d18ad4845c46ce3f7d4c54dd8e411e16c31a782b399fe0b7dc550b');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','5b0037e4a88e06efe6f006eff15c24d9e1fefdda40d282aa99f54c2637d21c4d');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','7db907b3b77ef5f3465f3c4339fbab56bbcdfd1bf34b3d33e4c178d2e07e23e7');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"fingerprint.generated.js","names":[],"sources":["../../../lib/modules/manager/fingerprint.generated.ts"],"sourcesContent":["export const hashMap = new Map<string, string>();\n\nhashMap.set('ansible','a52394a36ac5517f7330473c31d93aa05b2ce607c5e951b48f25a4693cd20a81');\nhashMap.set('ansible-galaxy','0a264d6be73953d801510fdeff271e4071c274339569c6dab4e2a128eaf4869f');\nhashMap.set('ant','2df5943cf0ed19a21b94df13729dbb925655548130caf37e3e22bebaed518e17');\nhashMap.set('apm','ca7c2342c04489253cd8f38d294a4c1428010115c2be22b3e0812dacf9881244');\nhashMap.set('argocd','cff9cd22257bc460ae4b9936570bf0ed5585f280a55d26629deaeeb0bfee8eb5');\nhashMap.set('asdf','430eb99b58171700c8a59c78b9e648575e9b176b781d90dd10a710f7b69015bb');\nhashMap.set('azure-pipelines','a051fe5e7e4fef8208b5864131a2b52b4ae319936f1dd8ee5a4e1ef11359ec09');\nhashMap.set('batect','375d39b432013bedb1330cf40a2199dd822751b28578214f219e7bab98594b8d');\nhashMap.set('batect-wrapper','d999355511ea7f4053325a18b8cfc8d2b586c61e6760c35e557d383a673e3939');\nhashMap.set('bazel','c31bc0a0e23d32726bcc09aa67533ebc5058124bf89c88e09c837419f550801a');\nhashMap.set('bazel-module','9fbba0339f9f7785d52ab85c5f0f6385003093c063483c13feccba13ae438bef');\nhashMap.set('bazelisk','770f75a746dc6ba90c518788d5987d7df4243ef9eee122d1bb0556a93d6e1b11');\nhashMap.set('bicep','7246e0bfc06e0e28cbb03ac088c5591f648956b086e106aeb251fe5d628329db');\nhashMap.set('bitbucket-pipelines','59c0503494ab1442b127914503c01b97ac17b6742b19c632292d5aa24de115cd');\nhashMap.set('bitrise','478dfd316221fad7c29e177c70d1018d832fb2626b53308a5d0f1f0380e69f42');\nhashMap.set('buildkite','b8b404f53cd5d61c39153fddf93945e621471c4ac6aa9960c881cd868922bb4c');\nhashMap.set('buildpacks','6bef3cb04d66b5cfbb195adb4829bcbccae6408518706744d291bacf0610421f');\nhashMap.set('bun','8ec4c3c8080a55e93b741cfa97779b47291734dc24d80529c887d3b2b823fc44');\nhashMap.set('bun-version','df3ae8e4a5de1fa1b4544f3d7fc8117e80adb1e151c46d1ede54a4dbea6521e4');\nhashMap.set('bundler','6e4784dd98c1f86ef64cc8cbf3128df48aebf920032d7792b54fdedd3dd9d4d5');\nhashMap.set('cake','9ebd8b481220b30a8860121d26184540a1a2fcc05ef780df9295dea39b386fad');\nhashMap.set('cargo','fe8136135c895dd08819f91a60cf105f8b951251b057092700101ace991ae1d7');\nhashMap.set('cdnurl','9a81c8e3c6ad6c788498c99fc1067ffdfcd92a427c3afaf8c0130975d83131f2');\nhashMap.set('circleci','91cbeb33ea20f9838e2c81a1195eb806f0b38fa282bc3679f62552f20575ca85');\nhashMap.set('cloudbuild','f4e40388944652c8a19f8518771ac8d3f3c4ccf81ddef0e68b463aca833cb73c');\nhashMap.set('cocoapods','f832e2beef885bb3fd697ed9bb3e8cd742926bfec37ff41212edd2dbb4edb3ba');\nhashMap.set('composer','f1294fb3866ff65a75d98fdef80b1df3d3a8856535b8c690d1799e1205e4b639');\nhashMap.set('conan','8d46e9a30ae628e26118aea10a98d1b846f7c5d96d51ce24693437d555f6d125');\nhashMap.set('copier','10ae4d7f8ff35faf3a3f9f25bf4c969ea960e19aaf8c012aee11f93f4d10533e');\nhashMap.set('cpanfile','07813fec3f3c2197056500e9266a0553b9774c02f2c74d5ca2e213188c7c12d3');\nhashMap.set('crossplane','5c26b1201a1a51454ffb94d829e223a76a781569bf79cdb1e47087c30233ec40');\nhashMap.set('crow','eb9a5f9f95041855dded67bcce3dd54724f690995ed6268d272e8a666ff28fd0');\nhashMap.set('deno','917fdbfbad58fd7f57933646a760d91768368df563ce5eaf34a2bba165164a12');\nhashMap.set('deps-edn','06783dbc8b9c7bb84e162d1f75b7db56dfa021cc6f809dfd2314cee8b64af08d');\nhashMap.set('devbox','a40050cc61bd9b5d500ec111abb17bb15d5f82ab5b7699f66f628307ba8382c9');\nhashMap.set('devcontainer','24320ed1cb6191d04cb8b2707214d82c08c682597aed1d84f250aa00ad1632ec');\nhashMap.set('docker-compose','fba87b82cb0f2bfd66526631fbe928b8153e7ca701a5790d02b944df17417bb9');\nhashMap.set('dockerfile','e491725880d930dfd0d58db135b31c0cc5bb6ff5e87f9e813c78bc0cf03b580c');\nhashMap.set('droneci','661d2a2d7295af8dd7a1234c7090c42a89306bd574c3adf1fc67782efaad3998');\nhashMap.set('fleet','4942d52e82f35c41e2d46cf76f426e2d91b350338cfc0bbcb97e8aaae2a1ac0b');\nhashMap.set('flux','aad8c786c4a2b5820663027452eeb8fe84c3af8c8399261e85f0eade2e484fe8');\nhashMap.set('fvm','9b161df0f14bc6e536368952adf373e343630097121a913cea60ee284027fb90');\nhashMap.set('git-submodules','df8bb92b2906d8cddda2d4b302ee503f8002e3554d32d74cef2f584fe891f38f');\nhashMap.set('github-actions','12dc3846a64c684de316a6140145fe1700c7b12f1f66a35405b41745ff1d4631');\nhashMap.set('gitlabci','a5e1e66ef461e1c1e71062f85f35a212417e23627f4b002810f9a98295d6e672');\nhashMap.set('gitlabci-include','8860a15ab516fde00694f9bd9bf56fce4addafe5a55b5ddb9a4ec477d301d351');\nhashMap.set('glasskube','93e7b9000a17efa15a1abaaf320b5af9169b1ecd828fc0c881d98570ef9d9e30');\nhashMap.set('gleam','5e9b9f5f914afe5ed7b526c06c65111e3716d2dea9b0cbe7907bbc96db1064a3');\nhashMap.set('gomod','de042f3b5a900346c5f2df41f793f1716dc12145c38705c3064c6a7150b49495');\nhashMap.set('gradle','9e3ff52ce4ad2555929acdd4d32c417c4ef8714c23a92f2893ecc580fa4d6064');\nhashMap.set('gradle-wrapper','73ba30c34955fab7737454b5cff9aca6d1b5607d53c17c9e13d8ad96f6eaae87');\nhashMap.set('haskell-cabal','f158b7725e3143dfd2950e3de0bbccc2a61cd7eba87f7a54c5057e01252348e2');\nhashMap.set('helm-requirements','7ee9dace4c036dfe113c0c0e46369d8b83a739caa831660142ca98d3236a180a');\nhashMap.set('helm-values','01069e887d4f3b55ca62a3c0dc66d8620264e1426207be9eb240a10c1ad5e412');\nhashMap.set('helmfile','28572dd24b6746ca7065ee467aa13bbc8c3e8c0f88ae48e33bce88468c600100');\nhashMap.set('helmsman','951deeb3355da751ef39c9e932b26ea749450e32e75759e4b5fc29359e100b37');\nhashMap.set('helmv3','4a3cf47072978eb131d70cd13f3d0bbd4408b0290be2a798a4cbf6103189269b');\nhashMap.set('hermit','0fb25b7766c3a264fbb765ff75b1542b24136c4c9f933696d4a5aecfed637071');\nhashMap.set('homeassistant-manifest','05043c6db870cffbb6f8f3e351c025e3de227eaae0b24134b796aec46f84b65f');\nhashMap.set('homebrew','dffe954a4e18c2dc4bfdaa12222fe8ddc3395869afd5afa603fc2b6264747984');\nhashMap.set('html','81fa6c2bf2b868596584a48b949645207a2aa3081951ed99183ee50b70b77d5f');\nhashMap.set('jenkins','7fda0e7e0f3d5e18088ccb3594f727f4cfc48b064706bdaaf1a0a075b6a2cff5');\nhashMap.set('jsonnet-bundler','4cedeb0394e5c38361d1868ff45b4f34747ab8c492378b6e63dcaf1f4f3c024d');\nhashMap.set('kotlin-script','95ebc844c040ca047321b207d525220e29774a2a1fe06f9639e8353c66908564');\nhashMap.set('kubernetes','321e7d77fb3600dd4c00a86eaa1294927e7f92300b74fa2977d813dcaa3bb4de');\nhashMap.set('kustomize','ca5f7520a3ce1082a94097425021cf51e02088157bcb3286c04d22f59fd0dd61');\nhashMap.set('leiningen','c8397e376f1717c2f771ae9ea3ba6b720d2422b133cf937e762c44e42be146a2');\nhashMap.set('maven','c110b99291c2a5bc82cf7a69330275e9bbd7dc8ba3e9e987611dfcffbe002d8d');\nhashMap.set('maven-wrapper','6e53b6e4abf1d20b75094c7a70d66b4a5ac39954f009aa401f5e55dada8be4d0');\nhashMap.set('meteor','4636a47ba4dcfff19fe662572ef7a40d17146be3c966e00ef437e1fc8de92776');\nhashMap.set('mint','248fe4f1ea5c985921c286785792c97e06fc41f402b2d45df82f6aecd17f710e');\nhashMap.set('mise','10f20b75f727142938939b2b3cd7e0f77c3a37567f2b8b7ef78cef9a4908936e');\nhashMap.set('mix','0f79163dc2a1c896599d152be635c23beaf16812ae3d8fbfffec98c7bd0de872');\nhashMap.set('nix','0f80f0b81f2197a7e588be5c115a32a826fc184593f4e879f7b60fafd97a977e');\nhashMap.set('nodenv','ac652c28481b001f7471f4183eac07b45d98ecbe83efc275830b0a1b2e0459b8');\nhashMap.set('npm','30c78bc1c29eeecbdedb4eacc52bd93eedfb07279fd385f893193dcac6196466');\nhashMap.set('nuget','b81fb0ca6cfeb86b004592b38ce176673e056d6a2ed41a9807afb0eb7ad405d2');\nhashMap.set('nvm','3eb77c7b0acf6d64753de78fad2499b352719853aa6872878c40675d14152322');\nhashMap.set('ocb','032b216684c14b0954e0bb019513a2aca3faaee5748587acb668d377d7c891ca');\nhashMap.set('osgi','d6567a733ef3983112b46fdccd7ceebfcd48411104e0c6b6e714d4310db48024');\nhashMap.set('pep621','52450676f8b0e05134b3e8947b832195ef40bcaec1ce43d71351a2f797b80d75');\nhashMap.set('pep723','77022a0eae6a3cbb74a1e6d596db1276e379768e40448192b3fa81edd14ca73f');\nhashMap.set('pip-compile','7e418b8bdaeed38c1372eb19e0ae1c64999000e128d8754e37368638037b4c5c');\nhashMap.set('pip_requirements','bf3a407f72abf711230247bef94ba5dc84c08a35107b0f017912fad66afa716a');\nhashMap.set('pip_setup','df18fba2bdcf48f3ca12a8f7e5cd28df31e2368d5528127277038ef4206eca79');\nhashMap.set('pipenv','cd974eadd649ba8c9c2e3c7b564a49c8bb2ce95d6df043a7e942364f574c7613');\nhashMap.set('pixi','83f94ec64144ce2adad0901844ab1e9c1636bb5c77bd6578b22b98ab401d34b4');\nhashMap.set('poetry','b2b917c200d25e01a3a198deb3bf33353535f27430142111cfab816c03bb966d');\nhashMap.set('pre-commit','760f2c291ae084db889f722390798a0e2d431ccdc3bc676e73b14901ebea19ac');\nhashMap.set('proto','412053d4550026b4ace490b46e970915b87ec1abf0b0a0c6c8c58ccf1fc16843');\nhashMap.set('pub','8e7c65dfd1999de4f7c44392e949a4d8f4701eb86df59d550e4657feb06b1872');\nhashMap.set('puppet','ba58ab689e44acc8f61c3569ab8b40fde01b8a9d3aad712708e2a419e57d8b45');\nhashMap.set('pyenv','9ede8becc97774f9040b40f4472d3e933534b596e04c360bfe0f3c6f95f25182');\nhashMap.set('quadlet','e1fc88a4e14cd595e89bb3d79b4adf2add3ce5eb80f75276e712c32598cca53d');\nhashMap.set('renovate-config','ca60beee2e3b871ea1216fa9df9a501f7ed355fe7da29e12509e56a124a78e69');\nhashMap.set('ruby-version','2db2140d9eee8c555e729a4de0396fa2d78846d3149890ee12fa515bd654be97');\nhashMap.set('runtime-version','b582b168c0cc595e39010feb10f4b97a82683eb269e9598216fbb11cc186e160');\nhashMap.set('rust-toolchain','6ace53db02874d73620d2d872291839820a512a9529c42d174358c692e5db720');\nhashMap.set('sbt','e1eb5c7f0171a9bb1b6bd4a36a91039a31b6c84e0983d91d930be31a69506d9e');\nhashMap.set('scalafmt','9d36159b56835e96498af026a1fb0543200db0581681ef95ec54988f411e180f');\nhashMap.set('setup-cfg','4a3a7c812d34739c07685691e7e64c7d3127f9d7d4aff99dc45a25df97ed9745');\nhashMap.set('smithy','9641b91d065ffb63be0dd888139a0402dba41e550f8b44c592db9daf52109100');\nhashMap.set('sveltos','60dd75bb53ace31217211100d622fdb65068c6162758b6ae7103a6ce8bdc9f90');\nhashMap.set('swift','6932c904b0d18ad4845c46ce3f7d4c54dd8e411e16c31a782b399fe0b7dc550b');\nhashMap.set('tekton','33948f5bdf7553909fa63744adb26da97ddf366e9499bccab1250879570267c9');\nhashMap.set('terraform','5b0037e4a88e06efe6f006eff15c24d9e1fefdda40d282aa99f54c2637d21c4d');\nhashMap.set('terraform-version','ec8f786b9731d47f2c2fe0307caf64d7ddd83046fe7ff1f7d8423239f8b0f2aa');\nhashMap.set('terragrunt','ffcbaa67dd65f064d43f8c121c1006115eab1879c4bd38de263b9b90a009c118');\nhashMap.set('terragrunt-version','eea6087b33717d22ede2fc68c2f64df8390b75abe82110ed831a180648feb51d');\nhashMap.set('tflint-plugin','f423bfa2b42a2bfc0e38a33ebd4f9d452473e7ed4e7ad6384a99eb9a35d97479');\nhashMap.set('travis','f3e2f38e699c390b00ff481be5e91dceaa81609e93caf9a4214933de759c84fc');\nhashMap.set('typst','d080a79fbd961c6e21fcc505d544b7e0ff2126142acb1dcabdf6abbcd9339248');\nhashMap.set('unity3d','f13e25e115e3443f4e16cf31578acffa78fb1a5e23339680a92d8d6de6052920');\nhashMap.set('velaci','fda00ddb7cc23e9a37e0a8a253151df0a6930b4276d3e4f78cc54b9ac09af7de');\nhashMap.set('vendir','7db907b3b77ef5f3465f3c4339fbab56bbcdfd1bf34b3d33e4c178d2e07e23e7');\nhashMap.set('woodpecker','6110d3bec33aaeb3511d4bbfa896cec3c8e02fb04a6cff50c9ba81061c851045');\nhashMap.set('xcodegen','dad511d88a9ce1dbdde8b9731f3da7f2bdaa4ca8a083294ee58d56da62ab1683');\nhashMap.set('jsonata','416bcf61144b276b3112814c6e6d261aa29608f46fbb0516c471d35c16f8f0d7');\nhashMap.set('regex','20be5247fdc164173871a051acb0527da017d0c155c653d7563601f55e7b3ff5');"],"mappings":"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"}
|
|
@@ -13,6 +13,7 @@ import { GiteaHttp, setBaseUrl } from "../../../util/http/gitea.js";
|
|
|
13
13
|
import { getPrBodyStruct, hashBody } from "../pr-body.js";
|
|
14
14
|
import { repoFingerprint } from "../util.js";
|
|
15
15
|
import { smartTruncate } from "../utils/pr-body.js";
|
|
16
|
+
import { PRMergeMethod } from "./schema.js";
|
|
16
17
|
import { DRAFT_PREFIX, getMergeMethod, getRepoUrl, isAllowed, platformDisplayName, smartLinks, toRenovatePR, trimTrailingApiPath, usableRepo } from "./utils.js";
|
|
17
18
|
import { closeIssue, createComment, createCommitStatus, createIssue, createPR, deleteComment, getCombinedCommitStatus, getComments, getCurrentUser, getIssue as getIssue$1, getPR, getPRByBranch, getRepo, getRepoContents, getVersion, isOrg, mergePR, orgListRepos, requestPrReviewers, searchIssues, searchRepos, toPlatformStatusMapping, toRenovateStatusMapping, unassignLabel, updateComment, updateIssue, updateIssueLabels, updatePR } from "./gitea-helper.js";
|
|
18
19
|
import { lookupLabelByName } from "./labels.js";
|
|
@@ -196,8 +197,10 @@ function createPlatform(options) {
|
|
|
196
197
|
"rebase",
|
|
197
198
|
"rebase-merge"
|
|
198
199
|
].find((style) => isAllowed(style, repo));
|
|
199
|
-
if (mergeStyle)
|
|
200
|
-
|
|
200
|
+
if (mergeStyle) {
|
|
201
|
+
config.mergeMethod = mergeStyle;
|
|
202
|
+
config.allowedMergeMethods = new Set(PRMergeMethod.options.filter((style) => isAllowed(style, repo)));
|
|
203
|
+
} else {
|
|
201
204
|
logger.debug("Repository has no allowed merge methods - aborting renovation");
|
|
202
205
|
throw new Error(REPOSITORY_BLOCKED);
|
|
203
206
|
}
|
|
@@ -343,7 +346,7 @@ function createPlatform(options) {
|
|
|
343
346
|
const unsupportedReason = checkNativeAutomerge(defaults.version);
|
|
344
347
|
if (unsupportedReason === null) try {
|
|
345
348
|
await mergePR(http, config.repository, gpr.number, {
|
|
346
|
-
Do: getMergeMethod(platformPrOptions?.automergeStrategy) ?? config.mergeMethod,
|
|
349
|
+
Do: getMergeMethod(platformPrOptions?.automergeStrategy, config.allowedMergeMethods) ?? config.mergeMethod,
|
|
347
350
|
merge_when_checks_succeed: true,
|
|
348
351
|
delete_branch_after_merge: true
|
|
349
352
|
});
|
|
@@ -416,7 +419,7 @@ function createPlatform(options) {
|
|
|
416
419
|
},
|
|
417
420
|
async mergePr({ id: prNumber, strategy }) {
|
|
418
421
|
try {
|
|
419
|
-
await mergePR(http, config.repository, prNumber, { Do: getMergeMethod(strategy) ?? config.mergeMethod });
|
|
422
|
+
await mergePR(http, config.repository, prNumber, { Do: getMergeMethod(strategy, config.allowedMergeMethods) ?? config.mergeMethod });
|
|
420
423
|
return true;
|
|
421
424
|
} catch (err) {
|
|
422
425
|
logger.warn({
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["helper.searchIssues","helper.searchRepos","helper.getCurrentUser","helper.getVersion","helper.getRepoContents","helper.getRepo","helper.isOrg","git.initRepo","helper.orgListRepos","git.getBranchCommit","helper.createCommitStatus","helper.toPlatformStatusMapping","helper.getCombinedCommitStatus","helper.toRenovateStatusMapping","helper.getPR","helper.getPRByBranch","helper.createPR","helper.mergePR","helper.updatePR","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/gitea/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 { coerceArray, 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 { GiteaHttp, setBaseUrl } from '../../../util/http/gitea.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 './gitea-helper.ts';\nimport { lookupLabelByName } from './labels.ts';\nimport { GiteaPrCache } from './pr-cache.ts';\nimport type { Comment, Label, PRMergeMethod, Repo } from './schema.ts';\nimport type {\n CombinedCommitStatus,\n GiteaPlatform,\n GiteaPlatformOptions,\n PRUpdateParams,\n} from './types.ts';\nimport {\n DRAFT_PREFIX,\n getMergeMethod,\n getRepoUrl,\n isAllowed,\n platformDisplayName,\n smartLinks,\n toRenovatePR,\n trimTrailingApiPath,\n usableRepo,\n} from './utils.ts';\n\ninterface GiteaRepoConfig {\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 = 'gitea';\n\nexport const giteaHttp = new GiteaHttp();\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\ninterface FetchRepositoriesArgs {\n topic?: string;\n sort?: RepoSortMethod;\n order?: SortMethod;\n}\n\n/**\n * Builds the platform implementation shared by every platform which speaks the\n * Gitea API. Each call owns its own module state, so `gitea` and `forgejo` do\n * not share caches or configuration.\n */\nexport function createPlatform(options: GiteaPlatformOptions): GiteaPlatform {\n const {\n id,\n http,\n setBaseUrl,\n logDetectedVersion,\n checkNativeAutomerge,\n minReviewerVersion,\n } = options;\n const name = platformDisplayName[id];\n\n const defaults = {\n endpoint: options.defaultEndpoint,\n version: '0.0.0',\n };\n\n let config: GiteaRepoConfig = {} as any;\n let botUserID: number;\n let botUserName: string;\n const prCache = new GiteaPrCache(http, id);\n\n function resetPlatform(): void {\n config = {} as any;\n prCache.reset();\n botUserID = undefined as never;\n botUserName = undefined as never;\n defaults.endpoint = options.defaultEndpoint;\n defaults.version = '0.0.0';\n setBaseUrl(defaults.endpoint);\n }\n\n async function fetchIssueList(): Promise<Issue[]> {\n const issues = await helper.searchIssues(\n http,\n config.repository,\n { state: 'all' },\n { memCache: false },\n );\n const issueList = issues.map(toRenovateIssue);\n logger.debug(`Retrieved ${issueList.length} Issues`);\n return issueList;\n }\n\n async function fetchRepositories({\n topic,\n sort,\n order,\n }: FetchRepositoriesArgs): Promise<string[]> {\n const repos = await helper.searchRepos(http, {\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\n const 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 ${name} 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 ${name} endpoint: ${defaults.endpoint}`);\n }\n setBaseUrl(defaults.endpoint);\n\n let gitAuthor: string;\n try {\n const user = await helper.getCurrentUser(http, { 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(http, { token });\n }\n\n logDetectedVersion(defaults.version);\n } catch (err) {\n logger.debug(\n { err },\n `Error authenticating with ${name}. 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(\n http,\n repo,\n fileName,\n branchOrTag,\n );\n if (contents.type !== 'file') {\n return null;\n }\n return contents.contentString;\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(http, repository);\n } catch (err) {\n logger.debug({ err }, `Unknown ${name} 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 // if default merge style is allowed, use this; else fall back to\n // 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(http, id, repo.owner.login);\n } catch (err) {\n logger.debug({ err }, `${name} 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, id);\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 prCache.initRepo(config.repository, config.ignorePrAuthor, botUserName);\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 ${name} 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(http, 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(\n { err, platform: id },\n 'Error auto-discovering repositories',\n );\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(\n http,\n config.repository,\n branchCommit!,\n {\n state: helper.toPlatformStatusMapping[state] || 'pending',\n context,\n description,\n ...(target_url && { target_url }),\n },\n );\n\n // Refresh caches by re-fetching commit status for branch\n await helper.getCombinedCommitStatus(\n http,\n config.repository,\n branchName,\n {\n memCache: false,\n },\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(\n http,\n config.repository,\n branchName,\n );\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.toRenovateStatusMapping[ccs.worstStatus];\n },\n\n async getBranchStatusCheck(\n branchName: string,\n context: string,\n ): Promise<BranchStatus | null> {\n const ccs = await helper.getCombinedCommitStatus(\n http,\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.toRenovateStatusMapping[cs.status];\n },\n\n getPrList(): Promise<Pr[]> {\n return prCache.getPrs();\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(http, config.repository, number);\n pr = toRenovatePR(gpr, botUserName);\n\n // Add pull request to cache for further lookups / queries\n if (pr) {\n await prCache.setPr(pr);\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 Renovate account\n const pr = await helper.getPRByBranch(\n http,\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, (name) =>\n lookupLabelByName(http, config, name),\n )\n : [];\n const gpr = await helper.createPR(http, config.repository, {\n base,\n head,\n title,\n body,\n labels: labels.filter(isNumber),\n });\n\n if (platformPrOptions?.usePlatformAutomerge) {\n // `delete_branch_after_merge` is required to not have undesired\n // behavior when renovate finds existing branches on next run.\n const unsupportedReason = checkNativeAutomerge(defaults.version);\n if (unsupportedReason === null) {\n try {\n await helper.mergePR(http, 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 `${name}-native automerge: success`,\n );\n } catch (err) {\n logger.warn(\n { err, prNumber: gpr.number, platform: id },\n 'Platform-native automerge: fail',\n );\n }\n } else {\n logger.debug({ prNumber: gpr.number }, unsupportedReason);\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 prCache.setPr(pr);\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 the platform, the PR gets automatically closed when that happens, but older versions\n // do 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 prCache.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 (\n (await platform.getPrList()).find((pr) => pr.number === number)?.isDraft\n ) {\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 Gitea 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 = (\n await map(labels, (name) => lookupLabelByName(http, config, name))\n ).filter(isNumber);\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 http,\n config.repository,\n number,\n prUpdateParams,\n );\n const pr = toRenovatePR(gpr, botUserName);\n if (pr) {\n await prCache.setPr(pr);\n }\n },\n\n async mergePr({ id: prNumber, strategy }: MergePRConfig): Promise<boolean> {\n try {\n await helper.mergePR(http, config.repository, prNumber, {\n Do: getMergeMethod(strategy) ?? config.mergeMethod,\n });\n return true;\n } catch (err) {\n logger.warn({ err, id: prNumber }, '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 ??= fetchIssueList();\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(http, 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 platform.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 ? (\n await Promise.all(\n labelNames.map((name) => lookupLabelByName(http, config, name)),\n )\n ).filter(isNumber)\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(\n { issueNo: issue.number! },\n 'Closing duplicate issue',\n );\n // TODO #22198\n await helper.closeIssue(http, 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 http,\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 = coerceArray(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 http,\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(http, 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(http, 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(http, config, labelName);\n if (label) {\n await helper.unassignLabel(http, config.repository, issue, label);\n } else {\n logger.warn(\n { issue, labelName },\n 'Failed to lookup label for deletion',\n );\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(\n http,\n config.repository,\n issue,\n );\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(\n http,\n config.repository,\n issue,\n body,\n );\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(http, 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(\n http,\n config.repository,\n issue,\n );\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(http, 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(http, 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 if (\n minReviewerVersion &&\n semver.lt(defaults.version, minReviewerVersion)\n ) {\n logger.debug(\n { version: defaults.version },\n 'Adding reviewer not yet supported.',\n );\n return;\n }\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(http, 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\n function maxBodyLength(): number {\n return 1000000;\n }\n\n return { platform, resetPlatform };\n}\n\n/**\n * Forgejo reports the Gitea version it is compatible with as part of its own\n * version, for example `11.0.1-99-c504062+gitea-1.22.0`.\n */\nfunction isForgejo(version: string): boolean {\n return version.includes('gitea-');\n}\n\nfunction logDetectedVersion(version: string): void {\n if (isForgejo(version)) {\n logger.info(\n `Detected Forgejo instance, please use 'forgejo' platform instead`,\n );\n }\n logger.debug(\n `${isForgejo(version) ? 'Forgejo' : 'Gitea'} version: ${version}`,\n );\n}\n\nfunction checkNativeAutomerge(version: string): string | null {\n // Only Gitea v1.24.0+ and Forgejo v10.0.0+ support delete_branch_after_merge.\n const minVersion = isForgejo(version) ? '10.0.0' : '1.24.0';\n if (semver.gte(version, minVersion)) {\n return null;\n }\n return `Gitea-native automerge: not supported on this version of ${isForgejo(version) ? 'Forgejo' : 'Gitea'}. Use ${minVersion} or newer.`;\n}\n\nconst { platform, resetPlatform } = createPlatform({\n id,\n defaultEndpoint: 'https://gitea.com/',\n http: giteaHttp,\n setBaseUrl,\n logDetectedVersion,\n checkNativeAutomerge,\n // Requesting reviewers is only supported since Gitea v1.14.0.\n minReviewerVersion: '1.14.0',\n});\n\nexport { resetPlatform };\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 maxBodyLength,\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.searchIssues","helper.searchRepos","helper.getCurrentUser","helper.getVersion","helper.getRepoContents","helper.getRepo","helper.isOrg","git.initRepo","helper.orgListRepos","git.getBranchCommit","helper.createCommitStatus","helper.toPlatformStatusMapping","helper.getCombinedCommitStatus","helper.toRenovateStatusMapping","helper.getPR","helper.getPRByBranch","helper.createPR","helper.mergePR","helper.updatePR","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/gitea/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 { coerceArray, 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 { GiteaHttp, setBaseUrl } from '../../../util/http/gitea.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 './gitea-helper.ts';\nimport { lookupLabelByName } from './labels.ts';\nimport { GiteaPrCache } from './pr-cache.ts';\nimport type { Comment, Label, Repo } from './schema.ts';\nimport { PRMergeMethod } from './schema.ts';\nimport type {\n AllowedMergeMethods,\n CombinedCommitStatus,\n GiteaPlatform,\n GiteaPlatformOptions,\n PRUpdateParams,\n} from './types.ts';\nimport {\n DRAFT_PREFIX,\n getMergeMethod,\n getRepoUrl,\n isAllowed,\n platformDisplayName,\n smartLinks,\n toRenovatePR,\n trimTrailingApiPath,\n usableRepo,\n} from './utils.ts';\n\ninterface GiteaRepoConfig {\n ignorePrAuthor: boolean;\n repository: string;\n mergeMethod: PRMergeMethod;\n /** The set of merge styles allowed by the repository, used to pick the\n * best matching Gitea/Forgejo merge style for a given `MergeStrategy`. */\n allowedMergeMethods: AllowedMergeMethods;\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 = 'gitea';\n\nexport const giteaHttp = new GiteaHttp();\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\ninterface FetchRepositoriesArgs {\n topic?: string;\n sort?: RepoSortMethod;\n order?: SortMethod;\n}\n\n/**\n * Builds the platform implementation shared by every platform which speaks the\n * Gitea API. Each call owns its own module state, so `gitea` and `forgejo` do\n * not share caches or configuration.\n */\nexport function createPlatform(options: GiteaPlatformOptions): GiteaPlatform {\n const {\n id,\n http,\n setBaseUrl,\n logDetectedVersion,\n checkNativeAutomerge,\n minReviewerVersion,\n } = options;\n const name = platformDisplayName[id];\n\n const defaults = {\n endpoint: options.defaultEndpoint,\n version: '0.0.0',\n };\n\n let config: GiteaRepoConfig = {} as any;\n let botUserID: number;\n let botUserName: string;\n const prCache = new GiteaPrCache(http, id);\n\n function resetPlatform(): void {\n config = {} as any;\n prCache.reset();\n botUserID = undefined as never;\n botUserName = undefined as never;\n defaults.endpoint = options.defaultEndpoint;\n defaults.version = '0.0.0';\n setBaseUrl(defaults.endpoint);\n }\n\n async function fetchIssueList(): Promise<Issue[]> {\n const issues = await helper.searchIssues(\n http,\n config.repository,\n { state: 'all' },\n { memCache: false },\n );\n const issueList = issues.map(toRenovateIssue);\n logger.debug(`Retrieved ${issueList.length} Issues`);\n return issueList;\n }\n\n async function fetchRepositories({\n topic,\n sort,\n order,\n }: FetchRepositoriesArgs): Promise<string[]> {\n const repos = await helper.searchRepos(http, {\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\n const 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 ${name} 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 ${name} endpoint: ${defaults.endpoint}`);\n }\n setBaseUrl(defaults.endpoint);\n\n let gitAuthor: string;\n try {\n const user = await helper.getCurrentUser(http, { 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(http, { token });\n }\n\n logDetectedVersion(defaults.version);\n } catch (err) {\n logger.debug(\n { err },\n `Error authenticating with ${name}. 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(\n http,\n repo,\n fileName,\n branchOrTag,\n );\n if (contents.type !== 'file') {\n return null;\n }\n return contents.contentString;\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(http, repository);\n } catch (err) {\n logger.debug({ err }, `Unknown ${name} 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 // if default merge style is allowed, use this; else fall back to\n // 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 config.allowedMergeMethods = new Set(\n PRMergeMethod.options.filter((style) => isAllowed(style, repo)),\n );\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(http, id, repo.owner.login);\n } catch (err) {\n logger.debug({ err }, `${name} 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, id);\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 prCache.initRepo(config.repository, config.ignorePrAuthor, botUserName);\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 ${name} 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(http, 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(\n { err, platform: id },\n 'Error auto-discovering repositories',\n );\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(\n http,\n config.repository,\n branchCommit!,\n {\n state: helper.toPlatformStatusMapping[state] || 'pending',\n context,\n description,\n ...(target_url && { target_url }),\n },\n );\n\n // Refresh caches by re-fetching commit status for branch\n await helper.getCombinedCommitStatus(\n http,\n config.repository,\n branchName,\n {\n memCache: false,\n },\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(\n http,\n config.repository,\n branchName,\n );\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.toRenovateStatusMapping[ccs.worstStatus];\n },\n\n async getBranchStatusCheck(\n branchName: string,\n context: string,\n ): Promise<BranchStatus | null> {\n const ccs = await helper.getCombinedCommitStatus(\n http,\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.toRenovateStatusMapping[cs.status];\n },\n\n getPrList(): Promise<Pr[]> {\n return prCache.getPrs();\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(http, config.repository, number);\n pr = toRenovatePR(gpr, botUserName);\n\n // Add pull request to cache for further lookups / queries\n if (pr) {\n await prCache.setPr(pr);\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 Renovate account\n const pr = await helper.getPRByBranch(\n http,\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, (name) =>\n lookupLabelByName(http, config, name),\n )\n : [];\n const gpr = await helper.createPR(http, config.repository, {\n base,\n head,\n title,\n body,\n labels: labels.filter(isNumber),\n });\n\n if (platformPrOptions?.usePlatformAutomerge) {\n // `delete_branch_after_merge` is required to not have undesired\n // behavior when renovate finds existing branches on next run.\n const unsupportedReason = checkNativeAutomerge(defaults.version);\n if (unsupportedReason === null) {\n try {\n await helper.mergePR(http, config.repository, gpr.number, {\n Do:\n getMergeMethod(\n platformPrOptions?.automergeStrategy,\n config.allowedMergeMethods,\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 `${name}-native automerge: success`,\n );\n } catch (err) {\n logger.warn(\n { err, prNumber: gpr.number, platform: id },\n 'Platform-native automerge: fail',\n );\n }\n } else {\n logger.debug({ prNumber: gpr.number }, unsupportedReason);\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 prCache.setPr(pr);\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 the platform, the PR gets automatically closed when that happens, but older versions\n // do 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 prCache.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 (\n (await platform.getPrList()).find((pr) => pr.number === number)?.isDraft\n ) {\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 Gitea 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 = (\n await map(labels, (name) => lookupLabelByName(http, config, name))\n ).filter(isNumber);\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 http,\n config.repository,\n number,\n prUpdateParams,\n );\n const pr = toRenovatePR(gpr, botUserName);\n if (pr) {\n await prCache.setPr(pr);\n }\n },\n\n async mergePr({ id: prNumber, strategy }: MergePRConfig): Promise<boolean> {\n try {\n await helper.mergePR(http, config.repository, prNumber, {\n Do:\n getMergeMethod(strategy, config.allowedMergeMethods) ??\n config.mergeMethod,\n });\n return true;\n } catch (err) {\n logger.warn({ err, id: prNumber }, '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 ??= fetchIssueList();\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(http, 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 platform.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 ? (\n await Promise.all(\n labelNames.map((name) => lookupLabelByName(http, config, name)),\n )\n ).filter(isNumber)\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(\n { issueNo: issue.number! },\n 'Closing duplicate issue',\n );\n // TODO #22198\n await helper.closeIssue(http, 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 http,\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 = coerceArray(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 http,\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(http, 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(http, 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(http, config, labelName);\n if (label) {\n await helper.unassignLabel(http, config.repository, issue, label);\n } else {\n logger.warn(\n { issue, labelName },\n 'Failed to lookup label for deletion',\n );\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(\n http,\n config.repository,\n issue,\n );\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(\n http,\n config.repository,\n issue,\n body,\n );\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(http, 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(\n http,\n config.repository,\n issue,\n );\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(http, 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(http, 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 if (\n minReviewerVersion &&\n semver.lt(defaults.version, minReviewerVersion)\n ) {\n logger.debug(\n { version: defaults.version },\n 'Adding reviewer not yet supported.',\n );\n return;\n }\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(http, 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\n function maxBodyLength(): number {\n return 1000000;\n }\n\n return { platform, resetPlatform };\n}\n\n/**\n * Forgejo reports the Gitea version it is compatible with as part of its own\n * version, for example `11.0.1-99-c504062+gitea-1.22.0`.\n */\nfunction isForgejo(version: string): boolean {\n return version.includes('gitea-');\n}\n\nfunction logDetectedVersion(version: string): void {\n if (isForgejo(version)) {\n logger.info(\n `Detected Forgejo instance, please use 'forgejo' platform instead`,\n );\n }\n logger.debug(\n `${isForgejo(version) ? 'Forgejo' : 'Gitea'} version: ${version}`,\n );\n}\n\nfunction checkNativeAutomerge(version: string): string | null {\n // Only Gitea v1.24.0+ and Forgejo v10.0.0+ support delete_branch_after_merge.\n const minVersion = isForgejo(version) ? '10.0.0' : '1.24.0';\n if (semver.gte(version, minVersion)) {\n return null;\n }\n return `Gitea-native automerge: not supported on this version of ${isForgejo(version) ? 'Forgejo' : 'Gitea'}. Use ${minVersion} or newer.`;\n}\n\nconst { platform, resetPlatform } = createPlatform({\n id,\n defaultEndpoint: 'https://gitea.com/',\n http: giteaHttp,\n setBaseUrl,\n logDetectedVersion,\n checkNativeAutomerge,\n // Requesting reviewers is only supported since Gitea v1.14.0.\n minReviewerVersion: '1.14.0',\n});\n\nexport { resetPlatform };\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 maxBodyLength,\n getPrList,\n getRepos,\n initPlatform,\n initRepo,\n mergePr,\n setBranchStatus,\n updatePr,\n} = platform;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAsFA,MAAa,KAAK;AAElB,MAAa,YAAY,IAAI,UAAU;AAEvC,SAAS,gBAAgB,MAAoB;CAC3C,OAAO;EACL,QAAQ,KAAK;EACb,OAAO,KAAK;EACZ,OAAO,KAAK;EACZ,MAAM,KAAK;CACb;AACF;AAEA,SAAS,aAAa,QAAgB,UAA2B;CAC/D,IAAI,aAAa,OACf,OAAO;CAET,IAAI,SAAS,WAAW,GAAG,GACzB,OAAO,WAAW,SAAS,UAAU,CAAC;CAGxC,OAAO,WAAW;AACpB;AAEA,SAAS,mBACP,UACA,OACgB;CAChB,OAAO,SAAS,MAAM,MAAM,EAAE,KAAK,WAAW,OAAO,MAAM,KAAK,CAAC,KAAK;AACxE;AAEA,SAAS,qBACP,UACA,SACgB;CAChB,OAAO,SAAS,MAAM,MAAM,EAAE,KAAK,KAAK,MAAM,OAAO,KAAK;AAC5D;;;;;;AAaA,SAAgB,eAAe,SAA8C;CAC3E,MAAM,EACJ,IACA,MACA,YACA,oBACA,sBACA,uBACE;CACJ,MAAM,OAAO,oBAAoB;CAEjC,MAAM,WAAW;EACf,UAAU,QAAQ;EAClB,SAAS;CACX;CAEA,IAAI,SAA0B,CAAC;CAC/B,IAAI;CACJ,IAAI;CACJ,MAAM,UAAU,IAAI,aAAa,MAAM,EAAE;CAEzC,SAAS,gBAAsB;EAC7B,SAAS,CAAC;EACV,QAAQ,MAAM;EACd,YAAY,KAAA;EACZ,cAAc,KAAA;EACd,SAAS,WAAW,QAAQ;EAC5B,SAAS,UAAU;EACnB,WAAW,SAAS,QAAQ;CAC9B;CAEA,eAAe,iBAAmC;EAOhD,MAAM,aAAY,MANGA,aACnB,MACA,OAAO,YACP,EAAE,OAAO,MAAM,GACf,EAAE,UAAU,MAAM,CACpB,EAAA,CACyB,IAAI,eAAe;EAC5C,OAAO,MAAM,aAAa,UAAU,OAAO,QAAQ;EACnD,OAAO;CACT;CAEA,eAAe,kBAAkB,EAC/B,OACA,MACA,SAC2C;EAe3C,QAAO,MAdaC,YAAmB,MAAM;GAC3C,KAAK;GACL,UAAU;GACV,GAAI,SAAS;IACX,OAAO;IACP,GAAG;GACL;GACA,GAAI,QAAQ,EACV,KACF;GACA,GAAI,SAAS,EACX,MACF;EACF,CAAC,EAAA,CACY,OAAO,UAAU,CAAC,CAAC,KAAK,MAAM,EAAE,SAAS;CACxD;CAEA,MAAM,WAAqB;EACzB,MAAM,aAAa,EACjB,UACA,SAC0C;GAC1C,IAAI,CAAC,OACH,MAAM,IAAI,MACR,8BAA8B,KAAK,uBACrC;GAGF,IAAI,UAAU;IACZ,IAAI,eAAe,oBAAoB,QAAQ;IAC/C,eAAe,oBAAoB,YAAY;IAC/C,SAAS,WAAW;GACtB,OACE,OAAO,MAAM,iBAAiB,KAAK,aAAa,SAAS,UAAU;GAErE,WAAW,SAAS,QAAQ;GAE5B,IAAI;GACJ,IAAI;IACF,MAAM,OAAO,MAAMC,eAAsB,MAAM,EAAE,MAAM,CAAC;IAExD,YAAY,GAAG,KAAK,aAAa,KAAK,MAAM,IAAI,KAAK,MAAM;IAC3D,YAAY,KAAK;IACjB,cAAc,KAAK;IACnB,MAAM,MAAM,OAAO;;IAEnB,IAAI,OAAO,MAAM,IAAI,2BAA2B,GAC9C,SAAS,UAAU,IAAI;SAEvB,SAAS,UAAU,MAAMC,WAAkB,MAAM,EAAE,MAAM,CAAC;IAG5D,mBAAmB,SAAS,OAAO;GACrC,SAAS,KAAK;IACZ,OAAO,MACL,EAAE,IAAI,GACN,6BAA6B,KAAK,mBACpC;IACA,MAAM,IAAI,MAAM,8BAA8B;GAChD;GAEA,OAAO;IACL,UAAU,SAAS;IACnB;GACF;EACF;EAEA,MAAM,WACJ,UACA,UACA,aACwB;GACxB,MAAM,OAAO,YAAY,OAAO;GAChC,MAAM,WAAW,MAAMC,gBACrB,MACA,MACA,UACA,WACF;GACA,IAAI,SAAS,SAAS,QACpB,OAAO;GAET,OAAO,SAAS;EAClB;EAEA,MAAM,YACJ,UACA,UACA,aACc;GAEd,MAAM,MAAM,MAAM,SAAS,WAAW,UAAU,UAAU,WAAW;GACrE,OAAO,UAAU,KAAK,QAAQ;EAChC;EAEA,MAAM,SAAS,EACb,YACA,iBACA,uBACA,UACkC;GAClC,IAAI;GAEJ,SAAS,CAAC;GACV,OAAO,aAAa;GACpB,OAAO,kBAAkB,CAAC,CAAC;GAC3B,OAAO,wBAAwB;GAC/B,OAAO,iBAAiB,aAAa,IAAI,gBAAgB;GAGzD,IAAI;IACF,OAAO,MAAMC,QAAe,MAAM,UAAU;GAC9C,SAAS,KAAK;IACZ,OAAO,MAAM,EAAE,IAAI,GAAG,WAAW,KAAK,gBAAgB;IACtD,MAAM;GACR;GAGA,IAAI,KAAK,UAAU;IACjB,OAAO,MAAM,8CAA8C;IAC3D,MAAM,IAAI,MAAM,mBAAmB;GACrC;GACA,IAAI,KAAK,QAAQ;IACf,OAAO,MAAM,8CAA8C;IAC3D,MAAM,IAAI,MAAM,mBAAmB;GACrC;GACA,IAAI,CAAC,KAAK,YAAY,QAAQ,CAAC,KAAK,YAAY,MAAM;IACpD,OAAO,MACL,+DACF;IACA,MAAM,IAAI,MAAM,2BAA2B;GAC7C;GACA,IAAI,KAAK,OAAO;IACd,OAAO,MAAM,2CAA2C;IACxD,MAAM,IAAI,MAAM,gBAAgB;GAClC;GAEA,IAAI,KAAK,sBAAsB,OAAO;IACpC,OAAO,MAAM,uDAAuD;IACpE,MAAM,IAAI,MAAM,kBAAkB;GACpC;GAcA,MAAM,aAAa;IARjB,GAAI,KAAK,sBAAsB,CAAC,KAAK,mBAAmB,IAAI,CAAC;IAC7D;IACA;IACA;IACA;IACA;GAG8B,CAAC,CAAC,MAAM,UAAU,UAAU,OAAO,IAAI,CAAC;GAExE,IAAI,YAAY;IACd,OAAO,cAAc;IACrB,OAAO,sBAAsB,IAAI,IAC/B,cAAc,QAAQ,QAAQ,UAAU,UAAU,OAAO,IAAI,CAAC,CAChE;GACF,OAAO;IACL,OAAO,MACL,+DACF;IACA,MAAM,IAAI,MAAM,kBAAkB;GACpC;GAEA,IAAI;IACF,OAAO,YAAY,MAAMC,MAAa,MAAM,IAAI,KAAK,MAAM,KAAK;GAClE,SAAS,KAAK;IACZ,OAAO,MAAM,EAAE,IAAI,GAAG,GAAG,KAAK,kBAAkB;IAChD,MAAM;GACR;GAGA,OAAO,gBAAgB,KAAK;GAC5B,OAAO,MAAM,GAAG,WAAW,oBAAoB,OAAO,eAAe;GAErE,MAAM,MAAM,WAAW,MAAM,QAAQ,SAAS,UAAU,EAAE;GAG1D,MAAMC,WAAa;IACjB,GAAG;IACH;GACF,CAAC;GAGD,OAAO,YAAY;GACnB,OAAO,YAAY;GACnB,QAAQ,SAAS,OAAO,YAAY,OAAO,gBAAgB,WAAW;GACtE,OAAO,mBAAmB,CAAC,KAAK,oBAAoB,KAAK;GACzD,OAAO,UAAU,KAAK,MAAM;GAE5B,OAAO;IACL,eAAe,OAAO;IACtB,QAAQ,CAAC,CAAC,KAAK;IACf,iBAAiB,gBAAgB,KAAK,IAAI,SAAS,QAAQ;GAC7D;EACF;EAEA,MAAM,SAAS,QAAgD;GAC7D,OAAO,MAAM,oBAAoB,KAAK,cAAc;GACpD,IAAI;IACF,IAAI,QAAQ,QAAQ;KAClB,OAAO,MAAM,EAAE,QAAQ,OAAO,OAAO,GAAG,4BAA4B;KACpE,MAAM,gBAAyC,OAAO,OAAO,KAC1D,UAAU;MACT,OAAO;OACL;OACA,MAAM,OAAO;OACb,OAAO,OAAO;MAChB;KACF,CACF;KACA,MAAM,QAAQ,MAAM,IAAI,eAAe,iBAAiB;KACxD,OAAO,iBAAiB,MAAM,KAAK,CAAC;IACtC;IACA,IAAI,QAAQ,YAAY;KACtB,OAAO,MACL,EAAE,YAAY,OAAO,WAAW,GAChC,kCACF;KACA,MAAM,QAAQ,MAAM,IAClB,OAAO,YACP,OAAO,iBAAyB;MAE9B,QAAO,MADgBC,aAAoB,MAAM,YAAY,EAAA,CAE1D,QAAQ,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,QAAQ,CAAC,CACvC,KAAK,MAAM,EAAE,SAAS;KAC3B,CACF;KACA,OAAO,iBAAiB,MAAM,KAAK,CAAC;IACtC;IACA,OAAO,MAAM,kBAAkB;KAC7B,MAAM,QAAQ;KACd,OAAO,QAAQ;IACjB,CAAC;GACH,SAAS,KAAK;IACZ,OAAO,MACL;KAAE;KAAK,UAAU;IAAG,GACpB,qCACF;IACA,MAAM;GACR;EACF;EAEA,MAAM,gBAAgB,EACpB,YACA,SACA,aACA,OACA,KAAK,cAC+B;GACpC,IAAI;IAEF,MAAM,eAAeC,gBAAoB,UAAU;IAGnD,MAAMC,mBACJ,MACA,OAAO,YACP,cACA;KACE,OAAOC,wBAA+B,UAAU;KAChD;KACA;KACA,GAAI,cAAc,EAAE,WAAW;IACjC,CACF;IAGA,MAAMC,wBACJ,MACA,OAAO,YACP,YACA,EACE,UAAU,MACZ,CACF;GACF,SAAS,KAAK;IACZ,OAAO,KAAK,EAAE,IAAI,GAAG,6BAA6B;GACpD;EACF;EAEA,MAAM,gBACJ,YACA,yBACuB;GACvB,IAAI;GACJ,IAAI;IACF,MAAM,MAAMA,wBACV,MACA,OAAO,YACP,UACF;GACF,SAAS,KAAK;IACZ,IAAI,IAAI,eAAe,KAAK;KAC1B,OAAO,MACL,oEACF;KACA,MAAM,IAAI,MAAM,kBAAkB;IACpC;IAEA,OAAO,MAAM,2CAA2C;IACxD,MAAM;GACR;GAEA,OAAO,MAAM,EAAE,IAAI,GAAG,4BAA4B;GAClD,IACE,CAAC,2BACD,IAAI,gBAAgB,aACpB,IAAI,SAAS,OAAO,WAAW,OAAO,SAAS,WAAW,WAAW,CAAC,GACtE;IACA,OAAO,MACL,6FACF;IACA,OAAO;GACT;GAEA,OAAOC,wBAA+B,IAAI;EAC5C;EAEA,MAAM,qBACJ,YACA,SAC8B;GAM9B,MAAM,MAAK,MALOD,wBAChB,MACA,OAAO,YACP,UACF,EAAA,CACe,SAAS,MAAM,MAAM,EAAE,YAAY,OAAO;GACzD,IAAI,CAAC,IACH,OAAO;GAET,OAAOC,wBAA+B,GAAG;EAC3C;EAEA,YAA2B;GACzB,OAAO,QAAQ,OAAO;EACxB;EAEA,MAAM,MAAM,QAAoC;GAG9C,IAAI,MAAK,MADY,SAAS,UAAU,EAAA,CACxB,MAAM,MAAM,EAAE,WAAW,MAAM,KAAK;GACpD,IAAI,IACF,OAAO,MAAM,2BAA2B;QACnC;IACL,OAAO,MAAM,uDAAuD;IACpE,MAAM,MAAM,MAAMC,MAAa,MAAM,OAAO,YAAY,MAAM;IAC9D,KAAK,aAAa,KAAK,WAAW;IAGlC,IAAI,IACF,MAAM,QAAQ,MAAM,EAAE;GAE1B;GAGA,IAAI,CAAC,IACH,OAAO;GAGT,OAAO;EACT;EAEA,MAAM,OAAO,EACX,YACA,SAAS,OACT,QAAQ,OACR,qBACA,gBACmC;GACnC,OAAO,MAAM,UAAU,WAAW,IAAI,MAAO,IAAI,MAAM,EAAE;GACzD,IAAI,uBAAuB,SAAS,YAAY,GAAG;IAEjD,MAAM,KAAK,MAAMC,cACf,MACA,OAAO,YACP,cACA,UACF;IACA,IAAI,CAAC,IACH,OAAO;IAGT,OAAO,aAAa,IAAI,IAAI;GAC9B;GAEA,MAAM,MAAK,MADU,SAAS,UAAU,EAAA,CACtB,MACf,MACC,EAAE,eAAe,OAAO,cACxB,EAAE,iBAAiB,cACnB,aAAa,EAAE,OAAO,KAAK,MAC1B,CAAC,SAAS,EAAE,UAAU,MAC3B;GAEA,IAAI,IACF,OAAO,MAAM,aAAa,GAAG,QAAQ;GAEvC,OAAO,MAAM;EACf;EAEA,MAAM,SAAS,EACb,cACA,cACA,SACA,QAAQ,SACR,QAAQ,YACR,mBACA,WAC8B;GAC9B,IAAI,QAAQ;GACZ,MAAM,OAAO;GACb,MAAM,OAAO;GACb,MAAM,OAAO,SAAS,OAAO;GAC7B,IAAI,SACF,QAAQ,eAAe;GAGzB,OAAO,MAAM,0BAA0B,MAAM,IAAI,KAAK,MAAM,KAAK,EAAE;GACnE,IAAI;IACF,MAAM,SAAS,MAAM,QAAQ,UAAU,IACnC,MAAM,IAAI,aAAa,SACrB,kBAAkB,MAAM,QAAQ,IAAI,CACtC,IACA,CAAC;IACL,MAAM,MAAM,MAAMC,SAAgB,MAAM,OAAO,YAAY;KACzD;KACA;KACA;KACA;KACA,QAAQ,OAAO,OAAO,QAAQ;IAChC,CAAC;IAED,IAAI,mBAAmB,sBAAsB;KAG3C,MAAM,oBAAoB,qBAAqB,SAAS,OAAO;KAC/D,IAAI,sBAAsB,MACxB,IAAI;MACF,MAAMC,QAAe,MAAM,OAAO,YAAY,IAAI,QAAQ;OACxD,IACE,eACE,mBAAmB,mBACnB,OAAO,mBACT,KAAK,OAAO;OACd,2BAA2B;OAC3B,2BAA2B;MAC7B,CAAC;MAED,OAAO,MACL,EAAE,UAAU,IAAI,OAAO,GACvB,GAAG,KAAK,2BACV;KACF,SAAS,KAAK;MACZ,OAAO,KACL;OAAE;OAAK,UAAU,IAAI;OAAQ,UAAU;MAAG,GAC1C,iCACF;KACF;UAEA,OAAO,MAAM,EAAE,UAAU,IAAI,OAAO,GAAG,iBAAiB;IAE5D;IAEA,MAAM,KAAK,aAAa,KAAK,WAAW;IACxC,IAAI,CAAC,IACH,MAAM,IAAI,MAAM,0CAA0C;IAG5D,MAAM,QAAQ,MAAM,EAAE;IACtB,OAAO;GACT,SAAS,KAAK;IAKZ,IAAI,IAAI,eAAe,KAAK;KAC1B,OAAO,KACL;MAAE,SAAS;MAAO;KAAa,GAC/B,2EACF;KAGA,QAAQ,UAAU;KAClB,MAAM,KAAK,MAAM,SAAS,OAAO;MAC/B,YAAY;MACZ,OAAO;KACT,CAAC;;KAID,IAAI,IAAI,YAAY;MAClB,IAAI,GAAG,UAAU,SAAS,GAAG,WAAW,SAAS,SAAS,IAAI,GAAG;OAC/D,OAAO,MACL,2CAA2C,aAAa,0BAC1D;OACA,MAAM,SAAS,SAAS;QACtB,QAAQ,GAAG;QACX,SAAS;QACT,QAAQ;OACV,CAAC;OACD,GAAG,QAAQ;OACX,GAAG,aAAa,gBAAgB,IAAI;MACtC,OACE,OAAO,MACL,0CAA0C,aAAa,eACzD;MAGF,OAAO;KACT;IACF;IAEA,MAAM;GACR;EACF;EAEA,MAAM,SAAS,EACb,QACA,SACA,QAAQ,MACR,QACA,OACA,gBACgC;GAChC,IAAI,QAAQ;GACZ,KACG,MAAM,SAAS,UAAU,EAAA,CAAG,MAAM,OAAO,GAAG,WAAW,MAAM,CAAC,EAAE,SAEjE,QAAQ,eAAe;GAGzB,MAAM,iBAAiC;IACrC;IACA,GAAI,QAAQ,EAAE,KAAK;IACnB,GAAI,SAAS,EAAE,MAAM;GACvB;GACA,IAAI,cACF,eAAe,OAAO;;;;;;;;GAUxB,IAAI,MAAM,QAAQ,MAAM,GAAG;IACzB,eAAe,UACb,MAAM,IAAI,SAAS,SAAS,kBAAkB,MAAM,QAAQ,IAAI,CAAC,EAAA,CACjE,OAAO,QAAQ;IACjB,IAAI,OAAO,WAAW,eAAe,OAAO,QAC1C,OAAO,KACL,iGACF;GAEJ;GAEA,MAAM,MAAM,MAAMC,SAChB,MACA,OAAO,YACP,QACA,cACF;GACA,MAAM,KAAK,aAAa,KAAK,WAAW;GACxC,IAAI,IACF,MAAM,QAAQ,MAAM,EAAE;EAE1B;EAEA,MAAM,QAAQ,EAAE,IAAI,UAAU,YAA6C;GACzE,IAAI;IACF,MAAMD,QAAe,MAAM,OAAO,YAAY,UAAU,EACtD,IACE,eAAe,UAAU,OAAO,mBAAmB,KACnD,OAAO,YACX,CAAC;IACD,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,KAAK;KAAE;KAAK,IAAI;IAAS,GAAG,sBAAsB;IACzD,OAAO;GACT;EACF;EAEA,eAAiC;GAC/B,IAAI,OAAO,qBAAqB,OAC9B,OAAO,QAAQ,QAAQ,CAAC,CAAC;GAE3B,OAAO,cAAc,eAAe;GAEpC,OAAO,OAAO;EAChB;EAEA,MAAM,SAAS,QAAgB,WAAW,MAA6B;GACrE,IAAI,OAAO,qBAAqB,OAC9B,OAAO;GAET,IAAI;IAIF,OAAO;KACL;KACA,OAJA,MAAME,WAAgB,MAAM,OAAO,YAAY,QAAQ,EAAE,SAAS,CAAC,EAAA,CACnE;IAIF;GACF,SAAS,KAAK;IACZ,OAAO,MAAM;KAAE;KAAK;IAAO,GAAG,qBAAqB;IACnD,OAAO;GACT;EACF;EAEA,MAAM,UAAU,OAAsC;GAEpD,MAAM,SAAQ,MADU,SAAS,aAAa,EAAA,CACtB,MACrB,MAAM,EAAE,UAAU,UAAU,EAAE,UAAU,KAC3C;GAEA,IAAI,CAAC,OACH,OAAO;GAGT,OAAO,MAAM,gBAAgB,MAAM,QAAS;GAE5C,OAAO,SAAS,SAAU,MAAM,MAAO;EACzC;EAEA,MAAM,YAAY,EAChB,OACA,YACA,MAAM,SACN,QAAQ,YACR,cACA,QAC2D;GAC3D,OAAO,MAAM,eAAe,MAAM,EAAE;GACpC,IAAI,OAAO,qBAAqB,OAAO;IACrC,OAAO,KACL,oEACF;IACA,OAAO;GACT;GACA,IAAI;IACF,MAAM,OAAO,WAAW,OAAO;IAE/B,MAAM,YAAY,MAAM,SAAS,aAAa;IAC9C,IAAI,SAAS,UAAU,QAAQ,MAAM,EAAE,UAAU,KAAK;IACtD,IAAI,CAAC,OAAO,QACV,SAAS,UAAU,QAAQ,MAAM,EAAE,UAAU,UAAU;IAGzD,MAAM,SAAS,MAAM,QAAQ,UAAU,KAEjC,MAAM,QAAQ,IACZ,WAAW,KAAK,SAAS,kBAAkB,MAAM,QAAQ,IAAI,CAAC,CAChE,EAAA,CACA,OAAO,QAAQ,IACjB,KAAA;IAGJ,IAAI,OAAO,QAAQ;KACjB,IAAI,cAAc,OAAO,MAAM,MAAM,EAAE,UAAU,MAAM;KAGvD,IAAI,CAAC,aAAa;MAChB,IAAI,MAAM;OACR,OAAO,MAAM,wCAAwC;OACrD,OAAO;MACT;MACA,IAAI,cACF,OAAO,MAAM,mCAAmC;MAIlD,cAAc,OAAO,GAAG,EAAE;KAC5B;KAGA,KAAK,MAAM,SAAS,QAClB,IAAI,MAAM,UAAU,UAAU,MAAM,WAAW,YAAY,QAAQ;MAEjE,OAAO,KACL,EAAE,SAAS,MAAM,OAAQ,GACzB,yBACF;MAEA,MAAMC,WAAkB,MAAM,OAAO,YAAY,MAAM,MAAO;KAChE;KAIF,IACE,YAAY,UAAU,SACtB,YAAY,SAAS,QACrB,YAAY,UAAU,QACtB;MACA,OAAO,MAEL,UAAU,YAAY,OAAQ,wCAChC;MACA,OAAO;KACT;KAEA,IAAI,gBAAgB,YAAY,UAAU,QAAQ;MAEhD,OAAO,MAAM,mBAAmB,YAAY,QAAQ;MACpD,MAAM,gBAAgB,MAAMC,YAC1B,MACA,OAAO,YAEP,YAAY,QACZ;OACE;OACA;OACA,OAAO;MACT,CACF;MAGA,MAAM,mBAAmB,YAAY,cAAc,MAAM,CAAC,CAAC,KACxD,UAAU,MAAM,EACnB;MACA,IACE,WACC,OAAO,WAAW,iBAAiB,UAClC,OAAO,QAAQ,YAAY,CAAC,iBAAiB,SAAS,OAAO,CAAC,CAAC,CAC5D,WAAW,IAEhB,MAAMC,kBACJ,MACA,OAAO,YAEP,YAAY,QACZ,EACE,OACF,CACF;MAGF,OAAO;KACT;IACF;IAGA,MAAM,QAAQ,MAAMC,YAAmB,MAAM,OAAO,YAAY;KAC9D;KACA;KACA;IACF,CAAC;IACD,OAAO,MAAM,sBAAsB,MAAM,QAAQ;IACjD,OAAO,YAAY;IAEnB,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,KAAK,EAAE,IAAI,GAAG,wBAAwB;GAC/C;GAEA,OAAO;EACT;EAEA,MAAM,mBAAmB,OAA8B;GACrD,OAAO,MAAM,sBAAsB,MAAM,EAAE;GAC3C,IAAI,OAAO,qBAAqB,OAC9B;GAEF,MAAM,YAAY,MAAM,SAAS,aAAa;GAC9C,KAAK,MAAM,SAAS,WAClB,IAAI,MAAM,UAAU,UAAU,MAAM,UAAU,OAAO;IACnD,OAAO,MAAM,4BAA4B,MAAM,QAAS;IAExD,MAAMH,WAAkB,MAAM,OAAO,YAAY,MAAM,MAAO;GAChE;EAEJ;EAEA,MAAM,YAAY,OAAe,WAAkC;GACjE,OAAO,MAAM,kBAAkB,UAAU,eAAe,OAAO;GAC/D,MAAM,QAAQ,MAAM,kBAAkB,MAAM,QAAQ,SAAS;GAC7D,IAAI,OACF,MAAMI,cAAqB,MAAM,OAAO,YAAY,OAAO,KAAK;QAEhE,OAAO,KACL;IAAE;IAAO;GAAU,GACnB,qCACF;EAEJ;EAEA,MAAM,cAAc,EAClB,QAAQ,OACR,OACA,WACwC;GACxC,IAAI;IACF,IAAI,OAAO,SAAS,OAAO;IAC3B,MAAM,cAAc,MAAMC,YACxB,MACA,OAAO,YACP,KACF;IAGA,IAAI,UAA0B;IAC9B,IAAI,OAAO;KACT,UAAU,mBAAmB,aAAa,KAAK;KAC/C,OAAO,OAAO,MAAM,MAAM;IAC5B,OACE,UAAU,qBAAqB,aAAa,IAAI;IAIlD,IAAI,CAAC,SAAS;KACZ,UAAU,MAAMC,cACd,MACA,OAAO,YACP,OACA,IACF;KACA,OAAO,KACL;MAAE,YAAY,OAAO;MAAY;MAAO,SAAS,QAAQ;KAAG,GAC5D,eACF;IACF,OAAO,IAAI,QAAQ,SAAS,MAC1B,OAAO,MAAM,YAAY,QAAQ,GAAG,uBAAuB;SACtD;KACL,MAAMC,cAAqB,MAAM,OAAO,YAAY,QAAQ,IAAI,IAAI;KACpE,OAAO,MACL;MAAE,YAAY,OAAO;MAAY;MAAO,SAAS,QAAQ;KAAG,GAC5D,iBACF;IACF;IAEA,OAAO;GACT,SAAS,KAAK;IACZ,OAAO,KAAK;KAAE;KAAK;KAAO,SAAS;IAAM,GAAG,wBAAwB;IACpE,OAAO;GACT;EACF;EAEA,MAAM,qBACJ,cACe;GACf,MAAM,EAAE,QAAQ,UAAU;GAC1B,MAAM,MACJ,aAAa,SAAS,aAClB,aAAa,QACb,aAAa;GACnB,OAAO,MAAM,qBAAqB,IAAI,QAAQ,MAAM,YAAY;GAChE,MAAM,cAAc,MAAMF,YACxB,MACA,OAAO,YACP,KACF;GAEA,IAAI,UAA0B;;GAE9B,IAAI,aAAa,SAAS,YACxB,UAAU,mBAAmB,aAAa,aAAa,KAAK;QACvD,IAAI,aAAa,SAAS,cAE/B,UAAU,qBAAqB,aADlB,SAAS,aAAa,OACY,CAAC;GAIlD,IAAI,CAAC,SACH;GAIF,IAAI;IACF,MAAMG,cAAqB,MAAM,OAAO,YAAY,QAAQ,EAAE;GAChE,SAAS,KAAK;IACZ,OAAO,KACL;KAAE;KAAK;KAAO,QAAQ;IAAa,GACnC,wBACF;GACF;EACF;EAEA,MAAM,YAAY,YAAwC;GACxD,OAAO,MAAM,eAAe,WAAW,EAAE;GACzC,MAAM,KAAK,MAAM,SAAS,OAAO;IAAE;IAAY,OAAO;GAAO,CAAC;GAC9D,OAAO,KAAK,SAAS,MAAM,GAAG,MAAM,IAAI;EAC1C;EAEA,MAAM,aAAa,QAAgB,WAAoC;GACrE,OAAO,MACL,uBAAuB,WAAW,KAAK,IAAI,EAAE,cAAc,QAC7D;GACA,MAAMP,YAAmB,MAAM,OAAO,YAAY,QAAQ,EACxD,UACF,CAAC;EACH;EAEA,MAAM,aAAa,QAAgB,WAAoC;GACrE,OAAO,MAAM,qBAAqB,WAAW,KAAK,IAAI,EAAE,QAAQ,QAAQ;GACxE,IACE,sBACA,OAAO,GAAG,SAAS,SAAS,kBAAkB,GAC9C;IACA,OAAO,MACL,EAAE,SAAS,SAAS,QAAQ,GAC5B,oCACF;IACA;GACF;GACA,IAAI;IACF,MAAM,gBAAgB,IAAI,IACxB,UACG,QAAQ,MAAM,EAAE,WAAW,OAAO,CAAC,CAAC,CACpC,KAAK,MAAM,EAAE,UAAU,CAAC,CAAC,CAC9B;IACA,MAAM,gBAAgB,IAAI,IACxB,UAAU,QAAQ,MAAM,CAAC,EAAE,WAAW,OAAO,CAAC,CAChD;IAEA,MAAMQ,mBAA0B,MAAM,OAAO,YAAY,QAAQ;KAC/D,WAAW,CAAC,GAAG,aAAa;KAC5B,GAAI,cAAc,QAAQ,EACxB,gBAAgB,CAAC,GAAG,aAAa,EACnC;IACF,CAAC;GACH,SAAS,KAAK;IACZ,OAAO,KAAK;KAAE;KAAK;KAAQ;IAAU,GAAG,2BAA2B;GACrE;EACF;EAEA,gBAAgB,QAAwB;GACtC,OAAO,cAAc,WAAW,MAAM,GAAG,cAAc,CAAC;EAC1D;EAEA;CACF;CAEA,SAAS,gBAAwB;EAC/B,OAAO;CACT;CAEA,OAAO;EAAE;EAAU;CAAc;AACnC;;;;;AAMA,SAAS,UAAU,SAA0B;CAC3C,OAAO,QAAQ,SAAS,QAAQ;AAClC;AAEA,SAAS,mBAAmB,SAAuB;CACjD,IAAI,UAAU,OAAO,GACnB,OAAO,KACL,kEACF;CAEF,OAAO,MACL,GAAG,UAAU,OAAO,IAAI,YAAY,QAAQ,YAAY,SAC1D;AACF;AAEA,SAAS,qBAAqB,SAAgC;CAE5D,MAAM,aAAa,UAAU,OAAO,IAAI,WAAW;CACnD,IAAI,OAAO,IAAI,SAAS,UAAU,GAChC,OAAO;CAET,OAAO,4DAA4D,UAAU,OAAO,IAAI,YAAY,QAAQ,QAAQ,WAAW;AACjI;AAEA,MAAM,EAAE,UAAU,kBAAkB,eAAe;CACjD;CACA,iBAAiB;CACjB,MAAM;CACN;CACA;CACA;CAEA,oBAAoB;AACtB,CAAC;AAKD,MAAa,EACX,cACA,cACA,UACA,aACA,eACA,sBACA,aACA,oBACA,WACA,QACA,aACA,iBACA,sBACA,UACA,YACA,aACA,cACA,OACA,iBACA,eACA,WACA,UACA,cACA,UACA,SACA,iBACA,aACE"}
|
|
@@ -38,9 +38,9 @@ function getRepoUrl(repo, gitUrl, endpoint, hostType) {
|
|
|
38
38
|
repoUrl.username = opts.token ?? "";
|
|
39
39
|
return repoUrl.toString();
|
|
40
40
|
}
|
|
41
|
-
function getMergeMethod(strategy) {
|
|
41
|
+
function getMergeMethod(strategy, allowedMergeMethods) {
|
|
42
42
|
switch (strategy) {
|
|
43
|
-
case "fast-forward": return "rebase";
|
|
43
|
+
case "fast-forward": return allowedMergeMethods?.has("fast-forward-only") ? "fast-forward-only" : "rebase";
|
|
44
44
|
case "merge-commit": return "merge";
|
|
45
45
|
case "rebase": return "rebase-merge";
|
|
46
46
|
case "squash": return strategy;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/gitea/utils.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport type { MergeStrategy } from '../../../config/types.ts';\nimport { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { getPrBodyStruct } from '../pr-body.ts';\nimport type { GitUrlOption, Pr } from '../types.ts';\nimport type { PR, PRMergeMethod, Repo } from './schema.ts';\nimport type { GiteaPlatformKey } from './types.ts';\n\nexport function smartLinks(body: string): string {\n return body\n ?.replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](issues/')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](pulls/');\n}\n\nexport function trimTrailingApiPath(url: string): string {\n return url?.replace(regEx(/api\\/v1\\/?$/g), '');\n}\n\nexport function getRepoUrl(\n repo: Repo,\n gitUrl: GitUrlOption | undefined,\n endpoint: string,\n hostType: string,\n): string {\n if (gitUrl === 'ssh') {\n if (!repo.ssh_url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n logger.debug(`Using SSH URL: ${repo.ssh_url}`);\n return repo.ssh_url;\n }\n\n // Find options for current host and determine Git endpoint\n const opts = hostRules.find({\n hostType,\n url: endpoint,\n });\n\n if (gitUrl === 'endpoint') {\n const url = parseUrl(endpoint);\n if (!url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n url.username = opts.token ?? '';\n url.pathname = `${url.pathname}${repo.full_name}.git`;\n logger.debug(\n { url: url.toString() },\n 'using URL based on configured endpoint',\n );\n return url.toString();\n }\n\n if (!repo.clone_url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n\n logger.debug(`Using HTTP URL: ${repo.clone_url}`);\n const repoUrl = parseUrl(repo.clone_url);\n if (!repoUrl) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n repoUrl.username = opts.token ?? '';\n return repoUrl.toString();\n}\n\nexport function getMergeMethod(\n strategy: MergeStrategy | undefined,\n): PRMergeMethod | null {\n switch (strategy) {\n case 'fast-forward':\n return 'rebase';\n case 'merge-commit':\n return 'merge';\n case 'rebase':\n return 'rebase-merge';\n case 'squash':\n return strategy;\n case 'auto':\n default:\n return null;\n }\n}\n\nexport const API_PATH = '/api/v1';\n\n/** Human readable name of each platform, used in log messages. */\nexport const platformDisplayName = {\n gitea: 'Gitea',\n forgejo: 'Forgejo',\n} as const satisfies Record<GiteaPlatformKey, string>;\n\nexport const DRAFT_PREFIX = 'WIP: ';\nconst reconfigurePrRegex = regEx(/reconfigure$/);\n\nexport function toRenovatePR(data: PR, author: string | null): Pr | null {\n if (\n !data.base?.ref ||\n !data.head?.label ||\n !data.head?.sha ||\n !data.head?.repo?.full_name\n ) {\n logger.trace(\n `Skipping Pull Request #${data.number} due to missing base and/or head branch`,\n );\n return null;\n }\n\n const createdBy = data.user?.login;\n if (\n createdBy &&\n author &&\n !reconfigurePrRegex.test(data.head.label) &&\n createdBy !== author\n ) {\n return null;\n }\n\n let title = data.title;\n let isDraft = false;\n if (title.startsWith(DRAFT_PREFIX)) {\n title = title.substring(DRAFT_PREFIX.length);\n isDraft = true;\n }\n const labels = coerceArray(data.labels).map((l) => l.name);\n\n return {\n labels,\n number: data.number,\n state: data.merged ? 'merged' : data.state,\n title,\n isDraft,\n bodyStruct: getPrBodyStruct(data.body),\n sha: data.head.sha,\n sourceBranch: data.head.label,\n targetBranch: data.base.ref,\n sourceRepo: data.head.repo.full_name,\n createdAt: data.created_at,\n cannotMergeReason: data.mergeable\n ? undefined\n : `pr.mergeable=\"${data.mergeable}\"`,\n hasAssignees: !!(data.assignee?.login ?? isNonEmptyArray(data.assignees)),\n };\n}\n\n/**\n * Check if a repository is usable.\n * A repo isn't usable if one of the following conditions is met:\n * - The repo is a `mirror`\n * - We don't have pull or push permissions\n * - Pull requests are disabled\n * @param repo Repo to check\n * @returns `true` if the repository is usable, `false` otherwise\n */\nexport function usableRepo(repo: Repo): boolean {\n if (repo.mirror === true) {\n return false;\n }\n\n if (repo.permissions.pull === false || repo.permissions.push === false) {\n logger.debug(\n `Skipping repository ${repo.full_name} because of missing pull or push permissions`,\n );\n return false;\n }\n\n if (repo.has_pull_requests === false) {\n logger.debug(\n `Skipping repository ${repo.full_name} because pull requests are disabled`,\n );\n return false;\n }\n return true;\n}\n\nexport function isAllowed(style: PRMergeMethod, repo: Repo): boolean {\n switch (style) {\n case 'merge':\n return repo.allow_merge_commits;\n case 'rebase':\n return repo.allow_rebase;\n case 'rebase-merge':\n return repo.allow_rebase_explicit;\n case 'squash':\n return repo.allow_squash_merge;\n case 'fast-forward-only':\n return repo.allow_fast_forward_only_merge;\n }\n}\n"],"mappings":";;;;;;;;;AAaA,SAAgB,WAAW,MAAsB;CAC/C,OAAO,MACH,QAAQ,MAAM,qBAAqB,GAAG,WAAW,CAAC,CACnD,QAAQ,MAAM,mBAAmB,GAAG,UAAU;AACnD;AAEA,SAAgB,oBAAoB,KAAqB;CACvD,OAAO,KAAK,QAAQ,MAAM,cAAc,GAAG,EAAE;AAC/C;AAEA,SAAgB,WACd,MACA,QACA,UACA,UACQ;CACR,IAAI,WAAW,OAAO;EACpB,IAAI,CAAC,KAAK,SACR,MAAM,IAAI,MAAM,0BAA0B;EAE5C,OAAO,MAAM,kBAAkB,KAAK,SAAS;EAC7C,OAAO,KAAK;CACd;CAGA,MAAM,OAAOA,KAAe;EAC1B;EACA,KAAK;CACP,CAAC;CAED,IAAI,WAAW,YAAY;EACzB,MAAM,MAAM,SAAS,QAAQ;EAC7B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,0BAA0B;EAE5C,IAAI,WAAW,KAAK,SAAS;EAC7B,IAAI,WAAW,GAAG,IAAI,WAAW,KAAK,UAAU;EAChD,OAAO,MACL,EAAE,KAAK,IAAI,SAAS,EAAE,GACtB,wCACF;EACA,OAAO,IAAI,SAAS;CACtB;CAEA,IAAI,CAAC,KAAK,WACR,MAAM,IAAI,MAAM,0BAA0B;CAG5C,OAAO,MAAM,mBAAmB,KAAK,WAAW;CAChD,MAAM,UAAU,SAAS,KAAK,SAAS;CACvC,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,0BAA0B;CAE5C,QAAQ,WAAW,KAAK,SAAS;CACjC,OAAO,QAAQ,SAAS;AAC1B;AAEA,SAAgB,eACd,
|
|
1
|
+
{"version":3,"file":"utils.js","names":["hostRules.find"],"sources":["../../../../lib/modules/platform/gitea/utils.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport type { MergeStrategy } from '../../../config/types.ts';\nimport { CONFIG_GIT_URL_UNAVAILABLE } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport * as hostRules from '../../../util/host-rules.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { parseUrl } from '../../../util/url.ts';\nimport { getPrBodyStruct } from '../pr-body.ts';\nimport type { GitUrlOption, Pr } from '../types.ts';\nimport type { PR, PRMergeMethod, Repo } from './schema.ts';\nimport type { AllowedMergeMethods, GiteaPlatformKey } from './types.ts';\n\nexport function smartLinks(body: string): string {\n return body\n ?.replace(regEx(/\\]\\(\\.\\.\\/issues\\//g), '](issues/')\n .replace(regEx(/\\]\\(\\.\\.\\/pull\\//g), '](pulls/');\n}\n\nexport function trimTrailingApiPath(url: string): string {\n return url?.replace(regEx(/api\\/v1\\/?$/g), '');\n}\n\nexport function getRepoUrl(\n repo: Repo,\n gitUrl: GitUrlOption | undefined,\n endpoint: string,\n hostType: string,\n): string {\n if (gitUrl === 'ssh') {\n if (!repo.ssh_url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n logger.debug(`Using SSH URL: ${repo.ssh_url}`);\n return repo.ssh_url;\n }\n\n // Find options for current host and determine Git endpoint\n const opts = hostRules.find({\n hostType,\n url: endpoint,\n });\n\n if (gitUrl === 'endpoint') {\n const url = parseUrl(endpoint);\n if (!url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n url.username = opts.token ?? '';\n url.pathname = `${url.pathname}${repo.full_name}.git`;\n logger.debug(\n { url: url.toString() },\n 'using URL based on configured endpoint',\n );\n return url.toString();\n }\n\n if (!repo.clone_url) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n\n logger.debug(`Using HTTP URL: ${repo.clone_url}`);\n const repoUrl = parseUrl(repo.clone_url);\n if (!repoUrl) {\n throw new Error(CONFIG_GIT_URL_UNAVAILABLE);\n }\n repoUrl.username = opts.token ?? '';\n return repoUrl.toString();\n}\n\nexport function getMergeMethod(\n strategy: MergeStrategy | undefined,\n allowedMergeMethods: AllowedMergeMethods,\n): PRMergeMethod | null {\n switch (strategy) {\n case 'fast-forward':\n // Renovate only automerges branches that are already up to date with\n // their target branch, so a strict \"fast-forward only\" merge is safe\n // and is preferred over \"rebase\" (rebase-then-fast-forward) when the\n // repository allows it.\n return allowedMergeMethods?.has('fast-forward-only')\n ? 'fast-forward-only'\n : 'rebase';\n case 'merge-commit':\n return 'merge';\n case 'rebase':\n return 'rebase-merge';\n case 'squash':\n return strategy;\n case 'auto':\n default:\n return null;\n }\n}\n\nexport const API_PATH = '/api/v1';\n\n/** Human readable name of each platform, used in log messages. */\nexport const platformDisplayName = {\n gitea: 'Gitea',\n forgejo: 'Forgejo',\n} as const satisfies Record<GiteaPlatformKey, string>;\n\nexport const DRAFT_PREFIX = 'WIP: ';\nconst reconfigurePrRegex = regEx(/reconfigure$/);\n\nexport function toRenovatePR(data: PR, author: string | null): Pr | null {\n if (\n !data.base?.ref ||\n !data.head?.label ||\n !data.head?.sha ||\n !data.head?.repo?.full_name\n ) {\n logger.trace(\n `Skipping Pull Request #${data.number} due to missing base and/or head branch`,\n );\n return null;\n }\n\n const createdBy = data.user?.login;\n if (\n createdBy &&\n author &&\n !reconfigurePrRegex.test(data.head.label) &&\n createdBy !== author\n ) {\n return null;\n }\n\n let title = data.title;\n let isDraft = false;\n if (title.startsWith(DRAFT_PREFIX)) {\n title = title.substring(DRAFT_PREFIX.length);\n isDraft = true;\n }\n const labels = coerceArray(data.labels).map((l) => l.name);\n\n return {\n labels,\n number: data.number,\n state: data.merged ? 'merged' : data.state,\n title,\n isDraft,\n bodyStruct: getPrBodyStruct(data.body),\n sha: data.head.sha,\n sourceBranch: data.head.label,\n targetBranch: data.base.ref,\n sourceRepo: data.head.repo.full_name,\n createdAt: data.created_at,\n cannotMergeReason: data.mergeable\n ? undefined\n : `pr.mergeable=\"${data.mergeable}\"`,\n hasAssignees: !!(data.assignee?.login ?? isNonEmptyArray(data.assignees)),\n };\n}\n\n/**\n * Check if a repository is usable.\n * A repo isn't usable if one of the following conditions is met:\n * - The repo is a `mirror`\n * - We don't have pull or push permissions\n * - Pull requests are disabled\n * @param repo Repo to check\n * @returns `true` if the repository is usable, `false` otherwise\n */\nexport function usableRepo(repo: Repo): boolean {\n if (repo.mirror === true) {\n return false;\n }\n\n if (repo.permissions.pull === false || repo.permissions.push === false) {\n logger.debug(\n `Skipping repository ${repo.full_name} because of missing pull or push permissions`,\n );\n return false;\n }\n\n if (repo.has_pull_requests === false) {\n logger.debug(\n `Skipping repository ${repo.full_name} because pull requests are disabled`,\n );\n return false;\n }\n return true;\n}\n\nexport function isAllowed(style: PRMergeMethod, repo: Repo): boolean {\n switch (style) {\n case 'merge':\n return repo.allow_merge_commits;\n case 'rebase':\n return repo.allow_rebase;\n case 'rebase-merge':\n return repo.allow_rebase_explicit;\n case 'squash':\n return repo.allow_squash_merge;\n case 'fast-forward-only':\n return repo.allow_fast_forward_only_merge;\n }\n}\n"],"mappings":";;;;;;;;;AAaA,SAAgB,WAAW,MAAsB;CAC/C,OAAO,MACH,QAAQ,MAAM,qBAAqB,GAAG,WAAW,CAAC,CACnD,QAAQ,MAAM,mBAAmB,GAAG,UAAU;AACnD;AAEA,SAAgB,oBAAoB,KAAqB;CACvD,OAAO,KAAK,QAAQ,MAAM,cAAc,GAAG,EAAE;AAC/C;AAEA,SAAgB,WACd,MACA,QACA,UACA,UACQ;CACR,IAAI,WAAW,OAAO;EACpB,IAAI,CAAC,KAAK,SACR,MAAM,IAAI,MAAM,0BAA0B;EAE5C,OAAO,MAAM,kBAAkB,KAAK,SAAS;EAC7C,OAAO,KAAK;CACd;CAGA,MAAM,OAAOA,KAAe;EAC1B;EACA,KAAK;CACP,CAAC;CAED,IAAI,WAAW,YAAY;EACzB,MAAM,MAAM,SAAS,QAAQ;EAC7B,IAAI,CAAC,KACH,MAAM,IAAI,MAAM,0BAA0B;EAE5C,IAAI,WAAW,KAAK,SAAS;EAC7B,IAAI,WAAW,GAAG,IAAI,WAAW,KAAK,UAAU;EAChD,OAAO,MACL,EAAE,KAAK,IAAI,SAAS,EAAE,GACtB,wCACF;EACA,OAAO,IAAI,SAAS;CACtB;CAEA,IAAI,CAAC,KAAK,WACR,MAAM,IAAI,MAAM,0BAA0B;CAG5C,OAAO,MAAM,mBAAmB,KAAK,WAAW;CAChD,MAAM,UAAU,SAAS,KAAK,SAAS;CACvC,IAAI,CAAC,SACH,MAAM,IAAI,MAAM,0BAA0B;CAE5C,QAAQ,WAAW,KAAK,SAAS;CACjC,OAAO,QAAQ,SAAS;AAC1B;AAEA,SAAgB,eACd,UACA,qBACsB;CACtB,QAAQ,UAAR;EACE,KAAK,gBAKH,OAAO,qBAAqB,IAAI,mBAAmB,IAC/C,sBACA;EACN,KAAK,gBACH,OAAO;EACT,KAAK,UACH,OAAO;EACT,KAAK,UACH,OAAO;EAET,SACE,OAAO;CACX;AACF;AAEA,MAAa,WAAW;;AAGxB,MAAa,sBAAsB;CACjC,OAAO;CACP,SAAS;AACX;AAEA,MAAa,eAAe;AAC5B,MAAM,qBAAqB,MAAM,cAAc;AAE/C,SAAgB,aAAa,MAAU,QAAkC;CACvE,IACE,CAAC,KAAK,MAAM,OACZ,CAAC,KAAK,MAAM,SACZ,CAAC,KAAK,MAAM,OACZ,CAAC,KAAK,MAAM,MAAM,WAClB;EACA,OAAO,MACL,0BAA0B,KAAK,OAAO,wCACxC;EACA,OAAO;CACT;CAEA,MAAM,YAAY,KAAK,MAAM;CAC7B,IACE,aACA,UACA,CAAC,mBAAmB,KAAK,KAAK,KAAK,KAAK,KACxC,cAAc,QAEd,OAAO;CAGT,IAAI,QAAQ,KAAK;CACjB,IAAI,UAAU;CACd,IAAI,MAAM,WAAA,OAAuB,GAAG;EAClC,QAAQ,MAAM,UAAU,CAAmB;EAC3C,UAAU;CACZ;CAGA,OAAO;EACL,QAHa,YAAY,KAAK,MAAM,CAAC,CAAC,KAAK,MAAM,EAAE,IAG9C;EACL,QAAQ,KAAK;EACb,OAAO,KAAK,SAAS,WAAW,KAAK;EACrC;EACA;EACA,YAAY,gBAAgB,KAAK,IAAI;EACrC,KAAK,KAAK,KAAK;EACf,cAAc,KAAK,KAAK;EACxB,cAAc,KAAK,KAAK;EACxB,YAAY,KAAK,KAAK,KAAK;EAC3B,WAAW,KAAK;EAChB,mBAAmB,KAAK,YACpB,KAAA,IACA,iBAAiB,KAAK,UAAU;EACpC,cAAc,CAAC,EAAE,KAAK,UAAU,SAAS,gBAAgB,KAAK,SAAS;CACzE;AACF;;;;;;;;;;AAWA,SAAgB,WAAW,MAAqB;CAC9C,IAAI,KAAK,WAAW,MAClB,OAAO;CAGT,IAAI,KAAK,YAAY,SAAS,SAAS,KAAK,YAAY,SAAS,OAAO;EACtE,OAAO,MACL,uBAAuB,KAAK,UAAU,6CACxC;EACA,OAAO;CACT;CAEA,IAAI,KAAK,sBAAsB,OAAO;EACpC,OAAO,MACL,uBAAuB,KAAK,UAAU,oCACxC;EACA,OAAO;CACT;CACA,OAAO;AACT;AAEA,SAAgB,UAAU,OAAsB,MAAqB;CACnE,QAAQ,OAAR;EACE,KAAK,SACH,OAAO,KAAK;EACd,KAAK,UACH,OAAO,KAAK;EACd,KAAK,gBACH,OAAO,KAAK;EACd,KAAK,UACH,OAAO,KAAK;EACd,KAAK,qBACH,OAAO,KAAK;CAChB;AACF"}
|
|
@@ -11,6 +11,9 @@ import { addReleaseNotes } from "./release-notes.js";
|
|
|
11
11
|
import { getInRangeReleases } from "./releases.js";
|
|
12
12
|
import { isEmptyArray, isFalsy, isNonEmptyString, isNullOrUndefined, isTruthy } from "@sindresorhus/is";
|
|
13
13
|
//#region lib/workers/repository/update/pr/changelog/source.ts
|
|
14
|
+
function tagPrecision(tag) {
|
|
15
|
+
return tag.split(".").length - 1;
|
|
16
|
+
}
|
|
14
17
|
var ChangeLogSource = class {
|
|
15
18
|
cacheNamespace;
|
|
16
19
|
platform;
|
|
@@ -117,7 +120,9 @@ var ChangeLogSource = class {
|
|
|
117
120
|
const exactTagsList = tags.filter((tag) => {
|
|
118
121
|
return exactReleaseRegex.test(tag);
|
|
119
122
|
});
|
|
120
|
-
|
|
123
|
+
const candidates = (exactTagsList.length ? exactTagsList : tags).filter((tag) => versioningApi.isVersion(tag.replace(regex, ""))).filter((tag) => versioningApi.equals(tag.replace(regex, ""), depNewVersion));
|
|
124
|
+
if (!candidates.length) return;
|
|
125
|
+
return candidates.reduce((mostPrecise, candidate) => tagPrecision(candidate) > tagPrecision(mostPrecise) ? candidate : mostPrecise);
|
|
121
126
|
}
|
|
122
127
|
getRef(versioningApi, packageName, depName, release, tags) {
|
|
123
128
|
const tagName = this.findTagOfRelease(versioningApi, packageName, depName, release.version, tags);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"source.js","names":["allVersioning.get","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"sourcesContent":["import {\n isEmptyArray,\n isFalsy,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { instrument } from '../../../../../instrumentation/index.ts';\nimport { logger } from '../../../../../logger/index.ts';\nimport { getPkgReleases } from '../../../../../modules/datasource/index.ts';\nimport type { Release } from '../../../../../modules/datasource/types.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { memoize } from '../../../../../util/memoize.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport {\n isHttpUrl,\n joinUrlParts,\n parseUrl,\n trimSlashes,\n} from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport { slugifyUrl } from './common.ts';\nimport { addReleaseNotes } from './release-notes.ts';\nimport { getInRangeReleases } from './releases.ts';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n private readonly platform: ChangeLogPlatform;\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags';\n\n constructor(\n platform: ChangeLogPlatform,\n datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\n this.platform = platform;\n this.datasource = datasource;\n this.cacheNamespace = `changelog-${platform}-release`;\n }\n\n abstract getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string;\n\n abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;\n\n async getAllTags(endpoint: string, repository: string): Promise<string[]> {\n const tags = (\n await getPkgReleases({\n registryUrls: [endpoint],\n datasource: this.datasource,\n packageName: repository,\n versioning:\n 'regex:(?<major>\\\\d+)(\\\\.(?<minor>\\\\d+))?(\\\\.(?<patch>\\\\d+))?',\n })\n )?.releases;\n\n if (isNullOrUndefined(tags) || isEmptyArray(tags)) {\n logger.debug(\n `No ${this.datasource} tags found for repository: ${repository}`,\n );\n\n return [];\n }\n\n return tags.map(({ version }) => version);\n }\n\n public async getChangeLogJSON(\n config: BranchUpgradeConfig,\n ): Promise<ChangeLogResult | null> {\n return await instrument(\n `source.getChangeLogJSON(${this.platform})`,\n async () => {\n logger.trace(`getChangeLogJSON for ${this.platform}`);\n\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const sourceUrl = config.sourceUrl!;\n const packageName = config.packageName!;\n const depName = config.depName!;\n const sourceDirectory = config.sourceDirectory;\n const versioningApi = allVersioning.get(versioning);\n\n if (this.shouldSkipPackage(config)) {\n return null;\n }\n\n const baseUrl = this.getBaseUrl(config);\n const apiBaseUrl = this.getAPIBaseUrl(config);\n const repository = this.getRepositoryFromUrl(config);\n\n const tokenResponse = this.hasValidToken(config);\n if (!tokenResponse.isValid) {\n if (tokenResponse.error) {\n return {\n error: tokenResponse.error,\n };\n }\n return null;\n }\n\n if (isFalsy(this.hasValidRepository(repository))) {\n logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);\n return null;\n }\n\n const releases = config.releases ?? (await getInRangeReleases(config));\n if (!releases?.length) {\n logger.debug('No releases');\n return null;\n }\n // This extra filter/sort should not be necessary, but better safe than sorry\n const validReleases = [...releases]\n .filter((release) => versioningApi.isVersion(release.version))\n .sort((a, b) => versioningApi.sortVersions(a.version, b.version))\n // Drop versions equal under this versioning, e.g. the Docker tags\n // `3.7.12` and `v3.7.12`, else their notes are rendered twice\n .filter(\n (release, index, sorted) =>\n index === sorted.length - 1 ||\n !versioningApi.equals(release.version, sorted[index + 1].version),\n );\n\n if (validReleases.length < 2) {\n logger.debug(\n `Not enough valid releases for dep ${depName} (${packageName})`,\n );\n return null;\n }\n\n const changelogReleases: ChangeLogRelease[] = [];\n\n // Check if `v` belongs to the range (currentVersion, newVersion]\n function inRange(v: string): boolean {\n return (\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion)\n );\n }\n\n const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));\n // Fetch releases newest-first, matching the order they're shown in the PR body.\n for (let i = validReleases.length - 1; i >= 1; i -= 1) {\n const prev = validReleases[i - 1];\n const next = validReleases[i];\n if (!inRange(next.version)) {\n continue;\n }\n let release = await packageCache.get(\n this.cacheNamespace,\n this.getCacheKey(\n sourceUrl,\n packageName,\n prev.version,\n next.version,\n ),\n );\n if (!release) {\n release = {\n version: next.version,\n date: next.releaseTimestamp,\n gitRef: next.gitRef,\n // put empty changes so that existing templates won't break\n changes: [],\n compare: {},\n };\n const tags = await getTags();\n const prevHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n prev,\n tags,\n );\n const nextHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n next,\n tags,\n );\n if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) {\n release.compare.url = this.getCompareURL(\n baseUrl,\n repository,\n prevHead,\n nextHead,\n );\n }\n const cacheMinutes = 55;\n await packageCache.set(\n this.cacheNamespace,\n this.getCacheKey(\n sourceUrl,\n packageName,\n prev.version,\n next.version,\n ),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.push(release);\n }\n\n let res: ChangeLogResult | null = {\n project: {\n apiBaseUrl,\n baseUrl,\n type: this.platform,\n repository,\n sourceUrl,\n sourceDirectory,\n packageName,\n depName,\n },\n versions: changelogReleases,\n };\n\n res = await addReleaseNotes(res, config, this);\n\n return res;\n },\n );\n }\n\n private findTagOfRelease(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n depNewVersion: string,\n tags: string[],\n ): string | undefined {\n const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;\n const regex = regEx(releaseRegexPrefix, undefined, false);\n const exactReleaseRegex = regEx(`${releaseRegexPrefix}${depNewVersion}`);\n const exactTagsList = tags.filter((tag) => {\n return exactReleaseRegex.test(tag);\n });\n const tagList = exactTagsList.length ? exactTagsList : tags;\n return tagList\n .filter((tag) => versioningApi.isVersion(tag.replace(regex, '')))\n .find((tag) =>\n versioningApi.equals(tag.replace(regex, ''), depNewVersion),\n );\n }\n\n private getRef(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n release: Release,\n tags: string[],\n ): string | null {\n const tagName = this.findTagOfRelease(\n versioningApi,\n packageName,\n depName,\n release.version,\n tags,\n );\n if (isNonEmptyString(tagName)) {\n return tagName;\n }\n if (isNonEmptyString(release.gitRef)) {\n return release.gitRef;\n }\n return null;\n }\n\n private getCacheKey(\n sourceUrl: string,\n packageName: string,\n prev: string,\n next: string,\n ): string {\n return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`;\n }\n\n getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const host = parsedUrl.host;\n return `${protocol}//${host}/`;\n }\n\n getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const pathname = parsedUrl.pathname;\n return trimSlashes(pathname).replace(regEx(/\\.git$/), '');\n }\n\n protected hasValidToken(_config: BranchUpgradeConfig): {\n isValid: boolean;\n error?: ChangeLogError;\n } {\n return { isValid: true };\n }\n\n protected shouldSkipPackage(_config: BranchUpgradeConfig): boolean {\n return false;\n }\n\n hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n\n /**\n * Build the URL to the changelog markdown file for the release notes.\n * Platform sources can override this to match their web UI conventions.\n */\n getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n changelogFile: string,\n ): string {\n return joinUrlParts(baseUrl, repository, 'blob', 'HEAD', changelogFile);\n }\n\n /**\n * Build the URL pointing to a specific heading within the changelog markdown\n * file. Platform sources can override this to match their anchor conventions.\n */\n getReleaseNotesMdAnchorUrl(notesSourceUrl: string, heading: string): string {\n const mdHeadingLink = heading\n .replace(regEx(/[[\\]()]/g), ' ')\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(isTruthy)\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n return `${notesSourceUrl}#${mdHeadingLink}`;\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"source.js","names":["allVersioning.get","packageCache.get","packageCache.set"],"sources":["../../../../../../lib/workers/repository/update/pr/changelog/source.ts"],"sourcesContent":["import {\n isEmptyArray,\n isFalsy,\n isNonEmptyString,\n isNullOrUndefined,\n isTruthy,\n} from '@sindresorhus/is';\nimport { instrument } from '../../../../../instrumentation/index.ts';\nimport { logger } from '../../../../../logger/index.ts';\nimport { getPkgReleases } from '../../../../../modules/datasource/index.ts';\nimport type { Release } from '../../../../../modules/datasource/types.ts';\nimport * as allVersioning from '../../../../../modules/versioning/index.ts';\nimport * as packageCache from '../../../../../util/cache/package/index.ts';\nimport type { PackageCacheNamespace } from '../../../../../util/cache/package/types.ts';\nimport { memoize } from '../../../../../util/memoize.ts';\nimport { regEx } from '../../../../../util/regex.ts';\nimport {\n isHttpUrl,\n joinUrlParts,\n parseUrl,\n trimSlashes,\n} from '../../../../../util/url.ts';\nimport type { BranchUpgradeConfig } from '../../../../types.ts';\nimport { slugifyUrl } from './common.ts';\nimport { addReleaseNotes } from './release-notes.ts';\nimport { getInRangeReleases } from './releases.ts';\nimport type {\n ChangeLogError,\n ChangeLogPlatform,\n ChangeLogRelease,\n ChangeLogResult,\n} from './types.ts';\n\n// Number of dot-separated segments, used as a proxy for how precise a tag is,\n// e.g. `v7` (0) < `v7.0` (1) < `v7.0.0` (2).\nfunction tagPrecision(tag: string): number {\n return tag.split('.').length - 1;\n}\n\nexport abstract class ChangeLogSource {\n private readonly cacheNamespace: PackageCacheNamespace;\n private readonly platform: ChangeLogPlatform;\n private readonly datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags';\n\n constructor(\n platform: ChangeLogPlatform,\n datasource:\n | 'bitbucket-tags'\n | 'bitbucket-server-tags'\n | 'forgejo-tags'\n | 'gitea-tags'\n | 'github-tags'\n | 'gitlab-tags',\n ) {\n this.platform = platform;\n this.datasource = datasource;\n this.cacheNamespace = `changelog-${platform}-release`;\n }\n\n abstract getCompareURL(\n baseUrl: string,\n repository: string,\n prevHead: string,\n nextHead: string,\n ): string;\n\n abstract getAPIBaseUrl(config: BranchUpgradeConfig): string;\n\n async getAllTags(endpoint: string, repository: string): Promise<string[]> {\n const tags = (\n await getPkgReleases({\n registryUrls: [endpoint],\n datasource: this.datasource,\n packageName: repository,\n versioning:\n 'regex:(?<major>\\\\d+)(\\\\.(?<minor>\\\\d+))?(\\\\.(?<patch>\\\\d+))?',\n })\n )?.releases;\n\n if (isNullOrUndefined(tags) || isEmptyArray(tags)) {\n logger.debug(\n `No ${this.datasource} tags found for repository: ${repository}`,\n );\n\n return [];\n }\n\n return tags.map(({ version }) => version);\n }\n\n public async getChangeLogJSON(\n config: BranchUpgradeConfig,\n ): Promise<ChangeLogResult | null> {\n return await instrument(\n `source.getChangeLogJSON(${this.platform})`,\n async () => {\n logger.trace(`getChangeLogJSON for ${this.platform}`);\n\n const versioning = config.versioning!;\n const currentVersion = config.currentVersion!;\n const newVersion = config.newVersion!;\n const sourceUrl = config.sourceUrl!;\n const packageName = config.packageName!;\n const depName = config.depName!;\n const sourceDirectory = config.sourceDirectory;\n const versioningApi = allVersioning.get(versioning);\n\n if (this.shouldSkipPackage(config)) {\n return null;\n }\n\n const baseUrl = this.getBaseUrl(config);\n const apiBaseUrl = this.getAPIBaseUrl(config);\n const repository = this.getRepositoryFromUrl(config);\n\n const tokenResponse = this.hasValidToken(config);\n if (!tokenResponse.isValid) {\n if (tokenResponse.error) {\n return {\n error: tokenResponse.error,\n };\n }\n return null;\n }\n\n if (isFalsy(this.hasValidRepository(repository))) {\n logger.debug(`Invalid ${this.platform} URL found: ${sourceUrl}`);\n return null;\n }\n\n const releases = config.releases ?? (await getInRangeReleases(config));\n if (!releases?.length) {\n logger.debug('No releases');\n return null;\n }\n // This extra filter/sort should not be necessary, but better safe than sorry\n const validReleases = [...releases]\n .filter((release) => versioningApi.isVersion(release.version))\n .sort((a, b) => versioningApi.sortVersions(a.version, b.version))\n // Drop versions equal under this versioning, e.g. the Docker tags\n // `3.7.12` and `v3.7.12`, else their notes are rendered twice\n .filter(\n (release, index, sorted) =>\n index === sorted.length - 1 ||\n !versioningApi.equals(release.version, sorted[index + 1].version),\n );\n\n if (validReleases.length < 2) {\n logger.debug(\n `Not enough valid releases for dep ${depName} (${packageName})`,\n );\n return null;\n }\n\n const changelogReleases: ChangeLogRelease[] = [];\n\n // Check if `v` belongs to the range (currentVersion, newVersion]\n function inRange(v: string): boolean {\n return (\n versioningApi.isGreaterThan(v, currentVersion) &&\n !versioningApi.isGreaterThan(v, newVersion)\n );\n }\n\n const getTags = memoize(() => this.getAllTags(apiBaseUrl, repository));\n // Fetch releases newest-first, matching the order they're shown in the PR body.\n for (let i = validReleases.length - 1; i >= 1; i -= 1) {\n const prev = validReleases[i - 1];\n const next = validReleases[i];\n if (!inRange(next.version)) {\n continue;\n }\n let release = await packageCache.get(\n this.cacheNamespace,\n this.getCacheKey(\n sourceUrl,\n packageName,\n prev.version,\n next.version,\n ),\n );\n if (!release) {\n release = {\n version: next.version,\n date: next.releaseTimestamp,\n gitRef: next.gitRef,\n // put empty changes so that existing templates won't break\n changes: [],\n compare: {},\n };\n const tags = await getTags();\n const prevHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n prev,\n tags,\n );\n const nextHead = this.getRef(\n versioningApi,\n packageName,\n depName,\n next,\n tags,\n );\n if (isNonEmptyString(prevHead) && isNonEmptyString(nextHead)) {\n release.compare.url = this.getCompareURL(\n baseUrl,\n repository,\n prevHead,\n nextHead,\n );\n }\n const cacheMinutes = 55;\n await packageCache.set(\n this.cacheNamespace,\n this.getCacheKey(\n sourceUrl,\n packageName,\n prev.version,\n next.version,\n ),\n release,\n cacheMinutes,\n );\n }\n changelogReleases.push(release);\n }\n\n let res: ChangeLogResult | null = {\n project: {\n apiBaseUrl,\n baseUrl,\n type: this.platform,\n repository,\n sourceUrl,\n sourceDirectory,\n packageName,\n depName,\n },\n versions: changelogReleases,\n };\n\n res = await addReleaseNotes(res, config, this);\n\n return res;\n },\n );\n }\n\n private findTagOfRelease(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n depNewVersion: string,\n tags: string[],\n ): string | undefined {\n const releaseRegexPrefix = `^(?:${packageName}|${depName}|release)[@_-]v?`;\n const regex = regEx(releaseRegexPrefix, undefined, false);\n const exactReleaseRegex = regEx(`${releaseRegexPrefix}${depNewVersion}`);\n const exactTagsList = tags.filter((tag) => {\n return exactReleaseRegex.test(tag);\n });\n const tagList = exactTagsList.length ? exactTagsList : tags;\n const candidates = tagList\n .filter((tag) => versioningApi.isVersion(tag.replace(regex, '')))\n .filter((tag) =>\n versioningApi.equals(tag.replace(regex, ''), depNewVersion),\n );\n if (!candidates.length) {\n return undefined;\n }\n // Some versioning schemes (e.g. `github-actions`) treat a floating tag\n // like `v7` as equal to a precise one like `v7.0.0` via coercion, so more\n // than one tag can match the same release. Prefer the most precise tag\n // (most dot-separated segments), else keep the first match found.\n return candidates.reduce((mostPrecise, candidate) =>\n tagPrecision(candidate) > tagPrecision(mostPrecise)\n ? candidate\n : mostPrecise,\n );\n }\n\n private getRef(\n versioningApi: allVersioning.VersioningApi,\n packageName: string,\n depName: string,\n release: Release,\n tags: string[],\n ): string | null {\n const tagName = this.findTagOfRelease(\n versioningApi,\n packageName,\n depName,\n release.version,\n tags,\n );\n if (isNonEmptyString(tagName)) {\n return tagName;\n }\n if (isNonEmptyString(release.gitRef)) {\n return release.gitRef;\n }\n return null;\n }\n\n private getCacheKey(\n sourceUrl: string,\n packageName: string,\n prev: string,\n next: string,\n ): string {\n return `${slugifyUrl(sourceUrl)}:${packageName}:${prev}:${next}`;\n }\n\n getBaseUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const protocol = parsedUrl.protocol.replace(regEx(/^git\\+/), '');\n const host = parsedUrl.host;\n return `${protocol}//${host}/`;\n }\n\n getRepositoryFromUrl(config: BranchUpgradeConfig): string {\n const parsedUrl = parseUrl(config.sourceUrl);\n if (isNullOrUndefined(parsedUrl)) {\n return '';\n }\n const pathname = parsedUrl.pathname;\n return trimSlashes(pathname).replace(regEx(/\\.git$/), '');\n }\n\n protected hasValidToken(_config: BranchUpgradeConfig): {\n isValid: boolean;\n error?: ChangeLogError;\n } {\n return { isValid: true };\n }\n\n protected shouldSkipPackage(_config: BranchUpgradeConfig): boolean {\n return false;\n }\n\n hasValidRepository(repository: string): boolean {\n return repository.split('/').length === 2;\n }\n\n /**\n * Build the URL to the changelog markdown file for the release notes.\n * Platform sources can override this to match their web UI conventions.\n */\n getNotesSourceUrl(\n baseUrl: string,\n repository: string,\n changelogFile: string,\n ): string {\n return joinUrlParts(baseUrl, repository, 'blob', 'HEAD', changelogFile);\n }\n\n /**\n * Build the URL pointing to a specific heading within the changelog markdown\n * file. Platform sources can override this to match their anchor conventions.\n */\n getReleaseNotesMdAnchorUrl(notesSourceUrl: string, heading: string): string {\n const mdHeadingLink = heading\n .replace(regEx(/[[\\]()]/g), ' ')\n .replace(regEx(/^\\s*#*\\s*/), '')\n .split(' ')\n .filter(isTruthy)\n .filter((word) => !isHttpUrl(word))\n .join('-')\n .replace(regEx(/[^A-Za-z0-9-]/g), '');\n return `${notesSourceUrl}#${mdHeadingLink}`;\n }\n}\n"],"mappings":"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"}
|
package/package.json
CHANGED
package/renovate-schema.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"$id": "https://docs.renovatebot.com/renovate-schema.json",
|
|
3
|
-
"title": "JSON schema for Renovate 44.93.
|
|
3
|
+
"title": "JSON schema for Renovate 44.93.8 config files (https://renovatebot.com/)",
|
|
4
4
|
"$schema": "http://json-schema.org/draft-07/schema#",
|
|
5
|
-
"x-renovate-version": "44.93.
|
|
5
|
+
"x-renovate-version": "44.93.8",
|
|
6
6
|
"allowComments": true,
|
|
7
7
|
"type": "object",
|
|
8
8
|
"definitions": {
|