renovate 39.176.4 → 40.0.0-next.1
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/migrations/custom/package-rules-migration.js.map +1 -1
- package/dist/config/migrations/migrations-service.d.ts +2 -2
- package/dist/config/migrations/migrations-service.js.map +1 -1
- package/dist/config/migrations/types.d.ts +1 -3
- package/dist/config/migrations/types.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/presets/internal/group.js +0 -1
- package/dist/config/presets/internal/group.js.map +1 -1
- package/dist/config/presets/types.d.ts +4 -4
- package/dist/config/presets/types.js.map +1 -1
- package/dist/config-validator.js.map +1 -1
- package/dist/logger/utils.js +4 -2
- package/dist/logger/utils.js.map +1 -1
- package/dist/modules/datasource/artifactory/index.js +1 -1
- package/dist/modules/datasource/artifactory/index.js.map +1 -1
- package/dist/modules/datasource/conan/index.js +1 -1
- package/dist/modules/datasource/conan/index.js.map +1 -1
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/datasource.d.ts +1 -1
- package/dist/modules/datasource/datasource.js +3 -1
- package/dist/modules/datasource/datasource.js.map +1 -1
- package/dist/modules/datasource/deb/common.d.ts +3 -3
- package/dist/modules/datasource/deb/common.js.map +1 -1
- package/dist/modules/datasource/docker/ecr.js +1 -1
- package/dist/modules/datasource/docker/ecr.js.map +1 -1
- package/dist/modules/datasource/docker/index.js.map +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/nuget/v2.js +1 -1
- package/dist/modules/datasource/nuget/v2.js.map +1 -1
- package/dist/modules/datasource/pod/index.js +1 -2
- package/dist/modules/datasource/pod/index.js.map +1 -1
- package/dist/modules/datasource/rubygems/metadata-cache.js.map +1 -1
- package/dist/modules/datasource/sbt-plugin/index.js +1 -2
- package/dist/modules/datasource/sbt-plugin/index.js.map +1 -1
- package/dist/modules/manager/ansible-galaxy/collections-metadata.js +1 -2
- package/dist/modules/manager/ansible-galaxy/collections-metadata.js.map +1 -1
- package/dist/modules/manager/asdf/upgradeable-tooling.js +4 -4
- package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
- package/dist/modules/manager/batect/extract.js.map +1 -1
- package/dist/modules/manager/bazel/artifacts.js +2 -2
- package/dist/modules/manager/bazel/artifacts.js.map +1 -1
- package/dist/modules/manager/bazel/common.js +1 -2
- package/dist/modules/manager/bazel/common.js.map +1 -1
- package/dist/modules/manager/bazel/parser.js +1 -1
- package/dist/modules/manager/bazel/parser.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/context.d.ts +4 -3
- package/dist/modules/manager/bazel-module/parser/context.js +9 -6
- package/dist/modules/manager/bazel-module/parser/context.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/extension-tags.js +10 -2
- package/dist/modules/manager/bazel-module/parser/extension-tags.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/fragments.d.ts +20 -2
- package/dist/modules/manager/bazel-module/parser/fragments.js +8 -2
- package/dist/modules/manager/bazel-module/parser/fragments.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/index.js +1 -1
- package/dist/modules/manager/bazel-module/parser/index.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/maven.d.ts +16 -0
- package/dist/modules/manager/bazel-module/parser/oci.d.ts +8 -0
- package/dist/modules/manager/bazel-module/parser/oci.js +4 -1
- package/dist/modules/manager/bazel-module/parser/oci.js.map +1 -1
- package/dist/modules/manager/bun/artifacts.js +1 -1
- package/dist/modules/manager/bun/artifacts.js.map +1 -1
- package/dist/modules/manager/bundler/extract.js.map +1 -1
- package/dist/modules/manager/cargo/artifacts.js +1 -1
- package/dist/modules/manager/cargo/artifacts.js.map +1 -1
- package/dist/modules/manager/cargo/extract.js.map +1 -1
- package/dist/modules/manager/cargo/types.d.ts +1 -3
- package/dist/modules/manager/cargo/types.js.map +1 -1
- package/dist/modules/manager/composer/utils.js +4 -4
- package/dist/modules/manager/composer/utils.js.map +1 -1
- package/dist/modules/manager/deps-edn/extract.js +3 -3
- package/dist/modules/manager/deps-edn/extract.js.map +1 -1
- package/dist/modules/manager/deps-edn/types.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +2 -3
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/fingerprint.generated.js +17 -17
- package/dist/modules/manager/fingerprint.generated.js.map +1 -1
- package/dist/modules/manager/flux/types.d.ts +3 -3
- package/dist/modules/manager/flux/types.js.map +1 -1
- package/dist/modules/manager/git-submodules/types.d.ts +2 -2
- package/dist/modules/manager/git-submodules/types.js.map +1 -1
- package/dist/modules/manager/github-actions/extract.js +2 -2
- package/dist/modules/manager/github-actions/extract.js.map +1 -1
- package/dist/modules/manager/glasskube/types.d.ts +2 -2
- package/dist/modules/manager/glasskube/types.js.map +1 -1
- package/dist/modules/manager/gleam/artifacts.js +1 -1
- package/dist/modules/manager/gleam/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/utils.js +6 -2
- package/dist/modules/manager/gradle/utils.js.map +1 -1
- package/dist/modules/manager/haskell-cabal/extract.js +1 -1
- package/dist/modules/manager/haskell-cabal/extract.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/helmfile/extract.js +2 -2
- package/dist/modules/manager/helmfile/extract.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/helmv3/extract.js.map +1 -1
- package/dist/modules/manager/helmv3/utils.js +1 -1
- package/dist/modules/manager/helmv3/utils.js.map +1 -1
- package/dist/modules/manager/homebrew/util.js +1 -2
- package/dist/modules/manager/homebrew/util.js.map +1 -1
- package/dist/modules/manager/jsonnet-bundler/extract.js +1 -1
- package/dist/modules/manager/jsonnet-bundler/extract.js.map +1 -1
- package/dist/modules/manager/leiningen/extract.js +1 -2
- package/dist/modules/manager/leiningen/extract.js.map +1 -1
- package/dist/modules/manager/maven/extract.js.map +1 -1
- package/dist/modules/manager/maven/update.js.map +1 -1
- package/dist/modules/manager/mise/upgradeable-tooling.js +7 -7
- package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
- package/dist/modules/manager/nix/extract.js +1 -1
- package/dist/modules/manager/nix/extract.js.map +1 -1
- package/dist/modules/manager/npm/extract/pnpm.js +1 -1
- package/dist/modules/manager/npm/extract/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/index.js +1 -1
- package/dist/modules/manager/npm/post-update/index.js.map +1 -1
- package/dist/modules/manager/npm/post-update/pnpm.js.map +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js +1 -1
- package/dist/modules/manager/npm/update/dependency/index.js.map +1 -1
- package/dist/modules/manager/nuget/config-formatter.js +1 -2
- package/dist/modules/manager/nuget/config-formatter.js.map +1 -1
- package/dist/modules/manager/nuget/package-tree.js +1 -1
- package/dist/modules/manager/nuget/package-tree.js.map +1 -1
- package/dist/modules/manager/nuget/util.js +2 -2
- package/dist/modules/manager/nuget/util.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +3 -3
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pep621/processors/pdm.js +1 -1
- package/dist/modules/manager/pep621/processors/pdm.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +3 -2
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pip-compile/artifacts.js +8 -2
- package/dist/modules/manager/pip-compile/artifacts.js.map +1 -1
- package/dist/modules/manager/pip-compile/common.d.ts +5 -3
- package/dist/modules/manager/pip-compile/common.js +34 -13
- package/dist/modules/manager/pip-compile/common.js.map +1 -1
- package/dist/modules/manager/pip-compile/extract.js.map +1 -1
- package/dist/modules/manager/pip-compile/types.d.ts +1 -0
- package/dist/modules/manager/pip-compile/types.js.map +1 -1
- package/dist/modules/manager/poetry/artifacts.js +2 -2
- package/dist/modules/manager/poetry/artifacts.js.map +1 -1
- package/dist/modules/manager/pre-commit/types.d.ts +2 -2
- package/dist/modules/manager/pre-commit/types.js.map +1 -1
- package/dist/modules/manager/pub/artifacts.js +1 -1
- package/dist/modules/manager/pub/artifacts.js.map +1 -1
- package/dist/modules/manager/swift/extract.js +1 -2
- package/dist/modules/manager/swift/extract.js.map +1 -1
- package/dist/modules/manager/terraform/extractors/terraform-block/required-provider.js +2 -2
- package/dist/modules/manager/terraform/extractors/terraform-block/required-provider.js.map +1 -1
- package/dist/modules/manager/terraform/hcl/types.d.ts +1 -3
- package/dist/modules/manager/terraform/hcl/types.js.map +1 -1
- package/dist/modules/manager/terraform/lockfile/index.js +1 -1
- package/dist/modules/manager/terraform/lockfile/index.js.map +1 -1
- package/dist/modules/manager/terragrunt/artifacts.js +1 -1
- package/dist/modules/manager/terragrunt/artifacts.js.map +1 -1
- package/dist/modules/manager/types.d.ts +1 -0
- package/dist/modules/manager/types.js.map +1 -1
- package/dist/modules/manager/woodpecker/types.d.ts +2 -2
- package/dist/modules/manager/woodpecker/types.js.map +1 -1
- package/dist/modules/platform/azure/azure-helper.js.map +1 -1
- package/dist/modules/platform/azure/index.js +1 -1
- package/dist/modules/platform/azure/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/utils.js.map +1 -1
- package/dist/modules/platform/bitbucket-server/index.js +2 -2
- package/dist/modules/platform/bitbucket-server/index.js.map +1 -1
- package/dist/modules/platform/gerrit/scm.js +1 -1
- package/dist/modules/platform/gerrit/scm.js.map +1 -1
- package/dist/modules/platform/gitea/index.js +6 -5
- package/dist/modules/platform/gitea/index.js.map +1 -1
- package/dist/modules/platform/gitea/pr-cache.d.ts +3 -2
- package/dist/modules/platform/gitea/pr-cache.js +21 -12
- package/dist/modules/platform/gitea/pr-cache.js.map +1 -1
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/gitlab/index.js +20 -16
- package/dist/modules/platform/gitlab/index.js.map +1 -1
- package/dist/modules/platform/types.d.ts +2 -2
- package/dist/modules/platform/types.js.map +1 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.d.ts +1 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
- package/dist/modules/versioning/generic.d.ts +2 -6
- package/dist/modules/versioning/generic.js.map +1 -1
- package/dist/modules/versioning/gradle/compare.d.ts +2 -2
- package/dist/modules/versioning/gradle/compare.js.map +1 -1
- package/dist/modules/versioning/gradle/index.js +1 -1
- package/dist/modules/versioning/gradle/index.js.map +1 -1
- package/dist/modules/versioning/pvp/range.js +2 -2
- package/dist/modules/versioning/pvp/range.js.map +1 -1
- package/dist/modules/versioning/rpm/index.js +5 -5
- package/dist/modules/versioning/rpm/index.js.map +1 -1
- package/dist/modules/versioning/semver-coerced/index.js +4 -4
- package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
- package/dist/modules/versioning/types.d.ts +1 -3
- package/dist/modules/versioning/types.js.map +1 -1
- package/dist/types/git.d.ts +2 -2
- package/dist/types/git.js.map +1 -1
- package/dist/types/platform/github/index.d.ts +4 -4
- package/dist/types/platform/github/index.js.map +1 -1
- package/dist/types/platform/gitlab/index.d.ts +2 -2
- package/dist/types/platform/gitlab/index.js.map +1 -1
- package/dist/util/assign-keys.d.ts +1 -3
- package/dist/util/assign-keys.js.map +1 -1
- package/dist/util/cache/repository/http-cache.js +1 -1
- package/dist/util/cache/repository/http-cache.js.map +1 -1
- package/dist/util/exec/types.d.ts +2 -2
- package/dist/util/exec/types.js.map +1 -1
- package/dist/util/git/auth.js +1 -1
- package/dist/util/git/auth.js.map +1 -1
- package/dist/util/git/index.d.ts +10 -10
- package/dist/util/git/index.js +22 -26
- package/dist/util/git/index.js.map +1 -1
- package/dist/util/http/bitbucket.js.map +1 -1
- package/dist/util/http/cache/abstract-http-cache-provider.js +1 -1
- package/dist/util/http/cache/abstract-http-cache-provider.js.map +1 -1
- package/dist/util/http/index.js.map +1 -1
- package/dist/util/http/types.d.ts +3 -5
- package/dist/util/http/types.js.map +1 -1
- package/dist/util/pretty-time.js.map +1 -1
- package/dist/util/schema-utils.js.map +1 -1
- package/dist/util/stats.js +1 -0
- package/dist/util/stats.js.map +1 -1
- package/dist/workers/repository/dependency-dashboard.js +2 -2
- package/dist/workers/repository/dependency-dashboard.js.map +1 -1
- package/dist/workers/repository/init/config.d.ts +1 -2
- package/dist/workers/repository/init/config.js +0 -13
- package/dist/workers/repository/init/config.js.map +1 -1
- package/dist/workers/repository/init/merge.d.ts +2 -1
- package/dist/workers/repository/init/merge.js +13 -3
- package/dist/workers/repository/init/merge.js.map +1 -1
- package/dist/workers/repository/model/commit-message.js.map +1 -1
- package/dist/workers/repository/process/vulnerabilities.js +3 -1
- package/dist/workers/repository/process/vulnerabilities.js.map +1 -1
- package/dist/workers/repository/process/write.js +1 -1
- package/dist/workers/repository/process/write.js.map +1 -1
- package/dist/workers/repository/reconfigure/validate.js +3 -1
- package/dist/workers/repository/reconfigure/validate.js.map +1 -1
- package/dist/workers/repository/update/branch/schedule.js +1 -1
- package/dist/workers/repository/update/branch/schedule.js.map +1 -1
- package/dist/workers/repository/update/pr/body/updates-table.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +9 -0
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +28 -24
- package/renovate-schema.json +1 -1
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"vulnerabilities.js","sourceRoot":"","sources":["../../../../lib/workers/repository/process/vulnerabilities.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO #22198\nimport type { Ecosystem, Osv } from '@renovatebot/osv-offline';\nimport { OsvOffline } from '@renovatebot/osv-offline';\nimport is from '@sindresorhus/is';\nimport type { CvssScore } from 'vuln-vects';\nimport { parseCvssVector } from 'vuln-vects';\nimport { getManagerConfig, mergeChildConfig } from '../../../config';\nimport type { PackageRule, RenovateConfig } from '../../../config/types';\nimport { logger } from '../../../logger';\nimport { getDefaultVersioning } from '../../../modules/datasource/common';\nimport type {\n PackageDependency,\n PackageFile,\n} from '../../../modules/manager/types';\nimport type { VersioningApi } from '../../../modules/versioning';\nimport { get as getVersioning } from '../../../modules/versioning';\nimport { sanitizeMarkdown } from '../../../util/markdown';\nimport * as p from '../../../util/promises';\nimport { regEx } from '../../../util/regex';\nimport { titleCase } from '../../../util/string';\nimport type {\n DependencyVulnerabilities,\n SeverityDetails,\n Vulnerability,\n} from './types';\n\nexport class Vulnerabilities {\n private osvOffline: OsvOffline | undefined;\n\n private static readonly datasourceEcosystemMap: Record<\n string,\n Ecosystem | undefined\n > = {\n crate: 'crates.io',\n go: 'Go',\n hackage: 'Hackage',\n hex: 'Hex',\n maven: 'Maven',\n npm: 'npm',\n nuget: 'NuGet',\n packagist: 'Packagist',\n pypi: 'PyPI',\n rubygems: 'RubyGems',\n };\n\n private constructor() {}\n\n private async initialize(): Promise<void> {\n this.osvOffline = await OsvOffline.create();\n }\n\n static async create(): Promise<Vulnerabilities> {\n const instance = new Vulnerabilities();\n await instance.initialize();\n return instance;\n }\n\n async appendVulnerabilityPackageRules(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<void> {\n const dependencyVulnerabilities = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n\n config.packageRules ??= [];\n for (const {\n vulnerabilities,\n versioningApi,\n } of dependencyVulnerabilities) {\n const groupPackageRules: PackageRule[] = [];\n for (const vulnerability of vulnerabilities) {\n const rule = this.vulnerabilityToPackageRules(vulnerability);\n if (is.nullOrUndefined(rule)) {\n continue;\n }\n groupPackageRules.push(rule);\n }\n this.sortByFixedVersion(groupPackageRules, versioningApi);\n\n config.packageRules.push(...groupPackageRules);\n }\n }\n\n async fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<Vulnerability[]> {\n const groups = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n return groups.flatMap((group) => group.vulnerabilities);\n }\n\n private async fetchDependencyVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<DependencyVulnerabilities[]> {\n const managers = Object.keys(packageFiles);\n const allManagerJobs = managers.map((manager) =>\n this.fetchManagerVulnerabilities(config, packageFiles, manager),\n );\n return (await Promise.all(allManagerJobs)).flat();\n }\n\n private async fetchManagerVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n manager: string,\n ): Promise<DependencyVulnerabilities[]> {\n const managerConfig = getManagerConfig(config, manager);\n const queue = packageFiles[manager].map(\n (pFile) => (): Promise<DependencyVulnerabilities[]> =>\n this.fetchManagerPackageFileVulnerabilities(managerConfig, pFile),\n );\n logger.trace(\n { manager, queueLength: queue.length },\n 'fetchManagerVulnerabilities starting',\n );\n const result = (await p.all(queue)).flat();\n logger.trace({ manager }, 'fetchManagerVulnerabilities finished');\n return result;\n }\n\n private async fetchManagerPackageFileVulnerabilities(\n managerConfig: RenovateConfig,\n pFile: PackageFile,\n ): Promise<DependencyVulnerabilities[]> {\n const { packageFile } = pFile;\n const packageFileConfig = mergeChildConfig(managerConfig, pFile);\n const { manager } = packageFileConfig;\n const queue = pFile.deps.map(\n (dep) => (): Promise<DependencyVulnerabilities | null> =>\n this.fetchDependencyVulnerability(packageFileConfig, dep),\n );\n logger.trace(\n { manager, packageFile, queueLength: queue.length },\n 'fetchManagerPackageFileVulnerabilities starting with concurrency',\n );\n\n const result = await p.all(queue);\n logger.trace(\n { packageFile },\n 'fetchManagerPackageFileVulnerabilities finished',\n );\n\n return result.filter(is.truthy);\n }\n\n private async fetchDependencyVulnerability(\n packageFileConfig: RenovateConfig & PackageFile,\n dep: PackageDependency,\n ): Promise<DependencyVulnerabilities | null> {\n const ecosystem = Vulnerabilities.datasourceEcosystemMap[dep.datasource!];\n if (!ecosystem) {\n logger.trace(`Cannot map datasource ${dep.datasource!} to OSV ecosystem`);\n return null;\n }\n\n let packageName = dep.packageName ?? dep.depName!;\n if (ecosystem === 'PyPI') {\n // https://peps.python.org/pep-0503/#normalized-names\n packageName = packageName.toLowerCase().replace(regEx(/[_.-]+/g), '-');\n }\n\n try {\n const osvVulnerabilities = await this.osvOffline?.getVulnerabilities(\n ecosystem,\n packageName,\n );\n if (\n is.nullOrUndefined(osvVulnerabilities) ||\n is.emptyArray(osvVulnerabilities)\n ) {\n logger.trace(\n `No vulnerabilities found in OSV database for ${packageName}`,\n );\n return null;\n }\n\n const depVersion =\n dep.lockedVersion ?? dep.currentVersion ?? dep.currentValue!;\n\n const versioning = dep.versioning ?? getDefaultVersioning(dep.datasource);\n const versioningApi = getVersioning(versioning);\n\n if (!versioningApi.isVersion(depVersion)) {\n logger.debug(\n `Skipping vulnerability lookup for package ${packageName} due to unsupported version ${depVersion}`,\n );\n return null;\n }\n\n const vulnerabilities: Vulnerability[] = [];\n for (const osvVulnerability of osvVulnerabilities) {\n if (osvVulnerability.withdrawn) {\n logger.trace(\n `Skipping withdrawn vulnerability ${osvVulnerability.id}`,\n );\n continue;\n }\n\n for (const affected of osvVulnerability.affected ?? []) {\n const isVulnerable = this.isPackageVulnerable(\n ecosystem,\n packageName,\n depVersion,\n affected,\n versioningApi,\n );\n if (!isVulnerable) {\n continue;\n }\n\n logger.debug(\n `Vulnerability ${osvVulnerability.id} affects ${packageName} ${depVersion}`,\n );\n const fixedVersion = this.getFixedVersion(\n ecosystem,\n depVersion,\n affected,\n versioningApi,\n );\n\n vulnerabilities.push({\n packageName,\n vulnerability: osvVulnerability,\n affected,\n depVersion,\n fixedVersion,\n datasource: dep.datasource!,\n packageFileConfig,\n });\n }\n }\n\n return { vulnerabilities, versioningApi };\n } catch (err) {\n logger.warn(\n { err, packageName },\n 'Error fetching vulnerability information for package',\n );\n return null;\n }\n }\n\n private sortByFixedVersion(\n packageRules: PackageRule[],\n versioningApi: VersioningApi,\n ): void {\n const versionsCleaned: Record<string, string> = {};\n for (const rule of packageRules) {\n const version = rule.allowedVersions as string;\n versionsCleaned[version] = version.replace(regEx(/[(),=> ]+/g), '');\n }\n packageRules.sort((a, b) =>\n versioningApi.sortVersions(\n versionsCleaned[a.allowedVersions as string],\n versionsCleaned[b.allowedVersions as string],\n ),\n );\n }\n\n // https://ossf.github.io/osv-schema/#affectedrangesevents-fields\n private sortEvents(\n events: Osv.Event[],\n versioningApi: VersioningApi,\n ): Osv.Event[] {\n const sortedCopy: Osv.Event[] = [];\n let zeroEvent: Osv.Event | null = null;\n\n for (const event of events) {\n if (event.introduced === '0') {\n zeroEvent = event;\n } else if (versioningApi.isVersion(Object.values(event)[0])) {\n sortedCopy.push(event);\n } else {\n logger.debug({ event }, 'Skipping OSV event with invalid version');\n }\n }\n\n sortedCopy.sort((a, b) =>\n // no pre-processing, as there are only very few values to sort\n versioningApi.sortVersions(Object.values(a)[0], Object.values(b)[0]),\n );\n\n if (zeroEvent) {\n sortedCopy.unshift(zeroEvent);\n }\n\n return sortedCopy;\n }\n\n private isPackageAffected(\n ecosystem: Ecosystem,\n packageName: string,\n affected: Osv.Affected,\n ): boolean {\n return (\n affected.package?.name === packageName &&\n affected.package?.ecosystem === ecosystem\n );\n }\n\n private includedInVersions(\n depVersion: string,\n affected: Osv.Affected,\n ): boolean {\n return !!affected.versions?.includes(depVersion);\n }\n\n private includedInRanges(\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n let vulnerable = false;\n for (const event of this.sortEvents(range.events, versioningApi)) {\n if (\n is.nonEmptyString(event.introduced) &&\n (event.introduced === '0' ||\n this.isVersionGtOrEq(depVersion, event.introduced, versioningApi))\n ) {\n vulnerable = true;\n } else if (\n is.nonEmptyString(event.fixed) &&\n this.isVersionGtOrEq(depVersion, event.fixed, versioningApi)\n ) {\n vulnerable = false;\n } else if (\n is.nonEmptyString(event.last_affected) &&\n this.isVersionGt(depVersion, event.last_affected, versioningApi)\n ) {\n vulnerable = false;\n }\n }\n\n if (vulnerable) {\n return true;\n }\n }\n\n return false;\n }\n\n // https://ossf.github.io/osv-schema/#evaluation\n private isPackageVulnerable(\n ecosystem: Ecosystem,\n packageName: string,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n this.isPackageAffected(ecosystem, packageName, affected) &&\n (this.includedInVersions(depVersion, affected) ||\n this.includedInRanges(depVersion, affected, versioningApi))\n );\n }\n\n private getFixedVersion(\n ecosystem: Ecosystem,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): string | null {\n const fixedVersions: string[] = [];\n const lastAffectedVersions: string[] = [];\n\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n for (const event of range.events) {\n if (\n is.nonEmptyString(event.fixed) &&\n versioningApi.isVersion(event.fixed)\n ) {\n fixedVersions.push(event.fixed);\n } else if (\n is.nonEmptyString(event.last_affected) &&\n versioningApi.isVersion(event.last_affected)\n ) {\n lastAffectedVersions.push(event.last_affected);\n }\n }\n }\n\n fixedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const fixedVersion = fixedVersions.find((version) =>\n this.isVersionGt(version, depVersion, versioningApi),\n );\n if (fixedVersion) {\n return this.getFixedVersionByEcosystem(fixedVersion, ecosystem);\n }\n\n lastAffectedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const lastAffected = lastAffectedVersions.find((version) =>\n this.isVersionGtOrEq(version, depVersion, versioningApi),\n );\n if (lastAffected) {\n return this.getLastAffectedByEcosystem(lastAffected, ecosystem);\n }\n\n return null;\n }\n\n private getFixedVersionByEcosystem(\n fixedVersion: string,\n ecosystem: Ecosystem,\n ): string {\n if (ecosystem === 'Maven' || ecosystem === 'NuGet') {\n return `[${fixedVersion},)`;\n }\n\n // crates.io, Go, Hex, npm, RubyGems, PyPI\n return `>= ${fixedVersion}`;\n }\n\n private getLastAffectedByEcosystem(\n lastAffected: string,\n ecosystem: Ecosystem,\n ): string {\n if (ecosystem === 'Maven') {\n return `(${lastAffected},)`;\n }\n\n // crates.io, Go, Hex, npm, RubyGems, PyPI\n return `> ${lastAffected}`;\n }\n\n private isVersionGt(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n versioningApi.isGreaterThan(version, other)\n );\n }\n\n private isVersionGtOrEq(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n (versioningApi.equals(version, other) ||\n versioningApi.isGreaterThan(version, other))\n );\n }\n\n private vulnerabilityToPackageRules(vul: Vulnerability): PackageRule | null {\n const {\n vulnerability,\n affected,\n packageName,\n depVersion,\n fixedVersion,\n datasource,\n packageFileConfig,\n } = vul;\n if (is.nullOrUndefined(fixedVersion)) {\n logger.debug(\n `No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n return null;\n }\n\n logger.debug(\n `Setting allowed version ${fixedVersion} to fix vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n return {\n matchDatasources: [datasource],\n matchPackageNames: [packageName],\n matchCurrentVersion: depVersion,\n allowedVersions: fixedVersion,\n isVulnerabilityAlert: true,\n vulnerabilitySeverity: severityDetails.severityLevel,\n prBodyNotes: this.generatePrBodyNotes(vulnerability, affected),\n force: {\n ...packageFileConfig.vulnerabilityAlerts,\n },\n };\n }\n\n private evaluateCvssVector(vector: string): [string, string] {\n try {\n const parsedCvss: CvssScore = parseCvssVector(vector);\n const severityLevel = parsedCvss.cvss3OverallSeverityText;\n\n return [parsedCvss.baseScore.toFixed(1), severityLevel];\n } catch {\n logger.debug(`Error processing CVSS vector ${vector}`);\n }\n\n return ['', ''];\n }\n\n private generatePrBodyNotes(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): string[] {\n let aliases = [vulnerability.id].concat(vulnerability.aliases ?? []).sort();\n aliases = aliases.map((id) => {\n if (id.startsWith('CVE-')) {\n return `[${id}](https://nvd.nist.gov/vuln/detail/${id})`;\n } else if (id.startsWith('GHSA-')) {\n return `[${id}](https://github.com/advisories/${id})`;\n } else if (id.startsWith('GO-')) {\n return `[${id}](https://pkg.go.dev/vuln/${id})`;\n } else if (id.startsWith('RUSTSEC-')) {\n return `[${id}](https://rustsec.org/advisories/${id}.html)`;\n }\n\n return id;\n });\n\n let content = '\\n\\n---\\n\\n### ';\n content += vulnerability.summary ? `${vulnerability.summary}\\n` : '';\n content += `${aliases.join(' / ')}\\n`;\n content += `\\n<details>\\n<summary>More information</summary>\\n`;\n\n const details = vulnerability.details?.replace(\n regEx(/^#{1,4} /gm),\n '##### ',\n );\n content += `#### Details\\n${details ?? 'No details.'}\\n`;\n\n content += '#### Severity\\n';\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n if (severityDetails.cvssVector) {\n content += `- CVSS Score: ${severityDetails.score}\\n`;\n content += `- Vector String: \\`${severityDetails.cvssVector}\\`\\n`;\n } else {\n content += `${titleCase(severityDetails.severityLevel)}\\n`;\n }\n\n content += `\\n#### References\\n${\n vulnerability.references\n ?.map((ref) => {\n return `- [${ref.url}](${ref.url})`;\n })\n .join('\\n') ?? 'No references.'\n }`;\n\n let attribution = '';\n if (vulnerability.id.startsWith('GHSA-')) {\n attribution = ` and the [GitHub Advisory Database](https://github.com/github/advisory-database) ([CC-BY 4.0](https://github.com/github/advisory-database/blob/main/LICENSE.md))`;\n } else if (vulnerability.id.startsWith('GO-')) {\n attribution = ` and the [Go Vulnerability Database](https://github.com/golang/vulndb) ([CC-BY 4.0](https://github.com/golang/vulndb#license))`;\n } else if (vulnerability.id.startsWith('PYSEC-')) {\n attribution = ` and the [PyPI Advisory Database](https://github.com/pypa/advisory-database) ([CC-BY 4.0](https://github.com/pypa/advisory-database/blob/main/LICENSE))`;\n } else if (vulnerability.id.startsWith('RUSTSEC-')) {\n attribution = ` and the [Rust Advisory Database](https://github.com/RustSec/advisory-db) ([CC0 1.0](https://github.com/rustsec/advisory-db/blob/main/LICENSE.txt))`;\n }\n content += `\\n\\nThis data is provided by [OSV](https://osv.dev/vulnerability/${vulnerability.id})${attribution}.\\n`;\n content += `</details>`;\n\n return [sanitizeMarkdown(content)];\n }\n\n private extractSeverityDetails(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): SeverityDetails {\n let severityLevel = 'UNKNOWN';\n let score = 'Unknown';\n\n const cvssVector =\n vulnerability.severity?.find((e) => e.type === 'CVSS_V3')?.score ??\n vulnerability.severity?.[0]?.score ??\n (affected.database_specific?.cvss as string); // RUSTSEC\n\n if (cvssVector) {\n const [baseScore, severity] = this.evaluateCvssVector(cvssVector);\n severityLevel = severity.toUpperCase();\n score = baseScore\n ? `${baseScore} / 10 (${titleCase(severityLevel)})`\n : 'Unknown';\n } else if (\n vulnerability.id.startsWith('GHSA-') &&\n vulnerability.database_specific?.severity\n ) {\n const severity = vulnerability.database_specific.severity as string;\n severityLevel = severity.toUpperCase();\n }\n\n return {\n cvssVector,\n score,\n severityLevel,\n };\n }\n}\n"]}
|
1
|
+
{"version":3,"file":"vulnerabilities.js","sourceRoot":"","sources":["../../../../lib/workers/repository/process/vulnerabilities.ts"],"names":[],"mappings":"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","sourcesContent":["// TODO #22198\nimport type { Ecosystem, Osv } from '@renovatebot/osv-offline';\nimport { OsvOffline } from '@renovatebot/osv-offline';\nimport is from '@sindresorhus/is';\nimport type { CvssScore } from 'vuln-vects';\nimport { parseCvssVector } from 'vuln-vects';\nimport { getManagerConfig, mergeChildConfig } from '../../../config';\nimport type { PackageRule, RenovateConfig } from '../../../config/types';\nimport { logger } from '../../../logger';\nimport { getDefaultVersioning } from '../../../modules/datasource/common';\nimport type {\n PackageDependency,\n PackageFile,\n} from '../../../modules/manager/types';\nimport type { VersioningApi } from '../../../modules/versioning';\nimport { get as getVersioning } from '../../../modules/versioning';\nimport { sanitizeMarkdown } from '../../../util/markdown';\nimport * as p from '../../../util/promises';\nimport { regEx } from '../../../util/regex';\nimport { titleCase } from '../../../util/string';\nimport type {\n DependencyVulnerabilities,\n SeverityDetails,\n Vulnerability,\n} from './types';\n\nexport class Vulnerabilities {\n private osvOffline: OsvOffline | undefined;\n\n private static readonly datasourceEcosystemMap: Record<\n string,\n Ecosystem | undefined\n > = {\n crate: 'crates.io',\n go: 'Go',\n hackage: 'Hackage',\n hex: 'Hex',\n maven: 'Maven',\n npm: 'npm',\n nuget: 'NuGet',\n packagist: 'Packagist',\n pypi: 'PyPI',\n rubygems: 'RubyGems',\n };\n\n private constructor() {\n // private constructor\n }\n\n private async initialize(): Promise<void> {\n this.osvOffline = await OsvOffline.create();\n }\n\n static async create(): Promise<Vulnerabilities> {\n const instance = new Vulnerabilities();\n await instance.initialize();\n return instance;\n }\n\n async appendVulnerabilityPackageRules(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<void> {\n const dependencyVulnerabilities = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n\n config.packageRules ??= [];\n for (const {\n vulnerabilities,\n versioningApi,\n } of dependencyVulnerabilities) {\n const groupPackageRules: PackageRule[] = [];\n for (const vulnerability of vulnerabilities) {\n const rule = this.vulnerabilityToPackageRules(vulnerability);\n if (is.nullOrUndefined(rule)) {\n continue;\n }\n groupPackageRules.push(rule);\n }\n this.sortByFixedVersion(groupPackageRules, versioningApi);\n\n config.packageRules.push(...groupPackageRules);\n }\n }\n\n async fetchVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<Vulnerability[]> {\n const groups = await this.fetchDependencyVulnerabilities(\n config,\n packageFiles,\n );\n return groups.flatMap((group) => group.vulnerabilities);\n }\n\n private async fetchDependencyVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n ): Promise<DependencyVulnerabilities[]> {\n const managers = Object.keys(packageFiles);\n const allManagerJobs = managers.map((manager) =>\n this.fetchManagerVulnerabilities(config, packageFiles, manager),\n );\n return (await Promise.all(allManagerJobs)).flat();\n }\n\n private async fetchManagerVulnerabilities(\n config: RenovateConfig,\n packageFiles: Record<string, PackageFile[]>,\n manager: string,\n ): Promise<DependencyVulnerabilities[]> {\n const managerConfig = getManagerConfig(config, manager);\n const queue = packageFiles[manager].map(\n (pFile) => (): Promise<DependencyVulnerabilities[]> =>\n this.fetchManagerPackageFileVulnerabilities(managerConfig, pFile),\n );\n logger.trace(\n { manager, queueLength: queue.length },\n 'fetchManagerVulnerabilities starting',\n );\n const result = (await p.all(queue)).flat();\n logger.trace({ manager }, 'fetchManagerVulnerabilities finished');\n return result;\n }\n\n private async fetchManagerPackageFileVulnerabilities(\n managerConfig: RenovateConfig,\n pFile: PackageFile,\n ): Promise<DependencyVulnerabilities[]> {\n const { packageFile } = pFile;\n const packageFileConfig = mergeChildConfig(managerConfig, pFile);\n const { manager } = packageFileConfig;\n const queue = pFile.deps.map(\n (dep) => (): Promise<DependencyVulnerabilities | null> =>\n this.fetchDependencyVulnerability(packageFileConfig, dep),\n );\n logger.trace(\n { manager, packageFile, queueLength: queue.length },\n 'fetchManagerPackageFileVulnerabilities starting with concurrency',\n );\n\n const result = await p.all(queue);\n logger.trace(\n { packageFile },\n 'fetchManagerPackageFileVulnerabilities finished',\n );\n\n return result.filter(is.truthy);\n }\n\n private async fetchDependencyVulnerability(\n packageFileConfig: RenovateConfig & PackageFile,\n dep: PackageDependency,\n ): Promise<DependencyVulnerabilities | null> {\n const ecosystem = Vulnerabilities.datasourceEcosystemMap[dep.datasource!];\n if (!ecosystem) {\n logger.trace(`Cannot map datasource ${dep.datasource!} to OSV ecosystem`);\n return null;\n }\n\n let packageName = dep.packageName ?? dep.depName!;\n if (ecosystem === 'PyPI') {\n // https://peps.python.org/pep-0503/#normalized-names\n packageName = packageName.toLowerCase().replace(regEx(/[_.-]+/g), '-');\n }\n\n try {\n const osvVulnerabilities = await this.osvOffline?.getVulnerabilities(\n ecosystem,\n packageName,\n );\n if (\n is.nullOrUndefined(osvVulnerabilities) ||\n is.emptyArray(osvVulnerabilities)\n ) {\n logger.trace(\n `No vulnerabilities found in OSV database for ${packageName}`,\n );\n return null;\n }\n\n const depVersion =\n dep.lockedVersion ?? dep.currentVersion ?? dep.currentValue!;\n\n const versioning = dep.versioning ?? getDefaultVersioning(dep.datasource);\n const versioningApi = getVersioning(versioning);\n\n if (!versioningApi.isVersion(depVersion)) {\n logger.debug(\n `Skipping vulnerability lookup for package ${packageName} due to unsupported version ${depVersion}`,\n );\n return null;\n }\n\n const vulnerabilities: Vulnerability[] = [];\n for (const osvVulnerability of osvVulnerabilities) {\n if (osvVulnerability.withdrawn) {\n logger.trace(\n `Skipping withdrawn vulnerability ${osvVulnerability.id}`,\n );\n continue;\n }\n\n for (const affected of osvVulnerability.affected ?? []) {\n const isVulnerable = this.isPackageVulnerable(\n ecosystem,\n packageName,\n depVersion,\n affected,\n versioningApi,\n );\n if (!isVulnerable) {\n continue;\n }\n\n logger.debug(\n `Vulnerability ${osvVulnerability.id} affects ${packageName} ${depVersion}`,\n );\n const fixedVersion = this.getFixedVersion(\n ecosystem,\n depVersion,\n affected,\n versioningApi,\n );\n\n vulnerabilities.push({\n packageName,\n vulnerability: osvVulnerability,\n affected,\n depVersion,\n fixedVersion,\n datasource: dep.datasource!,\n packageFileConfig,\n });\n }\n }\n\n return { vulnerabilities, versioningApi };\n } catch (err) {\n logger.warn(\n { err, packageName },\n 'Error fetching vulnerability information for package',\n );\n return null;\n }\n }\n\n private sortByFixedVersion(\n packageRules: PackageRule[],\n versioningApi: VersioningApi,\n ): void {\n const versionsCleaned: Record<string, string> = {};\n for (const rule of packageRules) {\n const version = rule.allowedVersions as string;\n versionsCleaned[version] = version.replace(regEx(/[(),=> ]+/g), '');\n }\n packageRules.sort((a, b) =>\n versioningApi.sortVersions(\n versionsCleaned[a.allowedVersions as string],\n versionsCleaned[b.allowedVersions as string],\n ),\n );\n }\n\n // https://ossf.github.io/osv-schema/#affectedrangesevents-fields\n private sortEvents(\n events: Osv.Event[],\n versioningApi: VersioningApi,\n ): Osv.Event[] {\n const sortedCopy: Osv.Event[] = [];\n let zeroEvent: Osv.Event | null = null;\n\n for (const event of events) {\n if (event.introduced === '0') {\n zeroEvent = event;\n } else if (versioningApi.isVersion(Object.values(event)[0])) {\n sortedCopy.push(event);\n } else {\n logger.debug({ event }, 'Skipping OSV event with invalid version');\n }\n }\n\n sortedCopy.sort((a, b) =>\n // no pre-processing, as there are only very few values to sort\n versioningApi.sortVersions(Object.values(a)[0], Object.values(b)[0]),\n );\n\n if (zeroEvent) {\n sortedCopy.unshift(zeroEvent);\n }\n\n return sortedCopy;\n }\n\n private isPackageAffected(\n ecosystem: Ecosystem,\n packageName: string,\n affected: Osv.Affected,\n ): boolean {\n return (\n affected.package?.name === packageName &&\n affected.package?.ecosystem === ecosystem\n );\n }\n\n private includedInVersions(\n depVersion: string,\n affected: Osv.Affected,\n ): boolean {\n return !!affected.versions?.includes(depVersion);\n }\n\n private includedInRanges(\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n let vulnerable = false;\n for (const event of this.sortEvents(range.events, versioningApi)) {\n if (\n is.nonEmptyString(event.introduced) &&\n (event.introduced === '0' ||\n this.isVersionGtOrEq(depVersion, event.introduced, versioningApi))\n ) {\n vulnerable = true;\n } else if (\n is.nonEmptyString(event.fixed) &&\n this.isVersionGtOrEq(depVersion, event.fixed, versioningApi)\n ) {\n vulnerable = false;\n } else if (\n is.nonEmptyString(event.last_affected) &&\n this.isVersionGt(depVersion, event.last_affected, versioningApi)\n ) {\n vulnerable = false;\n }\n }\n\n if (vulnerable) {\n return true;\n }\n }\n\n return false;\n }\n\n // https://ossf.github.io/osv-schema/#evaluation\n private isPackageVulnerable(\n ecosystem: Ecosystem,\n packageName: string,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n this.isPackageAffected(ecosystem, packageName, affected) &&\n (this.includedInVersions(depVersion, affected) ||\n this.includedInRanges(depVersion, affected, versioningApi))\n );\n }\n\n private getFixedVersion(\n ecosystem: Ecosystem,\n depVersion: string,\n affected: Osv.Affected,\n versioningApi: VersioningApi,\n ): string | null {\n const fixedVersions: string[] = [];\n const lastAffectedVersions: string[] = [];\n\n for (const range of affected.ranges ?? []) {\n if (range.type === 'GIT') {\n continue;\n }\n\n for (const event of range.events) {\n if (\n is.nonEmptyString(event.fixed) &&\n versioningApi.isVersion(event.fixed)\n ) {\n fixedVersions.push(event.fixed);\n } else if (\n is.nonEmptyString(event.last_affected) &&\n versioningApi.isVersion(event.last_affected)\n ) {\n lastAffectedVersions.push(event.last_affected);\n }\n }\n }\n\n fixedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const fixedVersion = fixedVersions.find((version) =>\n this.isVersionGt(version, depVersion, versioningApi),\n );\n if (fixedVersion) {\n return this.getFixedVersionByEcosystem(fixedVersion, ecosystem);\n }\n\n lastAffectedVersions.sort((a, b) => versioningApi.sortVersions(a, b));\n const lastAffected = lastAffectedVersions.find((version) =>\n this.isVersionGtOrEq(version, depVersion, versioningApi),\n );\n if (lastAffected) {\n return this.getLastAffectedByEcosystem(lastAffected, ecosystem);\n }\n\n return null;\n }\n\n private getFixedVersionByEcosystem(\n fixedVersion: string,\n ecosystem: Ecosystem,\n ): string {\n if (ecosystem === 'Maven' || ecosystem === 'NuGet') {\n return `[${fixedVersion},)`;\n }\n\n // crates.io, Go, Hex, npm, RubyGems, PyPI\n return `>= ${fixedVersion}`;\n }\n\n private getLastAffectedByEcosystem(\n lastAffected: string,\n ecosystem: Ecosystem,\n ): string {\n if (ecosystem === 'Maven') {\n return `(${lastAffected},)`;\n }\n\n // crates.io, Go, Hex, npm, RubyGems, PyPI\n return `> ${lastAffected}`;\n }\n\n private isVersionGt(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n versioningApi.isGreaterThan(version, other)\n );\n }\n\n private isVersionGtOrEq(\n version: string,\n other: string,\n versioningApi: VersioningApi,\n ): boolean {\n return (\n versioningApi.isVersion(version) &&\n versioningApi.isVersion(other) &&\n (versioningApi.equals(version, other) ||\n versioningApi.isGreaterThan(version, other))\n );\n }\n\n private vulnerabilityToPackageRules(vul: Vulnerability): PackageRule | null {\n const {\n vulnerability,\n affected,\n packageName,\n depVersion,\n fixedVersion,\n datasource,\n packageFileConfig,\n } = vul;\n if (is.nullOrUndefined(fixedVersion)) {\n logger.debug(\n `No fixed version available for vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n return null;\n }\n\n logger.debug(\n `Setting allowed version ${fixedVersion} to fix vulnerability ${vulnerability.id} in ${packageName} ${depVersion}`,\n );\n\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n return {\n matchDatasources: [datasource],\n matchPackageNames: [packageName],\n matchCurrentVersion: depVersion,\n allowedVersions: fixedVersion,\n isVulnerabilityAlert: true,\n vulnerabilitySeverity: severityDetails.severityLevel,\n prBodyNotes: this.generatePrBodyNotes(vulnerability, affected),\n force: {\n ...packageFileConfig.vulnerabilityAlerts,\n },\n };\n }\n\n private evaluateCvssVector(vector: string): [string, string] {\n try {\n const parsedCvss: CvssScore = parseCvssVector(vector);\n const severityLevel = parsedCvss.cvss3OverallSeverityText;\n\n return [parsedCvss.baseScore.toFixed(1), severityLevel];\n } catch {\n logger.debug(`Error processing CVSS vector ${vector}`);\n }\n\n return ['', ''];\n }\n\n private generatePrBodyNotes(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): string[] {\n let aliases = [vulnerability.id].concat(vulnerability.aliases ?? []).sort();\n aliases = aliases.map((id) => {\n if (id.startsWith('CVE-')) {\n return `[${id}](https://nvd.nist.gov/vuln/detail/${id})`;\n } else if (id.startsWith('GHSA-')) {\n return `[${id}](https://github.com/advisories/${id})`;\n } else if (id.startsWith('GO-')) {\n return `[${id}](https://pkg.go.dev/vuln/${id})`;\n } else if (id.startsWith('RUSTSEC-')) {\n return `[${id}](https://rustsec.org/advisories/${id}.html)`;\n }\n\n return id;\n });\n\n let content = '\\n\\n---\\n\\n### ';\n content += vulnerability.summary ? `${vulnerability.summary}\\n` : '';\n content += `${aliases.join(' / ')}\\n`;\n content += `\\n<details>\\n<summary>More information</summary>\\n`;\n\n const details = vulnerability.details?.replace(\n regEx(/^#{1,4} /gm),\n '##### ',\n );\n content += `#### Details\\n${details ?? 'No details.'}\\n`;\n\n content += '#### Severity\\n';\n const severityDetails = this.extractSeverityDetails(\n vulnerability,\n affected,\n );\n\n if (severityDetails.cvssVector) {\n content += `- CVSS Score: ${severityDetails.score}\\n`;\n content += `- Vector String: \\`${severityDetails.cvssVector}\\`\\n`;\n } else {\n content += `${titleCase(severityDetails.severityLevel)}\\n`;\n }\n\n content += `\\n#### References\\n${\n vulnerability.references\n ?.map((ref) => {\n return `- [${ref.url}](${ref.url})`;\n })\n .join('\\n') ?? 'No references.'\n }`;\n\n let attribution = '';\n if (vulnerability.id.startsWith('GHSA-')) {\n attribution = ` and the [GitHub Advisory Database](https://github.com/github/advisory-database) ([CC-BY 4.0](https://github.com/github/advisory-database/blob/main/LICENSE.md))`;\n } else if (vulnerability.id.startsWith('GO-')) {\n attribution = ` and the [Go Vulnerability Database](https://github.com/golang/vulndb) ([CC-BY 4.0](https://github.com/golang/vulndb#license))`;\n } else if (vulnerability.id.startsWith('PYSEC-')) {\n attribution = ` and the [PyPI Advisory Database](https://github.com/pypa/advisory-database) ([CC-BY 4.0](https://github.com/pypa/advisory-database/blob/main/LICENSE))`;\n } else if (vulnerability.id.startsWith('RUSTSEC-')) {\n attribution = ` and the [Rust Advisory Database](https://github.com/RustSec/advisory-db) ([CC0 1.0](https://github.com/rustsec/advisory-db/blob/main/LICENSE.txt))`;\n }\n content += `\\n\\nThis data is provided by [OSV](https://osv.dev/vulnerability/${vulnerability.id})${attribution}.\\n`;\n content += `</details>`;\n\n return [sanitizeMarkdown(content)];\n }\n\n private extractSeverityDetails(\n vulnerability: Osv.Vulnerability,\n affected: Osv.Affected,\n ): SeverityDetails {\n let severityLevel = 'UNKNOWN';\n let score = 'Unknown';\n\n const cvssVector =\n vulnerability.severity?.find((e) => e.type === 'CVSS_V3')?.score ??\n vulnerability.severity?.[0]?.score ??\n (affected.database_specific?.cvss as string); // RUSTSEC\n\n if (cvssVector) {\n const [baseScore, severity] = this.evaluateCvssVector(cvssVector);\n severityLevel = severity.toUpperCase();\n score = baseScore\n ? `${baseScore} / 10 (${titleCase(severityLevel)})`\n : 'Unknown';\n } else if (\n vulnerability.id.startsWith('GHSA-') &&\n vulnerability.database_specific?.severity\n ) {\n const severity = vulnerability.database_specific.severity as string;\n severityLevel = severity.toUpperCase();\n }\n\n return {\n cvssVector,\n score,\n severityLevel,\n };\n }\n}\n"]}
|
@@ -109,7 +109,7 @@ async function writeUpdates(config, allBranches) {
|
|
109
109
|
const { baseBranch, branchName } = branch;
|
110
110
|
const meta = { branch: branchName };
|
111
111
|
if (config.baseBranches?.length && baseBranch) {
|
112
|
-
meta
|
112
|
+
meta.baseBranch = baseBranch;
|
113
113
|
}
|
114
114
|
(0, logger_1.addMeta)(meta);
|
115
115
|
const branchExisted = await scm_1.scm.branchExists(branchName);
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../../lib/workers/repository/process/write.ts"],"names":[],"mappings":";;AAqBA,0EAkBC;AAED,4DAgBC;AAED,0CA2DC;AAED,oCAyEC;;AAjMD,kEAAkC;AAElC,4CAA8D;AAC9D,sDAAmD;AACnD,uDAAoD;AACpD,+DAA0D;AAE1D,2DAAwD;AACxD,2EAAyE;AACzE,gDAA8D;AAE9D,6CAAiD;AACjD,6DAAgE;AAChE,qCAIkB;AAIlB,SAAgB,+BAA+B,CAC7C,MAAoB;IAEpB,MAAM,GAAG,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC1C,MAAM,eAAe,GAAG,EAA8B,CAAC;QACvD,KAAK,MAAM,KAAK,IAAI,6CAAwB,EAAE,CAAC;YAC7C,iCAAiC;YACjC,4DAA4D;YAC5D,IAAI,KAAK,KAAK,KAAK,IAAI,YAAE,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBACjD,eAAe,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC;YAC1C,CAAC;iBAAM,IAAI,YAAE,CAAC,WAAW,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC;gBAC1C,eAAe,CAAC,GAAG,GAAG,OAAO,CAAC,KAAK,CAA2B,CAAC;YACjE,CAAC;QACH,CAAC;QACD,OAAO,eAAe,CAAC;IACzB,CAAC,CAAC,CAAC;IAEH,OAAO,GAAG,CAAC;AACb,CAAC;AAED,SAAgB,wBAAwB,CACtC,WAAwB,EACxB,iBAAyB;IAEzB,IAAI,CAAC,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACnC,eAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,iBAAiB,KAAK,WAAW,CAAC,iBAAiB,EAAE,CAAC;QACxD,eAAM,CAAC,KAAK,CAAC,0CAA0C,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,eAAM,CAAC,KAAK,CAAC,iDAAiD,CAAC,CAAC;IAChE,OAAO,IAAI,CAAC;AACd,CAAC;AAEM,KAAK,UAAU,eAAe,CACnC,UAAkB,EAClB,UAAkB;IAElB,eAAM,CAAC,KAAK,CAAC,mBAAmB,CAAC,CAAC;IAClC,MAAM,SAAS,GAAG,MAAM,SAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IACxD,MAAM,aAAa,GAAG,MAAM,SAAG,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;IAE5D,MAAM,KAAK,GAAG,IAAA,qBAAQ,GAAE,CAAC;IACzB,KAAK,CAAC,QAAQ,KAAK,EAAE,CAAC;IACtB,MAAM,EAAE,QAAQ,EAAE,cAAc,EAAE,GAAG,KAAK,CAAC;IAC3C,IAAI,WAAW,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;IAC5E,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,eAAM,CAAC,KAAK,CACV,yEAAyE,CAC1E,CAAC;QACF,gCAAgC;QAChC,WAAW,GAAG;YACZ,UAAU;YACV,GAAG,EAAE,SAAS;YACd,UAAU;YACV,aAAa;SACC,CAAC;QACjB,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACnC,CAAC;IAED,qEAAqE;IACrE,IAAI,UAAU,KAAK,WAAW,CAAC,UAAU,EAAE,CAAC;QAC1C,eAAM,CAAC,KAAK,CAAC,2CAA2C,CAAC,CAAC;QAC1D,WAAW,CAAC,UAAU,GAAG,UAAU,CAAC;QACpC,OAAO,WAAW,CAAC,UAAU,CAAC;QAC9B,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,sEAAsE;IACtE,IAAI,aAAa,KAAK,WAAW,CAAC,aAAa,EAAE,CAAC;QAChD,eAAM,CAAC,KAAK,CAAC,yCAAyC,CAAC,CAAC;QACxD,OAAO,WAAW,CAAC,YAAY,CAAC;QAChC,OAAO,WAAW,CAAC,YAAY,CAAC;QAEhC,0BAA0B;QAC1B,WAAW,CAAC,aAAa,GAAG,aAAa,CAAC;QAC1C,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,yDAAyD;IACzD,IAAI,SAAS,KAAK,WAAW,CAAC,GAAG,EAAE,CAAC;QAClC,eAAM,CAAC,KAAK,CAAC,qCAAqC,CAAC,CAAC;QACpD,OAAO,WAAW,CAAC,YAAY,CAAC;QAChC,OAAO,WAAW,CAAC,YAAY,CAAC;QAChC,OAAO,WAAW,CAAC,UAAU,CAAC;QAC9B,OAAO,WAAW,CAAC,iBAAiB,CAAC;QAErC,0BAA0B;QAC1B,WAAW,CAAC,GAAG,GAAG,SAAS,CAAC;QAC5B,WAAW,CAAC,QAAQ,GAAG,KAAK,CAAC;IAC/B,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAEM,KAAK,UAAU,YAAY,CAChC,MAAsB,EACtB,WAA2B;IAE3B,MAAM,QAAQ,GAAG,WAAW,CAAC;IAC7B,eAAM,CAAC,KAAK,CACV,cAAc,QAAQ,CAAC,MAAM,UAC3B,QAAQ,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAC/B,KAAK,QAAQ;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC;SACxB,IAAI,EAAE;SACN,IAAI,CAAC,IAAI,CAAC,EAAE,CAChB,CAAC;IAEF,MAAM,kBAAkB,GAAG,MAAM,IAAA,8BAAqB,EAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;IACzE,IAAA,iBAAQ,EAAC,eAAe,EAAE,kBAAkB,CAAC,CAAC;IAE9C,MAAM,uBAAuB,GAAG,MAAM,IAAA,mCAA0B,EAAC,QAAQ,CAAC,CAAC;IAC3E,IAAA,iBAAQ,EAAC,UAAU,EAAE,uBAAuB,CAAC,CAAC;IAE9C,MAAM,gBAAgB,GAAG,MAAM,IAAA,yBAAgB,EAAC,MAAM,CAAC,CAAC;IACxD,IAAA,iBAAQ,EAAC,WAAW,EAAE,gBAAgB,CAAC,CAAC;IAExC,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;QAC9B,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,GAAG,MAAM,CAAC;QAC1C,MAAM,IAAI,GAA2B,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;QAC5D,IAAI,MAAM,CAAC,YAAY,EAAE,MAAM,IAAI,UAAU,EAAE,CAAC;YAC9C,IAAI,CAAC,YAAY,CAAC,GAAG,UAAU,CAAC;QAClC,CAAC;QACD,IAAA,gBAAO,EAAC,IAAI,CAAC,CAAC;QACd,MAAM,aAAa,GAAG,MAAM,SAAG,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACzD,MAAM,WAAW,GAAG,MAAM,eAAe,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;QAElE,MAAM,QAAQ,GAAG;YACf,GAAG,IAAI,GAAG,CACR,MAAM,CAAC,QAAQ;iBACZ,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,iBAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,OAAO,CAAC;iBACjE,MAAM,CAAC,YAAE,CAAC,MAAM,CAAC,CACrB;SACF,CAAC,IAAI,EAAE,CAAC;QACT,MAAM,iBAAiB,GAAG,IAAA,yBAAW,EAAC;YACpC,uBAAuB,EAAE,+BAA+B,CAAC,MAAM,CAAC;YAChE,QAAQ;SACT,CAAC,CAAC;QACH,MAAM,CAAC,gBAAgB,GAAG,wBAAwB,CAChD,WAAW,EACX,iBAAiB,CAClB,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,IAAA,sBAAa,EAAC,MAAM,CAAC,CAAC;QACxC,MAAM,CAAC,WAAW,GAAG,GAAG,EAAE,WAAW,CAAC;QACtC,MAAM,CAAC,IAAI,GAAG,GAAG,EAAE,IAAI,CAAC;QACxB,MAAM,CAAC,MAAM,GAAG,GAAG,EAAE,MAAM,CAAC;QAC5B,MAAM,CAAC,iBAAiB,GAAG,GAAG,EAAE,eAAe;YAC7C,CAAC,CAAC,iBAAiB;YACnB,CAAC,CAAC,WAAW,CAAC,iBAAiB,CAAC;QAElC,IAAI,GAAG,EAAE,SAAS,EAAE,CAAC;YACnB,IAAA,sCAAkB,EAAC,UAAU,EAAE,UAAU,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC;QAC5D,CAAC;QACD,IACE,MAAM,CAAC,MAAM,KAAK,YAAY;YAC9B,MAAM,CAAC,aAAa,KAAK,YAAY,EACrC,CAAC;YACD,sEAAsE;YACtE,OAAO,YAAY,CAAC;QACtB,CAAC;QACD,IAAI,CAAC,aAAa,IAAI,CAAC,MAAM,SAAG,CAAC,YAAY,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC;YAClE,IAAA,sBAAa,EAAC,UAAU,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IACD,IAAA,mBAAU,EAAC,CAAC,QAAQ,EAAE,YAAY,CAAC,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC;AAChB,CAAC","sourcesContent":["import is from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types';\nimport { addMeta, logger, removeMeta } from '../../../logger';\nimport { hashMap } from '../../../modules/manager';\nimport { scm } from '../../../modules/platform/scm';\nimport { getCache } from '../../../util/cache/repository';\nimport type { BranchCache } from '../../../util/cache/repository/types';\nimport { fingerprint } from '../../../util/fingerprint';\nimport { setBranchNewCommit } from '../../../util/git/set-branch-commit';\nimport { incCountValue, setCount } from '../../global/limits';\nimport type { BranchConfig, UpgradeFingerprintConfig } from '../../types';\nimport { processBranch } from '../update/branch';\nimport { upgradeFingerprintFields } from './fingerprint-fields';\nimport {\n getConcurrentBranchesCount,\n getConcurrentPrsCount,\n getPrHourlyCount,\n} from './limits';\n\nexport type WriteUpdateResult = 'done' | 'automerged';\n\nexport function generateCommitFingerprintConfig(\n branch: BranchConfig,\n): UpgradeFingerprintConfig[] {\n const res = branch.upgrades.map((upgrade) => {\n const filteredUpgrade = {} as UpgradeFingerprintConfig;\n for (const field of upgradeFingerprintFields) {\n // TS cannot narrow the type here\n // I am not sure if this is the best way suggestions welcome\n if (field !== 'env' && is.string(upgrade[field])) {\n filteredUpgrade[field] = upgrade[field];\n } else if (is.plainObject(upgrade[field])) {\n filteredUpgrade.env = upgrade[field] as Record<string, string>;\n }\n }\n return filteredUpgrade;\n });\n\n return res;\n}\n\nexport function canSkipBranchUpdateCheck(\n branchState: BranchCache,\n commitFingerprint: string,\n): boolean {\n if (!branchState.commitFingerprint) {\n logger.trace('branch.isUpToDate(): no fingerprint');\n return false;\n }\n\n if (commitFingerprint !== branchState.commitFingerprint) {\n logger.debug('branch.isUpToDate(): needs recalculation');\n return false;\n }\n\n logger.debug('branch.isUpToDate(): using cached result \"true\"');\n return true;\n}\n\nexport async function syncBranchState(\n branchName: string,\n baseBranch: string,\n): Promise<BranchCache> {\n logger.debug('syncBranchState()');\n const branchSha = await scm.getBranchCommit(branchName);\n const baseBranchSha = await scm.getBranchCommit(baseBranch);\n\n const cache = getCache();\n cache.branches ??= [];\n const { branches: cachedBranches } = cache;\n let branchState = cachedBranches.find((br) => br.branchName === branchName);\n if (!branchState) {\n logger.debug(\n 'syncBranchState(): Branch cache not found, creating minimal branchState',\n );\n // create a minimal branch state\n branchState = {\n branchName,\n sha: branchSha,\n baseBranch,\n baseBranchSha,\n } as BranchCache;\n cachedBranches.push(branchState);\n }\n\n // if base branch name has changed invalidate cached isModified state\n if (baseBranch !== branchState.baseBranch) {\n logger.debug('syncBranchState(): update baseBranch name');\n branchState.baseBranch = baseBranch;\n delete branchState.isModified;\n branchState.pristine = false;\n }\n\n // if base branch sha has changed invalidate cached isBehindBase state\n if (baseBranchSha !== branchState.baseBranchSha) {\n logger.debug('syncBranchState(): update baseBranchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n\n // update cached branchSha\n branchState.baseBranchSha = baseBranchSha;\n branchState.pristine = false;\n }\n\n // if branch sha has changed invalidate all cached states\n if (branchSha !== branchState.sha) {\n logger.debug('syncBranchState(): update branchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n delete branchState.isModified;\n delete branchState.commitFingerprint;\n\n // update cached branchSha\n branchState.sha = branchSha;\n branchState.pristine = false;\n }\n\n return branchState;\n}\n\nexport async function writeUpdates(\n config: RenovateConfig,\n allBranches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n const branches = allBranches;\n logger.debug(\n `Processing ${branches.length} branch${\n branches.length === 1 ? '' : 'es'\n }: ${branches\n .map((b) => b.branchName)\n .sort()\n .join(', ')}`,\n );\n\n const concurrentPrsCount = await getConcurrentPrsCount(config, branches);\n setCount('ConcurrentPRs', concurrentPrsCount);\n\n const concurrentBranchesCount = await getConcurrentBranchesCount(branches);\n setCount('Branches', concurrentBranchesCount);\n\n const prsThisHourCount = await getPrHourlyCount(config);\n setCount('HourlyPRs', prsThisHourCount);\n\n for (const branch of branches) {\n const { baseBranch, branchName } = branch;\n const meta: Record<string, string> = { branch: branchName };\n if (config.baseBranches?.length && baseBranch) {\n meta['baseBranch'] = baseBranch;\n }\n addMeta(meta);\n const branchExisted = await scm.branchExists(branchName);\n const branchState = await syncBranchState(branchName, baseBranch);\n\n const managers = [\n ...new Set(\n branch.upgrades\n .map((upgrade) => hashMap.get(upgrade.manager) ?? upgrade.manager)\n .filter(is.string),\n ),\n ].sort();\n const commitFingerprint = fingerprint({\n commitFingerprintConfig: generateCommitFingerprintConfig(branch),\n managers,\n });\n branch.skipBranchUpdate = canSkipBranchUpdateCheck(\n branchState,\n commitFingerprint,\n );\n\n const res = await processBranch(branch);\n branch.prBlockedBy = res?.prBlockedBy;\n branch.prNo = res?.prNo;\n branch.result = res?.result;\n branch.commitFingerprint = res?.updatesVerified\n ? commitFingerprint\n : branchState.commitFingerprint;\n\n if (res?.commitSha) {\n setBranchNewCommit(branchName, baseBranch, res.commitSha);\n }\n if (\n branch.result === 'automerged' &&\n branch.automergeType !== 'pr-comment'\n ) {\n // Stop processing other branches because base branch has been changed\n return 'automerged';\n }\n if (!branchExisted && (await scm.branchExists(branch.branchName))) {\n incCountValue('Branches');\n }\n }\n removeMeta(['branch', 'baseBranch']);\n return 'done';\n}\n"]}
|
1
|
+
{"version":3,"file":"write.js","sourceRoot":"","sources":["../../../../lib/workers/repository/process/write.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport type { RenovateConfig } from '../../../config/types';\nimport { addMeta, logger, removeMeta } from '../../../logger';\nimport { hashMap } from '../../../modules/manager';\nimport { scm } from '../../../modules/platform/scm';\nimport { getCache } from '../../../util/cache/repository';\nimport type { BranchCache } from '../../../util/cache/repository/types';\nimport { fingerprint } from '../../../util/fingerprint';\nimport { setBranchNewCommit } from '../../../util/git/set-branch-commit';\nimport { incCountValue, setCount } from '../../global/limits';\nimport type { BranchConfig, UpgradeFingerprintConfig } from '../../types';\nimport { processBranch } from '../update/branch';\nimport { upgradeFingerprintFields } from './fingerprint-fields';\nimport {\n getConcurrentBranchesCount,\n getConcurrentPrsCount,\n getPrHourlyCount,\n} from './limits';\n\nexport type WriteUpdateResult = 'done' | 'automerged';\n\nexport function generateCommitFingerprintConfig(\n branch: BranchConfig,\n): UpgradeFingerprintConfig[] {\n const res = branch.upgrades.map((upgrade) => {\n const filteredUpgrade = {} as UpgradeFingerprintConfig;\n for (const field of upgradeFingerprintFields) {\n // TS cannot narrow the type here\n // I am not sure if this is the best way suggestions welcome\n if (field !== 'env' && is.string(upgrade[field])) {\n filteredUpgrade[field] = upgrade[field];\n } else if (is.plainObject(upgrade[field])) {\n filteredUpgrade.env = upgrade[field] as Record<string, string>;\n }\n }\n return filteredUpgrade;\n });\n\n return res;\n}\n\nexport function canSkipBranchUpdateCheck(\n branchState: BranchCache,\n commitFingerprint: string,\n): boolean {\n if (!branchState.commitFingerprint) {\n logger.trace('branch.isUpToDate(): no fingerprint');\n return false;\n }\n\n if (commitFingerprint !== branchState.commitFingerprint) {\n logger.debug('branch.isUpToDate(): needs recalculation');\n return false;\n }\n\n logger.debug('branch.isUpToDate(): using cached result \"true\"');\n return true;\n}\n\nexport async function syncBranchState(\n branchName: string,\n baseBranch: string,\n): Promise<BranchCache> {\n logger.debug('syncBranchState()');\n const branchSha = await scm.getBranchCommit(branchName);\n const baseBranchSha = await scm.getBranchCommit(baseBranch);\n\n const cache = getCache();\n cache.branches ??= [];\n const { branches: cachedBranches } = cache;\n let branchState = cachedBranches.find((br) => br.branchName === branchName);\n if (!branchState) {\n logger.debug(\n 'syncBranchState(): Branch cache not found, creating minimal branchState',\n );\n // create a minimal branch state\n branchState = {\n branchName,\n sha: branchSha,\n baseBranch,\n baseBranchSha,\n } as BranchCache;\n cachedBranches.push(branchState);\n }\n\n // if base branch name has changed invalidate cached isModified state\n if (baseBranch !== branchState.baseBranch) {\n logger.debug('syncBranchState(): update baseBranch name');\n branchState.baseBranch = baseBranch;\n delete branchState.isModified;\n branchState.pristine = false;\n }\n\n // if base branch sha has changed invalidate cached isBehindBase state\n if (baseBranchSha !== branchState.baseBranchSha) {\n logger.debug('syncBranchState(): update baseBranchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n\n // update cached branchSha\n branchState.baseBranchSha = baseBranchSha;\n branchState.pristine = false;\n }\n\n // if branch sha has changed invalidate all cached states\n if (branchSha !== branchState.sha) {\n logger.debug('syncBranchState(): update branchSha');\n delete branchState.isBehindBase;\n delete branchState.isConflicted;\n delete branchState.isModified;\n delete branchState.commitFingerprint;\n\n // update cached branchSha\n branchState.sha = branchSha;\n branchState.pristine = false;\n }\n\n return branchState;\n}\n\nexport async function writeUpdates(\n config: RenovateConfig,\n allBranches: BranchConfig[],\n): Promise<WriteUpdateResult> {\n const branches = allBranches;\n logger.debug(\n `Processing ${branches.length} branch${\n branches.length === 1 ? '' : 'es'\n }: ${branches\n .map((b) => b.branchName)\n .sort()\n .join(', ')}`,\n );\n\n const concurrentPrsCount = await getConcurrentPrsCount(config, branches);\n setCount('ConcurrentPRs', concurrentPrsCount);\n\n const concurrentBranchesCount = await getConcurrentBranchesCount(branches);\n setCount('Branches', concurrentBranchesCount);\n\n const prsThisHourCount = await getPrHourlyCount(config);\n setCount('HourlyPRs', prsThisHourCount);\n\n for (const branch of branches) {\n const { baseBranch, branchName } = branch;\n const meta: Record<string, string> = { branch: branchName };\n if (config.baseBranches?.length && baseBranch) {\n meta.baseBranch = baseBranch;\n }\n addMeta(meta);\n const branchExisted = await scm.branchExists(branchName);\n const branchState = await syncBranchState(branchName, baseBranch);\n\n const managers = [\n ...new Set(\n branch.upgrades\n .map((upgrade) => hashMap.get(upgrade.manager) ?? upgrade.manager)\n .filter(is.string),\n ),\n ].sort();\n const commitFingerprint = fingerprint({\n commitFingerprintConfig: generateCommitFingerprintConfig(branch),\n managers,\n });\n branch.skipBranchUpdate = canSkipBranchUpdateCheck(\n branchState,\n commitFingerprint,\n );\n\n const res = await processBranch(branch);\n branch.prBlockedBy = res?.prBlockedBy;\n branch.prNo = res?.prNo;\n branch.result = res?.result;\n branch.commitFingerprint = res?.updatesVerified\n ? commitFingerprint\n : branchState.commitFingerprint;\n\n if (res?.commitSha) {\n setBranchNewCommit(branchName, baseBranch, res.commitSha);\n }\n if (\n branch.result === 'automerged' &&\n branch.automergeType !== 'pr-comment'\n ) {\n // Stop processing other branches because base branch has been changed\n return 'automerged';\n }\n if (!branchExisted && (await scm.branchExists(branch.branchName))) {\n incCountValue('Branches');\n }\n }\n removeMeta(['branch', 'baseBranch']);\n return 'done';\n}\n"]}
|
@@ -4,6 +4,7 @@ exports.validateReconfigureBranch = validateReconfigureBranch;
|
|
4
4
|
const tslib_1 = require("tslib");
|
5
5
|
const is_1 = tslib_1.__importDefault(require("@sindresorhus/is"));
|
6
6
|
const json5_1 = tslib_1.__importDefault(require("json5"));
|
7
|
+
const massage_1 = require("../../../config/massage");
|
7
8
|
const validation_1 = require("../../../config/validation");
|
8
9
|
const logger_1 = require("../../../logger");
|
9
10
|
const platform_1 = require("../../../modules/platform");
|
@@ -99,7 +100,8 @@ async function validateReconfigureBranch(config) {
|
|
99
100
|
return;
|
100
101
|
}
|
101
102
|
// perform validation and provide a passing or failing check based on result
|
102
|
-
const
|
103
|
+
const massagedConfig = (0, massage_1.massageConfig)(configFileParsed);
|
104
|
+
const validationResult = await (0, validation_1.validateConfig)('repo', massagedConfig);
|
103
105
|
// failing check
|
104
106
|
if (validationResult.errors.length > 0) {
|
105
107
|
logger_1.logger.debug({ errors: validationResult.errors.map((err) => err.message).join(', ') }, 'Validation Errors');
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../lib/workers/repository/reconfigure/validate.ts"],"names":[],"mappings":"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","sourcesContent":["import is from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport type { RenovateConfig } from '../../../config/types';\nimport { validateConfig } from '../../../config/validation';\nimport { logger } from '../../../logger';\nimport { platform } from '../../../modules/platform';\nimport { ensureComment } from '../../../modules/platform/comment';\nimport { scm } from '../../../modules/platform/scm';\nimport type { BranchStatus } from '../../../types';\nimport { getCache } from '../../../util/cache/repository';\nimport { readLocalFile } from '../../../util/fs';\nimport { getBranchCommit } from '../../../util/git';\nimport { regEx } from '../../../util/regex';\nimport { detectConfigFile } from '../init/merge';\nimport { setReconfigureBranchCache } from './reconfigure-cache';\nimport { getReconfigureBranchName } from './utils';\n\nasync function setBranchStatus(\n branchName: string,\n description: string,\n state: BranchStatus,\n context?: string | null,\n): Promise<void> {\n if (!is.nonEmptyString(context)) {\n // already logged this case when validating the status check\n return;\n }\n\n await platform.setBranchStatus({\n branchName,\n context,\n description,\n state,\n });\n}\n\nexport async function validateReconfigureBranch(\n config: RenovateConfig,\n): Promise<void> {\n logger.debug('validateReconfigureBranch()');\n\n const context = config.statusCheckNames?.configValidation;\n const branchName = getReconfigureBranchName(config.branchPrefix!);\n\n // look for config file\n // 1. check reconfigure branch cache and use the configFileName if it exists\n // 2. checkout reconfigure branch and look for the config file, don't assume default configFileName\n const branchSha = getBranchCommit(branchName)!;\n const cache = getCache();\n let configFileName: string | null = null;\n const reconfigureCache = cache.reconfigureBranchCache;\n // only use valid cached information\n if (reconfigureCache?.reconfigureBranchSha === branchSha) {\n logger.debug('Skipping validation check as branch sha is unchanged');\n return;\n }\n\n if (context) {\n const validationStatus = await platform.getBranchStatusCheck(\n branchName,\n context,\n );\n\n // if old status check is present skip validation\n if (is.nonEmptyString(validationStatus)) {\n logger.debug(\n 'Skipping validation check because status check already exists.',\n );\n return;\n }\n } else {\n logger.debug(\n 'Status check is null or an empty string, skipping status check addition.',\n );\n }\n\n try {\n await scm.checkoutBranch(branchName);\n configFileName = await detectConfigFile();\n } catch (err) {\n logger.error(\n { err },\n 'Error while searching for config file in reconfigure branch',\n );\n }\n\n if (!is.nonEmptyString(configFileName)) {\n logger.warn('No config file found in reconfigure branch');\n await setBranchStatus(\n branchName,\n 'Validation Failed - No config file found',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.defaultBranch!);\n return;\n }\n\n let configFileRaw: string | null = null;\n try {\n configFileRaw = await readLocalFile(configFileName, 'utf8');\n } catch (err) {\n logger.error({ err }, 'Error while reading config file');\n }\n\n if (!is.nonEmptyString(configFileRaw)) {\n logger.warn('Empty or invalid config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Empty/Invalid config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n let configFileParsed: any;\n try {\n configFileParsed = JSON5.parse(configFileRaw);\n // no need to confirm renovate field in package.json we already do it in `detectConfigFile()`\n if (configFileName === 'package.json') {\n configFileParsed = configFileParsed.renovate;\n }\n } catch (err) {\n logger.error({ err }, 'Error while parsing config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Unparsable config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // perform validation and provide a passing or failing check based on result\n const validationResult = await validateConfig('repo', configFileParsed);\n\n // failing check\n if (validationResult.errors.length > 0) {\n logger.debug(\n { errors: validationResult.errors.map((err) => err.message).join(', ') },\n 'Validation Errors',\n );\n\n const reconfigurePr = await platform.findPr({\n branchName,\n state: 'open',\n includeOtherAuthors: true,\n });\n\n // add comment to reconfigure PR if it exists\n if (reconfigurePr) {\n let body = `There is an error with this repository's Renovate configuration that needs to be fixed.\\n\\n`;\n body += `Location: \\`${configFileName}\\`\\n`;\n body += `Message: \\`${validationResult.errors\n .map((e) => e.message)\n .join(', ')\n .replace(regEx(/`/g), \"'\")}\\`\\n`;\n\n await ensureComment({\n number: reconfigurePr.number,\n topic: 'Action Required: Fix Renovate Configuration',\n content: body,\n });\n }\n\n await setBranchStatus(branchName, 'Validation Failed', 'red', context);\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // passing check\n await setBranchStatus(branchName, 'Validation Successful', 'green', context);\n\n setReconfigureBranchCache(branchSha, true);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n}\n"]}
|
1
|
+
{"version":3,"file":"validate.js","sourceRoot":"","sources":["../../../../lib/workers/repository/reconfigure/validate.ts"],"names":[],"mappings":";;AAqCA,8DAoJC;;AAzLD,kEAAkC;AAClC,0DAA0B;AAC1B,qDAAwD;AAExD,2DAA4D;AAC5D,4CAAyC;AACzC,wDAAqD;AACrD,+DAAkE;AAClE,uDAAoD;AAEpD,+DAA0D;AAC1D,yCAAiD;AACjD,2CAAoD;AACpD,+CAA4C;AAC5C,yCAAiD;AACjD,2DAAgE;AAChE,mCAAmD;AAEnD,KAAK,UAAU,eAAe,CAC5B,UAAkB,EAClB,WAAmB,EACnB,KAAmB,EACnB,OAAuB;IAEvB,IAAI,CAAC,YAAE,CAAC,cAAc,CAAC,OAAO,CAAC,EAAE,CAAC;QAChC,4DAA4D;QAC5D,OAAO;IACT,CAAC;IAED,MAAM,mBAAQ,CAAC,eAAe,CAAC;QAC7B,UAAU;QACV,OAAO;QACP,WAAW;QACX,KAAK;KACN,CAAC,CAAC;AACL,CAAC;AAEM,KAAK,UAAU,yBAAyB,CAC7C,MAAsB;IAEtB,eAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAE5C,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,EAAE,gBAAgB,CAAC;IAC1D,MAAM,UAAU,GAAG,IAAA,gCAAwB,EAAC,MAAM,CAAC,YAAa,CAAC,CAAC;IAElE,uBAAuB;IACvB,4EAA4E;IAC5E,mGAAmG;IACnG,MAAM,SAAS,GAAG,IAAA,qBAAe,EAAC,UAAU,CAAE,CAAC;IAC/C,MAAM,KAAK,GAAG,IAAA,qBAAQ,GAAE,CAAC;IACzB,IAAI,cAAc,GAAkB,IAAI,CAAC;IACzC,MAAM,gBAAgB,GAAG,KAAK,CAAC,sBAAsB,CAAC;IACtD,oCAAoC;IACpC,IAAI,gBAAgB,EAAE,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACzD,eAAM,CAAC,KAAK,CAAC,sDAAsD,CAAC,CAAC;QACrE,OAAO;IACT,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,gBAAgB,GAAG,MAAM,mBAAQ,CAAC,oBAAoB,CAC1D,UAAU,EACV,OAAO,CACR,CAAC;QAEF,iDAAiD;QACjD,IAAI,YAAE,CAAC,cAAc,CAAC,gBAAgB,CAAC,EAAE,CAAC;YACxC,eAAM,CAAC,KAAK,CACV,gEAAgE,CACjE,CAAC;YACF,OAAO;QACT,CAAC;IACH,CAAC;SAAM,CAAC;QACN,eAAM,CAAC,KAAK,CACV,0EAA0E,CAC3E,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,SAAG,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACrC,cAAc,GAAG,MAAM,IAAA,wBAAgB,GAAE,CAAC;IAC5C,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CACV,EAAE,GAAG,EAAE,EACP,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,YAAE,CAAC,cAAc,CAAC,cAAc,CAAC,EAAE,CAAC;QACvC,eAAM,CAAC,IAAI,CAAC,4CAA4C,CAAC,CAAC;QAC1D,MAAM,eAAe,CACnB,UAAU,EACV,0CAA0C,EAC1C,KAAK,EACL,OAAO,CACR,CAAC;QACF,IAAA,6CAAyB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAG,CAAC,cAAc,CAAC,MAAM,CAAC,aAAc,CAAC,CAAC;QAChD,OAAO;IACT,CAAC;IAED,IAAI,aAAa,GAAkB,IAAI,CAAC;IACxC,IAAI,CAAC;QACH,aAAa,GAAG,MAAM,IAAA,kBAAa,EAAC,cAAc,EAAE,MAAM,CAAC,CAAC;IAC9D,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC;IAC3D,CAAC;IAED,IAAI,CAAC,YAAE,CAAC,cAAc,CAAC,aAAa,CAAC,EAAE,CAAC;QACtC,eAAM,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;QAC5C,MAAM,eAAe,CACnB,UAAU,EACV,+CAA+C,EAC/C,KAAK,EACL,OAAO,CACR,CAAC;QACF,IAAA,6CAAyB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAG,CAAC,cAAc,CAAC,MAAM,CAAC,UAAW,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,IAAI,gBAAqB,CAAC;IAC1B,IAAI,CAAC;QACH,gBAAgB,GAAG,eAAK,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC9C,6FAA6F;QAC7F,IAAI,cAAc,KAAK,cAAc,EAAE,CAAC;YACtC,gBAAgB,GAAG,gBAAgB,CAAC,QAAQ,CAAC;QAC/C,CAAC;IACH,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,eAAM,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,EAAE,iCAAiC,CAAC,CAAC;QACzD,MAAM,eAAe,CACnB,UAAU,EACV,4CAA4C,EAC5C,KAAK,EACL,OAAO,CACR,CAAC;QACF,IAAA,6CAAyB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAG,CAAC,cAAc,CAAC,MAAM,CAAC,UAAW,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,4EAA4E;IAC5E,MAAM,cAAc,GAAG,IAAA,uBAAa,EAAC,gBAAgB,CAAC,CAAC;IACvD,MAAM,gBAAgB,GAAG,MAAM,IAAA,2BAAc,EAAC,MAAM,EAAE,cAAc,CAAC,CAAC;IAEtE,gBAAgB;IAChB,IAAI,gBAAgB,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvC,eAAM,CAAC,KAAK,CACV,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EACxE,mBAAmB,CACpB,CAAC;QAEF,MAAM,aAAa,GAAG,MAAM,mBAAQ,CAAC,MAAM,CAAC;YAC1C,UAAU;YACV,KAAK,EAAE,MAAM;YACb,mBAAmB,EAAE,IAAI;SAC1B,CAAC,CAAC;QAEH,6CAA6C;QAC7C,IAAI,aAAa,EAAE,CAAC;YAClB,IAAI,IAAI,GAAG,6FAA6F,CAAC;YACzG,IAAI,IAAI,eAAe,cAAc,MAAM,CAAC;YAC5C,IAAI,IAAI,cAAc,gBAAgB,CAAC,MAAM;iBAC1C,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC;iBACrB,IAAI,CAAC,IAAI,CAAC;iBACV,OAAO,CAAC,IAAA,aAAK,EAAC,IAAI,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC;YAEnC,MAAM,IAAA,uBAAa,EAAC;gBAClB,MAAM,EAAE,aAAa,CAAC,MAAM;gBAC5B,KAAK,EAAE,6CAA6C;gBACpD,OAAO,EAAE,IAAI;aACd,CAAC,CAAC;QACL,CAAC;QAED,MAAM,eAAe,CAAC,UAAU,EAAE,mBAAmB,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QACvE,IAAA,6CAAyB,EAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC5C,MAAM,SAAG,CAAC,cAAc,CAAC,MAAM,CAAC,UAAW,CAAC,CAAC;QAC7C,OAAO;IACT,CAAC;IAED,gBAAgB;IAChB,MAAM,eAAe,CAAC,UAAU,EAAE,uBAAuB,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;IAE7E,IAAA,6CAAyB,EAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAC3C,MAAM,SAAG,CAAC,cAAc,CAAC,MAAM,CAAC,UAAW,CAAC,CAAC;IAC7C,OAAO;AACT,CAAC","sourcesContent":["import is from '@sindresorhus/is';\nimport JSON5 from 'json5';\nimport { massageConfig } from '../../../config/massage';\nimport type { RenovateConfig } from '../../../config/types';\nimport { validateConfig } from '../../../config/validation';\nimport { logger } from '../../../logger';\nimport { platform } from '../../../modules/platform';\nimport { ensureComment } from '../../../modules/platform/comment';\nimport { scm } from '../../../modules/platform/scm';\nimport type { BranchStatus } from '../../../types';\nimport { getCache } from '../../../util/cache/repository';\nimport { readLocalFile } from '../../../util/fs';\nimport { getBranchCommit } from '../../../util/git';\nimport { regEx } from '../../../util/regex';\nimport { detectConfigFile } from '../init/merge';\nimport { setReconfigureBranchCache } from './reconfigure-cache';\nimport { getReconfigureBranchName } from './utils';\n\nasync function setBranchStatus(\n branchName: string,\n description: string,\n state: BranchStatus,\n context?: string | null,\n): Promise<void> {\n if (!is.nonEmptyString(context)) {\n // already logged this case when validating the status check\n return;\n }\n\n await platform.setBranchStatus({\n branchName,\n context,\n description,\n state,\n });\n}\n\nexport async function validateReconfigureBranch(\n config: RenovateConfig,\n): Promise<void> {\n logger.debug('validateReconfigureBranch()');\n\n const context = config.statusCheckNames?.configValidation;\n const branchName = getReconfigureBranchName(config.branchPrefix!);\n\n // look for config file\n // 1. check reconfigure branch cache and use the configFileName if it exists\n // 2. checkout reconfigure branch and look for the config file, don't assume default configFileName\n const branchSha = getBranchCommit(branchName)!;\n const cache = getCache();\n let configFileName: string | null = null;\n const reconfigureCache = cache.reconfigureBranchCache;\n // only use valid cached information\n if (reconfigureCache?.reconfigureBranchSha === branchSha) {\n logger.debug('Skipping validation check as branch sha is unchanged');\n return;\n }\n\n if (context) {\n const validationStatus = await platform.getBranchStatusCheck(\n branchName,\n context,\n );\n\n // if old status check is present skip validation\n if (is.nonEmptyString(validationStatus)) {\n logger.debug(\n 'Skipping validation check because status check already exists.',\n );\n return;\n }\n } else {\n logger.debug(\n 'Status check is null or an empty string, skipping status check addition.',\n );\n }\n\n try {\n await scm.checkoutBranch(branchName);\n configFileName = await detectConfigFile();\n } catch (err) {\n logger.error(\n { err },\n 'Error while searching for config file in reconfigure branch',\n );\n }\n\n if (!is.nonEmptyString(configFileName)) {\n logger.warn('No config file found in reconfigure branch');\n await setBranchStatus(\n branchName,\n 'Validation Failed - No config file found',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.defaultBranch!);\n return;\n }\n\n let configFileRaw: string | null = null;\n try {\n configFileRaw = await readLocalFile(configFileName, 'utf8');\n } catch (err) {\n logger.error({ err }, 'Error while reading config file');\n }\n\n if (!is.nonEmptyString(configFileRaw)) {\n logger.warn('Empty or invalid config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Empty/Invalid config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n let configFileParsed: any;\n try {\n configFileParsed = JSON5.parse(configFileRaw);\n // no need to confirm renovate field in package.json we already do it in `detectConfigFile()`\n if (configFileName === 'package.json') {\n configFileParsed = configFileParsed.renovate;\n }\n } catch (err) {\n logger.error({ err }, 'Error while parsing config file');\n await setBranchStatus(\n branchName,\n 'Validation Failed - Unparsable config file',\n 'red',\n context,\n );\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // perform validation and provide a passing or failing check based on result\n const massagedConfig = massageConfig(configFileParsed);\n const validationResult = await validateConfig('repo', massagedConfig);\n\n // failing check\n if (validationResult.errors.length > 0) {\n logger.debug(\n { errors: validationResult.errors.map((err) => err.message).join(', ') },\n 'Validation Errors',\n );\n\n const reconfigurePr = await platform.findPr({\n branchName,\n state: 'open',\n includeOtherAuthors: true,\n });\n\n // add comment to reconfigure PR if it exists\n if (reconfigurePr) {\n let body = `There is an error with this repository's Renovate configuration that needs to be fixed.\\n\\n`;\n body += `Location: \\`${configFileName}\\`\\n`;\n body += `Message: \\`${validationResult.errors\n .map((e) => e.message)\n .join(', ')\n .replace(regEx(/`/g), \"'\")}\\`\\n`;\n\n await ensureComment({\n number: reconfigurePr.number,\n topic: 'Action Required: Fix Renovate Configuration',\n content: body,\n });\n }\n\n await setBranchStatus(branchName, 'Validation Failed', 'red', context);\n setReconfigureBranchCache(branchSha, false);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n }\n\n // passing check\n await setBranchStatus(branchName, 'Validation Successful', 'green', context);\n\n setReconfigureBranchCache(branchSha, true);\n await scm.checkoutBranch(config.baseBranch!);\n return;\n}\n"]}
|
@@ -43,7 +43,7 @@ function hasValidSchedule(schedule) {
|
|
43
43
|
const parsedCron = parseCron(scheduleText);
|
44
44
|
if (parsedCron !== undefined) {
|
45
45
|
if (parsedCron.minute.filter((v) => v !== 1).length !== 0 ||
|
46
|
-
scheduleText.
|
46
|
+
!scheduleText.startsWith(minutesChar)) {
|
47
47
|
message = `Invalid schedule: "${scheduleText}" has cron syntax, but doesn't have * as minutes`;
|
48
48
|
return true;
|
49
49
|
}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../../../../lib/workers/repository/update/branch/schedule.ts"],"names":[],"mappings":"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","sourcesContent":["import later from '@breejs/later';\nimport is from '@sindresorhus/is';\nimport { Cron, CronPattern } from 'croner';\nimport cronstrue from 'cronstrue';\nimport { DateTime } from 'luxon';\nimport { fixShortHours } from '../../../../config/migration';\nimport type { RenovateConfig } from '../../../../config/types';\nimport { logger } from '../../../../logger';\n\nconst scheduleMappings: Record<string, string> = {\n 'every month': 'before 5am on the first day of the month',\n monthly: 'before 5am on the first day of the month',\n};\n\nconst minutesChar = '*';\n\nfunction parseCron(scheduleText: string): CronPattern | undefined {\n try {\n return new CronPattern(scheduleText);\n } catch {\n return undefined;\n }\n}\n\nexport function hasValidTimezone(timezone: string): [true] | [false, string] {\n if (!DateTime.local().setZone(timezone).isValid) {\n return [false, `Invalid schedule: Unsupported timezone ${timezone}`];\n }\n return [true];\n}\n\nexport function hasValidSchedule(\n schedule: string[] | null | 'at any time',\n): [true] | [false, string] {\n let message = '';\n if (\n !schedule ||\n schedule === 'at any time' ||\n schedule[0] === 'at any time'\n ) {\n return [true];\n }\n // check if any of the schedules fail to parse\n const hasFailedSchedules = schedule.some((scheduleText) => {\n const parsedCron = parseCron(scheduleText);\n if (parsedCron !== undefined) {\n if (\n parsedCron.minute.filter((v) => v !== 1).length !== 0 ||\n scheduleText.indexOf(minutesChar) !== 0\n ) {\n message = `Invalid schedule: \"${scheduleText}\" has cron syntax, but doesn't have * as minutes`;\n return true;\n }\n\n // It was valid cron syntax and * as minutes\n return false;\n }\n\n const massagedText = fixShortHours(\n scheduleMappings[scheduleText] || scheduleText,\n );\n\n const parsedSchedule = later.parse.text(massagedText);\n if (parsedSchedule.error !== -1) {\n message = `Invalid schedule: Failed to parse \"${scheduleText}\"`;\n // It failed to parse\n return true;\n }\n if (parsedSchedule.schedules.some((s) => s.m)) {\n message = `Invalid schedule: \"${scheduleText}\" should not specify minutes`;\n return true;\n }\n if (\n !parsedSchedule.schedules.some(\n (s) =>\n !!s.M || s.d !== undefined || !!s.D || s.t_a !== undefined || !!s.t_b,\n )\n ) {\n message = `Invalid schedule: \"${scheduleText}\" has no months, days of week or time of day`;\n return true;\n }\n // It must be OK\n return false;\n });\n if (hasFailedSchedules) {\n // If any fail then we invalidate the whole thing\n return [false, message];\n }\n return [true];\n}\n\nexport function cronMatches(\n cron: string,\n now: DateTime,\n timezone?: string,\n): boolean {\n const parsedCron: Cron = new Cron(cron, {\n ...(timezone && { timezone }),\n legacyMode: false,\n });\n // it will always parse because it is checked beforehand\n // istanbul ignore if\n if (!parsedCron) {\n return false;\n }\n\n // return the next date which matches the cron schedule\n const nextRun = parsedCron.nextRun();\n // istanbul ignore if: should not happen\n if (!nextRun) {\n logger.warn(\n { schedule: cron },\n 'Invalid cron schedule. No next run is possible',\n );\n return false;\n }\n\n let nextDate = DateTime.fromJSDate(nextRun);\n if (timezone) {\n nextDate = nextDate.setZone(timezone);\n }\n\n return (\n nextDate.hour === now.hour &&\n nextDate.day === now.day &&\n nextDate.month === now.month\n );\n}\n\nexport function isScheduledNow(\n config: RenovateConfig,\n scheduleKey: 'schedule' | 'automergeSchedule' = 'schedule',\n): boolean {\n let configSchedule = config[scheduleKey];\n logger.debug(\n // TODO: types (#22198)\n `Checking schedule(schedule=${String(configSchedule)}, tz=${config.timezone!}, now=${new Date().toISOString()})`,\n );\n if (\n !configSchedule ||\n configSchedule.length === 0 ||\n configSchedule[0] === '' ||\n configSchedule[0] === 'at any time'\n ) {\n logger.debug('No schedule defined');\n return true;\n }\n if (!is.array(configSchedule)) {\n logger.warn(\n { schedule: configSchedule },\n 'config schedule is not an array',\n );\n configSchedule = [configSchedule];\n }\n const validSchedule = hasValidSchedule(configSchedule);\n if (!validSchedule[0]) {\n logger.warn(validSchedule[1]);\n return true;\n }\n let now: DateTime = DateTime.local();\n logger.trace(`now=${now.toISO()!}`);\n // Adjust the time if repo is in a different timezone to renovate\n if (config.timezone) {\n logger.debug(`Found timezone: ${config.timezone}`);\n const validTimezone = hasValidTimezone(config.timezone);\n if (!validTimezone[0]) {\n logger.warn(validTimezone[1]);\n return true;\n }\n logger.debug('Adjusting now for timezone');\n now = now.setZone(config.timezone);\n logger.trace(`now=${now.toISO()!}`);\n }\n const currentDay = now.weekday;\n logger.trace(`currentDay=${currentDay}`);\n // Get the number of seconds since midnight\n const currentSeconds = now\n .startOf('second')\n .diff(now.startOf('day'), 'seconds').seconds;\n logger.trace(`currentSeconds=${currentSeconds}`);\n // Support a single string but massage to array for processing\n logger.debug(`Checking ${configSchedule.length} schedule(s)`);\n\n // later is timezone agnostic (as in, it purely relies on the underlying UTC date/time that is stored in the Date),\n // which means we have to pass it a Date that has an underlying UTC date/time in the same timezone as the schedule\n const jsNow = now.setZone('utc', { keepLocalTime: true }).toJSDate();\n\n // We run if any schedule matches\n const isWithinSchedule = configSchedule.some((scheduleText) => {\n const cronSchedule = parseCron(scheduleText);\n if (cronSchedule) {\n const cronScheduleSummary = cronstrue.toString(scheduleText, {\n throwExceptionOnParseError: false,\n });\n logger.debug(`Human-readable summary for cron:: ${cronScheduleSummary}`);\n // We have Cron syntax\n if (cronMatches(scheduleText, now, config.timezone)) {\n logger.debug(`Matches schedule ${scheduleText}`);\n return true;\n }\n } else {\n // We have Later syntax\n const massagedText = scheduleMappings[scheduleText] || scheduleText;\n const parsedSchedule = later.parse.text(fixShortHours(massagedText));\n logger.debug({ parsedSchedule }, `Checking schedule \"${scheduleText}\"`);\n\n if (later.schedule(parsedSchedule).isValid(jsNow)) {\n logger.debug(`Matches schedule ${scheduleText}`);\n return true;\n }\n }\n\n return false;\n });\n if (!isWithinSchedule) {\n logger.debug('Package not scheduled');\n return false;\n }\n return true;\n}\n"]}
|
1
|
+
{"version":3,"file":"schedule.js","sourceRoot":"","sources":["../../../../../lib/workers/repository/update/branch/schedule.ts"],"names":[],"mappings":"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","sourcesContent":["import later from '@breejs/later';\nimport is from '@sindresorhus/is';\nimport { Cron, CronPattern } from 'croner';\nimport cronstrue from 'cronstrue';\nimport { DateTime } from 'luxon';\nimport { fixShortHours } from '../../../../config/migration';\nimport type { RenovateConfig } from '../../../../config/types';\nimport { logger } from '../../../../logger';\n\nconst scheduleMappings: Record<string, string> = {\n 'every month': 'before 5am on the first day of the month',\n monthly: 'before 5am on the first day of the month',\n};\n\nconst minutesChar = '*';\n\nfunction parseCron(scheduleText: string): CronPattern | undefined {\n try {\n return new CronPattern(scheduleText);\n } catch {\n return undefined;\n }\n}\n\nexport function hasValidTimezone(timezone: string): [true] | [false, string] {\n if (!DateTime.local().setZone(timezone).isValid) {\n return [false, `Invalid schedule: Unsupported timezone ${timezone}`];\n }\n return [true];\n}\n\nexport function hasValidSchedule(\n schedule: string[] | null | 'at any time',\n): [true] | [false, string] {\n let message = '';\n if (\n !schedule ||\n schedule === 'at any time' ||\n schedule[0] === 'at any time'\n ) {\n return [true];\n }\n // check if any of the schedules fail to parse\n const hasFailedSchedules = schedule.some((scheduleText) => {\n const parsedCron = parseCron(scheduleText);\n if (parsedCron !== undefined) {\n if (\n parsedCron.minute.filter((v) => v !== 1).length !== 0 ||\n !scheduleText.startsWith(minutesChar)\n ) {\n message = `Invalid schedule: \"${scheduleText}\" has cron syntax, but doesn't have * as minutes`;\n return true;\n }\n\n // It was valid cron syntax and * as minutes\n return false;\n }\n\n const massagedText = fixShortHours(\n scheduleMappings[scheduleText] || scheduleText,\n );\n\n const parsedSchedule = later.parse.text(massagedText);\n if (parsedSchedule.error !== -1) {\n message = `Invalid schedule: Failed to parse \"${scheduleText}\"`;\n // It failed to parse\n return true;\n }\n if (parsedSchedule.schedules.some((s) => s.m)) {\n message = `Invalid schedule: \"${scheduleText}\" should not specify minutes`;\n return true;\n }\n if (\n !parsedSchedule.schedules.some(\n (s) =>\n !!s.M || s.d !== undefined || !!s.D || s.t_a !== undefined || !!s.t_b,\n )\n ) {\n message = `Invalid schedule: \"${scheduleText}\" has no months, days of week or time of day`;\n return true;\n }\n // It must be OK\n return false;\n });\n if (hasFailedSchedules) {\n // If any fail then we invalidate the whole thing\n return [false, message];\n }\n return [true];\n}\n\nexport function cronMatches(\n cron: string,\n now: DateTime,\n timezone?: string,\n): boolean {\n const parsedCron: Cron = new Cron(cron, {\n ...(timezone && { timezone }),\n legacyMode: false,\n });\n // it will always parse because it is checked beforehand\n // istanbul ignore if\n if (!parsedCron) {\n return false;\n }\n\n // return the next date which matches the cron schedule\n const nextRun = parsedCron.nextRun();\n // istanbul ignore if: should not happen\n if (!nextRun) {\n logger.warn(\n { schedule: cron },\n 'Invalid cron schedule. No next run is possible',\n );\n return false;\n }\n\n let nextDate = DateTime.fromJSDate(nextRun);\n if (timezone) {\n nextDate = nextDate.setZone(timezone);\n }\n\n return (\n nextDate.hour === now.hour &&\n nextDate.day === now.day &&\n nextDate.month === now.month\n );\n}\n\nexport function isScheduledNow(\n config: RenovateConfig,\n scheduleKey: 'schedule' | 'automergeSchedule' = 'schedule',\n): boolean {\n let configSchedule = config[scheduleKey];\n logger.debug(\n // TODO: types (#22198)\n `Checking schedule(schedule=${String(configSchedule)}, tz=${config.timezone!}, now=${new Date().toISOString()})`,\n );\n if (\n !configSchedule ||\n configSchedule.length === 0 ||\n configSchedule[0] === '' ||\n configSchedule[0] === 'at any time'\n ) {\n logger.debug('No schedule defined');\n return true;\n }\n if (!is.array(configSchedule)) {\n logger.warn(\n { schedule: configSchedule },\n 'config schedule is not an array',\n );\n configSchedule = [configSchedule];\n }\n const validSchedule = hasValidSchedule(configSchedule);\n if (!validSchedule[0]) {\n logger.warn(validSchedule[1]);\n return true;\n }\n let now: DateTime = DateTime.local();\n logger.trace(`now=${now.toISO()!}`);\n // Adjust the time if repo is in a different timezone to renovate\n if (config.timezone) {\n logger.debug(`Found timezone: ${config.timezone}`);\n const validTimezone = hasValidTimezone(config.timezone);\n if (!validTimezone[0]) {\n logger.warn(validTimezone[1]);\n return true;\n }\n logger.debug('Adjusting now for timezone');\n now = now.setZone(config.timezone);\n logger.trace(`now=${now.toISO()!}`);\n }\n const currentDay = now.weekday;\n logger.trace(`currentDay=${currentDay}`);\n // Get the number of seconds since midnight\n const currentSeconds = now\n .startOf('second')\n .diff(now.startOf('day'), 'seconds').seconds;\n logger.trace(`currentSeconds=${currentSeconds}`);\n // Support a single string but massage to array for processing\n logger.debug(`Checking ${configSchedule.length} schedule(s)`);\n\n // later is timezone agnostic (as in, it purely relies on the underlying UTC date/time that is stored in the Date),\n // which means we have to pass it a Date that has an underlying UTC date/time in the same timezone as the schedule\n const jsNow = now.setZone('utc', { keepLocalTime: true }).toJSDate();\n\n // We run if any schedule matches\n const isWithinSchedule = configSchedule.some((scheduleText) => {\n const cronSchedule = parseCron(scheduleText);\n if (cronSchedule) {\n const cronScheduleSummary = cronstrue.toString(scheduleText, {\n throwExceptionOnParseError: false,\n });\n logger.debug(`Human-readable summary for cron:: ${cronScheduleSummary}`);\n // We have Cron syntax\n if (cronMatches(scheduleText, now, config.timezone)) {\n logger.debug(`Matches schedule ${scheduleText}`);\n return true;\n }\n } else {\n // We have Later syntax\n const massagedText = scheduleMappings[scheduleText] || scheduleText;\n const parsedSchedule = later.parse.text(fixShortHours(massagedText));\n logger.debug({ parsedSchedule }, `Checking schedule \"${scheduleText}\"`);\n\n if (later.schedule(parsedSchedule).isValid(jsNow)) {\n logger.debug(`Matches schedule ${scheduleText}`);\n return true;\n }\n }\n\n return false;\n });\n if (!isWithinSchedule) {\n logger.debug('Package not scheduled');\n return false;\n }\n return true;\n}\n"]}
|
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"updates-table.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/body/updates-table.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '../../../../../logger';\nimport { regEx } from '../../../../../util/regex';\nimport * as template from '../../../../../util/template';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../../types';\n\
|
1
|
+
{"version":3,"file":"updates-table.js","sourceRoot":"","sources":["../../../../../../lib/workers/repository/update/pr/body/updates-table.ts"],"names":[],"mappings":"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","sourcesContent":["import { logger } from '../../../../../logger';\nimport { regEx } from '../../../../../util/regex';\nimport * as template from '../../../../../util/template';\nimport type { BranchConfig, BranchUpgradeConfig } from '../../../../types';\n\ninterface TableDefinition {\n header: string;\n value: string | undefined;\n}\n\nfunction getRowDefinition(\n prBodyColumns: string[],\n upgrade: BranchUpgradeConfig,\n): TableDefinition[] {\n const res: TableDefinition[] = [];\n if (upgrade.prBodyDefinitions) {\n for (const header of prBodyColumns) {\n const value = upgrade.prBodyDefinitions[header];\n res.push({ header, value });\n }\n }\n return res;\n}\n\nfunction getNonEmptyColumns(\n prBodyColumns: string[],\n rows: Record<string, string>[],\n): string[] {\n const res: string[] = [];\n for (const header of prBodyColumns) {\n for (const row of rows) {\n if (row[header]?.length) {\n if (!res.includes(header)) {\n res.push(header);\n }\n }\n }\n }\n return res;\n}\n\nexport function getPrUpdatesTable(config: BranchConfig): string {\n if (config.prBodyColumns === undefined) {\n logger.warn('getPrUpdatesTable - prBodyColumns is undefined');\n return '';\n }\n\n const tableKeyValuePairs: Record<string, Record<string, string>> = {};\n for (const upgrade of config.upgrades) {\n if (upgrade) {\n // Create a key based on the properties which are significant in the updates table\n const key = `${upgrade.depName ?? ''}_${upgrade.depType ?? ''}_${upgrade.newValue ?? ''}_${upgrade.newVersion ?? ''}_${upgrade.currentValue ?? ''}_${upgrade.currentVersion ?? ''}_${upgrade.updateType}`;\n\n const res: Record<string, string> = {};\n const rowDefinition = getRowDefinition(config.prBodyColumns, upgrade);\n for (const column of rowDefinition) {\n const { header, value } = column;\n try {\n // istanbul ignore else\n if (value) {\n res[header] = template\n .compile(value, upgrade)\n .replace(regEx(/``/g), '');\n } else {\n res[header] = '';\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ header, value, err }, 'Handlebars compilation error');\n }\n }\n\n if (tableKeyValuePairs[key]) {\n // compare the duplicate upgrades as per their table values\n // and select one with better values\n tableKeyValuePairs[key] = compareTableValues(\n tableKeyValuePairs[key],\n res,\n config.prBodyColumns,\n );\n } else {\n tableKeyValuePairs[key] = res;\n }\n }\n }\n\n const tableValues = Object.values(tableKeyValuePairs);\n const tableColumns = getNonEmptyColumns(config.prBodyColumns, tableValues);\n let res = '\\n\\nThis PR contains the following updates:\\n\\n';\n res += '| ' + tableColumns.join(' | ') + ' |\\n';\n res += '|' + tableColumns.map(() => '---|').join('') + '\\n';\n const rows = [];\n for (const row of tableValues) {\n let val = '|';\n for (const column of tableColumns) {\n const content = row[column]\n ? row[column]\n .replace(regEx(/^@/), '@​')\n .replace(regEx(/\\|/g), '\\\\|')\n : '';\n val += ` ${content} |`;\n }\n val += '\\n';\n rows.push(val);\n }\n const uniqueRows = [...new Set(rows)];\n res += uniqueRows.join('');\n res += '\\n\\n';\n return res;\n}\n\n// return the row with better table values\nfunction compareTableValues(\n a: Record<string, string>,\n b: Record<string, string>,\n prBodyColumns: string[],\n): Record<string, string> {\n let score = 0;\n\n for (const header of prBodyColumns) {\n if (!b[header] && !a[header]) {\n continue;\n }\n if (!b[header]) {\n score--;\n continue;\n }\n if (!a[header]) {\n score++;\n continue;\n }\n\n if (a[header] !== b[header]) {\n if (a[header].length < b[header].length) {\n score++;\n } else {\n score--;\n }\n }\n }\n return score > 0 ? b : a;\n}\n"]}
|
@@ -361,6 +361,15 @@ function generateBranchConfig(upgrades) {
|
|
361
361
|
if (config.upgrades.some((upgrade) => upgrade.updateType === 'major')) {
|
362
362
|
config.updateType = 'major';
|
363
363
|
}
|
364
|
+
// explicit set `isLockFileMaintenance` for the branch for groups
|
365
|
+
if (config.upgrades.some((upgrade) => upgrade.isLockFileMaintenance)) {
|
366
|
+
config.isLockFileMaintenance = true;
|
367
|
+
// istanbul ignore if: not worth testing
|
368
|
+
if (config.upgrades.some((upgrade) => !upgrade.isLockFileMaintenance)) {
|
369
|
+
// TODO: warn?
|
370
|
+
logger_1.logger.debug('Grouping lockfile maintenance with other update types is not supported');
|
371
|
+
}
|
372
|
+
}
|
364
373
|
config.constraints = {};
|
365
374
|
for (const upgrade of config.upgrades) {
|
366
375
|
if (upgrade.constraints) {
|