renovate 44.210.2 → 44.211.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/utils.js +2 -1
- package/dist/config/utils.js.map +1 -1
- package/dist/config/validation-helpers/regex-glob-matchers.js.map +1 -1
- package/dist/config/validation-helpers/utils.js +5 -1
- package/dist/config/validation-helpers/utils.js.map +1 -1
- package/dist/config/validation.js +8 -2
- package/dist/config/validation.js.map +1 -1
- package/dist/config-validator.js +1 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/instrumentation/index.js +3 -2
- package/dist/instrumentation/index.js.map +1 -1
- package/dist/logger/bunyan.js +3 -2
- package/dist/logger/bunyan.js.map +1 -1
- package/dist/logger/pretty-stdout.js +2 -1
- package/dist/logger/pretty-stdout.js.map +1 -1
- package/dist/modules/datasource/apk/index.js +2 -2
- package/dist/modules/datasource/apk/index.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +2 -3
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/bazel/index.js +2 -1
- package/dist/modules/datasource/bazel/index.js.map +1 -1
- package/dist/modules/datasource/cdnjs/index.js +2 -1
- package/dist/modules/datasource/cdnjs/index.js.map +1 -1
- package/dist/modules/datasource/conda/index.js +2 -1
- package/dist/modules/datasource/conda/index.js.map +1 -1
- package/dist/modules/datasource/crate/index.js +2 -1
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/dart-version/index.js +2 -1
- package/dist/modules/datasource/dart-version/index.js.map +1 -1
- package/dist/modules/datasource/datasource.js +2 -2
- package/dist/modules/datasource/datasource.js.map +1 -1
- package/dist/modules/datasource/deb/url.js +3 -1
- package/dist/modules/datasource/deb/url.js.map +1 -1
- package/dist/modules/datasource/devbox/index.js +2 -1
- package/dist/modules/datasource/devbox/index.js.map +1 -1
- package/dist/modules/datasource/docker/common.js +10 -8
- package/dist/modules/datasource/docker/common.js.map +1 -1
- package/dist/modules/datasource/docker/ecr.js +2 -1
- package/dist/modules/datasource/docker/ecr.js.map +1 -1
- package/dist/modules/datasource/docker/index.js +20 -17
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/gitea-tags/base.js +2 -3
- package/dist/modules/datasource/gitea-tags/base.js.map +1 -1
- package/dist/modules/datasource/github-tags/index.js +2 -1
- package/dist/modules/datasource/github-tags/index.js.map +1 -1
- package/dist/modules/datasource/gitlab-tags/index.js +2 -3
- package/dist/modules/datasource/gitlab-tags/index.js.map +1 -1
- package/dist/modules/datasource/go/base.js +1 -1
- package/dist/modules/datasource/go/base.js.map +1 -1
- package/dist/modules/datasource/go/common.js +8 -2
- package/dist/modules/datasource/go/common.js.map +1 -1
- package/dist/modules/datasource/go/env.js +2 -1
- package/dist/modules/datasource/go/env.js.map +1 -1
- package/dist/modules/datasource/go/releases-goproxy.js +7 -5
- package/dist/modules/datasource/go/releases-goproxy.js.map +1 -1
- package/dist/modules/datasource/helm/index.js +2 -1
- package/dist/modules/datasource/helm/index.js.map +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js +2 -1
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/index.js +4 -3
- package/dist/modules/datasource/index.js.map +1 -1
- package/dist/modules/datasource/java-version/adoptium.js +3 -2
- package/dist/modules/datasource/java-version/adoptium.js.map +1 -1
- package/dist/modules/datasource/java-version/graalvm.js +2 -1
- package/dist/modules/datasource/java-version/graalvm.js.map +1 -1
- package/dist/modules/datasource/maven/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +7 -10
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/npm/npmrc.js +2 -2
- package/dist/modules/datasource/npm/npmrc.js.map +1 -1
- package/dist/modules/datasource/nuget/v3.js +3 -5
- package/dist/modules/datasource/nuget/v3.js.map +1 -1
- package/dist/modules/datasource/packagist/index.js +4 -5
- package/dist/modules/datasource/packagist/index.js.map +1 -1
- package/dist/modules/datasource/pod/index.js +4 -4
- package/dist/modules/datasource/pod/index.js.map +1 -1
- package/dist/modules/datasource/pypi/index.js +19 -11
- package/dist/modules/datasource/pypi/index.js.map +1 -1
- package/dist/modules/datasource/python-version/index.js +2 -3
- package/dist/modules/datasource/python-version/index.js.map +1 -1
- package/dist/modules/datasource/repology/index.js +4 -3
- package/dist/modules/datasource/repology/index.js.map +1 -1
- package/dist/modules/datasource/rpm/providers/common.js +3 -1
- package/dist/modules/datasource/rpm/providers/common.js.map +1 -1
- package/dist/modules/datasource/rubygems/index.js +2 -5
- package/dist/modules/datasource/rubygems/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js +13 -18
- package/dist/modules/datasource/rubygems/versions-endpoint-cache.js.map +1 -1
- package/dist/modules/datasource/terraform-module/base.js +2 -1
- package/dist/modules/datasource/terraform-module/base.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +2 -3
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/context.js +0 -1
- package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
- package/dist/modules/manager/bundler/host-rules.js +4 -1
- package/dist/modules/manager/bundler/host-rules.js.map +1 -1
- package/dist/modules/manager/composer/range.js +1 -1
- package/dist/modules/manager/composer/range.js.map +1 -1
- package/dist/modules/manager/custom/utils.js +3 -1
- package/dist/modules/manager/custom/utils.js.map +1 -1
- package/dist/modules/manager/devbox/schema.js +2 -1
- package/dist/modules/manager/devbox/schema.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +10 -2
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +1 -1
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/github-actions/parse.js +2 -1
- package/dist/modules/manager/github-actions/parse.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +5 -2
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/artifacts.js +5 -2
- package/dist/modules/manager/gradle/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/utils.js +2 -1
- package/dist/modules/manager/gradle/utils.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/utils.js +9 -5
- package/dist/modules/manager/gradle-wrapper/utils.js.map +1 -1
- package/dist/modules/manager/helm-values/util.js +1 -1
- package/dist/modules/manager/helm-values/util.js.map +1 -1
- package/dist/modules/manager/helmfile/artifacts.js +1 -1
- package/dist/modules/manager/helmfile/artifacts.js.map +1 -1
- package/dist/modules/manager/helmv3/artifacts.js +1 -1
- package/dist/modules/manager/helmv3/artifacts.js.map +1 -1
- package/dist/modules/manager/maven/extract.js +5 -2
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js +3 -2
- package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/artifacts.js +2 -1
- package/dist/modules/manager/mise/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/extract.js.map +1 -1
- package/dist/modules/manager/npm/artifacts.js +3 -1
- package/dist/modules/manager/npm/artifacts.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +4 -1
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/package-file.js +2 -1
- package/dist/modules/manager/npm/extract/common/package-file.js.map +1 -1
- package/dist/modules/manager/npm/extract/index.js.map +1 -1
- package/dist/modules/manager/npm/extract/post/locked-versions.js.map +1 -1
- package/dist/modules/manager/npm/npmrc.js +2 -1
- package/dist/modules/manager/npm/npmrc.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js +2 -1
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/npm.js +2 -3
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
- package/dist/modules/manager/npm/schema.js +6 -2
- package/dist/modules/manager/npm/schema.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +3 -2
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js +6 -2
- package/dist/modules/manager/npm/update/locked-dependency/common/parent-version.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js +2 -1
- package/dist/modules/manager/npm/update/locked-dependency/package-lock/get-locked.js.map +1 -1
- package/dist/modules/manager/nuget/package-tree.js +2 -1
- package/dist/modules/manager/nuget/package-tree.js.map +1 -1
- package/dist/modules/manager/paket/update-locked.js +4 -1
- package/dist/modules/manager/paket/update-locked.js.map +1 -1
- package/dist/modules/manager/pipenv/extract.js +4 -1
- package/dist/modules/manager/pipenv/extract.js.map +1 -1
- package/dist/modules/platform/azure/azure-helper.js +2 -1
- package/dist/modules/platform/azure/azure-helper.js.map +1 -1
- package/dist/modules/platform/azure/index.js +7 -3
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +13 -6
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/index.js +13 -9
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/codecommit/index.js +2 -2
- package/dist/modules/platform/codecommit/index.js.map +1 -1
- package/dist/modules/platform/gerrit/client.js +4 -1
- package/dist/modules/platform/gerrit/client.js.map +1 -1
- package/dist/modules/platform/gerrit/index.js +3 -2
- package/dist/modules/platform/gerrit/index.js.map +1 -1
- package/dist/modules/platform/gitea/gitea-helper.js +5 -4
- package/dist/modules/platform/gitea/gitea-helper.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +11 -4
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/github/index.js +36 -23
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +16 -9
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/scm-manager/index.js +4 -1
- package/dist/modules/platform/scm-manager/index.js.map +1 -1
- package/dist/modules/platform/scm-manager/utils.js +2 -1
- package/dist/modules/platform/scm-manager/utils.js.map +1 -1
- package/dist/modules/versioning/cargo/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +2 -1
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/conan/common.js +4 -1
- package/dist/modules/versioning/conan/common.js.map +1 -1
- package/dist/modules/versioning/debian/index.js +2 -1
- package/dist/modules/versioning/debian/index.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.js +2 -1
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/hex/index.js +2 -1
- package/dist/modules/versioning/hex/index.js.map +1 -1
- package/dist/modules/versioning/julia/index.js.map +1 -1
- package/dist/modules/versioning/maven/compare.js +17 -7
- package/dist/modules/versioning/maven/compare.js.map +1 -1
- package/dist/modules/versioning/npm/index.js +2 -1
- package/dist/modules/versioning/npm/index.js.map +1 -1
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/paket/index.js +2 -1
- package/dist/modules/versioning/paket/index.js.map +1 -1
- package/dist/modules/versioning/paket/range.js +7 -3
- package/dist/modules/versioning/paket/range.js.map +1 -1
- package/dist/modules/versioning/pep440/index.js +2 -1
- package/dist/modules/versioning/pep440/index.js.map +1 -1
- package/dist/modules/versioning/poetry/index.js +2 -1
- package/dist/modules/versioning/poetry/index.js.map +1 -1
- package/dist/modules/versioning/regex/index.js +1 -1
- package/dist/modules/versioning/regex/index.js.map +1 -1
- package/dist/modules/versioning/rez/index.js +2 -1
- package/dist/modules/versioning/rez/index.js.map +1 -1
- package/dist/modules/versioning/vcpkg/index.js +2 -1
- package/dist/modules/versioning/vcpkg/index.js.map +1 -1
- package/dist/util/cache/package/impl/base.js +2 -1
- package/dist/util/cache/package/impl/base.js.map +1 -1
- package/dist/util/cache/package/with-cache.js +2 -1
- package/dist/util/cache/package/with-cache.js.map +1 -1
- package/dist/util/check-token.js +7 -4
- package/dist/util/check-token.js.map +1 -1
- package/dist/util/exec/utils.js +4 -1
- package/dist/util/exec/utils.js.map +1 -1
- package/dist/util/git/auth.js +5 -1
- package/dist/util/git/auth.js.map +1 -1
- package/dist/util/git/error.js.map +1 -1
- package/dist/util/host-rules.js +5 -3
- package/dist/util/host-rules.js.map +1 -1
- package/dist/util/http/cache/abstract-http-cache-provider.js +3 -2
- package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
- package/dist/util/http/cache/package-http-cache-provider.js +2 -1
- package/dist/util/http/cache/package-http-cache-provider.js.map +1 -1
- package/dist/util/http/github.js +15 -11
- package/dist/util/http/github.js.map +1 -1
- package/dist/util/http/gitlab.js +5 -4
- package/dist/util/http/gitlab.js.map +1 -1
- package/dist/util/http/http.js +2 -1
- package/dist/util/http/http.js.map +1 -1
- package/dist/util/http/jwt.js +2 -1
- package/dist/util/http/jwt.js.map +1 -1
- package/dist/util/http/retry-after.js +2 -1
- package/dist/util/http/retry-after.js.map +1 -1
- package/dist/util/http/status.js +95 -0
- package/dist/util/http/status.js.map +1 -0
- package/dist/util/merge-confidence/index.js +3 -2
- package/dist/util/merge-confidence/index.js.map +1 -1
- package/dist/util/package-rules/current-version.js +4 -1
- package/dist/util/package-rules/current-version.js.map +1 -1
- package/dist/util/package-rules/index.js +7 -3
- package/dist/util/package-rules/index.js.map +1 -1
- package/dist/util/schema-utils/index.js +5 -0
- package/dist/util/schema-utils/index.js.map +1 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js +2 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
- package/dist/workers/repository/common.js +4 -1
- package/dist/workers/repository/common.js.map +1 -1
- package/dist/workers/repository/config-migration/branch/index.js +2 -1
- package/dist/workers/repository/config-migration/branch/index.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +6 -2
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/dist/workers/repository/finalize/repository-statistics.js +4 -1
- package/dist/workers/repository/finalize/repository-statistics.js.map +1 -1
- package/dist/workers/repository/init/merge.js +13 -3
- package/dist/workers/repository/init/merge.js.map +1 -1
- package/dist/workers/repository/onboarding/branch/check.js +2 -1
- package/dist/workers/repository/onboarding/branch/check.js.map +1 -1
- package/dist/workers/repository/onboarding/pr/pr-list.js +4 -2
- package/dist/workers/repository/onboarding/pr/pr-list.js.map +1 -1
- package/dist/workers/repository/process/extract-update.js +4 -1
- package/dist/workers/repository/process/extract-update.js.map +1 -1
- package/dist/workers/repository/process/lookup/digest.js +2 -1
- package/dist/workers/repository/process/lookup/digest.js.map +1 -1
- package/dist/workers/repository/process/lookup/generate.js +1 -1
- package/dist/workers/repository/process/lookup/generate.js.map +1 -1
- package/dist/workers/repository/process/lookup/index.js +4 -1
- package/dist/workers/repository/process/lookup/index.js.map +1 -1
- package/dist/workers/repository/process/lookup/utils.js +7 -1
- package/dist/workers/repository/process/lookup/utils.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +10 -3
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/reconfigure/index.js +2 -1
- package/dist/workers/repository/reconfigure/index.js.map +1 -1
- package/dist/workers/repository/update/branch/auto-replace.js +6 -2
- package/dist/workers/repository/update/branch/auto-replace.js.map +1 -1
- package/dist/workers/repository/update/branch/errors.js +2 -1
- package/dist/workers/repository/update/branch/errors.js.map +1 -1
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js +2 -2
- package/dist/workers/repository/update/branch/execute-post-upgrade-commands.js.map +1 -1
- package/dist/workers/repository/update/branch/get-updated.js +1 -2
- package/dist/workers/repository/update/branch/get-updated.js.map +1 -1
- package/dist/workers/repository/update/branch/index.js +2 -1
- package/dist/workers/repository/update/branch/index.js.map +1 -1
- package/dist/workers/repository/update/branch/status-checks.js +2 -1
- package/dist/workers/repository/update/branch/status-checks.js.map +1 -1
- package/dist/workers/repository/update/pr/body/index.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/release-notes.js +3 -2
- package/dist/workers/repository/update/pr/changelog/release-notes.js.map +1 -1
- package/dist/workers/repository/update/pr/index.js +7 -3
- package/dist/workers/repository/update/pr/index.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +6 -3
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +2 -2
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"client.js","names":[],"sources":["../../../../lib/modules/platform/gerrit/client.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { z } from 'zod/v4';\nimport { REPOSITORY_ARCHIVED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { GerritHttp } from '../../../util/http/gerrit.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport type {\n GerritAccountInfo,\n GerritChangeMessageInfo,\n GerritReviewResult,\n} from './schema.ts';\nimport {\n GerritBranchInfo,\n GerritChange,\n GerritChangeMessages,\n GerritChanges,\n GerritMergeableInfo,\n GerritProjectInfo,\n GerritRepos,\n} from './schema.ts';\nimport type {\n GerritFindPRConfig,\n GerritHashtagsInput,\n GerritRequestDetail,\n} from './types.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n MIN_GERRIT_VERSION,\n currentGerritTimestamp,\n mapPrStateToGerritFilter,\n} from './utils.ts';\n\nclass GerritClient {\n // memCache is disabled because GerritPrCache provides a smarter caching\n private gerritHttp = new GerritHttp({ memCache: false });\n private gerritVersion = MIN_GERRIT_VERSION;\n\n setGerritVersion(version: string): void {\n this.gerritVersion = version;\n }\n\n async getGerritVersion(\n options: Pick<HttpOptions, 'username' | 'password'>,\n ): Promise<string> {\n const res = await this.gerritHttp.getJson(\n 'a/config/server/version',\n options,\n z.string(),\n );\n return res.body;\n }\n\n async getRepos(): Promise<string[]> {\n const res = await this.gerritHttp.getJson(\n 'a/projects/?type=CODE&state=ACTIVE',\n GerritRepos,\n );\n return Object.keys(res.body);\n }\n\n async getProjectInfo(repository: string): Promise<GerritProjectInfo> {\n const projectInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}`,\n GerritProjectInfo,\n );\n if (projectInfo.body.state !== 'ACTIVE') {\n throw new Error(REPOSITORY_ARCHIVED);\n }\n return projectInfo.body;\n }\n\n async getBranchInfo(repository: string): Promise<GerritBranchInfo> {\n const branchInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}/branches/HEAD`,\n GerritBranchInfo,\n );\n return branchInfo.body;\n }\n\n async getBranchChange(\n repository: string,\n config: Pick<\n GerritFindPRConfig,\n 'branchName' | 'state' | 'targetBranch' | 'requestDetails'\n >,\n ): Promise<GerritChange | null> {\n const changes = await this.findChanges(repository, {\n branchName: config.branchName,\n state: config.state,\n singleChange: config.targetBranch ? false : true,\n requestDetails: config.requestDetails,\n });\n\n if (changes.length === 0) {\n return null;\n }\n\n if (changes.length === 1) {\n return changes[0];\n }\n\n // If multiple changes are found, prefer the one matching the target branch\n if (config.targetBranch) {\n const change = changes.find((c) => c.branch === config.targetBranch);\n if (change) {\n return change;\n }\n }\n\n // Otherwise return the first one\n return changes[0];\n }\n\n async findChanges(\n repository: string,\n findPRConfig: GerritFindPRConfig,\n ): Promise<GerritChange[]> {\n const pageLimit = findPRConfig.singleChange\n ? 1\n : (findPRConfig.pageLimit ?? 50);\n\n const query: Record<string, any> = {\n n: pageLimit,\n };\n if (findPRConfig.requestDetails) {\n query.o = findPRConfig.requestDetails;\n }\n\n const filters = this.buildSearchFilters(repository, findPRConfig);\n\n const allChanges: GerritChange[] = [];\n\n while (true) {\n query.S = allChanges.length;\n const queryString = `q=${filters.join('+')}&${getQueryString(query)}`;\n const changes = await this.gerritHttp.getJson(\n `a/changes/?${queryString}`,\n GerritChanges,\n );\n\n logger.trace(\n `findChanges(${queryString},start=${query.S},limit=${query.n}) => ${changes.body.length}`,\n );\n\n const lastChange = changes.body.at(-1);\n let hasMoreChanges = false;\n if (lastChange?._more_changes) {\n hasMoreChanges = true;\n delete lastChange._more_changes;\n }\n\n allChanges.push(...changes.body);\n\n // Honor predicate if it is provided\n if (findPRConfig.shouldFetchNextPage) {\n const shouldContinue = findPRConfig.shouldFetchNextPage(changes.body);\n if (!shouldContinue) {\n break;\n }\n }\n\n if (findPRConfig.singleChange || !hasMoreChanges) {\n break;\n }\n }\n\n return allChanges;\n }\n\n async getChange(\n changeNumber: number,\n requestDetails?: GerritRequestDetail[],\n ): Promise<GerritChange> {\n const queryString = getQueryString({ o: requestDetails });\n const changes = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}?${queryString}`,\n GerritChange,\n );\n return changes.body;\n }\n\n async getMergeableInfo(change: GerritChange): Promise<GerritMergeableInfo> {\n const mergeable = await this.gerritHttp.getJson(\n `a/changes/${change._number}/revisions/current/mergeable`,\n GerritMergeableInfo,\n );\n return mergeable.body;\n }\n\n async abandonChange(\n changeNumber: number,\n message?: string,\n ): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/abandon`,\n {\n body: {\n message,\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n },\n );\n return change.body;\n }\n\n async submitChange(changeNumber: number): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/submit`,\n );\n return change.body;\n }\n\n async getMessages(changeNumber: number): Promise<GerritChangeMessageInfo[]> {\n const messages = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}/messages`,\n GerritChangeMessages,\n );\n return messages.body;\n }\n\n async addMessage(\n changeNumber: number,\n fullMessage: string,\n tag?: string,\n ): Promise<string> {\n const message = this.normalizeMessage(fullMessage);\n const url = `a/changes/${changeNumber}/revisions/current/review`;\n const response = await this.gerritHttp.postJson<GerritReviewResult>(url, {\n body: { message, tag, notify: 'NONE' },\n });\n // change_info is only present on Gerrit >= 3.10\n return response.body.change_info?.updated ?? currentGerritTimestamp();\n }\n\n async checkForExistingMessage(\n changeNumber: number,\n newMessage: string,\n msgType?: string,\n ): Promise<boolean> {\n const messagesToSearch = await this.getMessages(changeNumber);\n\n return messagesToSearch.some(\n (existingMsg) =>\n (msgType === undefined || msgType === existingMsg.tag) &&\n existingMsg.message.includes(newMessage),\n );\n }\n\n async addMessageIfNotAlreadyExists(\n changeNumber: number,\n message: string,\n tag?: string,\n ): Promise<void> {\n const newMsg = this.normalizeMessage(message);\n if (!(await this.checkForExistingMessage(changeNumber, newMsg, tag))) {\n await this.addMessage(changeNumber, newMsg, tag);\n }\n }\n\n async setLabel(\n changeNumber: number,\n label: string,\n value: number,\n ): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n { body: { labels: { [label]: value }, notify: 'NONE' } },\n );\n }\n\n async setHashtags(\n changeNumber: number,\n hashtagsInput: GerritHashtagsInput,\n ): Promise<void> {\n const { add, remove } = hashtagsInput;\n if (isNonEmptyArray(add) || isNonEmptyArray(remove)) {\n await this.gerritHttp.postJson(`a/changes/${changeNumber}/hashtags`, {\n body: { add, remove },\n });\n }\n }\n\n async addReviewers(changeNumber: number, reviewers: string[]): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n {\n body: {\n reviewers: reviewers.map((r) => ({ reviewer: r })),\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n },\n );\n }\n\n async addAssignee(changeNumber: number, assignee: string): Promise<void> {\n await this.gerritHttp.putJson<GerritAccountInfo>(\n // TODO: use CCs instead as Gerrit 3.8+ no longer supports assignees\n `a/changes/${changeNumber}/assignee`,\n {\n body: { assignee },\n },\n );\n }\n\n async getFile(\n repo: string,\n branch: string,\n fileName: string,\n ): Promise<string> {\n const base64Content = await this.gerritHttp.getText(\n `a/projects/${encodeURIComponent(\n repo,\n )}/branches/${encodeURIComponent(branch)}/files/${encodeURIComponent(fileName)}/content`,\n );\n return Buffer.from(base64Content.body, 'base64').toString();\n }\n\n async moveChange(\n changeNumber: number,\n destinationBranch: string,\n ): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/move`,\n {\n body: {\n destination_branch: destinationBranch,\n },\n },\n );\n return change.body;\n }\n\n normalizeMessage(message: string): string {\n // Gerrit would trim it anyway\n let msg = message.trim();\n\n const encoder = new TextEncoder();\n const bytes = encoder.encode(msg);\n if (bytes.length > MAX_GERRIT_COMMENT_SIZE) {\n const truncationNotice = '\\n\\n[Truncated by Renovate]';\n const truncationNoticeBytes = encoder.encode(truncationNotice);\n const maxContentBytes =\n MAX_GERRIT_COMMENT_SIZE - truncationNoticeBytes.length;\n const truncatedBytes = bytes.slice(0, maxContentBytes);\n const decoded = new TextDecoder().decode(truncatedBytes);\n msg = decoded + truncationNotice;\n }\n\n return msg;\n }\n\n private buildSearchFilters(\n repository: string,\n searchConfig: GerritFindPRConfig,\n ): string[] {\n const filters = [\n 'owner:self',\n `project:${repository}`,\n '-is:wip',\n '-is:private',\n ];\n const filterState = mapPrStateToGerritFilter(searchConfig.state);\n if (filterState) {\n filters.push(filterState);\n }\n if (searchConfig.branchName) {\n filters.push(`footer:Renovate-Branch=${searchConfig.branchName}`);\n } else if (semver.gte(this.gerritVersion, '3.6.0')) {\n filters.push('hasfooter:Renovate-Branch');\n } else {\n filters.push('message:\"Renovate-Branch: \"');\n }\n if (searchConfig.targetBranch) {\n filters.push(`branch:${searchConfig.targetBranch}`);\n }\n if (searchConfig.label) {\n filters.push(`label:Code-Review=${searchConfig.label}`);\n }\n if (searchConfig.prTitle) {\n // Quotes in the search operators must be escaped with a backslash:\n // https://gerrit-review.googlesource.com/Documentation/user-search.html#search-operators\n const escapedTitle = searchConfig.prTitle.replaceAll('\"', '\\\\\"');\n if (semver.gte(this.gerritVersion, '3.8.0')) {\n filters.push(`subject:\"${escapedTitle}\"`);\n } else {\n filters.push(`message:\"${escapedTitle}\"`);\n }\n }\n return filters;\n }\n}\n\nexport const client = new GerritClient();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"client.js","names":[],"sources":["../../../../lib/modules/platform/gerrit/client.ts"],"sourcesContent":["import { isNonEmptyArray } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { z } from 'zod/v4';\nimport { REPOSITORY_ARCHIVED } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { GerritHttp } from '../../../util/http/gerrit.ts';\nimport type { HttpOptions } from '../../../util/http/types.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport type {\n GerritAccountInfo,\n GerritChangeMessageInfo,\n GerritReviewResult,\n} from './schema.ts';\nimport {\n GerritBranchInfo,\n GerritChange,\n GerritChangeMessages,\n GerritChanges,\n GerritMergeableInfo,\n GerritProjectInfo,\n GerritRepos,\n} from './schema.ts';\nimport type {\n GerritFindPRConfig,\n GerritHashtagsInput,\n GerritRequestDetail,\n} from './types.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n MIN_GERRIT_VERSION,\n currentGerritTimestamp,\n mapPrStateToGerritFilter,\n} from './utils.ts';\n\nclass GerritClient {\n // memCache is disabled because GerritPrCache provides a smarter caching\n private gerritHttp = new GerritHttp({ memCache: false });\n private gerritVersion = MIN_GERRIT_VERSION;\n\n setGerritVersion(version: string): void {\n this.gerritVersion = version;\n }\n\n async getGerritVersion(\n options: Pick<HttpOptions, 'username' | 'password'>,\n ): Promise<string> {\n const res = await this.gerritHttp.getJson(\n 'a/config/server/version',\n options,\n z.string(),\n );\n return res.body;\n }\n\n async getRepos(): Promise<string[]> {\n const res = await this.gerritHttp.getJson(\n 'a/projects/?type=CODE&state=ACTIVE',\n GerritRepos,\n );\n return Object.keys(res.body);\n }\n\n async getProjectInfo(repository: string): Promise<GerritProjectInfo> {\n const projectInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}`,\n GerritProjectInfo,\n );\n if (projectInfo.body.state !== 'ACTIVE') {\n throw new Error(REPOSITORY_ARCHIVED);\n }\n return projectInfo.body;\n }\n\n async getBranchInfo(repository: string): Promise<GerritBranchInfo> {\n const branchInfo = await this.gerritHttp.getJson(\n `a/projects/${encodeURIComponent(repository)}/branches/HEAD`,\n GerritBranchInfo,\n );\n return branchInfo.body;\n }\n\n async getBranchChange(\n repository: string,\n config: Pick<\n GerritFindPRConfig,\n 'branchName' | 'state' | 'targetBranch' | 'requestDetails'\n >,\n ): Promise<GerritChange | null> {\n const changes = await this.findChanges(repository, {\n branchName: config.branchName,\n state: config.state,\n singleChange: config.targetBranch ? false : true,\n requestDetails: config.requestDetails,\n });\n\n if (changes.length === 0) {\n return null;\n }\n\n if (changes.length === 1) {\n return changes[0];\n }\n\n // If multiple changes are found, prefer the one matching the target branch\n if (config.targetBranch) {\n const change = changes.find((c) => c.branch === config.targetBranch);\n if (change) {\n return change;\n }\n }\n\n // Otherwise return the first one\n return changes[0];\n }\n\n async findChanges(\n repository: string,\n findPRConfig: GerritFindPRConfig,\n ): Promise<GerritChange[]> {\n const pageLimit = findPRConfig.singleChange\n ? 1\n : (findPRConfig.pageLimit ?? 50);\n\n const query: Record<string, any> = {\n n: pageLimit,\n };\n if (findPRConfig.requestDetails) {\n query.o = findPRConfig.requestDetails;\n }\n\n const filters = this.buildSearchFilters(repository, findPRConfig);\n\n const allChanges: GerritChange[] = [];\n\n while (true) {\n query.S = allChanges.length;\n const queryString = `q=${filters.join('+')}&${getQueryString(query)}`;\n const changes = await this.gerritHttp.getJson(\n `a/changes/?${queryString}`,\n GerritChanges,\n );\n\n logger.trace(\n `findChanges(${queryString},start=${query.S},limit=${query.n}) => ${changes.body.length}`,\n );\n\n const lastChange = changes.body.at(-1);\n let hasMoreChanges = false;\n if (lastChange?._more_changes) {\n hasMoreChanges = true;\n delete lastChange._more_changes;\n }\n\n allChanges.push(...changes.body);\n\n // Honor predicate if it is provided\n if (findPRConfig.shouldFetchNextPage) {\n const shouldContinue = findPRConfig.shouldFetchNextPage(changes.body);\n if (!shouldContinue) {\n break;\n }\n }\n\n if (findPRConfig.singleChange || !hasMoreChanges) {\n break;\n }\n }\n\n return allChanges;\n }\n\n async getChange(\n changeNumber: number,\n requestDetails?: GerritRequestDetail[],\n ): Promise<GerritChange> {\n const queryString = getQueryString({ o: requestDetails });\n const changes = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}?${queryString}`,\n GerritChange,\n );\n return changes.body;\n }\n\n async getMergeableInfo(change: GerritChange): Promise<GerritMergeableInfo> {\n const mergeable = await this.gerritHttp.getJson(\n `a/changes/${change._number}/revisions/current/mergeable`,\n GerritMergeableInfo,\n );\n return mergeable.body;\n }\n\n async abandonChange(\n changeNumber: number,\n message?: string,\n ): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/abandon`,\n {\n body: {\n message,\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n },\n );\n return change.body;\n }\n\n async submitChange(changeNumber: number): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/submit`,\n );\n return change.body;\n }\n\n async getMessages(changeNumber: number): Promise<GerritChangeMessageInfo[]> {\n const messages = await this.gerritHttp.getJson(\n `a/changes/${changeNumber}/messages`,\n GerritChangeMessages,\n );\n return messages.body;\n }\n\n async addMessage(\n changeNumber: number,\n fullMessage: string,\n tag?: string,\n ): Promise<string> {\n const message = this.normalizeMessage(fullMessage);\n const url = `a/changes/${changeNumber}/revisions/current/review`;\n const response = await this.gerritHttp.postJson<GerritReviewResult>(url, {\n body: { message, tag, notify: 'NONE' },\n });\n // change_info is only present on Gerrit >= 3.10\n return response.body.change_info?.updated ?? currentGerritTimestamp();\n }\n\n async checkForExistingMessage(\n changeNumber: number,\n newMessage: string,\n msgType?: string,\n ): Promise<boolean> {\n const messagesToSearch = await this.getMessages(changeNumber);\n\n return messagesToSearch.some((existingMsg) => {\n if (msgType !== undefined && msgType !== existingMsg.tag) {\n return false;\n }\n return existingMsg.message.includes(newMessage);\n });\n }\n\n async addMessageIfNotAlreadyExists(\n changeNumber: number,\n message: string,\n tag?: string,\n ): Promise<void> {\n const newMsg = this.normalizeMessage(message);\n if (!(await this.checkForExistingMessage(changeNumber, newMsg, tag))) {\n await this.addMessage(changeNumber, newMsg, tag);\n }\n }\n\n async setLabel(\n changeNumber: number,\n label: string,\n value: number,\n ): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n { body: { labels: { [label]: value }, notify: 'NONE' } },\n );\n }\n\n async setHashtags(\n changeNumber: number,\n hashtagsInput: GerritHashtagsInput,\n ): Promise<void> {\n const { add, remove } = hashtagsInput;\n if (isNonEmptyArray(add) || isNonEmptyArray(remove)) {\n await this.gerritHttp.postJson(`a/changes/${changeNumber}/hashtags`, {\n body: { add, remove },\n });\n }\n }\n\n async addReviewers(changeNumber: number, reviewers: string[]): Promise<void> {\n await this.gerritHttp.postJson(\n `a/changes/${changeNumber}/revisions/current/review`,\n {\n body: {\n reviewers: reviewers.map((r) => ({ reviewer: r })),\n notify: 'OWNER_REVIEWERS', // Avoids notifying cc's\n },\n },\n );\n }\n\n async addAssignee(changeNumber: number, assignee: string): Promise<void> {\n await this.gerritHttp.putJson<GerritAccountInfo>(\n // TODO: use CCs instead as Gerrit 3.8+ no longer supports assignees\n `a/changes/${changeNumber}/assignee`,\n {\n body: { assignee },\n },\n );\n }\n\n async getFile(\n repo: string,\n branch: string,\n fileName: string,\n ): Promise<string> {\n const base64Content = await this.gerritHttp.getText(\n `a/projects/${encodeURIComponent(\n repo,\n )}/branches/${encodeURIComponent(branch)}/files/${encodeURIComponent(fileName)}/content`,\n );\n return Buffer.from(base64Content.body, 'base64').toString();\n }\n\n async moveChange(\n changeNumber: number,\n destinationBranch: string,\n ): Promise<GerritChange> {\n const change = await this.gerritHttp.postJson<GerritChange>(\n `a/changes/${changeNumber}/move`,\n {\n body: {\n destination_branch: destinationBranch,\n },\n },\n );\n return change.body;\n }\n\n normalizeMessage(message: string): string {\n // Gerrit would trim it anyway\n let msg = message.trim();\n\n const encoder = new TextEncoder();\n const bytes = encoder.encode(msg);\n if (bytes.length > MAX_GERRIT_COMMENT_SIZE) {\n const truncationNotice = '\\n\\n[Truncated by Renovate]';\n const truncationNoticeBytes = encoder.encode(truncationNotice);\n const maxContentBytes =\n MAX_GERRIT_COMMENT_SIZE - truncationNoticeBytes.length;\n const truncatedBytes = bytes.slice(0, maxContentBytes);\n const decoded = new TextDecoder().decode(truncatedBytes);\n msg = decoded + truncationNotice;\n }\n\n return msg;\n }\n\n private buildSearchFilters(\n repository: string,\n searchConfig: GerritFindPRConfig,\n ): string[] {\n const filters = [\n 'owner:self',\n `project:${repository}`,\n '-is:wip',\n '-is:private',\n ];\n const filterState = mapPrStateToGerritFilter(searchConfig.state);\n if (filterState) {\n filters.push(filterState);\n }\n if (searchConfig.branchName) {\n filters.push(`footer:Renovate-Branch=${searchConfig.branchName}`);\n } else if (semver.gte(this.gerritVersion, '3.6.0')) {\n filters.push('hasfooter:Renovate-Branch');\n } else {\n filters.push('message:\"Renovate-Branch: \"');\n }\n if (searchConfig.targetBranch) {\n filters.push(`branch:${searchConfig.targetBranch}`);\n }\n if (searchConfig.label) {\n filters.push(`label:Code-Review=${searchConfig.label}`);\n }\n if (searchConfig.prTitle) {\n // Quotes in the search operators must be escaped with a backslash:\n // https://gerrit-review.googlesource.com/Documentation/user-search.html#search-operators\n const escapedTitle = searchConfig.prTitle.replaceAll('\"', '\\\\\"');\n if (semver.gte(this.gerritVersion, '3.8.0')) {\n filters.push(`subject:\"${escapedTitle}\"`);\n } else {\n filters.push(`message:\"${escapedTitle}\"`);\n }\n }\n return filters;\n }\n}\n\nexport const client = new GerritClient();\n"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ import { regEx } from "../../../util/regex.js";
|
|
|
5
5
|
import { logger } from "../../../logger/index.js";
|
|
6
6
|
import { clone } from "../../../util/clone.js";
|
|
7
7
|
import { ensureTrailingSlash } from "../../../util/url.js";
|
|
8
|
+
import { isConflict, isNotFound } from "../../../util/http/status.js";
|
|
8
9
|
import { parseJson } from "../../../util/common.js";
|
|
9
10
|
import { toLongCommitSha } from "../../../util/schema-utils/git.js";
|
|
10
11
|
import { initRepo as initRepo$1, setVirtualBranch } from "../../../util/git/index.js";
|
|
@@ -171,7 +172,7 @@ async function getPr(number) {
|
|
|
171
172
|
pr = mapGerritChangeToPr(change);
|
|
172
173
|
if (pr) await GerritPrCache.setPr(config.repository, pr);
|
|
173
174
|
} catch (err) {
|
|
174
|
-
if (err
|
|
175
|
+
if (isNotFound(err)) {
|
|
175
176
|
logger.debug({ number }, "Change not found in Gerrit");
|
|
176
177
|
return null;
|
|
177
178
|
}
|
|
@@ -275,7 +276,7 @@ async function mergePr(mergeConfig) {
|
|
|
275
276
|
change = await client.submitChange(mergeConfig.id);
|
|
276
277
|
if (change.status !== "MERGED") return false;
|
|
277
278
|
} catch (err) {
|
|
278
|
-
if (err
|
|
279
|
+
if (isConflict(err)) {
|
|
279
280
|
logger.warn({ err }, "Can't submit the change, because the submit rule doesn't allow it.");
|
|
280
281
|
return false;
|
|
281
282
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":["git.initRepo","git.setVirtualBranch"],"sources":["../../../../lib/modules/platform/gerrit/index.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport type { VirtualBranch } from '../../../util/git/types.ts';\nimport { setBaseUrl } from '../../../util/http/gerrit.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { toLongCommitSha } from '../../../util/schema-utils/git.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { hashBody } from '../pr-body.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfigByContent,\n EnsureCommentRemovalConfigByTopic,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { readOnlyIssueBody } from '../utils/read-only-issue-body.ts';\nimport { client } from './client.ts';\nimport { GerritPrCache } from './pr-cache.ts';\nimport type {\n GerritChange,\n GerritLabels,\n GerritProjectInfo,\n} from './schema.ts';\nimport { configureScm, pushForReview } from './scm.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n REQUEST_DETAILS_FOR_PRS,\n TAG_PULL_REQUEST_BODY,\n convertGerritDateToISO,\n extractSourceBranch,\n getGerritRepoUrl,\n mapBranchStatusToLabel,\n mapGerritChangeToPr,\n prStateMatchesFilter,\n} from './utils.ts';\n\nexport const id = 'gerrit';\nexport const experimental = true;\n\nconst defaults: {\n endpoint?: string;\n} = {};\n\nlet config: {\n repository?: string;\n head?: string;\n config?: GerritProjectInfo;\n labels: GerritLabels;\n gerritUsername?: string;\n} = {\n labels: {},\n};\n\nexport function writeToConfig(newConfig: typeof config): void {\n config = { ...config, ...newConfig };\n}\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n}: PlatformParams): Promise<PlatformResult> {\n logger.debug(`initPlatform(${endpoint!}, ${username!})`);\n if (!endpoint) {\n throw new Error('Init: You must configure a Gerrit Server endpoint');\n }\n if (!(username && password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n config.gerritUsername = username;\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n\n let gerritVersion: string;\n try {\n const env = getEnv();\n /* v8 ignore if: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n gerritVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } else {\n gerritVersion = await client.getGerritVersion({\n username,\n password,\n });\n }\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Gerrit. Check your credentials',\n );\n throw new Error('Init: Authentication failure');\n }\n\n logger.debug(`Gerrit version is: ${gerritVersion}`);\n // Example: 3.13.0-rc3-148-gb478dbbb57\n const parsed = semver.parse(gerritVersion);\n if (!parsed) {\n throw new Error(`Unable to parse Gerrit version: ${gerritVersion}`);\n }\n gerritVersion = `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n client.setGerritVersion(gerritVersion);\n\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n return platformConfig;\n}\n\n/**\n * Get all state=\"ACTIVE\" and type=\"CODE\" repositories from gerrit\n */\nexport async function getRepos(): Promise<string[]> {\n logger.debug(`getRepos()`);\n return await client.getRepos();\n}\n\n/**\n * Clone repository to local directory\n * @param config\n */\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(${repository}, ${gitUrl})`);\n const projectInfo = await client.getProjectInfo(repository);\n const branchInfo = await client.getBranchInfo(repository);\n\n config = {\n ...config,\n repository,\n head: branchInfo.revision,\n config: projectInfo,\n labels: coerceObject(projectInfo.labels),\n };\n\n // Abandon all changes voted with Code-Review -2\n // The GerritPrCache cannot be used here otherwise initializeCaches(), which is not called yet, would erase it later\n const rejectedChanges = await client.findChanges(repository, {\n branchName: '',\n state: 'open',\n label: '-2',\n });\n for (const change of rejectedChanges) {\n await client.abandonChange(\n change._number,\n 'This change has been abandoned as it was voted with Code-Review -2.',\n );\n logger.info(\n `Abandoned change ${change._number} with Code-Review -2 in repository ${repository}`,\n );\n }\n\n // Collect open Gerrit changes to initialize as virtual branches.\n // This allows DefaultGitScm to treat them as regular Git branches.\n const openChanges = await client.findChanges(repository, {\n branchName: '',\n state: 'open',\n requestDetails: ['CURRENT_REVISION', 'COMMIT_FOOTERS'],\n });\n const virtualBranches: Record<string, VirtualBranch> = {};\n for (const change of openChanges) {\n const branchName = extractSourceBranch(change);\n if (!branchName) {\n continue;\n }\n const sha = toLongCommitSha(change.current_revision);\n const ref = change.revisions![sha].ref;\n virtualBranches[branchName] = { ref, sha };\n }\n\n const virtualBranchCount = Object.keys(virtualBranches).length;\n if (virtualBranchCount > 0) {\n logger.debug(\n `Will fetch ${virtualBranchCount} Gerrit changes as virtual branches`,\n );\n }\n\n const baseUrl = defaults.endpoint!;\n const url = getGerritRepoUrl(\n repository,\n baseUrl,\n gitUrl,\n config.gerritUsername!,\n );\n configureScm(repository, config.labels);\n await git.initRepo({\n url,\n cloneSubmodules,\n cloneSubmodulesFilter,\n virtualBranches,\n });\n\n const repoConfig: RepoResult = {\n defaultBranch: config.head!,\n isFork: false,\n repoFingerprint: repoFingerprint(repository, baseUrl),\n };\n return repoConfig;\n}\n\nexport async function findPr(findPRConfig: FindPRConfig): Promise<Pr | null> {\n const prs = await GerritPrCache.getPrs(config.repository!);\n // Find matching PR from cache\n const cached = prs.find((pr) => {\n if (\n findPRConfig.branchName &&\n pr.sourceBranch !== findPRConfig.branchName\n ) {\n return false;\n }\n if (\n findPRConfig.targetBranch &&\n pr.targetBranch !== findPRConfig.targetBranch\n ) {\n return false;\n }\n if (findPRConfig.prTitle && pr.title !== findPRConfig.prTitle) {\n return false;\n }\n if (!prStateMatchesFilter(pr.state, findPRConfig.state)) {\n return false;\n }\n return true;\n });\n logger.trace(\n `findPr: using cached gerrit change ${cached?.number} for ${findPRConfig.branchName}`,\n );\n return cached ?? null;\n}\n\nexport async function getPr(number: number): Promise<Pr | null> {\n const prs = await GerritPrCache.getPrs(config.repository!);\n let pr = prs.find((p) => p.number === number) ?? null;\n if (pr) {\n logger.trace(\n `getPr: using cached gerrit change ${pr.sourceBranch} for ${number}`,\n );\n } else {\n logger.debug(\n { number },\n 'PR not found in cached PRs - trying to fetch directly',\n );\n try {\n const change = await client.getChange(number, REQUEST_DETAILS_FOR_PRS);\n pr = mapGerritChangeToPr(change);\n\n // Add to cache for further queries\n if (pr) {\n await GerritPrCache.setPr(config.repository!, pr);\n }\n } catch (err) {\n if (err.statusCode === 404) {\n logger.debug({ number }, 'Change not found in Gerrit');\n return null;\n }\n throw err;\n }\n }\n\n return pr;\n}\n\nexport async function updatePr(prConfig: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prConfig.number}, ${prConfig.prTitle})`);\n const cached = await getPr(prConfig.number);\n if (!cached) {\n logger.warn(\n { number: prConfig.number },\n 'updatePr: change not found in cache or Gerrit',\n );\n return;\n }\n\n const pr = clone(cached);\n let updated = false;\n\n // Only add message if the body has really changed\n const newBodyHash = prConfig.prBody ? hashBody(prConfig.prBody) : undefined;\n if (newBodyHash && newBodyHash !== pr.bodyStruct?.hash) {\n const updatedDate = await client.addMessage(\n prConfig.number,\n prConfig.prBody!,\n TAG_PULL_REQUEST_BODY,\n );\n pr.bodyStruct = {\n hash: newBodyHash,\n };\n pr.updatedAt = convertGerritDateToISO(updatedDate);\n updated = true;\n }\n await client.setHashtags(prConfig.number, {\n add: prConfig.addLabels,\n remove: prConfig.removeLabels,\n });\n if (prConfig.targetBranch) {\n const change = await client.moveChange(\n prConfig.number,\n prConfig.targetBranch,\n );\n pr.targetBranch = change.branch;\n pr.updatedAt = convertGerritDateToISO(change.updated);\n updated = true;\n }\n // TODO: support restoring change if prConfig.state === 'open'\n if (prConfig.state === 'closed') {\n const change = await client.abandonChange(prConfig.number);\n pr.state = 'closed';\n pr.updatedAt = convertGerritDateToISO(change.updated);\n updated = true;\n }\n\n if (updated) {\n logger.debug(\n `updatePr: updating gerrit change ${prConfig.number} in cache`,\n );\n await GerritPrCache.setPr(config.repository!, pr);\n }\n}\n\nexport async function createPr(prConfig: CreatePRConfig): Promise<Pr | null> {\n logger.debug(\n `createPr(${prConfig.sourceBranch}, ${prConfig.prTitle}, ${\n prConfig.labels?.toString() ?? ''\n })`,\n );\n\n logger.debug(\n `Pushing commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n const pushResult = await pushForReview({\n sourceRef: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n files: [],\n autoApprove: prConfig.platformPrOptions?.autoApprove,\n labels: prConfig.labels ?? undefined,\n });\n\n if (!pushResult) {\n throw new Error(\n `Failed to push commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n }\n\n const change = (\n await client.findChanges(config.repository!, {\n branchName: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n state: 'open',\n singleChange: true,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n })\n ).pop();\n if (isUndefined(change)) {\n throw new Error(\n `Could not find the Gerrit change after pushing to refs/for/${prConfig.targetBranch}`,\n );\n }\n\n // Register the virtual branch now that the change exists and we have the ref.\n const sha = toLongCommitSha(change.current_revision);\n const ref = change.revisions![sha].ref;\n await git.setVirtualBranch(prConfig.sourceBranch, ref, sha);\n\n const updatedDate = await client.addMessage(\n change._number,\n prConfig.prBody,\n TAG_PULL_REQUEST_BODY,\n );\n\n const pr = mapGerritChangeToPr(change, {\n sourceBranch: prConfig.sourceBranch,\n prBody: prConfig.prBody,\n })!;\n pr.updatedAt = convertGerritDateToISO(updatedDate);\n logger.debug(`createPr: saving gerrit change ${pr.number} to cache`);\n await GerritPrCache.setPr(config.repository!, pr);\n\n return pr;\n}\n\nexport async function getBranchPr(\n branchName: string,\n targetBranch?: string,\n): Promise<Pr | null> {\n const prs = await GerritPrCache.getPrs(config.repository!);\n const cachedPrs = prs.filter((pr) => {\n if (pr.sourceBranch !== branchName) {\n return false;\n }\n if (pr.state !== 'open') {\n return false;\n }\n return true;\n });\n let result: Pr | undefined;\n if (targetBranch) {\n const found = cachedPrs.find((pr) => pr.targetBranch === targetBranch);\n if (found) {\n result = found;\n }\n }\n result ??= cachedPrs[0];\n logger.trace(\n `getBranchPr: using cached gerrit change ${result?.number} for ${branchName}`,\n );\n return result ?? null;\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n const cached = await GerritPrCache.getPrs(config.repository!);\n logger.debug(`getPrList: using ${cached.length} cached changes`);\n return cached;\n}\n\nexport async function mergePr(mergeConfig: MergePRConfig): Promise<boolean> {\n logger.debug(\n `mergePr(${mergeConfig.id}, ${mergeConfig.branchName!}, ${mergeConfig.strategy!})`,\n );\n\n let change: GerritChange;\n try {\n change = await client.submitChange(mergeConfig.id);\n if (change.status !== 'MERGED') {\n return false;\n }\n } catch (err) {\n if (err.statusCode === 409) {\n logger.warn(\n { err },\n \"Can't submit the change, because the submit rule doesn't allow it.\",\n );\n return false;\n }\n throw err;\n }\n\n const cached = await getPr(mergeConfig.id);\n if (cached) {\n const pr = clone(cached);\n pr.state = 'merged';\n pr.updatedAt = convertGerritDateToISO(change.updated);\n logger.debug(`mergePr: updating gerrit change ${mergeConfig.id} in cache`);\n await GerritPrCache.setPr(config.repository!, pr);\n } else {\n logger.warn(\n { number: mergeConfig.id },\n 'mergePr: merged change but could not update PR cache',\n );\n }\n\n return true;\n}\n\n/**\n * BranchStatus for Gerrit assumes that the branchName refers to a change.\n * @param branchName\n */\nexport async function getBranchStatus(\n branchName: string,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n const change = (\n await client.findChanges(config.repository!, {\n state: 'open',\n branchName,\n singleChange: true,\n requestDetails: ['LABELS', 'SUBMITTABLE', 'CHECK'],\n })\n ).pop();\n if (change) {\n const hasProblems = change.problems && change.problems.length > 0;\n if (hasProblems) {\n return 'red';\n }\n const hasBlockingLabels = Object.values(coerceObject(change.labels)).some(\n (label) => label.blocking,\n );\n if (hasBlockingLabels) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (change.submittable) {\n return 'green';\n }\n }\n return 'yellow';\n}\n\n/**\n * check the gerrit-change for the presence of the corresponding \"$context\" Gerrit label if configured,\n * return 'yellow' if not configured or not set\n * @param branchName\n * @param context renovate/stability-days || ...\n */\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n const labelConfig = config.labels[context];\n if (labelConfig) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n // v8 ignore else -- TODO: add test #40625\n if (change) {\n const label = change.labels![context];\n // v8 ignore else -- TODO: add test #40625\n if (label) {\n // Check for rejected or blocking first, as a label could have both rejected and approved\n if (label.rejected || label.blocking) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (label.approved) {\n return 'green';\n }\n }\n }\n }\n return 'yellow';\n}\n\n/**\n * Apply the branch state $context to the corresponding gerrit label (if available)\n * context === \"renovate/stability-days\" / \"renovate/merge-confidence\" and state === \"green\"/...\n * @param branchStatusConfig\n */\nexport async function setBranchStatus(\n branchStatusConfig: BranchStatusConfig,\n): Promise<void> {\n const label = config.labels[branchStatusConfig.context];\n const labelValue =\n label && mapBranchStatusToLabel(branchStatusConfig.state, label);\n if (branchStatusConfig.context && labelValue) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName: branchStatusConfig.branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n\n const labelKey = branchStatusConfig.context;\n if (!change?.labels || !Object.hasOwn(change.labels, labelKey)) {\n return;\n }\n\n await client.setLabel(change._number, labelKey, labelValue);\n }\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const repo = repoName ?? config.repository;\n if (!repo) {\n logger.debug('No repo so cannot getRawFile');\n return null;\n }\n // v8 ignore next -- TODO: add test #40625\n const branch =\n branchOrTag ??\n (repo === config.repository ? (config.head ?? 'HEAD') : 'HEAD');\n const result = await client.getFile(repo, branch, fileName);\n return result;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function addReviewers(\n number: number,\n reviewers: string[],\n): Promise<void> {\n await client.addReviewers(number, reviewers);\n}\n\n/**\n * add \"CC\" (only one possible)\n */\nexport async function addAssignees(\n number: number,\n assignees: string[],\n): Promise<void> {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length) {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length > 1) {\n logger.debug(\n `addAssignees(${number}, ${assignees.toString()}) called with more then one assignee! Gerrit only supports one assignee! Using the first from list.`,\n );\n }\n await client.addAssignee(number, assignees[0]);\n }\n}\n\nexport async function ensureComment(\n ensureComment: EnsureCommentConfig,\n): Promise<boolean> {\n logger.debug(\n `ensureComment(${ensureComment.number}, ${ensureComment.topic!}, ${\n ensureComment.content\n })`,\n );\n await client.addMessageIfNotAlreadyExists(\n ensureComment.number,\n ensureComment.content,\n ensureComment.topic ?? undefined,\n );\n return true;\n}\n\nexport function massageMarkdown(prBody: string, rebaseLabel: string): string {\n return (\n smartTruncate(readOnlyIssueBody(prBody), maxBodyLength())\n .replace('Branch creation', 'Change creation')\n .replace(\n 'close this Pull Request unmerged',\n 'abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'Close this PR',\n 'Abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'you tick the rebase/retry checkbox',\n `you add the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(\n 'checking the rebase/retry box above',\n `adding the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(regEx(/\\b(?:Pull Request|PR)/g), 'change')\n // Remove HTML tags not supported in Gerrit markdown\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?(?:details|blockquote)>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/<!--renovate-(?:debug|config-hash):.*?-->/g), '')\n // Remove zero-width-space not supported in Gerrit markdown\n .replace(regEx(/​/g), '')\n );\n}\n\nexport function maxBodyLength(): number {\n return MAX_GERRIT_COMMENT_SIZE;\n}\n\nexport async function deleteLabel(\n number: number,\n label: string,\n): Promise<void> {\n await client.setHashtags(number, { remove: [label] });\n}\n\nexport function ensureCommentRemoval(\n _ensureCommentRemoval:\n EnsureCommentRemovalConfigByTopic | EnsureCommentRemovalConfigByContent,\n): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssueClosing(_title: string): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssue(\n _issueConfig: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n return Promise.resolve(null);\n}\n\nexport function findIssue(_title: string): Promise<Issue | null> {\n return Promise.resolve(null);\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n return Promise.resolve([]);\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAwDA,MAAa,KAAK;AAGlB,MAAM,WAEF,CAAC;AAEL,IAAI,SAMA,EACF,QAAQ,CAAC,EACX;AAEA,SAAgB,cAAc,WAAgC;CAC5D,SAAS;EAAE,GAAG;EAAQ,GAAG;CAAU;AACrC;AAEA,eAAsB,aAAa,EACjC,UACA,UACA,YAC0C;CAC1C,OAAO,MAAM,gBAAgB,SAAU,IAAI,SAAU,EAAE;CACvD,IAAI,CAAC,UACH,MAAM,IAAI,MAAM,mDAAmD;CAErE,IAAI,EAAE,YAAY,WAChB,MAAM,IAAI,MACR,4DACF;CAEF,OAAO,iBAAiB;CACxB,SAAS,WAAW,oBAAoB,QAAQ;CAChD,WAAW,SAAS,QAAQ;CAE5B,IAAI;CACJ,IAAI;EACF,MAAM,MAAM,OAAO;;EAEnB,IAAI,IAAI,6BACN,gBAAgB,IAAI;OAEpB,gBAAgB,MAAM,OAAO,iBAAiB;GAC5C;GACA;EACF,CAAC;CAEL,SAAS,KAAK;EACZ,OAAO,MACL,EAAE,IAAI,GACN,0DACF;EACA,MAAM,IAAI,MAAM,8BAA8B;CAChD;CAEA,OAAO,MAAM,sBAAsB,eAAe;CAElD,MAAM,SAAS,OAAO,MAAM,aAAa;CACzC,IAAI,CAAC,QACH,MAAM,IAAI,MAAM,mCAAmC,eAAe;CAEpE,gBAAgB,GAAG,OAAO,MAAM,GAAG,OAAO,MAAM,GAAG,OAAO;CAC1D,OAAO,iBAAiB,aAAa;CAKrC,OAAO,EAFL,UAAU,SAAS,SAED;AACtB;;;;AAKA,eAAsB,WAA8B;CAClD,OAAO,MAAM,YAAY;CACzB,OAAO,MAAM,OAAO,SAAS;AAC/B;;;;;AAMA,eAAsB,SAAS,EAC7B,YACA,iBACA,uBACA,UACkC;CAClC,OAAO,MAAM,YAAY,WAAW,IAAI,OAAO,EAAE;CACjD,MAAM,cAAc,MAAM,OAAO,eAAe,UAAU;CAC1D,MAAM,aAAa,MAAM,OAAO,cAAc,UAAU;CAExD,SAAS;EACP,GAAG;EACH;EACA,MAAM,WAAW;EACjB,QAAQ;EACR,QAAQ,aAAa,YAAY,MAAM;CACzC;CAIA,MAAM,kBAAkB,MAAM,OAAO,YAAY,YAAY;EAC3D,YAAY;EACZ,OAAO;EACP,OAAO;CACT,CAAC;CACD,KAAK,MAAM,UAAU,iBAAiB;EACpC,MAAM,OAAO,cACX,OAAO,SACP,qEACF;EACA,OAAO,KACL,oBAAoB,OAAO,QAAQ,qCAAqC,YAC1E;CACF;CAIA,MAAM,cAAc,MAAM,OAAO,YAAY,YAAY;EACvD,YAAY;EACZ,OAAO;EACP,gBAAgB,CAAC,oBAAoB,gBAAgB;CACvD,CAAC;CACD,MAAM,kBAAiD,CAAC;CACxD,KAAK,MAAM,UAAU,aAAa;EAChC,MAAM,aAAa,oBAAoB,MAAM;EAC7C,IAAI,CAAC,YACH;EAEF,MAAM,MAAM,gBAAgB,OAAO,gBAAgB;EAEnD,gBAAgB,cAAc;GAAE,KADpB,OAAO,UAAW,IAAI,CAAC;GACE;EAAI;CAC3C;CAEA,MAAM,qBAAqB,OAAO,KAAK,eAAe,CAAC,CAAC;CACxD,IAAI,qBAAqB,GACvB,OAAO,MACL,cAAc,mBAAmB,oCACnC;CAGF,MAAM,UAAU,SAAS;CACzB,MAAM,MAAM,iBACV,YACA,SACA,QACA,OAAO,cACT;CACA,aAAa,YAAY,OAAO,MAAM;CACtC,MAAMA,WAAa;EACjB;EACA;EACA;EACA;CACF,CAAC;CAOD,OAAO;EAJL,eAAe,OAAO;EACtB,QAAQ;EACR,iBAAiB,gBAAgB,YAAY,OAAO;CAEtC;AAClB;AAEA,eAAsB,OAAO,cAAgD;CAG3E,MAAM,UAAS,MAFG,cAAc,OAAO,OAAO,UAAW,EAAA,CAEtC,MAAM,OAAO;EAC9B,IACE,aAAa,cACb,GAAG,iBAAiB,aAAa,YAEjC,OAAO;EAET,IACE,aAAa,gBACb,GAAG,iBAAiB,aAAa,cAEjC,OAAO;EAET,IAAI,aAAa,WAAW,GAAG,UAAU,aAAa,SACpD,OAAO;EAET,IAAI,CAAC,qBAAqB,GAAG,OAAO,aAAa,KAAK,GACpD,OAAO;EAET,OAAO;CACT,CAAC;CACD,OAAO,MACL,sCAAsC,QAAQ,OAAO,OAAO,aAAa,YAC3E;CACA,OAAO,UAAU;AACnB;AAEA,eAAsB,MAAM,QAAoC;CAE9D,IAAI,MAAK,MADS,cAAc,OAAO,OAAO,UAAW,EAAA,CAC5C,MAAM,MAAM,EAAE,WAAW,MAAM,KAAK;CACjD,IAAI,IACF,OAAO,MACL,qCAAqC,GAAG,aAAa,OAAO,QAC9D;MACK;EACL,OAAO,MACL,EAAE,OAAO,GACT,uDACF;EACA,IAAI;GACF,MAAM,SAAS,MAAM,OAAO,UAAU,QAAQ,uBAAuB;GACrE,KAAK,oBAAoB,MAAM;GAG/B,IAAI,IACF,MAAM,cAAc,MAAM,OAAO,YAAa,EAAE;EAEpD,SAAS,KAAK;GACZ,IAAI,IAAI,eAAe,KAAK;IAC1B,OAAO,MAAM,EAAE,OAAO,GAAG,4BAA4B;IACrD,OAAO;GACT;GACA,MAAM;EACR;CACF;CAEA,OAAO;AACT;AAEA,eAAsB,SAAS,UAAyC;CACtE,OAAO,MAAM,YAAY,SAAS,OAAO,IAAI,SAAS,QAAQ,EAAE;CAChE,MAAM,SAAS,MAAM,MAAM,SAAS,MAAM;CAC1C,IAAI,CAAC,QAAQ;EACX,OAAO,KACL,EAAE,QAAQ,SAAS,OAAO,GAC1B,+CACF;EACA;CACF;CAEA,MAAM,KAAK,MAAM,MAAM;CACvB,IAAI,UAAU;CAGd,MAAM,cAAc,SAAS,SAAS,SAAS,SAAS,MAAM,IAAI,KAAA;CAClE,IAAI,eAAe,gBAAgB,GAAG,YAAY,MAAM;EACtD,MAAM,cAAc,MAAM,OAAO,WAC/B,SAAS,QACT,SAAS,QACT,qBACF;EACA,GAAG,aAAa,EACd,MAAM,YACR;EACA,GAAG,YAAY,uBAAuB,WAAW;EACjD,UAAU;CACZ;CACA,MAAM,OAAO,YAAY,SAAS,QAAQ;EACxC,KAAK,SAAS;EACd,QAAQ,SAAS;CACnB,CAAC;CACD,IAAI,SAAS,cAAc;EACzB,MAAM,SAAS,MAAM,OAAO,WAC1B,SAAS,QACT,SAAS,YACX;EACA,GAAG,eAAe,OAAO;EACzB,GAAG,YAAY,uBAAuB,OAAO,OAAO;EACpD,UAAU;CACZ;CAEA,IAAI,SAAS,UAAU,UAAU;EAC/B,MAAM,SAAS,MAAM,OAAO,cAAc,SAAS,MAAM;EACzD,GAAG,QAAQ;EACX,GAAG,YAAY,uBAAuB,OAAO,OAAO;EACpD,UAAU;CACZ;CAEA,IAAI,SAAS;EACX,OAAO,MACL,oCAAoC,SAAS,OAAO,UACtD;EACA,MAAM,cAAc,MAAM,OAAO,YAAa,EAAE;CAClD;AACF;AAEA,eAAsB,SAAS,UAA8C;CAC3E,OAAO,MACL,YAAY,SAAS,aAAa,IAAI,SAAS,QAAQ,IACrD,SAAS,QAAQ,SAAS,KAAK,GAChC,EACH;CAEA,OAAO,MACL,8BAA8B,SAAS,aAAa,yBACtD;CASA,IAAI,CAAC,MARoB,cAAc;EACrC,WAAW,SAAS;EACpB,cAAc,SAAS;EACvB,OAAO,CAAC;EACR,aAAa,SAAS,mBAAmB;EACzC,QAAQ,SAAS,UAAU,KAAA;CAC7B,CAAC,GAGC,MAAM,IAAI,MACR,qCAAqC,SAAS,aAAa,yBAC7D;CAGF,MAAM,UACJ,MAAM,OAAO,YAAY,OAAO,YAAa;EAC3C,YAAY,SAAS;EACrB,cAAc,SAAS;EACvB,OAAO;EACP,cAAc;EACd,gBAAgB;CAClB,CAAC,EAAA,CACD,IAAI;CACN,IAAI,YAAY,MAAM,GACpB,MAAM,IAAI,MACR,8DAA8D,SAAS,cACzE;CAIF,MAAM,MAAM,gBAAgB,OAAO,gBAAgB;CACnD,MAAM,MAAM,OAAO,UAAW,IAAI,CAAC;CACnC,MAAMC,iBAAqB,SAAS,cAAc,KAAK,GAAG;CAE1D,MAAM,cAAc,MAAM,OAAO,WAC/B,OAAO,SACP,SAAS,QACT,qBACF;CAEA,MAAM,KAAK,oBAAoB,QAAQ;EACrC,cAAc,SAAS;EACvB,QAAQ,SAAS;CACnB,CAAC;CACD,GAAG,YAAY,uBAAuB,WAAW;CACjD,OAAO,MAAM,kCAAkC,GAAG,OAAO,UAAU;CACnE,MAAM,cAAc,MAAM,OAAO,YAAa,EAAE;CAEhD,OAAO;AACT;AAEA,eAAsB,YACpB,YACA,cACoB;CAEpB,MAAM,aAAY,MADA,cAAc,OAAO,OAAO,UAAW,EAAA,CACnC,QAAQ,OAAO;EACnC,IAAI,GAAG,iBAAiB,YACtB,OAAO;EAET,IAAI,GAAG,UAAU,QACf,OAAO;EAET,OAAO;CACT,CAAC;CACD,IAAI;CACJ,IAAI,cAAc;EAChB,MAAM,QAAQ,UAAU,MAAM,OAAO,GAAG,iBAAiB,YAAY;EACrE,IAAI,OACF,SAAS;CAEb;CACA,WAAW,UAAU;CACrB,OAAO,MACL,2CAA2C,QAAQ,OAAO,OAAO,YACnE;CACA,OAAO,UAAU;AACnB;AAEA,eAAsB,YAA2B;CAC/C,MAAM,SAAS,MAAM,cAAc,OAAO,OAAO,UAAW;CAC5D,OAAO,MAAM,oBAAoB,OAAO,OAAO,gBAAgB;CAC/D,OAAO;AACT;AAEA,eAAsB,QAAQ,aAA8C;CAC1E,OAAO,MACL,WAAW,YAAY,GAAG,IAAI,YAAY,WAAY,IAAI,YAAY,SAAU,EAClF;CAEA,IAAI;CACJ,IAAI;EACF,SAAS,MAAM,OAAO,aAAa,YAAY,EAAE;EACjD,IAAI,OAAO,WAAW,UACpB,OAAO;CAEX,SAAS,KAAK;EACZ,IAAI,IAAI,eAAe,KAAK;GAC1B,OAAO,KACL,EAAE,IAAI,GACN,oEACF;GACA,OAAO;EACT;EACA,MAAM;CACR;CAEA,MAAM,SAAS,MAAM,MAAM,YAAY,EAAE;CACzC,IAAI,QAAQ;EACV,MAAM,KAAK,MAAM,MAAM;EACvB,GAAG,QAAQ;EACX,GAAG,YAAY,uBAAuB,OAAO,OAAO;EACpD,OAAO,MAAM,mCAAmC,YAAY,GAAG,UAAU;EACzE,MAAM,cAAc,MAAM,OAAO,YAAa,EAAE;CAClD,OACE,OAAO,KACL,EAAE,QAAQ,YAAY,GAAG,GACzB,sDACF;CAGF,OAAO;AACT;;;;;AAMA,eAAsB,gBACpB,YACuB;CACvB,OAAO,MAAM,mBAAmB,WAAW,EAAE;CAC7C,MAAM,UACJ,MAAM,OAAO,YAAY,OAAO,YAAa;EAC3C,OAAO;EACP;EACA,cAAc;EACd,gBAAgB;GAAC;GAAU;GAAe;EAAO;CACnD,CAAC,EAAA,CACD,IAAI;CACN,IAAI,QAAQ;EAEV,IADoB,OAAO,YAAY,OAAO,SAAS,SAAS,GAE9D,OAAO;EAKT,IAH0B,OAAO,OAAO,aAAa,OAAO,MAAM,CAAC,CAAC,CAAC,MAClE,UAAU,MAAM,QAEC,GAClB,OAAO;;EAGT,IAAI,OAAO,aACT,OAAO;CAEX;CACA,OAAO;AACT;;;;;;;AAQA,eAAsB,qBACpB,YACA,SAC8B;CAE9B,IADoB,OAAO,OAAO,UACjB;EACf,MAAM,UACJ,MAAM,OAAO,YAAY,OAAO,YAAa;GAC3C;GACA,OAAO;GACP,cAAc;GACd,gBAAgB,CAAC,QAAQ;EAC3B,CAAC,EAAA,CACD,IAAI;;EAEN,IAAI,QAAQ;GACV,MAAM,QAAQ,OAAO,OAAQ;;GAE7B,IAAI,OAAO;IAET,IAAI,MAAM,YAAY,MAAM,UAC1B,OAAO;;IAGT,IAAI,MAAM,UACR,OAAO;GAEX;EACF;CACF;CACA,OAAO;AACT;;;;;;AAOA,eAAsB,gBACpB,oBACe;CACf,MAAM,QAAQ,OAAO,OAAO,mBAAmB;CAC/C,MAAM,aACJ,SAAS,uBAAuB,mBAAmB,OAAO,KAAK;CACjE,IAAI,mBAAmB,WAAW,YAAY;EAC5C,MAAM,UACJ,MAAM,OAAO,YAAY,OAAO,YAAa;GAC3C,YAAY,mBAAmB;GAC/B,OAAO;GACP,cAAc;GACd,gBAAgB,CAAC,QAAQ;EAC3B,CAAC,EAAA,CACD,IAAI;EAEN,MAAM,WAAW,mBAAmB;EACpC,IAAI,CAAC,QAAQ,UAAU,CAAC,OAAO,OAAO,OAAO,QAAQ,QAAQ,GAC3D;EAGF,MAAM,OAAO,SAAS,OAAO,SAAS,UAAU,UAAU;CAC5D;AACF;AAEA,eAAsB,WACpB,UACA,UACA,aACwB;CACxB,MAAM,OAAO,YAAY,OAAO;CAChC,IAAI,CAAC,MAAM;EACT,OAAO,MAAM,8BAA8B;EAC3C,OAAO;CACT;;CAEA,MAAM,SACJ,gBACC,SAAS,OAAO,aAAc,OAAO,QAAQ,SAAU;CAE1D,OAAO,MADc,OAAO,QAAQ,MAAM,QAAQ,QAAQ;AAE5D;AAEA,eAAsB,YACpB,UACA,UACA,aACc;CACd,MAAM,MAAM,MAAM,WAAW,UAAU,UAAU,WAAW;CAC5D,OAAO,UAAU,KAAK,QAAQ;AAChC;AAEA,eAAsB,aACpB,QACA,WACe;CACf,MAAM,OAAO,aAAa,QAAQ,SAAS;AAC7C;;;;AAKA,eAAsB,aACpB,QACA,WACe;;CAEf,IAAI,UAAU,QAAQ;;EAEpB,IAAI,UAAU,SAAS,GACrB,OAAO,MACL,gBAAgB,OAAO,IAAI,UAAU,SAAS,EAAE,oGAClD;EAEF,MAAM,OAAO,YAAY,QAAQ,UAAU,EAAE;CAC/C;AACF;AAEA,eAAsB,cACpB,eACkB;CAClB,OAAO,MACL,iBAAiB,cAAc,OAAO,IAAI,cAAc,MAAO,IAC7D,cAAc,QACf,EACH;CACA,MAAM,OAAO,6BACX,cAAc,QACd,cAAc,SACd,cAAc,SAAS,KAAA,CACzB;CACA,OAAO;AACT;AAEA,SAAgB,gBAAgB,QAAgB,aAA6B;CAC3E,OACE,cAAc,kBAAkB,MAAM,GAAG,cAAc,CAAC,CAAC,CACtD,QAAQ,mBAAmB,iBAAiB,CAAC,CAC7C,QACC,oCACA,iDACF,CAAC,CACA,QACC,iBACA,iDACF,CAAC,CACA,QACC,sCACA,gBAAgB,YAAY,yBAC9B,CAAC,CACA,QACC,uCACA,eAAe,YAAY,yBAC7B,CAAC,CACA,QAAQ,MAAM,wBAAwB,GAAG,QAAQ,CAAC,CAElD,QAAQ,MAAM,eAAe,GAAG,IAAI,CAAC,CACrC,QAAQ,MAAM,8BAA8B,GAAG,EAAE,CAAC,CAClD,QAAQ,MAAM,wCAAwC,GAAG,EAAE,CAAC,CAC5D,QAAQ,MAAM,4CAA4C,GAAG,EAAE,CAAC,CAEhE,QAAQ,MAAM,UAAU,GAAG,EAAE;AAEpC;AAEA,SAAgB,gBAAwB;CACtC,OAAO;AACT;AAEA,eAAsB,YACpB,QACA,OACe;CACf,MAAM,OAAO,YAAY,QAAQ,EAAE,QAAQ,CAAC,KAAK,EAAE,CAAC;AACtD;AAEA,SAAgB,qBACd,uBAEe;CACf,OAAO,QAAQ,QAAQ;AACzB;AAEA,SAAgB,mBAAmB,QAA+B;CAChE,OAAO,QAAQ,QAAQ;AACzB;AAEA,SAAgB,YACd,cACmC;CACnC,OAAO,QAAQ,QAAQ,IAAI;AAC7B;AAEA,SAAgB,UAAU,QAAuC;CAC/D,OAAO,QAAQ,QAAQ,IAAI;AAC7B;AAEA,SAAgB,eAAiC;CAC/C,OAAO,QAAQ,QAAQ,CAAC,CAAC;AAC3B"}
|
|
1
|
+
{"version":3,"file":"index.js","names":["git.initRepo","git.setVirtualBranch"],"sources":["../../../../lib/modules/platform/gerrit/index.ts"],"sourcesContent":["import { isUndefined } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { clone } from '../../../util/clone.ts';\nimport { parseJson } from '../../../util/common.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport * as git from '../../../util/git/index.ts';\nimport type { VirtualBranch } from '../../../util/git/types.ts';\nimport { setBaseUrl } from '../../../util/http/gerrit.ts';\nimport { isConflict, isNotFound } from '../../../util/http/status.ts';\nimport { coerceObject } from '../../../util/object.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { toLongCommitSha } from '../../../util/schema-utils/git.ts';\nimport { ensureTrailingSlash } from '../../../util/url.ts';\nimport { hashBody } from '../pr-body.ts';\nimport type {\n BranchStatusConfig,\n CreatePRConfig,\n EnsureCommentConfig,\n EnsureCommentRemovalConfigByContent,\n EnsureCommentRemovalConfigByTopic,\n EnsureIssueConfig,\n EnsureIssueResult,\n FindPRConfig,\n Issue,\n MergePRConfig,\n PlatformParams,\n PlatformResult,\n Pr,\n RepoParams,\n RepoResult,\n UpdatePrConfig,\n} from '../types.ts';\nimport { repoFingerprint } from '../util.ts';\nimport { smartTruncate } from '../utils/pr-body.ts';\nimport { readOnlyIssueBody } from '../utils/read-only-issue-body.ts';\nimport { client } from './client.ts';\nimport { GerritPrCache } from './pr-cache.ts';\nimport type {\n GerritChange,\n GerritLabels,\n GerritProjectInfo,\n} from './schema.ts';\nimport { configureScm, pushForReview } from './scm.ts';\nimport {\n MAX_GERRIT_COMMENT_SIZE,\n REQUEST_DETAILS_FOR_PRS,\n TAG_PULL_REQUEST_BODY,\n convertGerritDateToISO,\n extractSourceBranch,\n getGerritRepoUrl,\n mapBranchStatusToLabel,\n mapGerritChangeToPr,\n prStateMatchesFilter,\n} from './utils.ts';\n\nexport const id = 'gerrit';\nexport const experimental = true;\n\nconst defaults: {\n endpoint?: string;\n} = {};\n\nlet config: {\n repository?: string;\n head?: string;\n config?: GerritProjectInfo;\n labels: GerritLabels;\n gerritUsername?: string;\n} = {\n labels: {},\n};\n\nexport function writeToConfig(newConfig: typeof config): void {\n config = { ...config, ...newConfig };\n}\n\nexport async function initPlatform({\n endpoint,\n username,\n password,\n}: PlatformParams): Promise<PlatformResult> {\n logger.debug(`initPlatform(${endpoint!}, ${username!})`);\n if (!endpoint) {\n throw new Error('Init: You must configure a Gerrit Server endpoint');\n }\n if (!(username && password)) {\n throw new Error(\n 'Init: You must configure a Gerrit Server username/password',\n );\n }\n config.gerritUsername = username;\n defaults.endpoint = ensureTrailingSlash(endpoint);\n setBaseUrl(defaults.endpoint);\n\n let gerritVersion: string;\n try {\n const env = getEnv();\n /* v8 ignore if: experimental feature */\n if (env.RENOVATE_X_PLATFORM_VERSION) {\n gerritVersion = env.RENOVATE_X_PLATFORM_VERSION;\n } else {\n gerritVersion = await client.getGerritVersion({\n username,\n password,\n });\n }\n } catch (err) {\n logger.debug(\n { err },\n 'Error authenticating with Gerrit. Check your credentials',\n );\n throw new Error('Init: Authentication failure');\n }\n\n logger.debug(`Gerrit version is: ${gerritVersion}`);\n // Example: 3.13.0-rc3-148-gb478dbbb57\n const parsed = semver.parse(gerritVersion);\n if (!parsed) {\n throw new Error(`Unable to parse Gerrit version: ${gerritVersion}`);\n }\n gerritVersion = `${parsed.major}.${parsed.minor}.${parsed.patch}`;\n client.setGerritVersion(gerritVersion);\n\n const platformConfig: PlatformResult = {\n endpoint: defaults.endpoint,\n };\n return platformConfig;\n}\n\n/**\n * Get all state=\"ACTIVE\" and type=\"CODE\" repositories from gerrit\n */\nexport async function getRepos(): Promise<string[]> {\n logger.debug(`getRepos()`);\n return await client.getRepos();\n}\n\n/**\n * Clone repository to local directory\n * @param config\n */\nexport async function initRepo({\n repository,\n cloneSubmodules,\n cloneSubmodulesFilter,\n gitUrl,\n}: RepoParams): Promise<RepoResult> {\n logger.debug(`initRepo(${repository}, ${gitUrl})`);\n const projectInfo = await client.getProjectInfo(repository);\n const branchInfo = await client.getBranchInfo(repository);\n\n config = {\n ...config,\n repository,\n head: branchInfo.revision,\n config: projectInfo,\n labels: coerceObject(projectInfo.labels),\n };\n\n // Abandon all changes voted with Code-Review -2\n // The GerritPrCache cannot be used here otherwise initializeCaches(), which is not called yet, would erase it later\n const rejectedChanges = await client.findChanges(repository, {\n branchName: '',\n state: 'open',\n label: '-2',\n });\n for (const change of rejectedChanges) {\n await client.abandonChange(\n change._number,\n 'This change has been abandoned as it was voted with Code-Review -2.',\n );\n logger.info(\n `Abandoned change ${change._number} with Code-Review -2 in repository ${repository}`,\n );\n }\n\n // Collect open Gerrit changes to initialize as virtual branches.\n // This allows DefaultGitScm to treat them as regular Git branches.\n const openChanges = await client.findChanges(repository, {\n branchName: '',\n state: 'open',\n requestDetails: ['CURRENT_REVISION', 'COMMIT_FOOTERS'],\n });\n const virtualBranches: Record<string, VirtualBranch> = {};\n for (const change of openChanges) {\n const branchName = extractSourceBranch(change);\n if (!branchName) {\n continue;\n }\n const sha = toLongCommitSha(change.current_revision);\n const ref = change.revisions![sha].ref;\n virtualBranches[branchName] = { ref, sha };\n }\n\n const virtualBranchCount = Object.keys(virtualBranches).length;\n if (virtualBranchCount > 0) {\n logger.debug(\n `Will fetch ${virtualBranchCount} Gerrit changes as virtual branches`,\n );\n }\n\n const baseUrl = defaults.endpoint!;\n const url = getGerritRepoUrl(\n repository,\n baseUrl,\n gitUrl,\n config.gerritUsername!,\n );\n configureScm(repository, config.labels);\n await git.initRepo({\n url,\n cloneSubmodules,\n cloneSubmodulesFilter,\n virtualBranches,\n });\n\n const repoConfig: RepoResult = {\n defaultBranch: config.head!,\n isFork: false,\n repoFingerprint: repoFingerprint(repository, baseUrl),\n };\n return repoConfig;\n}\n\nexport async function findPr(findPRConfig: FindPRConfig): Promise<Pr | null> {\n const prs = await GerritPrCache.getPrs(config.repository!);\n // Find matching PR from cache\n const cached = prs.find((pr) => {\n if (\n findPRConfig.branchName &&\n pr.sourceBranch !== findPRConfig.branchName\n ) {\n return false;\n }\n if (\n findPRConfig.targetBranch &&\n pr.targetBranch !== findPRConfig.targetBranch\n ) {\n return false;\n }\n if (findPRConfig.prTitle && pr.title !== findPRConfig.prTitle) {\n return false;\n }\n if (!prStateMatchesFilter(pr.state, findPRConfig.state)) {\n return false;\n }\n return true;\n });\n logger.trace(\n `findPr: using cached gerrit change ${cached?.number} for ${findPRConfig.branchName}`,\n );\n return cached ?? null;\n}\n\nexport async function getPr(number: number): Promise<Pr | null> {\n const prs = await GerritPrCache.getPrs(config.repository!);\n let pr = prs.find((p) => p.number === number) ?? null;\n if (pr) {\n logger.trace(\n `getPr: using cached gerrit change ${pr.sourceBranch} for ${number}`,\n );\n } else {\n logger.debug(\n { number },\n 'PR not found in cached PRs - trying to fetch directly',\n );\n try {\n const change = await client.getChange(number, REQUEST_DETAILS_FOR_PRS);\n pr = mapGerritChangeToPr(change);\n\n // Add to cache for further queries\n if (pr) {\n await GerritPrCache.setPr(config.repository!, pr);\n }\n } catch (err) {\n if (isNotFound(err)) {\n logger.debug({ number }, 'Change not found in Gerrit');\n return null;\n }\n throw err;\n }\n }\n\n return pr;\n}\n\nexport async function updatePr(prConfig: UpdatePrConfig): Promise<void> {\n logger.debug(`updatePr(${prConfig.number}, ${prConfig.prTitle})`);\n const cached = await getPr(prConfig.number);\n if (!cached) {\n logger.warn(\n { number: prConfig.number },\n 'updatePr: change not found in cache or Gerrit',\n );\n return;\n }\n\n const pr = clone(cached);\n let updated = false;\n\n // Only add message if the body has really changed\n const newBodyHash = prConfig.prBody ? hashBody(prConfig.prBody) : undefined;\n if (newBodyHash && newBodyHash !== pr.bodyStruct?.hash) {\n const updatedDate = await client.addMessage(\n prConfig.number,\n prConfig.prBody!,\n TAG_PULL_REQUEST_BODY,\n );\n pr.bodyStruct = {\n hash: newBodyHash,\n };\n pr.updatedAt = convertGerritDateToISO(updatedDate);\n updated = true;\n }\n await client.setHashtags(prConfig.number, {\n add: prConfig.addLabels,\n remove: prConfig.removeLabels,\n });\n if (prConfig.targetBranch) {\n const change = await client.moveChange(\n prConfig.number,\n prConfig.targetBranch,\n );\n pr.targetBranch = change.branch;\n pr.updatedAt = convertGerritDateToISO(change.updated);\n updated = true;\n }\n // TODO: support restoring change if prConfig.state === 'open'\n if (prConfig.state === 'closed') {\n const change = await client.abandonChange(prConfig.number);\n pr.state = 'closed';\n pr.updatedAt = convertGerritDateToISO(change.updated);\n updated = true;\n }\n\n if (updated) {\n logger.debug(\n `updatePr: updating gerrit change ${prConfig.number} in cache`,\n );\n await GerritPrCache.setPr(config.repository!, pr);\n }\n}\n\nexport async function createPr(prConfig: CreatePRConfig): Promise<Pr | null> {\n logger.debug(\n `createPr(${prConfig.sourceBranch}, ${prConfig.prTitle}, ${\n prConfig.labels?.toString() ?? ''\n })`,\n );\n\n logger.debug(\n `Pushing commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n const pushResult = await pushForReview({\n sourceRef: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n files: [],\n autoApprove: prConfig.platformPrOptions?.autoApprove,\n labels: prConfig.labels ?? undefined,\n });\n\n if (!pushResult) {\n throw new Error(\n `Failed to push commit to refs/for/${prConfig.targetBranch} to create Gerrit change`,\n );\n }\n\n const change = (\n await client.findChanges(config.repository!, {\n branchName: prConfig.sourceBranch,\n targetBranch: prConfig.targetBranch,\n state: 'open',\n singleChange: true,\n requestDetails: REQUEST_DETAILS_FOR_PRS,\n })\n ).pop();\n if (isUndefined(change)) {\n throw new Error(\n `Could not find the Gerrit change after pushing to refs/for/${prConfig.targetBranch}`,\n );\n }\n\n // Register the virtual branch now that the change exists and we have the ref.\n const sha = toLongCommitSha(change.current_revision);\n const ref = change.revisions![sha].ref;\n await git.setVirtualBranch(prConfig.sourceBranch, ref, sha);\n\n const updatedDate = await client.addMessage(\n change._number,\n prConfig.prBody,\n TAG_PULL_REQUEST_BODY,\n );\n\n const pr = mapGerritChangeToPr(change, {\n sourceBranch: prConfig.sourceBranch,\n prBody: prConfig.prBody,\n })!;\n pr.updatedAt = convertGerritDateToISO(updatedDate);\n logger.debug(`createPr: saving gerrit change ${pr.number} to cache`);\n await GerritPrCache.setPr(config.repository!, pr);\n\n return pr;\n}\n\nexport async function getBranchPr(\n branchName: string,\n targetBranch?: string,\n): Promise<Pr | null> {\n const prs = await GerritPrCache.getPrs(config.repository!);\n const cachedPrs = prs.filter((pr) => {\n if (pr.sourceBranch !== branchName) {\n return false;\n }\n if (pr.state !== 'open') {\n return false;\n }\n return true;\n });\n let result: Pr | undefined;\n if (targetBranch) {\n const found = cachedPrs.find((pr) => pr.targetBranch === targetBranch);\n if (found) {\n result = found;\n }\n }\n result ??= cachedPrs[0];\n logger.trace(\n `getBranchPr: using cached gerrit change ${result?.number} for ${branchName}`,\n );\n return result ?? null;\n}\n\nexport async function getPrList(): Promise<Pr[]> {\n const cached = await GerritPrCache.getPrs(config.repository!);\n logger.debug(`getPrList: using ${cached.length} cached changes`);\n return cached;\n}\n\nexport async function mergePr(mergeConfig: MergePRConfig): Promise<boolean> {\n logger.debug(\n `mergePr(${mergeConfig.id}, ${mergeConfig.branchName!}, ${mergeConfig.strategy!})`,\n );\n\n let change: GerritChange;\n try {\n change = await client.submitChange(mergeConfig.id);\n if (change.status !== 'MERGED') {\n return false;\n }\n } catch (err) {\n if (isConflict(err)) {\n logger.warn(\n { err },\n \"Can't submit the change, because the submit rule doesn't allow it.\",\n );\n return false;\n }\n throw err;\n }\n\n const cached = await getPr(mergeConfig.id);\n if (cached) {\n const pr = clone(cached);\n pr.state = 'merged';\n pr.updatedAt = convertGerritDateToISO(change.updated);\n logger.debug(`mergePr: updating gerrit change ${mergeConfig.id} in cache`);\n await GerritPrCache.setPr(config.repository!, pr);\n } else {\n logger.warn(\n { number: mergeConfig.id },\n 'mergePr: merged change but could not update PR cache',\n );\n }\n\n return true;\n}\n\n/**\n * BranchStatus for Gerrit assumes that the branchName refers to a change.\n * @param branchName\n */\nexport async function getBranchStatus(\n branchName: string,\n): Promise<BranchStatus> {\n logger.debug(`getBranchStatus(${branchName})`);\n const change = (\n await client.findChanges(config.repository!, {\n state: 'open',\n branchName,\n singleChange: true,\n requestDetails: ['LABELS', 'SUBMITTABLE', 'CHECK'],\n })\n ).pop();\n if (change) {\n const hasProblems = change.problems && change.problems.length > 0;\n if (hasProblems) {\n return 'red';\n }\n const hasBlockingLabels = Object.values(coerceObject(change.labels)).some(\n (label) => label.blocking,\n );\n if (hasBlockingLabels) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (change.submittable) {\n return 'green';\n }\n }\n return 'yellow';\n}\n\n/**\n * check the gerrit-change for the presence of the corresponding \"$context\" Gerrit label if configured,\n * return 'yellow' if not configured or not set\n * @param branchName\n * @param context renovate/stability-days || ...\n */\nexport async function getBranchStatusCheck(\n branchName: string,\n context: string,\n): Promise<BranchStatus | null> {\n const labelConfig = config.labels[context];\n if (labelConfig) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n // v8 ignore else -- TODO: add test #40625\n if (change) {\n const label = change.labels![context];\n // v8 ignore else -- TODO: add test #40625\n if (label) {\n // Check for rejected or blocking first, as a label could have both rejected and approved\n if (label.rejected || label.blocking) {\n return 'red';\n }\n // v8 ignore else -- TODO: add test #40625\n if (label.approved) {\n return 'green';\n }\n }\n }\n }\n return 'yellow';\n}\n\n/**\n * Apply the branch state $context to the corresponding gerrit label (if available)\n * context === \"renovate/stability-days\" / \"renovate/merge-confidence\" and state === \"green\"/...\n * @param branchStatusConfig\n */\nexport async function setBranchStatus(\n branchStatusConfig: BranchStatusConfig,\n): Promise<void> {\n const label = config.labels[branchStatusConfig.context];\n const labelValue =\n label && mapBranchStatusToLabel(branchStatusConfig.state, label);\n if (branchStatusConfig.context && labelValue) {\n const change = (\n await client.findChanges(config.repository!, {\n branchName: branchStatusConfig.branchName,\n state: 'open',\n singleChange: true,\n requestDetails: ['LABELS'],\n })\n ).pop();\n\n const labelKey = branchStatusConfig.context;\n if (!change?.labels || !Object.hasOwn(change.labels, labelKey)) {\n return;\n }\n\n await client.setLabel(change._number, labelKey, labelValue);\n }\n}\n\nexport async function getRawFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<string | null> {\n const repo = repoName ?? config.repository;\n if (!repo) {\n logger.debug('No repo so cannot getRawFile');\n return null;\n }\n // v8 ignore next -- TODO: add test #40625\n const branch =\n branchOrTag ??\n (repo === config.repository ? (config.head ?? 'HEAD') : 'HEAD');\n const result = await client.getFile(repo, branch, fileName);\n return result;\n}\n\nexport async function getJsonFile(\n fileName: string,\n repoName?: string,\n branchOrTag?: string,\n): Promise<any> {\n const raw = await getRawFile(fileName, repoName, branchOrTag);\n return parseJson(raw, fileName);\n}\n\nexport async function addReviewers(\n number: number,\n reviewers: string[],\n): Promise<void> {\n await client.addReviewers(number, reviewers);\n}\n\n/**\n * add \"CC\" (only one possible)\n */\nexport async function addAssignees(\n number: number,\n assignees: string[],\n): Promise<void> {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length) {\n // v8 ignore else -- TODO: add test #40625\n if (assignees.length > 1) {\n logger.debug(\n `addAssignees(${number}, ${assignees.toString()}) called with more then one assignee! Gerrit only supports one assignee! Using the first from list.`,\n );\n }\n await client.addAssignee(number, assignees[0]);\n }\n}\n\nexport async function ensureComment(\n ensureComment: EnsureCommentConfig,\n): Promise<boolean> {\n logger.debug(\n `ensureComment(${ensureComment.number}, ${ensureComment.topic!}, ${\n ensureComment.content\n })`,\n );\n await client.addMessageIfNotAlreadyExists(\n ensureComment.number,\n ensureComment.content,\n ensureComment.topic ?? undefined,\n );\n return true;\n}\n\nexport function massageMarkdown(prBody: string, rebaseLabel: string): string {\n return (\n smartTruncate(readOnlyIssueBody(prBody), maxBodyLength())\n .replace('Branch creation', 'Change creation')\n .replace(\n 'close this Pull Request unmerged',\n 'abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'Close this PR',\n 'Abandon or vote this change with Code-Review -2',\n )\n .replace(\n 'you tick the rebase/retry checkbox',\n `you add the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(\n 'checking the rebase/retry box above',\n `adding the _${rebaseLabel}_ hashtag to this change`,\n )\n .replace(regEx(/\\b(?:Pull Request|PR)/g), 'change')\n // Remove HTML tags not supported in Gerrit markdown\n .replace(regEx(/<\\/?summary>/g), '**')\n .replace(regEx(/<\\/?(?:details|blockquote)>/g), '')\n .replace(regEx(`\\n---\\n\\n.*?<!-- rebase-check -->.*?\\n`), '')\n .replace(regEx(/<!--renovate-(?:debug|config-hash):.*?-->/g), '')\n // Remove zero-width-space not supported in Gerrit markdown\n .replace(regEx(/​/g), '')\n );\n}\n\nexport function maxBodyLength(): number {\n return MAX_GERRIT_COMMENT_SIZE;\n}\n\nexport async function deleteLabel(\n number: number,\n label: string,\n): Promise<void> {\n await client.setHashtags(number, { remove: [label] });\n}\n\nexport function ensureCommentRemoval(\n _ensureCommentRemoval:\n EnsureCommentRemovalConfigByTopic | EnsureCommentRemovalConfigByContent,\n): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssueClosing(_title: string): Promise<void> {\n return Promise.resolve();\n}\n\nexport function ensureIssue(\n _issueConfig: EnsureIssueConfig,\n): Promise<EnsureIssueResult | null> {\n return Promise.resolve(null);\n}\n\nexport function findIssue(_title: string): Promise<Issue | null> {\n return Promise.resolve(null);\n}\n\nexport function getIssueList(): Promise<Issue[]> {\n return Promise.resolve([]);\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { logger } from "../../../logger/index.js";
|
|
2
2
|
import { getQueryString } from "../../../util/url.js";
|
|
3
|
+
import { isNotFound, isOk } from "../../../util/http/status.js";
|
|
3
4
|
import { getCache } from "../../../util/cache/repository/index.js";
|
|
4
5
|
import { Comment, CommitStatus, Issue, Label, PR, Repo, RepoSearchResults, User, Version } from "./schema.js";
|
|
5
6
|
import { API_PATH } from "./utils.js";
|
|
@@ -35,10 +36,10 @@ async function isOrg(http, platform, organization) {
|
|
|
35
36
|
try {
|
|
36
37
|
const url = `${API_PATH}/orgs/${organization}`;
|
|
37
38
|
const res = await http.getJsonUnchecked(url);
|
|
38
|
-
platformCache.orgs[organization] = res
|
|
39
|
-
return res
|
|
39
|
+
platformCache.orgs[organization] = isOk(res);
|
|
40
|
+
return isOk(res);
|
|
40
41
|
} catch (err) {
|
|
41
|
-
if (err
|
|
42
|
+
if (isNotFound(err)) return false;
|
|
42
43
|
throw err;
|
|
43
44
|
}
|
|
44
45
|
}
|
|
@@ -94,7 +95,7 @@ async function getPRByBranch(http, repoPath, base, head, options = {}) {
|
|
|
94
95
|
return (await http.getJson(url, options, PR)).body;
|
|
95
96
|
} catch (err) {
|
|
96
97
|
logger.trace({ err }, "Error while fetching PR");
|
|
97
|
-
if (err
|
|
98
|
+
if (!isNotFound(err)) logger.debug({ err }, "Error while fetching PR");
|
|
98
99
|
return null;
|
|
99
100
|
}
|
|
100
101
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"gitea-helper.js","names":[],"sources":["../../../../lib/modules/platform/gitea/gitea-helper.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { GiteaHttp, GiteaHttpOptions } from '../../../util/http/gitea.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport {\n Branch,\n Comment,\n CommitStatus,\n type CommitStatusType,\n Issue,\n Label,\n PR,\n Repo,\n RepoSearchResults,\n User,\n Version,\n} from './schema.ts';\nimport type {\n CombinedCommitStatus,\n CommentCreateParams,\n CommitStatusCreateParams,\n GiteaPlatformKey,\n IssueCreateParams,\n IssueSearchParams,\n IssueUpdateLabelsParams,\n IssueUpdateParams,\n PRCreateParams,\n PRMergeParams,\n PRUpdateParams,\n PrReviewersParams,\n RepoSearchParams,\n} from './types.ts';\nimport { API_PATH } from './utils.ts';\n\nfunction urlEscape(raw: string): string {\n return encodeURIComponent(raw);\n}\nconst commitStatusStates: CommitStatusType[] = [\n 'unknown',\n 'success',\n 'pending',\n 'warning',\n 'failure',\n 'error',\n];\n\nexport async function getCurrentUser(\n http: GiteaHttp,\n options: GiteaHttpOptions = {},\n): Promise<User> {\n const url = `${API_PATH}/user`;\n const res = await http.getJson(url, options, User);\n return res.body;\n}\n\nexport async function getVersion(\n http: GiteaHttp,\n options: GiteaHttpOptions = {},\n): Promise<string> {\n const url = `${API_PATH}/version`;\n const res = await http.getJson(url, options, Version);\n return res.body.version;\n}\n\nexport async function isOrg(\n http: GiteaHttp,\n platform: GiteaPlatformKey,\n organization: string,\n): Promise<boolean> {\n const repoCache = getCache();\n repoCache.platform ??= {};\n const platformCache = (repoCache.platform[platform] ??= {});\n platformCache.orgs ??= {};\n const cached = platformCache.orgs[organization];\n if (isBoolean(cached)) {\n return cached;\n }\n try {\n const url = `${API_PATH}/orgs/${organization}`;\n const res = await http.getJsonUnchecked(url);\n platformCache.orgs[organization] = res.statusCode === 200;\n return res.statusCode === 200;\n } catch (err) {\n if (err.statusCode === 404) {\n return false;\n }\n // throw other errors\n throw err;\n }\n}\n\nexport async function searchRepos(\n http: GiteaHttp,\n params: RepoSearchParams,\n options?: GiteaHttpOptions,\n): Promise<Repo[]> {\n const query = getQueryString(params);\n const url = `${API_PATH}/repos/search?${query}`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n RepoSearchResults,\n );\n\n if (!res.body.ok) {\n throw new Error(\n 'Unable to search for repositories, ok flag has not been set',\n );\n }\n\n return res.body.data;\n}\n\nexport async function orgListRepos(\n http: GiteaHttp,\n organization: string,\n options?: GiteaHttpOptions,\n): Promise<Repo[]> {\n const url = `${API_PATH}/orgs/${organization}/repos`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Repo),\n );\n\n return res.body;\n}\n\nexport async function getRepo(\n http: GiteaHttp,\n repoPath: string,\n options: GiteaHttpOptions = {},\n): Promise<Repo> {\n const url = `${API_PATH}/repos/${repoPath}`;\n const res = await http.getJson(url, options, Repo);\n return res.body;\n}\n\nexport async function createPR(\n http: GiteaHttp,\n repoPath: string,\n params: PRCreateParams,\n options?: GiteaHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function updatePR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: PRUpdateParams,\n options?: GiteaHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await http.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function closePR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n await updatePR(http, repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function mergePR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: PRMergeParams,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/merge`;\n await http.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function getPR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options: GiteaHttpOptions = {},\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await http.getJson(url, options, PR);\n return res.body;\n}\n\nexport async function getPRByBranch(\n http: GiteaHttp,\n repoPath: string,\n base: string,\n head: string,\n options: GiteaHttpOptions = {},\n): Promise<PR | null> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${base}/${head}`;\n try {\n const res = await http.getJson(url, options, PR);\n return res.body;\n } catch (err) {\n logger.trace({ err }, 'Error while fetching PR');\n if (err.statusCode !== 404) {\n logger.debug({ err }, 'Error while fetching PR');\n }\n return null;\n }\n}\n\nexport async function requestPrReviewers(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: PrReviewersParams,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/requested_reviewers`;\n await http.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function createIssue(\n http: GiteaHttp,\n repoPath: string,\n params: IssueCreateParams,\n options?: GiteaHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssue(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: IssueUpdateParams,\n options?: GiteaHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await http.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssueLabels(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: IssueUpdateLabelsParams,\n options?: GiteaHttpOptions,\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}/labels`;\n const res = await http.putJson(\n url,\n {\n ...options,\n body: params,\n },\n z.array(Label),\n );\n\n return res.body;\n}\n\nexport async function closeIssue(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n await updateIssue(http, repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function searchIssues(\n http: GiteaHttp,\n repoPath: string,\n params: IssueSearchParams,\n options?: GiteaHttpOptions,\n): Promise<Issue[]> {\n const query = getQueryString({ ...params, type: 'issues' });\n const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Issue),\n );\n\n return res.body;\n}\n\nexport async function getIssue(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options: GiteaHttpOptions = {},\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await http.getJson(url, options, Issue);\n return res.body;\n}\n\nexport async function getRepoLabels(\n http: GiteaHttp,\n repoPath: string,\n options: GiteaHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/labels`;\n const res = await http.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function getOrgLabels(\n http: GiteaHttp,\n orgName: string,\n options: GiteaHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/orgs/${orgName}/labels`;\n const res = await http.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function unassignLabel(\n http: GiteaHttp,\n repoPath: string,\n issue: number,\n label: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/labels/${label}`;\n await http.deleteJson(url, options);\n}\n\nexport async function createComment(\n http: GiteaHttp,\n repoPath: string,\n issue: number,\n body: string,\n options?: GiteaHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function updateComment(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n body: string,\n options?: GiteaHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n const res = await http.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function deleteComment(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n await http.deleteJson(url, options);\n}\n\nexport async function getComments(\n http: GiteaHttp,\n repoPath: string,\n issue: number,\n options: GiteaHttpOptions = {},\n): Promise<Comment[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await http.getJson(url, options, z.array(Comment));\n\n return res.body;\n}\n\nexport async function createCommitStatus(\n http: GiteaHttp,\n repoPath: string,\n branchCommit: string,\n params: CommitStatusCreateParams,\n options?: GiteaHttpOptions,\n): Promise<CommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/statuses/${branchCommit}`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n CommitStatus,\n );\n\n return res.body;\n}\n\nexport const toRenovateStatusMapping: Record<CommitStatusType, BranchStatus> = {\n unknown: 'yellow',\n success: 'green',\n pending: 'yellow',\n warning: 'red',\n failure: 'red',\n error: 'red',\n};\n\nexport const toPlatformStatusMapping: Record<BranchStatus, CommitStatusType> = {\n green: 'success',\n yellow: 'pending',\n red: 'failure',\n};\n\nfunction filterStatus(data: CommitStatus[]): CommitStatus[] {\n const ret: Record<string, CommitStatus> = {};\n for (const i of data) {\n if (!ret[i.context] || ret[i.context].id < i.id) {\n ret[i.context] = i;\n }\n }\n return Object.values(ret);\n}\n\nexport async function getCombinedCommitStatus(\n http: GiteaHttp,\n repoPath: string,\n branchName: string,\n options?: GiteaHttpOptions,\n): Promise<CombinedCommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/commits/${urlEscape(\n branchName,\n )}/statuses`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(CommitStatus),\n );\n\n let worstState = 0;\n const statuses = filterStatus(res.body);\n for (const cs of statuses) {\n worstState = Math.max(worstState, commitStatusStates.indexOf(cs.status));\n }\n\n return {\n worstStatus: commitStatusStates[worstState],\n statuses,\n };\n}\n\nexport async function getBranch(\n http: GiteaHttp,\n repoPath: string,\n branchName: string,\n options: GiteaHttpOptions = {},\n): Promise<Branch> {\n const url = `${API_PATH}/repos/${repoPath}/branches/${urlEscape(branchName)}`;\n const res = await http.getJson(url, options, Branch);\n\n return res.body;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"gitea-helper.js","names":[],"sources":["../../../../lib/modules/platform/gitea/gitea-helper.ts"],"sourcesContent":["import { isBoolean } from '@sindresorhus/is';\nimport { z } from 'zod/v4';\nimport { logger } from '../../../logger/index.ts';\nimport type { BranchStatus } from '../../../types/index.ts';\nimport { getCache } from '../../../util/cache/repository/index.ts';\nimport type { GiteaHttp, GiteaHttpOptions } from '../../../util/http/gitea.ts';\nimport { isNotFound, isOk } from '../../../util/http/status.ts';\nimport { getQueryString } from '../../../util/url.ts';\nimport {\n Branch,\n Comment,\n CommitStatus,\n type CommitStatusType,\n Issue,\n Label,\n PR,\n Repo,\n RepoSearchResults,\n User,\n Version,\n} from './schema.ts';\nimport type {\n CombinedCommitStatus,\n CommentCreateParams,\n CommitStatusCreateParams,\n GiteaPlatformKey,\n IssueCreateParams,\n IssueSearchParams,\n IssueUpdateLabelsParams,\n IssueUpdateParams,\n PRCreateParams,\n PRMergeParams,\n PRUpdateParams,\n PrReviewersParams,\n RepoSearchParams,\n} from './types.ts';\nimport { API_PATH } from './utils.ts';\n\nfunction urlEscape(raw: string): string {\n return encodeURIComponent(raw);\n}\nconst commitStatusStates: CommitStatusType[] = [\n 'unknown',\n 'success',\n 'pending',\n 'warning',\n 'failure',\n 'error',\n];\n\nexport async function getCurrentUser(\n http: GiteaHttp,\n options: GiteaHttpOptions = {},\n): Promise<User> {\n const url = `${API_PATH}/user`;\n const res = await http.getJson(url, options, User);\n return res.body;\n}\n\nexport async function getVersion(\n http: GiteaHttp,\n options: GiteaHttpOptions = {},\n): Promise<string> {\n const url = `${API_PATH}/version`;\n const res = await http.getJson(url, options, Version);\n return res.body.version;\n}\n\nexport async function isOrg(\n http: GiteaHttp,\n platform: GiteaPlatformKey,\n organization: string,\n): Promise<boolean> {\n const repoCache = getCache();\n repoCache.platform ??= {};\n const platformCache = (repoCache.platform[platform] ??= {});\n platformCache.orgs ??= {};\n const cached = platformCache.orgs[organization];\n if (isBoolean(cached)) {\n return cached;\n }\n try {\n const url = `${API_PATH}/orgs/${organization}`;\n const res = await http.getJsonUnchecked(url);\n platformCache.orgs[organization] = isOk(res);\n return isOk(res);\n } catch (err) {\n if (isNotFound(err)) {\n return false;\n }\n // throw other errors\n throw err;\n }\n}\n\nexport async function searchRepos(\n http: GiteaHttp,\n params: RepoSearchParams,\n options?: GiteaHttpOptions,\n): Promise<Repo[]> {\n const query = getQueryString(params);\n const url = `${API_PATH}/repos/search?${query}`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n RepoSearchResults,\n );\n\n if (!res.body.ok) {\n throw new Error(\n 'Unable to search for repositories, ok flag has not been set',\n );\n }\n\n return res.body.data;\n}\n\nexport async function orgListRepos(\n http: GiteaHttp,\n organization: string,\n options?: GiteaHttpOptions,\n): Promise<Repo[]> {\n const url = `${API_PATH}/orgs/${organization}/repos`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Repo),\n );\n\n return res.body;\n}\n\nexport async function getRepo(\n http: GiteaHttp,\n repoPath: string,\n options: GiteaHttpOptions = {},\n): Promise<Repo> {\n const url = `${API_PATH}/repos/${repoPath}`;\n const res = await http.getJson(url, options, Repo);\n return res.body;\n}\n\nexport async function createPR(\n http: GiteaHttp,\n repoPath: string,\n params: PRCreateParams,\n options?: GiteaHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function updatePR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: PRUpdateParams,\n options?: GiteaHttpOptions,\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await http.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n PR,\n );\n\n return res.body;\n}\n\nexport async function closePR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n await updatePR(http, repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function mergePR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: PRMergeParams,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/merge`;\n await http.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function getPR(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options: GiteaHttpOptions = {},\n): Promise<PR> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}`;\n const res = await http.getJson(url, options, PR);\n return res.body;\n}\n\nexport async function getPRByBranch(\n http: GiteaHttp,\n repoPath: string,\n base: string,\n head: string,\n options: GiteaHttpOptions = {},\n): Promise<PR | null> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${base}/${head}`;\n try {\n const res = await http.getJson(url, options, PR);\n return res.body;\n } catch (err) {\n logger.trace({ err }, 'Error while fetching PR');\n if (!isNotFound(err)) {\n logger.debug({ err }, 'Error while fetching PR');\n }\n return null;\n }\n}\n\nexport async function requestPrReviewers(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: PrReviewersParams,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/pulls/${idx}/requested_reviewers`;\n await http.postJson(url, {\n ...options,\n body: params,\n });\n}\n\nexport async function createIssue(\n http: GiteaHttp,\n repoPath: string,\n params: IssueCreateParams,\n options?: GiteaHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssue(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: IssueUpdateParams,\n options?: GiteaHttpOptions,\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await http.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Issue,\n );\n\n return res.body;\n}\n\nexport async function updateIssueLabels(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n params: IssueUpdateLabelsParams,\n options?: GiteaHttpOptions,\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}/labels`;\n const res = await http.putJson(\n url,\n {\n ...options,\n body: params,\n },\n z.array(Label),\n );\n\n return res.body;\n}\n\nexport async function closeIssue(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n await updateIssue(http, repoPath, idx, {\n ...options,\n state: 'closed',\n });\n}\n\nexport async function searchIssues(\n http: GiteaHttp,\n repoPath: string,\n params: IssueSearchParams,\n options?: GiteaHttpOptions,\n): Promise<Issue[]> {\n const query = getQueryString({ ...params, type: 'issues' });\n const url = `${API_PATH}/repos/${repoPath}/issues?${query}`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(Issue),\n );\n\n return res.body;\n}\n\nexport async function getIssue(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options: GiteaHttpOptions = {},\n): Promise<Issue> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${idx}`;\n const res = await http.getJson(url, options, Issue);\n return res.body;\n}\n\nexport async function getRepoLabels(\n http: GiteaHttp,\n repoPath: string,\n options: GiteaHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/repos/${repoPath}/labels`;\n const res = await http.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function getOrgLabels(\n http: GiteaHttp,\n orgName: string,\n options: GiteaHttpOptions = {},\n): Promise<Label[]> {\n const url = `${API_PATH}/orgs/${orgName}/labels`;\n const res = await http.getJson(url, options, z.array(Label));\n\n return res.body;\n}\n\nexport async function unassignLabel(\n http: GiteaHttp,\n repoPath: string,\n issue: number,\n label: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/labels/${label}`;\n await http.deleteJson(url, options);\n}\n\nexport async function createComment(\n http: GiteaHttp,\n repoPath: string,\n issue: number,\n body: string,\n options?: GiteaHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function updateComment(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n body: string,\n options?: GiteaHttpOptions,\n): Promise<Comment> {\n const params: CommentCreateParams = { body };\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n const res = await http.patchJson(\n url,\n {\n ...options,\n body: params,\n },\n Comment,\n );\n\n return res.body;\n}\n\nexport async function deleteComment(\n http: GiteaHttp,\n repoPath: string,\n idx: number,\n options?: GiteaHttpOptions,\n): Promise<void> {\n const url = `${API_PATH}/repos/${repoPath}/issues/comments/${idx}`;\n await http.deleteJson(url, options);\n}\n\nexport async function getComments(\n http: GiteaHttp,\n repoPath: string,\n issue: number,\n options: GiteaHttpOptions = {},\n): Promise<Comment[]> {\n const url = `${API_PATH}/repos/${repoPath}/issues/${issue}/comments`;\n const res = await http.getJson(url, options, z.array(Comment));\n\n return res.body;\n}\n\nexport async function createCommitStatus(\n http: GiteaHttp,\n repoPath: string,\n branchCommit: string,\n params: CommitStatusCreateParams,\n options?: GiteaHttpOptions,\n): Promise<CommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/statuses/${branchCommit}`;\n const res = await http.postJson(\n url,\n {\n ...options,\n body: params,\n },\n CommitStatus,\n );\n\n return res.body;\n}\n\nexport const toRenovateStatusMapping: Record<CommitStatusType, BranchStatus> = {\n unknown: 'yellow',\n success: 'green',\n pending: 'yellow',\n warning: 'red',\n failure: 'red',\n error: 'red',\n};\n\nexport const toPlatformStatusMapping: Record<BranchStatus, CommitStatusType> = {\n green: 'success',\n yellow: 'pending',\n red: 'failure',\n};\n\nfunction filterStatus(data: CommitStatus[]): CommitStatus[] {\n const ret: Record<string, CommitStatus> = {};\n for (const i of data) {\n if (!ret[i.context] || ret[i.context].id < i.id) {\n ret[i.context] = i;\n }\n }\n return Object.values(ret);\n}\n\nexport async function getCombinedCommitStatus(\n http: GiteaHttp,\n repoPath: string,\n branchName: string,\n options?: GiteaHttpOptions,\n): Promise<CombinedCommitStatus> {\n const url = `${API_PATH}/repos/${repoPath}/commits/${urlEscape(\n branchName,\n )}/statuses`;\n const res = await http.getJson(\n url,\n {\n ...options,\n paginate: true,\n },\n z.array(CommitStatus),\n );\n\n let worstState = 0;\n const statuses = filterStatus(res.body);\n for (const cs of statuses) {\n worstState = Math.max(worstState, commitStatusStates.indexOf(cs.status));\n }\n\n return {\n worstStatus: commitStatusStates[worstState],\n statuses,\n };\n}\n\nexport async function getBranch(\n http: GiteaHttp,\n repoPath: string,\n branchName: string,\n options: GiteaHttpOptions = {},\n): Promise<Branch> {\n const url = `${API_PATH}/repos/${repoPath}/branches/${urlEscape(branchName)}`;\n const res = await http.getJson(url, options, Branch);\n\n return res.body;\n}\n"],"mappings":"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"}
|
|
@@ -6,6 +6,7 @@ import { coerceArray, deduplicateArray } from "../../../util/array.js";
|
|
|
6
6
|
import { sanitize } from "../../../util/sanitize.js";
|
|
7
7
|
import { logger } from "../../../logger/index.js";
|
|
8
8
|
import { ensureTrailingSlash, joinUrlParts } from "../../../util/url.js";
|
|
9
|
+
import { isConflict, isNotFound } from "../../../util/http/status.js";
|
|
9
10
|
import { parseJson } from "../../../util/common.js";
|
|
10
11
|
import { map } from "../../../util/promises.js";
|
|
11
12
|
import { getBranchCommit, initRepo as initRepo$1 } from "../../../util/git/index.js";
|
|
@@ -65,6 +66,9 @@ function toRenovateIssue(data) {
|
|
|
65
66
|
body: data.body
|
|
66
67
|
};
|
|
67
68
|
}
|
|
69
|
+
function haveLabelsChanged(labels, existingLabelIds) {
|
|
70
|
+
return labels.length !== existingLabelIds.length || labels.some((labelId) => !existingLabelIds.includes(labelId));
|
|
71
|
+
}
|
|
68
72
|
function matchesState(actual, expected) {
|
|
69
73
|
if (expected === "all") return true;
|
|
70
74
|
if (expected.startsWith("!")) return actual !== expected.substring(1);
|
|
@@ -282,7 +286,7 @@ function createPlatform(options) {
|
|
|
282
286
|
try {
|
|
283
287
|
ccs = await getCombinedCommitStatus(http, config.repository, branchName);
|
|
284
288
|
} catch (err) {
|
|
285
|
-
if (err
|
|
289
|
+
if (isNotFound(err)) {
|
|
286
290
|
logger.debug("Received 404 when checking branch status, assuming branch deletion");
|
|
287
291
|
throw new Error(REPOSITORY_CHANGED);
|
|
288
292
|
}
|
|
@@ -323,7 +327,10 @@ function createPlatform(options) {
|
|
|
323
327
|
if (!pr) return null;
|
|
324
328
|
return toRenovatePR(pr, null);
|
|
325
329
|
}
|
|
326
|
-
const pr = (await platform.getPrList()).find((p) =>
|
|
330
|
+
const pr = (await platform.getPrList()).find((p) => {
|
|
331
|
+
if (p.sourceRepo !== config.repository || p.sourceBranch !== branchName || !matchesState(p.state, state)) return false;
|
|
332
|
+
return !title || p.title === title;
|
|
333
|
+
});
|
|
327
334
|
if (pr) logger.debug(`Found PR #${pr.number}`);
|
|
328
335
|
return pr ?? null;
|
|
329
336
|
},
|
|
@@ -366,7 +373,7 @@ function createPlatform(options) {
|
|
|
366
373
|
await prCache.setPr(pr);
|
|
367
374
|
return pr;
|
|
368
375
|
} catch (err) {
|
|
369
|
-
if (err
|
|
376
|
+
if (isConflict(err)) {
|
|
370
377
|
logger.warn({
|
|
371
378
|
prTitle: title,
|
|
372
379
|
sourceBranch
|
|
@@ -494,7 +501,7 @@ function createPlatform(options) {
|
|
|
494
501
|
state: "open"
|
|
495
502
|
});
|
|
496
503
|
const existingLabelIds = coerceArray(existingIssue.labels).map((label) => label.id);
|
|
497
|
-
if (labels && (labels
|
|
504
|
+
if (labels && haveLabelsChanged(labels, existingLabelIds)) await updateIssueLabels(http, config.repository, activeIssue.number, { labels });
|
|
498
505
|
return "updated";
|
|
499
506
|
}
|
|
500
507
|
}
|