renovate 44.30.0 → 44.30.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/migration.js +3 -3
- package/dist/config/migration.js.map +1 -1
- package/dist/config/migrations/custom/azure-gitlab-automerge-migration.js.map +1 -1
- package/dist/config/migrations/custom/dep-types-migration.js.map +1 -1
- package/dist/config/options/env.js +2 -1
- package/dist/config/options/env.js.map +1 -1
- package/dist/config/options/index.js +1 -1
- package/dist/config/options/index.js.map +1 -1
- package/dist/global-config-option-defaults.generated.js +1 -1
- package/dist/global-config-option-defaults.generated.js.map +1 -1
- package/dist/logger/utils.js +3 -3
- package/dist/logger/utils.js.map +1 -1
- package/dist/modules/datasource/crate/index.js +3 -3
- package/dist/modules/datasource/crate/index.js.map +1 -1
- package/dist/modules/datasource/go/base.js +1 -1
- package/dist/modules/datasource/go/base.js.map +1 -1
- package/dist/modules/datasource/go/goproxy-parser.js +1 -1
- package/dist/modules/datasource/go/goproxy-parser.js.map +1 -1
- package/dist/modules/datasource/hexpm-bob/index.js +3 -3
- package/dist/modules/datasource/hexpm-bob/index.js.map +1 -1
- package/dist/modules/datasource/maven/util.js +1 -1
- package/dist/modules/datasource/maven/util.js.map +1 -1
- package/dist/modules/datasource/packagist/schema.js +2 -1
- package/dist/modules/datasource/packagist/schema.js.map +1 -1
- package/dist/modules/datasource/pypi/common.js +1 -1
- package/dist/modules/datasource/pypi/common.js.map +1 -1
- package/dist/modules/datasource/rpm/repomd.js +2 -1
- package/dist/modules/datasource/rpm/repomd.js.map +1 -1
- package/dist/modules/datasource/sbt-package/util.js +3 -3
- package/dist/modules/datasource/sbt-package/util.js.map +1 -1
- package/dist/modules/datasource/terraform-provider/index.js +1 -1
- package/dist/modules/datasource/terraform-provider/index.js.map +1 -1
- package/dist/modules/manager/ansible-galaxy/util.js +4 -4
- package/dist/modules/manager/ansible-galaxy/util.js.map +1 -1
- package/dist/modules/manager/asdf/upgradeable-tooling.js +5 -5
- package/dist/modules/manager/asdf/upgradeable-tooling.js.map +1 -1
- package/dist/modules/manager/bazel-module/extract.js +2 -1
- package/dist/modules/manager/bazel-module/extract.js.map +1 -1
- package/dist/modules/manager/bazel-module/parser/repo-rules.js +1 -1
- package/dist/modules/manager/bazel-module/parser/repo-rules.js.map +1 -1
- package/dist/modules/manager/bitbucket-pipelines/extract.js +2 -2
- package/dist/modules/manager/bitbucket-pipelines/extract.js.map +1 -1
- package/dist/modules/manager/bun/utils.js +2 -1
- package/dist/modules/manager/bun/utils.js.map +1 -1
- package/dist/modules/manager/bundler/extract.js +1 -1
- package/dist/modules/manager/bundler/extract.js.map +1 -1
- package/dist/modules/manager/cake/index.js.map +1 -1
- package/dist/modules/manager/composer/schema.js +2 -2
- package/dist/modules/manager/composer/schema.js.map +1 -1
- package/dist/modules/manager/cpanfile/language.js.map +1 -1
- package/dist/modules/manager/cpanfile/parser.js +4 -4
- package/dist/modules/manager/cpanfile/parser.js.map +1 -1
- package/dist/modules/manager/crossplane/extract.js +2 -1
- package/dist/modules/manager/crossplane/extract.js.map +1 -1
- package/dist/modules/manager/deps-edn/extract.js +1 -1
- package/dist/modules/manager/deps-edn/extract.js.map +1 -1
- package/dist/modules/manager/deps-edn/parser.js.map +1 -1
- package/dist/modules/manager/dockerfile/extract.js +2 -2
- package/dist/modules/manager/dockerfile/extract.js.map +1 -1
- package/dist/modules/manager/flux/extract.js +2 -2
- package/dist/modules/manager/flux/extract.js.map +1 -1
- package/dist/modules/manager/git-submodules/extract.js +1 -1
- package/dist/modules/manager/git-submodules/extract.js.map +1 -1
- package/dist/modules/manager/gomod/artifacts.js +1 -1
- package/dist/modules/manager/gomod/artifacts.js.map +1 -1
- package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js +2 -2
- package/dist/modules/manager/gradle/extract/consistent-versions-plugin.js.map +1 -1
- package/dist/modules/manager/gradle-wrapper/artifacts.js +2 -2
- package/dist/modules/manager/gradle-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/helmv3/utils.js +2 -1
- package/dist/modules/manager/helmv3/utils.js.map +1 -1
- package/dist/modules/manager/hermit/extract.js +1 -1
- package/dist/modules/manager/hermit/extract.js.map +1 -1
- package/dist/modules/manager/homebrew/utils.js +3 -3
- package/dist/modules/manager/homebrew/utils.js.map +1 -1
- package/dist/modules/manager/jsonnet-bundler/extract.js +2 -1
- package/dist/modules/manager/jsonnet-bundler/extract.js.map +1 -1
- package/dist/modules/manager/leiningen/extract.js +2 -2
- package/dist/modules/manager/leiningen/extract.js.map +1 -1
- package/dist/modules/manager/maven-wrapper/artifacts.js +6 -6
- package/dist/modules/manager/maven-wrapper/artifacts.js.map +1 -1
- package/dist/modules/manager/mise/backends.js +3 -3
- package/dist/modules/manager/mise/backends.js.map +1 -1
- package/dist/modules/manager/mise/upgradeable-tooling.js +1 -1
- package/dist/modules/manager/mise/upgradeable-tooling.js.map +1 -1
- package/dist/modules/manager/npm/extract/common/dependency.js +2 -2
- package/dist/modules/manager/npm/extract/common/dependency.js.map +1 -1
- package/dist/modules/manager/npm/extract/post/locked-versions.js +2 -1
- package/dist/modules/manager/npm/extract/post/locked-versions.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/npm.js +2 -1
- package/dist/modules/manager/npm/post-update/npm.js.map +1 -1
- package/dist/modules/manager/npm/post-update/yarn.js +2 -2
- package/dist/modules/manager/npm/post-update/yarn.js.map +1 -1
- package/dist/modules/manager/npm/schema.js +2 -1
- package/dist/modules/manager/npm/schema.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js +2 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/get-locked.js.map +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/replace.js +1 -1
- package/dist/modules/manager/npm/update/locked-dependency/yarn-lock/replace.js.map +1 -1
- package/dist/modules/manager/nuget/extract.js +1 -1
- package/dist/modules/manager/nuget/extract.js.map +1 -1
- package/dist/modules/manager/nvm/extract.js +2 -1
- package/dist/modules/manager/nvm/extract.js.map +1 -1
- package/dist/modules/manager/osgi/extract.js +2 -1
- package/dist/modules/manager/osgi/extract.js.map +1 -1
- package/dist/modules/manager/pep621/processors/uv.js +2 -1
- package/dist/modules/manager/pep621/processors/uv.js.map +1 -1
- package/dist/modules/manager/pip_requirements/extract.js +1 -1
- package/dist/modules/manager/pip_requirements/extract.js.map +1 -1
- package/dist/modules/manager/pip_setup/extract.js +3 -3
- package/dist/modules/manager/pip_setup/extract.js.map +1 -1
- package/dist/modules/manager/pixi/schema.js +2 -1
- package/dist/modules/manager/pixi/schema.js.map +1 -1
- package/dist/modules/manager/setup-cfg/extract.js +1 -1
- package/dist/modules/manager/setup-cfg/extract.js.map +1 -1
- package/dist/modules/manager/sveltos/util.js +1 -1
- package/dist/modules/manager/sveltos/util.js.map +1 -1
- package/dist/modules/manager/typst/extract.js +2 -2
- package/dist/modules/manager/typst/extract.js.map +1 -1
- package/dist/modules/platform/azure/issue.js +2 -1
- package/dist/modules/platform/azure/issue.js.map +1 -1
- package/dist/modules/platform/bitbucket/index.js +1 -1
- package/dist/modules/platform/bitbucket/index.js.map +1 -1
- package/dist/modules/platform/bitbucket/schema.js +2 -1
- package/dist/modules/platform/bitbucket/schema.js.map +1 -1
- package/dist/modules/platform/codecommit/codecommit-client.js +2 -1
- package/dist/modules/platform/codecommit/codecommit-client.js.map +1 -1
- package/dist/modules/platform/gerrit/utils.js +1 -1
- package/dist/modules/platform/gerrit/utils.js.map +1 -1
- package/dist/modules/platform/github/index.js +8 -8
- package/dist/modules/platform/github/index.js.map +1 -1
- package/dist/modules/platform/github/massage-markdown-links.js +6 -3
- package/dist/modules/platform/github/massage-markdown-links.js.map +1 -1
- package/dist/modules/versioning/apk/index.js +15 -15
- package/dist/modules/versioning/apk/index.js.map +1 -1
- package/dist/modules/versioning/bazel-module/bzlmod-version.js +3 -2
- package/dist/modules/versioning/bazel-module/bzlmod-version.js.map +1 -1
- package/dist/modules/versioning/bazel-module/index.js +2 -1
- package/dist/modules/versioning/bazel-module/index.js.map +1 -1
- package/dist/modules/versioning/composer/index.js +2 -2
- package/dist/modules/versioning/composer/index.js.map +1 -1
- package/dist/modules/versioning/conan/range.js +4 -3
- package/dist/modules/versioning/conan/range.js.map +1 -1
- package/dist/modules/versioning/conda/index.js +4 -3
- package/dist/modules/versioning/conda/index.js.map +1 -1
- package/dist/modules/versioning/distro.js +2 -1
- package/dist/modules/versioning/distro.js.map +1 -1
- package/dist/modules/versioning/generic.js +2 -1
- package/dist/modules/versioning/generic.js.map +1 -1
- package/dist/modules/versioning/hashicorp/convertor.js +1 -1
- package/dist/modules/versioning/hashicorp/convertor.js.map +1 -1
- package/dist/modules/versioning/npm/range.js +1 -1
- package/dist/modules/versioning/npm/range.js.map +1 -1
- package/dist/modules/versioning/nuget/range.js +2 -1
- package/dist/modules/versioning/nuget/range.js.map +1 -1
- package/dist/modules/versioning/perl/index.js +1 -1
- package/dist/modules/versioning/perl/index.js.map +1 -1
- package/dist/modules/versioning/poetry/transform.js +2 -2
- package/dist/modules/versioning/poetry/transform.js.map +1 -1
- package/dist/modules/versioning/rez/pattern.js.map +1 -1
- package/dist/modules/versioning/ruby/index.js +1 -1
- package/dist/modules/versioning/ruby/index.js.map +1 -1
- package/dist/modules/versioning/semver/index.js +2 -1
- package/dist/modules/versioning/semver/index.js.map +1 -1
- package/dist/modules/versioning/semver-coerced/index.js +1 -1
- package/dist/modules/versioning/semver-coerced/index.js.map +1 -1
- package/dist/util/emoji.js.map +1 -1
- package/dist/util/exec/containerbase.js +2 -1
- package/dist/util/exec/containerbase.js.map +1 -1
- package/dist/util/exec/env.js +2 -1
- package/dist/util/exec/env.js.map +1 -1
- package/dist/util/git/private-key.js +1 -1
- package/dist/util/git/private-key.js.map +1 -1
- package/dist/util/github/graphql/datasource-fetcher.js +2 -1
- package/dist/util/github/graphql/datasource-fetcher.js.map +1 -1
- package/dist/util/http/forgejo.js +2 -1
- package/dist/util/http/forgejo.js.map +1 -1
- package/dist/util/http/gitea.js +2 -1
- package/dist/util/http/gitea.js.map +1 -1
- package/dist/util/number.js +2 -1
- package/dist/util/number.js.map +1 -1
- package/dist/util/string-match.js +1 -1
- package/dist/util/string-match.js.map +1 -1
- package/dist/util/url.js +2 -2
- package/dist/util/url.js.map +1 -1
- package/dist/workers/global/config/parse/cli.js +1 -1
- package/dist/workers/global/config/parse/cli.js.map +1 -1
- package/dist/workers/global/config/parse/coersions.js +2 -1
- package/dist/workers/global/config/parse/coersions.js.map +1 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js +2 -1
- package/dist/workers/global/config/parse/host-rules-from-env.js.map +1 -1
- package/dist/workers/repository/model/commit-message.js +2 -1
- package/dist/workers/repository/model/commit-message.js.map +1 -1
- package/dist/workers/repository/model/semantic-commit-message.js +2 -1
- package/dist/workers/repository/model/semantic-commit-message.js.map +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js +1 -1
- package/dist/workers/repository/update/pr/changelog/common.js.map +1 -1
- package/dist/workers/repository/updates/generate.js +1 -1
- package/dist/workers/repository/updates/generate.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +2 -2
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(registryAliases ?? {})) {\n if (currentFrom.startsWith(`${name}/`)) {\n const depName = currentFrom.substring(name.length + 1);\n const dep = getDep(`${value}/${depName}`, false);\n // retain depName, not sure if condition is necessary\n if (dep.depName?.startsWith(value)) {\n dep.packageName = dep.depName;\n dep.depName = `${name}/${dep.depName.substring(value.length + 1)}`;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; ) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = new RegExp(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n ); // TODO #12875 complex for re2 has too many not supported groups\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = new RegExp(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n ); // TODO #12875 complex for re2 has too many not supported groups\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (Number.isNaN(Number(copyFromMatch.groups.image))) {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n } else {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n deps.at(-1)!.depType = 'final';\n return { deps };\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":["ubuntuVersioning.id","debianVersioning.id"],"sources":["../../../../lib/modules/manager/dockerfile/extract.ts"],"sourcesContent":["import { isNonEmptyStringAndNotWhitespace, isString } from '@sindresorhus/is';\nimport { logger } from '../../../logger/index.ts';\nimport { newlineRegex, regEx } from '../../../util/regex.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport * as debianVersioning from '../../versioning/debian/index.ts';\nimport * as ubuntuVersioning from '../../versioning/ubuntu/index.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFileContent,\n} from '../types.ts';\n\nconst variableMarker = '$';\n\nexport function extractVariables(image: string): Record<string, string> {\n const variables: Record<string, string> = {};\n const variableRegex = regEx(\n /(?<fullvariable>\\\\?\\$(?<simplearg>\\w+)|\\\\?\\${(?<complexarg>\\w+)(?::.+?)?}+)/gi,\n );\n\n let match: RegExpExecArray | null;\n do {\n match = variableRegex.exec(image);\n if (match?.groups?.fullvariable) {\n variables[match.groups.fullvariable] =\n match.groups?.simplearg || match.groups?.complexarg;\n }\n } while (match);\n\n return variables;\n}\n\nfunction getAutoReplaceTemplate(dep: PackageDependency): string | undefined {\n let template = dep.replaceString;\n\n if (dep.currentValue) {\n let placeholder = '{{#if newValue}}{{newValue}}{{/if}}';\n if (!dep.currentDigest) {\n placeholder += '{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n template = template?.replace(dep.currentValue, placeholder);\n }\n\n if (dep.currentDigest) {\n template = template?.replace(\n dep.currentDigest,\n '{{#if newDigest}}{{newDigest}}{{/if}}',\n );\n }\n\n return template;\n}\n\nfunction processDepForAutoReplace(\n dep: PackageDependency,\n lineNumberRanges: number[][],\n lines: string[],\n linefeed: string,\n): void {\n const lineNumberRangesToReplace: number[][] = [];\n for (const lineNumberRange of lineNumberRanges) {\n for (const lineNumber of lineNumberRange) {\n if (\n (isString(dep.currentValue) &&\n lines[lineNumber].includes(dep.currentValue)) ||\n (isString(dep.currentDigest) &&\n lines[lineNumber].includes(dep.currentDigest))\n ) {\n lineNumberRangesToReplace.push(lineNumberRange);\n }\n }\n }\n\n lineNumberRangesToReplace.sort((a, b) => {\n return a[0] - b[0];\n });\n\n const minLine = lineNumberRangesToReplace[0]?.[0];\n const maxLine = lineNumberRangesToReplace.at(-1)?.[1];\n if (\n lineNumberRanges.length === 1 ||\n minLine === undefined ||\n maxLine === undefined\n ) {\n return;\n }\n\n const unfoldedLineNumbers = Array.from(\n { length: maxLine - minLine + 1 },\n (_v, k) => k + minLine,\n );\n\n dep.replaceString = unfoldedLineNumbers\n .map((lineNumber) => lines[lineNumber])\n .join(linefeed);\n\n if (!dep.currentDigest) {\n dep.replaceString += linefeed;\n }\n\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n}\n\nexport function splitImageParts(currentFrom: string): PackageDependency {\n let isVariable = false;\n let cleanedCurrentFrom = currentFrom;\n\n // Check if we have a variable in format of \"${VARIABLE:-<image>:<defaultVal>@<digest>}\"\n // If so, remove everything except the image, defaultVal and digest.\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n const defaultValueRegex = regEx(/^\\${.+?:-\"?(?<value>.*?)\"?}$/);\n const defaultValueMatch =\n defaultValueRegex.exec(cleanedCurrentFrom)?.groups;\n if (defaultValueMatch?.value) {\n isVariable = true;\n cleanedCurrentFrom = defaultValueMatch.value;\n }\n\n if (cleanedCurrentFrom?.includes(variableMarker)) {\n // If cleanedCurrentFrom contains a variable, after cleaning, e.g. \"$REGISTRY/alpine\", we do not support this.\n return {\n skipReason: 'contains-variable',\n };\n }\n }\n\n const [currentDepTag, currentDigest] = cleanedCurrentFrom.split('@');\n const depTagSplit = currentDepTag.split(':');\n let depName: string;\n let currentValue: string | undefined;\n if (depTagSplit.length === 1 || depTagSplit.at(-1)!.includes('/')) {\n depName = currentDepTag;\n } else {\n currentValue = depTagSplit.pop();\n depName = depTagSplit.join(':');\n }\n\n const dep: PackageDependency = {\n depName,\n packageName: depName,\n currentValue,\n currentDigest,\n };\n\n if (isVariable) {\n dep.replaceString = cleanedCurrentFrom;\n\n if (!dep.currentValue) {\n delete dep.currentValue;\n }\n\n if (!dep.currentDigest) {\n delete dep.currentDigest;\n }\n }\n\n return dep;\n}\n\nconst quayRegex = regEx(/^quay\\.io(?::[1-9][0-9]{0,4})?/i);\n\nexport function getDep(\n currentFrom: string | null | undefined,\n specifyReplaceString = true,\n registryAliases?: Record<string, string>,\n): PackageDependency {\n if (\n !isString(currentFrom) ||\n !isNonEmptyStringAndNotWhitespace(currentFrom)\n ) {\n return {\n skipReason: 'invalid-value',\n };\n }\n\n // Resolve registry aliases first so that we don't need special casing later on:\n for (const [name, value] of Object.entries(registryAliases ?? {})) {\n if (currentFrom.startsWith(`${name}/`)) {\n const depName = currentFrom.substring(name.length + 1);\n const dep = getDep(`${value}/${depName}`, false);\n // retain depName, not sure if condition is necessary\n if (dep.depName?.startsWith(value)) {\n dep.packageName = dep.depName;\n dep.depName = `${name}/${dep.depName.substring(value.length + 1)}`;\n }\n if (specifyReplaceString) {\n dep.replaceString = currentFrom;\n dep.autoReplaceStringTemplate = getAutoReplaceTemplate(dep);\n }\n return dep;\n }\n }\n\n const dep = splitImageParts(currentFrom);\n if (specifyReplaceString) {\n dep.replaceString ??= currentFrom;\n dep.autoReplaceStringTemplate =\n '{{depName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n dep.datasource = DockerDatasource.id;\n\n // Pretty up special prefixes\n if (dep.depName) {\n const specialPrefixes = ['amd64', 'arm64', 'library'];\n for (const prefix of specialPrefixes) {\n if (dep.depName.startsWith(`${prefix}/`)) {\n dep.depName = dep.depName.replace(`${prefix}/`, '');\n if (specifyReplaceString) {\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n }\n }\n\n if (dep.depName === 'ubuntu' || dep.depName?.endsWith('/ubuntu')) {\n dep.versioning = ubuntuVersioning.id;\n }\n\n if (\n (dep.depName === 'debian' || dep.depName?.endsWith('/debian')) &&\n debianVersioning.api.isVersion(dep.currentValue)\n ) {\n dep.versioning = debianVersioning.id;\n }\n\n // Don't display quay.io ports\n if (dep.depName && quayRegex.test(dep.depName)) {\n const depName = dep.depName.replace(quayRegex, 'quay.io');\n if (depName !== dep.depName) {\n dep.depName = depName;\n dep.autoReplaceStringTemplate =\n '{{packageName}}{{#if newValue}}:{{newValue}}{{/if}}{{#if newDigest}}@{{newDigest}}{{/if}}';\n }\n }\n\n return dep;\n}\n\nexport function extractPackageFile(\n content: string,\n _packageFile: string,\n config: ExtractConfig,\n): PackageFileContent | null {\n const sanitizedContent = content.replace(regEx(/^\\uFEFF/), ''); // remove bom marker\n const deps: PackageDependency[] = [];\n const stageNames: string[] = [];\n const args: Record<string, string> = {};\n const argsLines: Record<string, number[]> = {};\n\n let escapeChar = '\\\\\\\\';\n let lookForEscapeChar = true;\n let lookForSyntaxDirective = true;\n\n const lineFeed = sanitizedContent.includes('\\r\\n') ? '\\r\\n' : '\\n';\n const lines = sanitizedContent.split(newlineRegex);\n for (let lineNumber = 0; lineNumber < lines.length; ) {\n const lineNumberInstrStart = lineNumber;\n let instruction = lines[lineNumber];\n\n if (lookForEscapeChar) {\n const directivesMatch = regEx(\n /^[ \\t]*#[ \\t]*(?<directive>syntax|escape)[ \\t]*=[ \\t]*(?<escapeChar>\\S)/i,\n ).exec(instruction);\n if (!directivesMatch) {\n lookForEscapeChar = false;\n } else if (directivesMatch.groups?.directive.toLowerCase() === 'escape') {\n if (directivesMatch.groups?.escapeChar === '`') {\n escapeChar = '`';\n }\n lookForEscapeChar = false;\n }\n }\n\n if (lookForSyntaxDirective) {\n const syntaxRegex = regEx(\n '^#[ \\\\t]*syntax[ \\\\t]*=[ \\\\t]*(?<image>\\\\S+)',\n 'im',\n );\n const syntaxMatch = instruction.match(syntaxRegex);\n if (syntaxMatch?.groups?.image) {\n const syntaxImage = syntaxMatch.groups.image;\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n const dep = getDep(syntaxImage, true, config.registryAliases);\n dep.depType = 'syntax';\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile # syntax',\n );\n deps.push(dep);\n }\n lookForSyntaxDirective = false;\n }\n\n const lineContinuationRegex = regEx(`${escapeChar}[ \\\\t]*$|^[ \\\\t]*#`, 'm');\n let lineLookahead = instruction;\n while (\n !lookForEscapeChar &&\n !instruction.trimStart().startsWith('#') &&\n lineContinuationRegex.test(lineLookahead)\n ) {\n lineLookahead = lines[++lineNumber] || '';\n instruction += `\\n${lineLookahead}`;\n }\n\n const argRegex = regEx(\n `^[ \\\\t]*ARG(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+(?<name>\\\\w+)[ =](?<value>\\\\S*)`,\n 'im',\n );\n const argMatch = argRegex.exec(instruction);\n if (argMatch?.groups?.name) {\n argsLines[argMatch.groups.name] = [lineNumberInstrStart, lineNumber];\n let argMatchValue = argMatch.groups?.value;\n\n if (\n (argMatchValue.startsWith('\"') && argMatchValue.endsWith('\"')) ||\n (argMatchValue.startsWith(\"'\") && argMatchValue.endsWith(\"'\"))\n ) {\n argMatchValue = argMatchValue.slice(1, -1);\n }\n\n args[argMatch.groups.name] = argMatchValue || '';\n }\n\n const fromRegex = regEx(\n `^[ \\\\t]*FROM(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--platform=\\\\S+)+(?<image>\\\\S+)(?:(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n)+as[ \\\\t]+(?<name>\\\\S+))?`,\n 'im',\n );\n const fromMatch = instruction.match(fromRegex);\n if (fromMatch?.groups?.image) {\n let fromImage = fromMatch.groups.image;\n const lineNumberRanges: number[][] = [[lineNumberInstrStart, lineNumber]];\n\n if (fromImage.includes(variableMarker)) {\n const variables = extractVariables(fromImage);\n for (const [fullVariable, argName] of Object.entries(variables)) {\n const resolvedArgValue = args[argName];\n if (resolvedArgValue || resolvedArgValue === '') {\n fromImage = fromImage.replaceAll(fullVariable, resolvedArgValue);\n lineNumberRanges.push(argsLines[argName]);\n }\n }\n }\n\n if (fromMatch.groups?.name) {\n logger.debug(\n `Found a multistage build stage name: ${fromMatch.groups.name}`,\n );\n stageNames.push(fromMatch.groups.name);\n }\n if (fromImage === 'scratch') {\n logger.debug('Skipping scratch');\n } else if (fromImage && stageNames.includes(fromImage)) {\n logger.debug(`Skipping alias FROM image:${fromImage}`);\n } else {\n const dep = getDep(fromImage, true, config.registryAliases);\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.trace(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile FROM',\n );\n deps.push(dep);\n }\n }\n\n const copyFromRegex = regEx(\n `^[ \\\\t]*COPY(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--from=(?<image>\\\\S+)`,\n 'im',\n );\n const copyFromMatch = instruction.match(copyFromRegex);\n if (copyFromMatch?.groups?.image) {\n if (stageNames.includes(copyFromMatch.groups.image)) {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping alias COPY --from',\n );\n } else if (Number.isNaN(Number(copyFromMatch.groups.image))) {\n const dep = getDep(\n copyFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile COPY --from',\n );\n deps.push(dep);\n } else {\n logger.debug(\n { image: copyFromMatch.groups.image },\n 'Skipping index reference COPY --from',\n );\n }\n }\n\n const runMountFromRegex = regEx(\n `^[ \\\\t]*RUN(?:${escapeChar}[ \\\\t]*\\\\r?\\\\n| |\\\\t|#.*?\\\\r?\\\\n|--[a-z]+(?:=[a-zA-Z0-9_.:-]+?)?)+--mount=(?:\\\\S*=\\\\S*,)*from=(?<image>[^, ]+)`,\n 'im',\n );\n const runMountFromMatch = instruction.match(runMountFromRegex);\n if (runMountFromMatch?.groups?.image) {\n if (stageNames.includes(runMountFromMatch.groups.image)) {\n logger.debug(\n { image: runMountFromMatch.groups.image },\n 'Skipping alias RUN --mount=from',\n );\n } else {\n const dep = getDep(\n runMountFromMatch.groups.image,\n true,\n config.registryAliases,\n );\n const lineNumberRanges: number[][] = [\n [lineNumberInstrStart, lineNumber],\n ];\n processDepForAutoReplace(dep, lineNumberRanges, lines, lineFeed);\n logger.debug(\n {\n depName: dep.depName,\n currentValue: dep.currentValue,\n currentDigest: dep.currentDigest,\n },\n 'Dockerfile RUN --mount=from',\n );\n deps.push(dep);\n }\n }\n\n lineNumber += 1;\n }\n\n if (!deps.length) {\n return null;\n }\n for (const d of deps) {\n d.depType ??= 'stage';\n }\n deps.at(-1)!.depType = 'final';\n return { deps };\n}\n"],"mappings":"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"}
|
|
@@ -70,7 +70,7 @@ function resolveGitRepositoryPerSourceTag(dep, gitUrl) {
|
|
|
70
70
|
}
|
|
71
71
|
dep.datasource = GitTagsDatasource.id;
|
|
72
72
|
dep.packageName = gitUrl;
|
|
73
|
-
if (isHttpUrl(gitUrl)) dep.sourceUrl = gitUrl.replace(/\.git
|
|
73
|
+
if (isHttpUrl(gitUrl)) dep.sourceUrl = gitUrl.replace(regEx(/\.git$/), "");
|
|
74
74
|
}
|
|
75
75
|
function resolveHelmRepository(dep, matchingRepositories, registryAliases, sourceRefName) {
|
|
76
76
|
if (matchingRepositories.length) {
|
|
@@ -214,7 +214,7 @@ function resolveResourceManifest(manifest, helmRepositories, registryAliases, co
|
|
|
214
214
|
dep.datasource = GitRefsDatasource.id;
|
|
215
215
|
dep.packageName = gitUrl;
|
|
216
216
|
dep.replaceString = resource.spec.ref.commit;
|
|
217
|
-
if (isHttpUrl(gitUrl)) dep.sourceUrl = gitUrl.replace(/\.git
|
|
217
|
+
if (isHttpUrl(gitUrl)) dep.sourceUrl = gitUrl.replace(regEx(/\.git$/), "");
|
|
218
218
|
if (resource.spec.ref?.branch) dep.currentValue = resource.spec.ref.branch;
|
|
219
219
|
} else if (resource.spec.ref?.tag) {
|
|
220
220
|
dep.currentValue = resource.spec.ref.tag;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/flux/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport {\n type Document,\n type Scalar,\n type YAMLMap,\n isMap,\n isPair,\n isScalar,\n parseAllDocuments,\n} from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isHttpUrl } from '../../../util/url.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { findDependencies } from '../helm-values/extract.ts';\nimport { isOCIRegistry, removeOCIPrefix } from '../helmv3/oci.ts';\nimport { extractImage } from '../kustomize/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n collectHelmRepos,\n isSystemManifest,\n systemManifestHeaderRegex,\n} from './common.ts';\nimport { FluxResource, type HelmRepository } from './schema.ts';\nimport type {\n FluxManagerData,\n FluxManifest,\n ResourceFluxManifest,\n SystemFluxManifest,\n} from './types.ts';\n\nfunction readManifest(\n content: string,\n packageFile: string,\n): FluxManifest | null {\n if (isSystemManifest(packageFile)) {\n const versionMatch = regEx(systemManifestHeaderRegex).exec(content);\n if (!versionMatch) {\n return null;\n }\n return {\n kind: 'system',\n file: packageFile,\n content,\n version: versionMatch[1],\n components: versionMatch[2],\n };\n }\n\n return {\n kind: 'resource',\n file: packageFile,\n content,\n resources: parseYaml(content, {\n customSchema: FluxResource,\n failureBehaviour: 'filter',\n }),\n };\n}\n\nconst githubUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)github\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst gitlabUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)gitlab\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst bitbucketUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)bitbucket\\.org[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\n\nfunction resolveGitRepositoryPerSourceTag(\n dep: PackageDependency,\n gitUrl: string,\n): void {\n const githubMatchGroups = githubUrlRegex.exec(gitUrl)?.groups;\n if (githubMatchGroups) {\n dep.datasource = GithubTagsDatasource.id;\n dep.packageName = githubMatchGroups.packageName;\n dep.sourceUrl = `https://github.com/${dep.packageName}`;\n return;\n }\n\n const gitlabMatchGroups = gitlabUrlRegex.exec(gitUrl)?.groups;\n if (gitlabMatchGroups) {\n dep.datasource = GitlabTagsDatasource.id;\n dep.packageName = gitlabMatchGroups.packageName;\n dep.sourceUrl = `https://gitlab.com/${dep.packageName}`;\n return;\n }\n\n const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitUrl)?.groups;\n if (bitbucketMatchGroups) {\n dep.datasource = BitbucketTagsDatasource.id;\n dep.packageName = bitbucketMatchGroups.packageName;\n dep.sourceUrl = `https://bitbucket.org/${dep.packageName}`;\n return;\n }\n\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = gitUrl;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(/\\.git$/, '');\n }\n}\n\nfunction resolveHelmRepository(\n dep: PackageDependency,\n matchingRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n sourceRefName?: string,\n): void {\n if (matchingRepositories.length) {\n dep.registryUrls = matchingRepositories\n .map((repo) => {\n if (repo.spec.type === 'oci' || isOCIRegistry(repo.spec.url)) {\n // Change datasource to Docker\n dep.datasource = DockerDatasource.id;\n // Ensure the URL is a valid OCI path\n dep.packageName = getDep(\n `${removeOCIPrefix(repo.spec.url)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n return null;\n }\n return repo.spec.url;\n })\n .filter(isString);\n\n // if registryUrls is empty, delete it from dep\n if (!dep.registryUrls?.length) {\n delete dep.registryUrls;\n }\n return;\n }\n\n if (sourceRefName && registryAliases) {\n const aliasUrl = registryAliases[sourceRefName];\n if (aliasUrl) {\n if (isOCIRegistry(aliasUrl)) {\n // Treat alias value as an OCI registry URL\n dep.datasource = DockerDatasource.id;\n dep.packageName = getDep(\n `${removeOCIPrefix(aliasUrl)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n } else {\n dep.registryUrls = [aliasUrl];\n }\n return;\n }\n }\n\n dep.skipReason = 'unknown-registry';\n}\n\nfunction resolveSystemManifest(\n manifest: SystemFluxManifest,\n): PackageDependency<FluxManagerData>[] {\n return [\n {\n depName: 'fluxcd/flux2',\n datasource: GithubReleasesDatasource.id,\n currentValue: manifest.version,\n managerData: {\n components: manifest.components,\n },\n },\n ];\n}\n\n/**\n * Returns all `spec.ref` map nodes for OCIRepository resources matching `resourceName`.\n */\nfunction findOCIRefNodes(\n docs: Document.Parsed[],\n resourceName: string,\n): YAMLMap[] {\n const refNodes: YAMLMap[] = [];\n for (const doc of docs) {\n const docContents = doc.contents;\n if (!isMap(docContents)) {\n continue;\n }\n const kindNode = docContents.get('kind', true);\n if (\n !isScalar(kindNode) ||\n (kindNode.value as unknown) !== 'OCIRepository'\n ) {\n continue;\n }\n const nameNode = docContents.getIn(['metadata', 'name'], true);\n if (!isScalar(nameNode) || nameNode.value !== resourceName) {\n continue;\n }\n const specNode = docContents.get('spec');\n if (!isMap(specNode)) {\n continue;\n }\n const refNode = specNode.get('ref');\n if (isMap(refNode)) {\n refNodes.push(refNode);\n }\n }\n\n return refNodes;\n}\n\nfunction extractOCIRefTagAndDigestRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; tagFirst: boolean } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n let tagKey: Scalar | undefined;\n let tagValue: Scalar | undefined;\n let digestKey: Scalar | undefined;\n let digestValue: Scalar | undefined;\n\n for (const item of refNode.items) {\n if (!isPair(item) || !isScalar(item.key)) {\n continue;\n }\n if (item.key.value === 'tag' && isScalar(item.value)) {\n tagKey = item.key;\n tagValue = item.value;\n } else if (item.key.value === 'digest' && isScalar(item.value)) {\n digestKey = item.key;\n digestValue = item.value;\n }\n }\n\n if (\n !tagKey?.range ||\n !tagValue?.range ||\n !digestKey?.range ||\n !digestValue?.range\n ) {\n continue;\n }\n\n const tagFirst = tagKey.range[0] < digestKey.range[0];\n const start = tagFirst ? tagKey.range[0] : digestKey.range[0];\n const end = tagFirst ? digestValue.range[1] : tagValue.range[1];\n\n return { replaceString: content.slice(start, end), tagFirst };\n }\n\n return null;\n}\n\nfunction extractOCIRefTagRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; indentation: string } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n for (const item of refNode.items) {\n if (\n isPair(item) &&\n isScalar(item.key) &&\n item.key.value === 'tag' &&\n isScalar(item.value) &&\n item.key.range &&\n item.value.range\n ) {\n const keyStart = item.key.range[0];\n const valueEnd = item.value.range[1];\n const lineStart = content.lastIndexOf('\\n', keyStart - 1) + 1;\n return {\n replaceString: content.slice(keyStart, valueEnd),\n indentation: content.slice(lineStart, keyStart),\n };\n }\n }\n }\n\n return null;\n}\n\nfunction resolveResourceManifest(\n manifest: ResourceFluxManifest,\n helmRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n content: string,\n): PackageDependency[] {\n let docs: Document.Parsed[] | undefined;\n const deps: PackageDependency[] = [];\n for (const resource of manifest.resources) {\n switch (resource.kind) {\n case 'HelmRelease': {\n if (resource.spec.chartRef) {\n logger.trace(\n 'HelmRelease using chartRef was found, skipping as version will be handled via referenced resource directly',\n );\n } else if (resource.spec.chart) {\n const chartSpec = resource.spec.chart.spec;\n const depName = chartSpec.chart;\n const dep: PackageDependency = {\n depName,\n currentValue: resource.spec.chart.spec.version,\n datasource: HelmDatasource.id,\n };\n\n if (depName.startsWith('./')) {\n dep.skipReason = 'local-chart';\n delete dep.datasource;\n } else {\n const sourceRef = chartSpec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace ===\n (sourceRef?.namespace ?? resource.metadata?.namespace),\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n }\n deps.push(dep);\n } else {\n logger.debug(\n `invalid or incomplete ${resource.metadata.name} HelmRelease spec, skipping`,\n );\n }\n\n if (resource.spec.values) {\n logger.trace('detecting dependencies in HelmRelease values');\n deps.push(...findDependencies(resource.spec.values, registryAliases));\n }\n break;\n }\n\n case 'HelmChart': {\n if (resource.spec.sourceRef.kind === 'GitRepository') {\n logger.trace(\n 'HelmChart using GitRepository was found, skipping as version will be handled via referenced resource directly',\n );\n continue;\n }\n\n const dep: PackageDependency = {\n depName: resource.spec.chart,\n };\n\n if (resource.spec.sourceRef.kind === 'HelmRepository') {\n dep.currentValue = resource.spec.version;\n dep.datasource = HelmDatasource.id;\n\n const sourceRef = resource.spec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace === resource.metadata?.namespace,\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n } else {\n dep.skipReason = 'unsupported-datasource';\n }\n deps.push(dep);\n break;\n }\n\n case 'GitRepository': {\n const dep: PackageDependency = {\n depName: resource.metadata.name,\n };\n\n if (resource.spec.ref?.commit) {\n const gitUrl = resource.spec.url;\n dep.currentDigest = resource.spec.ref.commit;\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = gitUrl;\n dep.replaceString = resource.spec.ref.commit;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(/\\.git$/, '');\n }\n if (resource.spec.ref?.branch) {\n dep.currentValue = resource.spec.ref.branch;\n }\n } else if (resource.spec.ref?.tag) {\n dep.currentValue = resource.spec.ref.tag;\n resolveGitRepositoryPerSourceTag(dep, resource.spec.url);\n } else {\n dep.skipReason = 'unversioned-reference';\n }\n deps.push(dep);\n break;\n }\n case 'OCIRepository': {\n const container = removeOCIPrefix(resource.spec.url);\n if (resource.spec.ref?.digest && resource.spec.ref?.tag) {\n const combinedDep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n // Set currentValue to the tag so the docker datasource can look up the image's new digest\n combinedDep.currentValue = resource.spec.ref.tag;\n\n const refRange = extractOCIRefTagAndDigestRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refRange) {\n combinedDep.replaceString = refRange.replaceString;\n if (refRange.tagFirst) {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.tag, '{{newValue}}')\n .replace(resource.spec.ref.digest, '{{newDigest}}');\n } else {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.digest, '{{newDigest}}')\n .replace(resource.spec.ref.tag, '{{newValue}}');\n }\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Could not find tag/digest nodes in content, skipping replacement',\n );\n combinedDep.skipReason = 'invalid-value';\n }\n\n deps.push(combinedDep);\n } else if (resource.spec.ref?.digest) {\n const dep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n deps.push(dep);\n } else if (resource.spec.ref?.tag) {\n const dep = getDep(\n `${container}:${resource.spec.ref.tag}`,\n false,\n registryAliases,\n );\n const refTagRange = extractOCIRefTagRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refTagRange) {\n dep.replaceString = refTagRange.replaceString;\n const newline = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n dep.autoReplaceStringTemplate = `${refTagRange.replaceString.replace(\n resource.spec.ref.tag,\n '{{newValue}}',\n )}{{#if newDigest}}${newline}${refTagRange.indentation}digest: {{newDigest}}{{/if}}`;\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Unable to locate tag node for replacement (may be YAML alias or alias reference), digest pinning will not be possible',\n );\n dep.replaceString = resource.spec.ref.tag;\n dep.autoReplaceStringTemplate = '{{newValue}}';\n }\n deps.push(dep);\n } else {\n const dep = getDep(container, false, registryAliases);\n dep.skipReason = 'unversioned-reference';\n deps.push(dep);\n }\n break;\n }\n\n case 'Kustomization': {\n for (const image of coerceArray(resource.spec.images)) {\n const dep = extractImage(image, registryAliases);\n if (dep) {\n deps.push(dep);\n }\n }\n }\n }\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent<FluxManagerData> | null {\n const manifest = readManifest(content, packageFile);\n if (!manifest) {\n return null;\n }\n const helmRepositories = collectHelmRepos([manifest]);\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config?.registryAliases,\n content,\n );\n break;\n }\n }\n return deps?.length ? { deps } : null;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile<FluxManagerData>[] | null> {\n const manifests: FluxManifest[] = [];\n const results: PackageFile<FluxManagerData>[] = [];\n\n for (const file of packageFiles) {\n const content = await readLocalFile(file, 'utf8');\n if (content) {\n const manifest = readManifest(content, file);\n if (manifest) {\n manifests.push(manifest);\n }\n }\n }\n\n const helmRepositories = collectHelmRepos(manifests);\n\n for (const manifest of manifests) {\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config.registryAliases,\n manifest.content,\n );\n break;\n }\n }\n if (deps?.length) {\n results.push({\n packageFile: manifest.file,\n deps,\n });\n }\n }\n\n return results.length ? results : null;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"extract.js","names":[],"sources":["../../../../lib/modules/manager/flux/extract.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport {\n type Document,\n type Scalar,\n type YAMLMap,\n isMap,\n isPair,\n isScalar,\n parseAllDocuments,\n} from 'yaml';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { readLocalFile } from '../../../util/fs/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isHttpUrl } from '../../../util/url.ts';\nimport { parseYaml } from '../../../util/yaml.ts';\nimport { BitbucketTagsDatasource } from '../../datasource/bitbucket-tags/index.ts';\nimport { DockerDatasource } from '../../datasource/docker/index.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport { GitTagsDatasource } from '../../datasource/git-tags/index.ts';\nimport { GithubReleasesDatasource } from '../../datasource/github-releases/index.ts';\nimport { GithubTagsDatasource } from '../../datasource/github-tags/index.ts';\nimport { GitlabTagsDatasource } from '../../datasource/gitlab-tags/index.ts';\nimport { HelmDatasource } from '../../datasource/helm/index.ts';\nimport { getDep } from '../dockerfile/extract.ts';\nimport { findDependencies } from '../helm-values/extract.ts';\nimport { isOCIRegistry, removeOCIPrefix } from '../helmv3/oci.ts';\nimport { extractImage } from '../kustomize/extract.ts';\nimport type {\n ExtractConfig,\n PackageDependency,\n PackageFile,\n PackageFileContent,\n} from '../types.ts';\nimport {\n collectHelmRepos,\n isSystemManifest,\n systemManifestHeaderRegex,\n} from './common.ts';\nimport { FluxResource, type HelmRepository } from './schema.ts';\nimport type {\n FluxManagerData,\n FluxManifest,\n ResourceFluxManifest,\n SystemFluxManifest,\n} from './types.ts';\n\nfunction readManifest(\n content: string,\n packageFile: string,\n): FluxManifest | null {\n if (isSystemManifest(packageFile)) {\n const versionMatch = regEx(systemManifestHeaderRegex).exec(content);\n if (!versionMatch) {\n return null;\n }\n return {\n kind: 'system',\n file: packageFile,\n content,\n version: versionMatch[1],\n components: versionMatch[2],\n };\n }\n\n return {\n kind: 'resource',\n file: packageFile,\n content,\n resources: parseYaml(content, {\n customSchema: FluxResource,\n failureBehaviour: 'filter',\n }),\n };\n}\n\nconst githubUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)github\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst gitlabUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)gitlab\\.com[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\nconst bitbucketUrlRegex = regEx(\n /^(?:https:\\/\\/|git@)bitbucket\\.org[/:](?<packageName>[^/]+\\/[^/]+?)(?:\\.git)?$/,\n);\n\nfunction resolveGitRepositoryPerSourceTag(\n dep: PackageDependency,\n gitUrl: string,\n): void {\n const githubMatchGroups = githubUrlRegex.exec(gitUrl)?.groups;\n if (githubMatchGroups) {\n dep.datasource = GithubTagsDatasource.id;\n dep.packageName = githubMatchGroups.packageName;\n dep.sourceUrl = `https://github.com/${dep.packageName}`;\n return;\n }\n\n const gitlabMatchGroups = gitlabUrlRegex.exec(gitUrl)?.groups;\n if (gitlabMatchGroups) {\n dep.datasource = GitlabTagsDatasource.id;\n dep.packageName = gitlabMatchGroups.packageName;\n dep.sourceUrl = `https://gitlab.com/${dep.packageName}`;\n return;\n }\n\n const bitbucketMatchGroups = bitbucketUrlRegex.exec(gitUrl)?.groups;\n if (bitbucketMatchGroups) {\n dep.datasource = BitbucketTagsDatasource.id;\n dep.packageName = bitbucketMatchGroups.packageName;\n dep.sourceUrl = `https://bitbucket.org/${dep.packageName}`;\n return;\n }\n\n dep.datasource = GitTagsDatasource.id;\n dep.packageName = gitUrl;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(regEx(/\\.git$/), '');\n }\n}\n\nfunction resolveHelmRepository(\n dep: PackageDependency,\n matchingRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n sourceRefName?: string,\n): void {\n if (matchingRepositories.length) {\n dep.registryUrls = matchingRepositories\n .map((repo) => {\n if (repo.spec.type === 'oci' || isOCIRegistry(repo.spec.url)) {\n // Change datasource to Docker\n dep.datasource = DockerDatasource.id;\n // Ensure the URL is a valid OCI path\n dep.packageName = getDep(\n `${removeOCIPrefix(repo.spec.url)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n return null;\n }\n return repo.spec.url;\n })\n .filter(isString);\n\n // if registryUrls is empty, delete it from dep\n if (!dep.registryUrls?.length) {\n delete dep.registryUrls;\n }\n return;\n }\n\n if (sourceRefName && registryAliases) {\n const aliasUrl = registryAliases[sourceRefName];\n if (aliasUrl) {\n if (isOCIRegistry(aliasUrl)) {\n // Treat alias value as an OCI registry URL\n dep.datasource = DockerDatasource.id;\n dep.packageName = getDep(\n `${removeOCIPrefix(aliasUrl)}/${dep.depName}`,\n false,\n registryAliases,\n ).packageName;\n } else {\n dep.registryUrls = [aliasUrl];\n }\n return;\n }\n }\n\n dep.skipReason = 'unknown-registry';\n}\n\nfunction resolveSystemManifest(\n manifest: SystemFluxManifest,\n): PackageDependency<FluxManagerData>[] {\n return [\n {\n depName: 'fluxcd/flux2',\n datasource: GithubReleasesDatasource.id,\n currentValue: manifest.version,\n managerData: {\n components: manifest.components,\n },\n },\n ];\n}\n\n/**\n * Returns all `spec.ref` map nodes for OCIRepository resources matching `resourceName`.\n */\nfunction findOCIRefNodes(\n docs: Document.Parsed[],\n resourceName: string,\n): YAMLMap[] {\n const refNodes: YAMLMap[] = [];\n for (const doc of docs) {\n const docContents = doc.contents;\n if (!isMap(docContents)) {\n continue;\n }\n const kindNode = docContents.get('kind', true);\n if (\n !isScalar(kindNode) ||\n (kindNode.value as unknown) !== 'OCIRepository'\n ) {\n continue;\n }\n const nameNode = docContents.getIn(['metadata', 'name'], true);\n if (!isScalar(nameNode) || nameNode.value !== resourceName) {\n continue;\n }\n const specNode = docContents.get('spec');\n if (!isMap(specNode)) {\n continue;\n }\n const refNode = specNode.get('ref');\n if (isMap(refNode)) {\n refNodes.push(refNode);\n }\n }\n\n return refNodes;\n}\n\nfunction extractOCIRefTagAndDigestRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; tagFirst: boolean } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n let tagKey: Scalar | undefined;\n let tagValue: Scalar | undefined;\n let digestKey: Scalar | undefined;\n let digestValue: Scalar | undefined;\n\n for (const item of refNode.items) {\n if (!isPair(item) || !isScalar(item.key)) {\n continue;\n }\n if (item.key.value === 'tag' && isScalar(item.value)) {\n tagKey = item.key;\n tagValue = item.value;\n } else if (item.key.value === 'digest' && isScalar(item.value)) {\n digestKey = item.key;\n digestValue = item.value;\n }\n }\n\n if (\n !tagKey?.range ||\n !tagValue?.range ||\n !digestKey?.range ||\n !digestValue?.range\n ) {\n continue;\n }\n\n const tagFirst = tagKey.range[0] < digestKey.range[0];\n const start = tagFirst ? tagKey.range[0] : digestKey.range[0];\n const end = tagFirst ? digestValue.range[1] : tagValue.range[1];\n\n return { replaceString: content.slice(start, end), tagFirst };\n }\n\n return null;\n}\n\nfunction extractOCIRefTagRange(\n docs: Document.Parsed[],\n content: string,\n resourceName: string,\n): { replaceString: string; indentation: string } | null {\n for (const refNode of findOCIRefNodes(docs, resourceName)) {\n for (const item of refNode.items) {\n if (\n isPair(item) &&\n isScalar(item.key) &&\n item.key.value === 'tag' &&\n isScalar(item.value) &&\n item.key.range &&\n item.value.range\n ) {\n const keyStart = item.key.range[0];\n const valueEnd = item.value.range[1];\n const lineStart = content.lastIndexOf('\\n', keyStart - 1) + 1;\n return {\n replaceString: content.slice(keyStart, valueEnd),\n indentation: content.slice(lineStart, keyStart),\n };\n }\n }\n }\n\n return null;\n}\n\nfunction resolveResourceManifest(\n manifest: ResourceFluxManifest,\n helmRepositories: HelmRepository[],\n registryAliases: Record<string, string> | undefined,\n content: string,\n): PackageDependency[] {\n let docs: Document.Parsed[] | undefined;\n const deps: PackageDependency[] = [];\n for (const resource of manifest.resources) {\n switch (resource.kind) {\n case 'HelmRelease': {\n if (resource.spec.chartRef) {\n logger.trace(\n 'HelmRelease using chartRef was found, skipping as version will be handled via referenced resource directly',\n );\n } else if (resource.spec.chart) {\n const chartSpec = resource.spec.chart.spec;\n const depName = chartSpec.chart;\n const dep: PackageDependency = {\n depName,\n currentValue: resource.spec.chart.spec.version,\n datasource: HelmDatasource.id,\n };\n\n if (depName.startsWith('./')) {\n dep.skipReason = 'local-chart';\n delete dep.datasource;\n } else {\n const sourceRef = chartSpec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace ===\n (sourceRef?.namespace ?? resource.metadata?.namespace),\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n }\n deps.push(dep);\n } else {\n logger.debug(\n `invalid or incomplete ${resource.metadata.name} HelmRelease spec, skipping`,\n );\n }\n\n if (resource.spec.values) {\n logger.trace('detecting dependencies in HelmRelease values');\n deps.push(...findDependencies(resource.spec.values, registryAliases));\n }\n break;\n }\n\n case 'HelmChart': {\n if (resource.spec.sourceRef.kind === 'GitRepository') {\n logger.trace(\n 'HelmChart using GitRepository was found, skipping as version will be handled via referenced resource directly',\n );\n continue;\n }\n\n const dep: PackageDependency = {\n depName: resource.spec.chart,\n };\n\n if (resource.spec.sourceRef.kind === 'HelmRepository') {\n dep.currentValue = resource.spec.version;\n dep.datasource = HelmDatasource.id;\n\n const sourceRef = resource.spec.sourceRef;\n const matchingRepositories = helmRepositories.filter(\n (rep) =>\n rep.kind === sourceRef?.kind &&\n rep.metadata.name === sourceRef.name &&\n rep.metadata.namespace === resource.metadata?.namespace,\n );\n resolveHelmRepository(\n dep,\n matchingRepositories,\n registryAliases,\n sourceRef?.name,\n );\n } else {\n dep.skipReason = 'unsupported-datasource';\n }\n deps.push(dep);\n break;\n }\n\n case 'GitRepository': {\n const dep: PackageDependency = {\n depName: resource.metadata.name,\n };\n\n if (resource.spec.ref?.commit) {\n const gitUrl = resource.spec.url;\n dep.currentDigest = resource.spec.ref.commit;\n dep.datasource = GitRefsDatasource.id;\n dep.packageName = gitUrl;\n dep.replaceString = resource.spec.ref.commit;\n if (isHttpUrl(gitUrl)) {\n dep.sourceUrl = gitUrl.replace(regEx(/\\.git$/), '');\n }\n if (resource.spec.ref?.branch) {\n dep.currentValue = resource.spec.ref.branch;\n }\n } else if (resource.spec.ref?.tag) {\n dep.currentValue = resource.spec.ref.tag;\n resolveGitRepositoryPerSourceTag(dep, resource.spec.url);\n } else {\n dep.skipReason = 'unversioned-reference';\n }\n deps.push(dep);\n break;\n }\n case 'OCIRepository': {\n const container = removeOCIPrefix(resource.spec.url);\n if (resource.spec.ref?.digest && resource.spec.ref?.tag) {\n const combinedDep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n // Set currentValue to the tag so the docker datasource can look up the image's new digest\n combinedDep.currentValue = resource.spec.ref.tag;\n\n const refRange = extractOCIRefTagAndDigestRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refRange) {\n combinedDep.replaceString = refRange.replaceString;\n if (refRange.tagFirst) {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.tag, '{{newValue}}')\n .replace(resource.spec.ref.digest, '{{newDigest}}');\n } else {\n combinedDep.autoReplaceStringTemplate = refRange.replaceString\n .replace(resource.spec.ref.digest, '{{newDigest}}')\n .replace(resource.spec.ref.tag, '{{newValue}}');\n }\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Could not find tag/digest nodes in content, skipping replacement',\n );\n combinedDep.skipReason = 'invalid-value';\n }\n\n deps.push(combinedDep);\n } else if (resource.spec.ref?.digest) {\n const dep = getDep(\n `${container}@${resource.spec.ref.digest}`,\n false,\n registryAliases,\n );\n deps.push(dep);\n } else if (resource.spec.ref?.tag) {\n const dep = getDep(\n `${container}:${resource.spec.ref.tag}`,\n false,\n registryAliases,\n );\n const refTagRange = extractOCIRefTagRange(\n (docs ??= parseAllDocuments(content, { strict: false })),\n content,\n resource.metadata.name,\n );\n if (refTagRange) {\n dep.replaceString = refTagRange.replaceString;\n const newline = content.includes('\\r\\n') ? '\\r\\n' : '\\n';\n dep.autoReplaceStringTemplate = `${refTagRange.replaceString.replace(\n resource.spec.ref.tag,\n '{{newValue}}',\n )}{{#if newDigest}}${newline}${refTagRange.indentation}digest: {{newDigest}}{{/if}}`;\n } else {\n logger.debug(\n { file: manifest.file, name: resource.metadata.name },\n 'Unable to locate tag node for replacement (may be YAML alias or alias reference), digest pinning will not be possible',\n );\n dep.replaceString = resource.spec.ref.tag;\n dep.autoReplaceStringTemplate = '{{newValue}}';\n }\n deps.push(dep);\n } else {\n const dep = getDep(container, false, registryAliases);\n dep.skipReason = 'unversioned-reference';\n deps.push(dep);\n }\n break;\n }\n\n case 'Kustomization': {\n for (const image of coerceArray(resource.spec.images)) {\n const dep = extractImage(image, registryAliases);\n if (dep) {\n deps.push(dep);\n }\n }\n }\n }\n }\n return deps;\n}\n\nexport function extractPackageFile(\n content: string,\n packageFile: string,\n config?: ExtractConfig,\n): PackageFileContent<FluxManagerData> | null {\n const manifest = readManifest(content, packageFile);\n if (!manifest) {\n return null;\n }\n const helmRepositories = collectHelmRepos([manifest]);\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config?.registryAliases,\n content,\n );\n break;\n }\n }\n return deps?.length ? { deps } : null;\n}\n\nexport async function extractAllPackageFiles(\n config: ExtractConfig,\n packageFiles: string[],\n): Promise<PackageFile<FluxManagerData>[] | null> {\n const manifests: FluxManifest[] = [];\n const results: PackageFile<FluxManagerData>[] = [];\n\n for (const file of packageFiles) {\n const content = await readLocalFile(file, 'utf8');\n if (content) {\n const manifest = readManifest(content, file);\n if (manifest) {\n manifests.push(manifest);\n }\n }\n }\n\n const helmRepositories = collectHelmRepos(manifests);\n\n for (const manifest of manifests) {\n let deps: PackageDependency[] | null = null;\n switch (manifest.kind) {\n case 'system':\n deps = resolveSystemManifest(manifest);\n break;\n case 'resource': {\n deps = resolveResourceManifest(\n manifest,\n helmRepositories,\n config.registryAliases,\n manifest.content,\n );\n break;\n }\n }\n if (deps?.length) {\n results.push({\n packageFile: manifest.file,\n deps,\n });\n }\n }\n\n return results.length ? results : null;\n}\n"],"mappings":"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"}
|
|
@@ -74,7 +74,7 @@ async function extractPackageFile(_content, packageFile, _config) {
|
|
|
74
74
|
deps.push({
|
|
75
75
|
depName: path,
|
|
76
76
|
packageName: httpSubModuleUrl,
|
|
77
|
-
sourceUrl: httpSubModuleUrl.replace(/\.git
|
|
77
|
+
sourceUrl: httpSubModuleUrl.replace(regEx(/\.git$/), ""),
|
|
78
78
|
currentValue: branch ?? void 0,
|
|
79
79
|
currentDigest,
|
|
80
80
|
...api.isVersion(branch) ? { versioning: id } : {}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"extract.js","names":["semVerVersioning.id"],"sources":["../../../../lib/modules/manager/git-submodules/extract.ts"],"sourcesContent":["import type { SimpleGit } from 'simple-git';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { createSimpleGit } from '../../../util/git/index.ts';\nimport { getHttpUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport * as semVerVersioning from '../../versioning/semver/index.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport type { GitModule } from './types.ts';\n\nasync function getUrl(\n git: SimpleGit,\n gitModulesPath: string,\n submoduleName: string,\n): Promise<string> {\n const path = (\n await createSimpleGit().raw([\n 'config',\n '--file',\n gitModulesPath,\n '--get',\n `submodule.${submoduleName}.url`,\n ])\n )?.trim();\n if (!path?.startsWith('../') && !path?.startsWith('./')) {\n return path;\n }\n const remoteUrl = (\n await git.raw(['config', '--get', 'remote.origin.url'])\n ).trim();\n return new URL(path, `${remoteUrl}/`).href;\n}\n\nasync function getBranch(\n git: SimpleGit,\n gitModulesPath: string,\n submoduleName: string,\n): Promise<string | null> {\n const branchFromConfig = (\n await createSimpleGit().raw([\n 'config',\n '--file',\n gitModulesPath,\n '--get',\n `submodule.${submoduleName}.branch`,\n ])\n ).trim();\n\n return branchFromConfig === '.'\n ? (await git.branch(['--list'])).current.trim()\n : branchFromConfig || null;\n}\n\nasync function getModules(\n git: SimpleGit,\n gitModulesPath: string,\n): Promise<GitModule[]> {\n const res: GitModule[] = [];\n try {\n const modules = (\n (await git.raw([\n 'config',\n '--file',\n gitModulesPath,\n '--get-regexp',\n '\\\\.path',\n ])) ?? /* istanbul ignore next: should never happen */ ''\n )\n .trim()\n .split(regEx(/\\n/))\n .filter((s) => !!s);\n\n for (const line of modules) {\n const [, name, path] = line.split(regEx(/submodule\\.(.+?)\\.path\\s(.+)/));\n res.push({ name, path });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err }, 'Error getting git submodules during extract');\n }\n return res;\n}\n\nexport default async function extractPackageFile(\n _content: string,\n packageFile: string,\n _config: ExtractConfig,\n): Promise<PackageFileContent | null> {\n const localDir = GlobalConfig.get('localDir');\n const git = createSimpleGit({ config: { baseDir: localDir } });\n const gitModulesPath = upath.join(localDir, packageFile);\n\n const depNames = await getModules(git, gitModulesPath);\n\n if (!depNames.length) {\n return null;\n }\n\n const deps = [];\n for (const { name, path } of depNames) {\n try {\n const [currentDigest] = (\n await git.subModule(['status', '--cached', path])\n )\n .trim()\n .replace(regEx(/^[-+]/), '')\n .split(regEx(/\\s/));\n const subModuleUrl = await getUrl(git, gitModulesPath, name);\n const httpSubModuleUrl = getHttpUrl(subModuleUrl);\n const branch = await getBranch(git, gitModulesPath, name);\n deps.push({\n depName: path,\n packageName: httpSubModuleUrl,\n sourceUrl: httpSubModuleUrl.replace(/\\.git
|
|
1
|
+
{"version":3,"file":"extract.js","names":["semVerVersioning.id"],"sources":["../../../../lib/modules/manager/git-submodules/extract.ts"],"sourcesContent":["import type { SimpleGit } from 'simple-git';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { createSimpleGit } from '../../../util/git/index.ts';\nimport { getHttpUrl } from '../../../util/git/url.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { GitRefsDatasource } from '../../datasource/git-refs/index.ts';\nimport * as semVerVersioning from '../../versioning/semver/index.ts';\nimport type { ExtractConfig, PackageFileContent } from '../types.ts';\nimport type { GitModule } from './types.ts';\n\nasync function getUrl(\n git: SimpleGit,\n gitModulesPath: string,\n submoduleName: string,\n): Promise<string> {\n const path = (\n await createSimpleGit().raw([\n 'config',\n '--file',\n gitModulesPath,\n '--get',\n `submodule.${submoduleName}.url`,\n ])\n )?.trim();\n if (!path?.startsWith('../') && !path?.startsWith('./')) {\n return path;\n }\n const remoteUrl = (\n await git.raw(['config', '--get', 'remote.origin.url'])\n ).trim();\n return new URL(path, `${remoteUrl}/`).href;\n}\n\nasync function getBranch(\n git: SimpleGit,\n gitModulesPath: string,\n submoduleName: string,\n): Promise<string | null> {\n const branchFromConfig = (\n await createSimpleGit().raw([\n 'config',\n '--file',\n gitModulesPath,\n '--get',\n `submodule.${submoduleName}.branch`,\n ])\n ).trim();\n\n return branchFromConfig === '.'\n ? (await git.branch(['--list'])).current.trim()\n : branchFromConfig || null;\n}\n\nasync function getModules(\n git: SimpleGit,\n gitModulesPath: string,\n): Promise<GitModule[]> {\n const res: GitModule[] = [];\n try {\n const modules = (\n (await git.raw([\n 'config',\n '--file',\n gitModulesPath,\n '--get-regexp',\n '\\\\.path',\n ])) ?? /* istanbul ignore next: should never happen */ ''\n )\n .trim()\n .split(regEx(/\\n/))\n .filter((s) => !!s);\n\n for (const line of modules) {\n const [, name, path] = line.split(regEx(/submodule\\.(.+?)\\.path\\s(.+)/));\n res.push({ name, path });\n }\n } catch (err) /* istanbul ignore next */ {\n logger.warn({ err }, 'Error getting git submodules during extract');\n }\n return res;\n}\n\nexport default async function extractPackageFile(\n _content: string,\n packageFile: string,\n _config: ExtractConfig,\n): Promise<PackageFileContent | null> {\n const localDir = GlobalConfig.get('localDir');\n const git = createSimpleGit({ config: { baseDir: localDir } });\n const gitModulesPath = upath.join(localDir, packageFile);\n\n const depNames = await getModules(git, gitModulesPath);\n\n if (!depNames.length) {\n return null;\n }\n\n const deps = [];\n for (const { name, path } of depNames) {\n try {\n const [currentDigest] = (\n await git.subModule(['status', '--cached', path])\n )\n .trim()\n .replace(regEx(/^[-+]/), '')\n .split(regEx(/\\s/));\n const subModuleUrl = await getUrl(git, gitModulesPath, name);\n const httpSubModuleUrl = getHttpUrl(subModuleUrl);\n const branch = await getBranch(git, gitModulesPath, name);\n deps.push({\n depName: path,\n packageName: httpSubModuleUrl,\n sourceUrl: httpSubModuleUrl.replace(regEx(/\\.git$/), ''),\n currentValue: branch ?? undefined,\n currentDigest,\n ...(semVerVersioning.api.isVersion(branch)\n ? { versioning: semVerVersioning.id }\n : {}),\n });\n } catch (err) /* istanbul ignore next */ {\n logger.warn(\n { err, packageFile },\n 'Error mapping git submodules during extraction',\n );\n }\n }\n\n return { deps, datasource: GitRefsDatasource.id };\n}\n"],"mappings":";;;;;;;;;AAYA,eAAe,OACb,KACA,gBACA,eACiB;CACjB,MAAM,QACJ,MAAM,gBAAgB,CAAC,CAAC,IAAI;EAC1B;EACA;EACA;EACA;EACA,aAAa,cAAc;CAC7B,CAAC,EAAA,EACA,KAAK;CACR,IAAI,CAAC,MAAM,WAAW,KAAK,KAAK,CAAC,MAAM,WAAW,IAAI,GACpD,OAAO;CAET,MAAM,aACJ,MAAM,IAAI,IAAI;EAAC;EAAU;EAAS;CAAmB,CAAC,EAAA,CACtD,KAAK;CACP,OAAO,IAAI,IAAI,MAAM,GAAG,UAAU,EAAE,CAAC,CAAC;AACxC;AAEA,eAAe,UACb,KACA,gBACA,eACwB;CACxB,MAAM,oBACJ,MAAM,gBAAgB,CAAC,CAAC,IAAI;EAC1B;EACA;EACA;EACA;EACA,aAAa,cAAc;CAC7B,CAAC,EAAA,CACD,KAAK;CAEP,OAAO,qBAAqB,OACvB,MAAM,IAAI,OAAO,CAAC,QAAQ,CAAC,EAAA,CAAG,QAAQ,KAAK,IAC5C,oBAAoB;AAC1B;AAEA,eAAe,WACb,KACA,gBACsB;CACtB,MAAM,MAAmB,CAAC;CAC1B,IAAI;EACF,MAAM,WACH,MAAM,IAAI,IAAI;GACb;GACA;GACA;GACA;GACA;EACF,CAAC,qDAAsD,GAAA,CAEtD,KAAK,CAAC,CACN,MAAM,MAAM,IAAI,CAAC,CAAC,CAClB,QAAQ,MAAM,CAAC,CAAC,CAAC;EAEpB,KAAK,MAAM,QAAQ,SAAS;GAC1B,MAAM,GAAG,MAAM,QAAQ,KAAK,MAAM,MAAM,8BAA8B,CAAC;GACvE,IAAI,KAAK;IAAE;IAAM;GAAK,CAAC;EACzB;CACF,SAAS,gCAAgC;EACvC,OAAO,KAAK,EAAE,IAAI,GAAG,6CAA6C;CACpE;CACA,OAAO;AACT;AAEA,eAA8B,mBAC5B,UACA,aACA,SACoC;CACpC,MAAM,WAAW,aAAa,IAAI,UAAU;CAC5C,MAAM,MAAM,gBAAgB,EAAE,QAAQ,EAAE,SAAS,SAAS,EAAE,CAAC;CAC7D,MAAM,iBAAiB,MAAM,KAAK,UAAU,WAAW;CAEvD,MAAM,WAAW,MAAM,WAAW,KAAK,cAAc;CAErD,IAAI,CAAC,SAAS,QACZ,OAAO;CAGT,MAAM,OAAO,CAAC;CACd,KAAK,MAAM,EAAE,MAAM,UAAU,UAC3B,IAAI;EACF,MAAM,CAAC,kBACL,MAAM,IAAI,UAAU;GAAC;GAAU;GAAY;EAAI,CAAC,EAAA,CAE/C,KAAK,CAAC,CACN,QAAQ,MAAM,OAAO,GAAG,EAAE,CAAC,CAC3B,MAAM,MAAM,IAAI,CAAC;EACpB,MAAM,eAAe,MAAM,OAAO,KAAK,gBAAgB,IAAI;EAC3D,MAAM,mBAAmB,WAAW,YAAY;EAChD,MAAM,SAAS,MAAM,UAAU,KAAK,gBAAgB,IAAI;EACxD,KAAK,KAAK;GACR,SAAS;GACT,aAAa;GACb,WAAW,iBAAiB,QAAQ,MAAM,QAAQ,GAAG,EAAE;GACvD,cAAc,UAAU,KAAA;GACxB;GACA,GAAA,IAAyB,UAAU,MAAM,IACrC,EAAE,YAAYA,GAAoB,IAClC,CAAC;EACP,CAAC;CACH,SAAS,gCAAgC;EACvC,OAAO,KACL;GAAE;GAAK;EAAY,GACnB,gDACF;CACF;CAGF,OAAO;EAAE;EAAM,YAAY,kBAAkB;CAAG;AAClD"}
|
|
@@ -69,7 +69,7 @@ async function updateArtifacts({ packageFileName: goModFileName, updatedDeps, ne
|
|
|
69
69
|
* @returns A commented out block with // renovate-replace
|
|
70
70
|
*/
|
|
71
71
|
function blockCommentOut(match) {
|
|
72
|
-
return match.replace(/(\r?\n)/g, "$1// renovate-replace ");
|
|
72
|
+
return match.replace(regEx(/(\r?\n)/g), "$1// renovate-replace ");
|
|
73
73
|
}
|
|
74
74
|
massagedGoMod = massagedGoMod.replace(inlineReplaceRegEx, inlineCommentOut).replace(blockReplaceRegEx, blockCommentOut);
|
|
75
75
|
if (massagedGoMod !== newGoModContent) logger.debug("Removed some relative replace statements and comments from go.mod");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"artifacts.js","names":["valid","major","isValid"],"sources":["../../../../lib/modules/manager/gomod/artifacts.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport {\n ensureCacheDir,\n findLocalSiblingOrParent,\n isValidLocalPath,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../util/git/exec.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isValid } from '../../versioning/semver/index.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../types.ts';\nimport { getExtraDepsNotice } from './artifacts-extra.ts';\nimport { getGoModulesInTidyOrder } from './package-tree.ts';\n\nconst { major, valid } = semver;\nconst gitExec = withGitEnvironment(['go']);\n\nfunction getUpdateImportPathCmds(\n updatedDeps: PackageDependency[],\n { constraints }: UpdateArtifactsConfig,\n): string[] {\n // Check if we fail to parse any major versions and log that they're skipped\n const invalidMajorDeps = updatedDeps.filter(\n ({ newVersion }) => !valid(newVersion),\n );\n if (invalidMajorDeps.length > 0) {\n invalidMajorDeps.forEach(({ depName }) =>\n logger.warn(\n { depName },\n 'Ignoring dependency: Could not get major version',\n ),\n );\n }\n\n const updateImportCommands = updatedDeps\n .filter(\n ({ newVersion }) =>\n valid(newVersion) && !newVersion!.endsWith('+incompatible'),\n )\n .map(({ depName, newVersion }) => ({\n depName: depName!,\n newMajor: major(newVersion!),\n }))\n // Skip path updates going from v0 to v1\n .filter(\n ({ depName, newMajor }) =>\n depName.startsWith('gopkg.in/') || newMajor > 1,\n )\n\n .map(\n ({ depName, newMajor }) =>\n `mod upgrade --mod-name=${quote(depName)} -t=${newMajor}`,\n );\n\n if (updateImportCommands.length > 0) {\n let installMarwanModArgs =\n 'install github.com/marwan-at-work/mod/cmd/mod@latest';\n const gomodModCompatibility = constraints?.gomodMod;\n if (gomodModCompatibility) {\n if (\n gomodModCompatibility.startsWith('v') &&\n isValid(gomodModCompatibility.replace(regEx(/^v/), ''))\n ) {\n installMarwanModArgs = installMarwanModArgs.replace(\n regEx(/@latest$/),\n `@${gomodModCompatibility}`,\n );\n } else {\n logger.debug(\n { gomodModCompatibility },\n 'marwan-at-work/mod compatibility range is not valid - skipping',\n );\n }\n } else {\n logger.debug(\n 'No marwan-at-work/mod compatibility range found - installing marwan-at-work/mod latest',\n );\n }\n updateImportCommands.unshift(`go ${installMarwanModArgs}`);\n }\n\n return updateImportCommands;\n}\n\nfunction useModcacherw(goVersion: string | undefined): boolean {\n if (!isString(goVersion)) {\n return true;\n }\n\n return semver.intersects(goVersion, `>=1.14`);\n}\n\nexport async function updateArtifacts({\n packageFileName: goModFileName,\n updatedDeps,\n newPackageFileContent: newGoModContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`gomod.updateArtifacts(${goModFileName})`);\n\n const sumFileName = goModFileName.replace(regEx(/\\.mod$/), '.sum');\n const existingGoSumContent = await readLocalFile(sumFileName);\n if (!existingGoSumContent) {\n logger.debug('No go.sum found');\n return null;\n }\n const goModDir = upath.dirname(goModFileName);\n const goModFileBaseName = upath.basename(goModFileName);\n const modFileFlag =\n goModFileBaseName === 'go.mod'\n ? ''\n : ` -modfile=${quote(goModFileBaseName)}`;\n\n // The \"vendor\" directory can be next to the go.mod, but also in the parent directory in case\n // the go workspaces are used.\n const vendorDir = await findLocalSiblingOrParent(goModFileName, 'vendor');\n const vendorModulesFileName = upath.join(vendorDir ?? '', 'modules.txt');\n const useVendor =\n !!config.postUpdateOptions?.includes('gomodVendor') ||\n (!config.postUpdateOptions?.includes('gomodSkipVendor') &&\n vendorDir &&\n (await readLocalFile(vendorModulesFileName)) !== null);\n let massagedGoMod = newGoModContent;\n const useGoGenerate = !!config.postUpdateOptions?.includes('goGenerate');\n const allowedUnsafeExecutions = GlobalConfig.get('allowedUnsafeExecutions');\n const goGenerateAllowed = allowedUnsafeExecutions?.includes('goGenerate');\n\n if (config.postUpdateOptions?.includes('gomodMassage')) {\n // Regex match inline replace directive, example:\n // replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\n // https://go.dev/ref/mod#go-mod-file-replace\n\n // replace bracket after comments, so it doesn't break the regex, doing a complex regex causes problems\n // when there's a comment and \")\" after it, the regex will read replace block until comment.. and stop.\n massagedGoMod = massagedGoMod\n .split('\\n')\n .map((line) => {\n if (line.trim().startsWith('//')) {\n return line.replace(')', 'renovate-replace-bracket');\n }\n return line;\n })\n .join('\\n');\n\n const inlineReplaceRegEx = regEx(\n /(\\r?\\n)(replace\\s+[^\\s]+\\s+=>\\s+\\.\\.\\/.*)/g,\n );\n\n // $1 will be matched with the (\\r?n) group\n // $2 will be matched with the inline replace match, example\n // \"// renovate-replace replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\"\n const inlineCommentOut = '$1// renovate-replace $2';\n\n // Regex match replace directive block, example:\n // replace (\n // golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\n // )\n const blockReplaceRegEx = regEx(/(\\r?\\n)replace\\s*\\([^)]+\\s*\\)/g);\n\n /**\n * replacerFunction for commenting out replace blocks\n * @param match A string representing a golang replace directive block\n * @returns A commented out block with // renovate-replace\n */\n function blockCommentOut(match: string): string {\n return match.replace(/(\\r?\\n)/g, '$1// renovate-replace ');\n }\n\n // Comment out golang replace directives\n massagedGoMod = massagedGoMod\n .replace(inlineReplaceRegEx, inlineCommentOut)\n .replace(blockReplaceRegEx, blockCommentOut);\n\n if (massagedGoMod !== newGoModContent) {\n logger.debug(\n 'Removed some relative replace statements and comments from go.mod',\n );\n }\n }\n const goConstraints = deriveGoToolchainConstraints(config, newGoModContent);\n\n try {\n await writeLocalFile(goModFileName, massagedGoMod);\n\n const cmd = 'go';\n const env = getEnv();\n const execOptions: ExecOptions = {\n cwdFile: goModFileName,\n extraEnv: {\n GOPATH: await ensureCacheDir('go'),\n GOPROXY: env.GOPROXY,\n GOPRIVATE: env.GOPRIVATE,\n GONOPROXY: env.GONOPROXY,\n GONOSUMDB: env.GONOSUMDB,\n GOSUMDB: env.GOSUMDB,\n GOINSECURE: env.GOINSECURE,\n /* v8 ignore next -- TODO: add test */\n GOFLAGS: useModcacherw(goConstraints) ? '-modcacherw' : null,\n CGO_ENABLED: GlobalConfig.get('binarySource') === 'docker' ? '0' : null,\n },\n docker: {},\n toolConstraints: [\n {\n toolName: 'golang',\n constraint: goConstraints,\n },\n ],\n };\n\n const execCommands: string[] = [];\n\n let goGetDirs: string | undefined;\n if (config.goGetDirs) {\n goGetDirs = config.goGetDirs\n .filter((dir) => {\n const isValid = isValidLocalPath(dir);\n if (!isValid) {\n logger.warn({ dir }, 'Invalid path in goGetDirs');\n }\n return isValid;\n })\n .map(quote)\n .join(' ');\n\n if (goGetDirs === '') {\n throw new Error('Invalid goGetDirs');\n }\n }\n\n let args = `get${modFileFlag} `;\n\n if (goConstraints && !semver.intersects(goConstraints, `>=1.18`)) {\n // For Go versions < 1.18, we need to use the -d flag to avoid builds or installs\n // https://go.dev/doc/go1.18#go-get\n args += `-d `;\n }\n\n args += `-t ${goGetDirs ?? './...'}`;\n logger.trace({ cmd, args }, 'go get command included');\n execCommands.push(`${cmd} ${args}`);\n\n // Update import paths on major updates\n const isImportPathUpdateRequired =\n config.postUpdateOptions?.includes('gomodUpdateImportPaths') &&\n config.updateType === 'major';\n\n if (isImportPathUpdateRequired) {\n const updateImportCmds = getUpdateImportPathCmds(updatedDeps, config);\n if (updateImportCmds.length > 0) {\n logger.debug(updateImportCmds, 'update import path commands included');\n // The updates\n execCommands.push(...updateImportCmds);\n }\n }\n\n const mustSkipGoModTidy =\n !config.postUpdateOptions?.includes('gomodUpdateImportPaths') &&\n config.updateType === 'major';\n if (mustSkipGoModTidy) {\n logger.debug('go mod tidy command skipped');\n }\n\n let tidyOpts = '';\n if (config.postUpdateOptions?.includes('gomodTidy1.17')) {\n tidyOpts += ' -compat=1.17';\n }\n if (config.postUpdateOptions?.includes('gomodTidyE')) {\n tidyOpts += ' -e';\n }\n\n // dependent modules can only be tidied once the updated module is settled\n const isGoModTidyAllRequired =\n config.postUpdateOptions?.includes('gomodTidyAll') === true;\n const isGoModTidyRequired =\n !mustSkipGoModTidy &&\n (config.postUpdateOptions?.includes('gomodTidy') === true ||\n config.postUpdateOptions?.includes('gomodTidy1.17') === true ||\n config.postUpdateOptions?.includes('gomodTidyE') === true ||\n isGoModTidyAllRequired ||\n (config.updateType === 'major' && isImportPathUpdateRequired));\n if (isGoModTidyRequired) {\n args = `mod tidy${modFileFlag}${tidyOpts}`;\n logger.debug('go mod tidy command included');\n execCommands.push(`${cmd} ${args}`);\n }\n\n let goWorkSumFileName = upath.join(goModDir, 'go.work.sum');\n if (useVendor) {\n // If we find a go.work, then use go workspace vendoring.\n const goWorkFile = await findLocalSiblingOrParent(\n goModFileName,\n 'go.work',\n );\n\n if (goWorkFile) {\n goWorkSumFileName = upath.join(\n upath.dirname(goWorkFile),\n 'go.work.sum',\n );\n\n args = 'work vendor';\n logger.debug('using go work vendor');\n execCommands.push(`${cmd} ${args}`);\n\n args = 'work sync';\n logger.debug('using go work sync');\n execCommands.push(`${cmd} ${args}`);\n } else {\n args = `mod vendor${modFileFlag}`;\n logger.debug('using go mod vendor');\n execCommands.push(`${cmd} ${args}`);\n }\n\n if (isGoModTidyRequired) {\n args = `mod tidy${modFileFlag}${tidyOpts}`;\n logger.debug('go mod tidy command included');\n execCommands.push(`${cmd} ${args}`);\n }\n }\n\n // We tidy one more time as a solution for #6795\n if (isGoModTidyRequired) {\n args = `mod tidy${modFileFlag}${tidyOpts}`;\n logger.debug('go mod tidy command included');\n execCommands.push(`${cmd} ${args}`);\n }\n\n let dependentModules: string[] = [];\n if (isGoModTidyAllRequired) {\n try {\n dependentModules = await getGoModulesInTidyOrder(goModFileName);\n for (const dependent of dependentModules) {\n const dir = upath.relative(goModDir, upath.dirname(dependent));\n execCommands.push(`${cmd} -C ${quote(dir)} mod tidy${tidyOpts}`);\n }\n logger.debug({ dependentModules }, 'go mod tidy commands included');\n } catch (err) {\n logger.warn({ err }, 'Failed to find dependent Go modules');\n }\n }\n\n if (useGoGenerate) {\n if (goGenerateAllowed) {\n logger.debug('go generate command included');\n execCommands.push(`${cmd} generate ./...`);\n } else {\n logger.once.warn(\n `go generate command requested as a post update action, but goGenerate is not permitted in the allowedUnsafeExecutions`,\n );\n }\n }\n\n await gitExec(execCommands, execOptions);\n\n const status = await getRepoStatus();\n const dependentFiles = dependentModules.flatMap((f) => [\n f,\n f.replace(regEx(/\\.mod$/), '.sum'),\n ]);\n\n if (\n !status.modified.includes(sumFileName) &&\n !status.modified.includes(goModFileName) &&\n !status.modified.includes(goWorkSumFileName) &&\n !dependentFiles.some((f) => status.modified.includes(f))\n ) {\n return null;\n }\n\n const res: UpdateArtifactsResult[] = [];\n if (status.modified.includes(sumFileName)) {\n logger.debug('Returning updated go.sum');\n res.push({\n file: {\n type: 'addition',\n path: sumFileName,\n contents: await readLocalFile(sumFileName),\n },\n });\n }\n\n if (status.modified.includes(goWorkSumFileName)) {\n logger.debug('Returning updated go.work.sum');\n res.push({\n file: {\n type: 'addition',\n path: goWorkSumFileName,\n contents: await readLocalFile(goWorkSumFileName),\n },\n });\n }\n\n for (const f of dependentFiles) {\n if (status.modified.includes(f)) {\n logger.trace(`Returning updated ${f}`);\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n\n // Include all the .go file import changes\n if (isImportPathUpdateRequired) {\n logger.debug('Returning updated go source files for import path changes');\n for (const f of status.modified) {\n if (f.endsWith('.go')) {\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n }\n\n const alreadyAdded = new Set<string>();\n const alreadyDeleted = new Set<string>();\n if (useVendor) {\n for (const f of status.modified.concat(status.not_added)) {\n if (vendorDir && f.startsWith(vendorDir)) {\n alreadyAdded.add(f);\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n for (const f of coerceArray(status.deleted)) {\n if (vendorDir && f.startsWith(vendorDir)) {\n alreadyDeleted.add(f);\n res.push({\n file: {\n type: 'deletion',\n path: f,\n },\n });\n }\n }\n }\n\n // TODO: throws in tests (#22198)\n const finalGoModContent = (await readLocalFile(goModFileName, 'utf8'))!\n .replace(regEx(/\\/\\/ renovate-replace /g), '')\n .replace(regEx(/renovate-replace-bracket/g), ')');\n if (finalGoModContent !== newGoModContent) {\n const artifactResult: UpdateArtifactsResult = {\n file: {\n type: 'addition',\n path: goModFileName,\n contents: finalGoModContent,\n },\n };\n\n const updatedDepNames = filterMap(updatedDeps, (dep) => dep?.depName);\n const extraDepsNotice = getExtraDepsNotice(\n newGoModContent,\n finalGoModContent,\n updatedDepNames,\n );\n\n if (extraDepsNotice) {\n artifactResult.notice = {\n file: goModFileName,\n message: extraDepsNotice,\n };\n }\n\n logger.debug('Found updated go.mod after go.sum update');\n res.push(artifactResult);\n alreadyAdded.add(goModFileName);\n }\n\n // add all files added when in `go generate` mode.\n // unfortunately there is not a good way as there is with vendoring or go import path updates to detect this.\n // Do this at the very very end to ensure we only capture files which would have been explicitly\n // modified, added, or deleted from a `go generate` invocation\n if (useGoGenerate && goGenerateAllowed) {\n logger.debug(\n 'Updating all modified files since generated files were added',\n );\n for (const f of status.modified.concat(status.created)) {\n if (!alreadyAdded.has(f)) {\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n for (const f of coerceArray(status.deleted)) {\n if (!alreadyDeleted.has(f)) {\n res.push({\n file: {\n type: 'deletion',\n path: f,\n },\n });\n }\n }\n }\n return res;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update go.sum');\n return [\n {\n artifactError: {\n fileName: sumFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n\nfunction getGoConstraints(content: string): string | undefined {\n // prefer toolchain directive when go.mod has one\n const toolchainMatch = regEx(/^toolchain\\s*go(?<gover>\\d+\\.\\d+\\.\\d+)$/m).exec(\n content,\n );\n const toolchainVer = toolchainMatch?.groups?.gover;\n if (toolchainVer) {\n logger.debug(\n `Using go version ${toolchainVer} found in toolchain directive`,\n );\n return toolchainVer;\n }\n\n // If go.mod doesn't have toolchain directive and has a full go version spec,\n // for example `go 1.23.6`, pick this version, this doesn't match major.minor version spec.\n //\n // This is because when go.mod have same version defined in go directive and toolchain directive,\n // go will remove toolchain directive from go.mod.\n //\n // For example, go will rewrite `go 1.23.5\\ntoolchain go1.23.5` to `go 1.23.5` by default,\n // in this case, the go directive is the toolchain directive.\n const goFullVersion = regEx(/^go\\s*(?<gover>\\d+\\.\\d+\\.\\d+)$/m).exec(content)\n ?.groups?.gover;\n if (goFullVersion) {\n return goFullVersion;\n }\n\n const re = regEx(/^go\\s*(?<gover>\\d+\\.\\d+)$/m);\n const match = re.exec(content);\n if (!match?.groups?.gover) {\n return undefined;\n }\n return `^${match.groups.gover}`;\n}\n\n/**\n * Derive the version of the Go toolchain needed to run this project.\n *\n * This matches with the `golang` Containerbase tool.\n *\n * In precedence order:\n *\n * 1. config: \\`constraints.go\\`\n * 1. \\`go.mod\\`: \\`toolchain\\` directive\n * 1. \\`go.mod\\`: \\`go\\` directive\n *\n * NOTE that the \\`constraints.golang\\` is not used (TODO #42601)\n */\nexport function deriveGoToolchainConstraints(\n config: UpdateArtifactsConfig,\n newGoModContent: string,\n): string | undefined {\n return config.constraints?.go ?? getGoConstraints(newGoModContent);\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"artifacts.js","names":["valid","major","isValid"],"sources":["../../../../lib/modules/manager/gomod/artifacts.ts"],"sourcesContent":["import { isString } from '@sindresorhus/is';\nimport semver from 'semver';\nimport { quote } from 'shlex';\nimport upath from 'upath';\nimport { GlobalConfig } from '../../../config/global.ts';\nimport { TEMPORARY_ERROR } from '../../../constants/error-messages.ts';\nimport { logger } from '../../../logger/index.ts';\nimport { coerceArray } from '../../../util/array.ts';\nimport { getEnv } from '../../../util/env.ts';\nimport type { ExecOptions } from '../../../util/exec/types.ts';\nimport { filterMap } from '../../../util/filter-map.ts';\nimport {\n ensureCacheDir,\n findLocalSiblingOrParent,\n isValidLocalPath,\n readLocalFile,\n writeLocalFile,\n} from '../../../util/fs/index.ts';\nimport { withGitEnvironment } from '../../../util/git/exec.ts';\nimport { getRepoStatus } from '../../../util/git/index.ts';\nimport { regEx } from '../../../util/regex.ts';\nimport { isValid } from '../../versioning/semver/index.ts';\nimport type {\n PackageDependency,\n UpdateArtifact,\n UpdateArtifactsConfig,\n UpdateArtifactsResult,\n} from '../types.ts';\nimport { getExtraDepsNotice } from './artifacts-extra.ts';\nimport { getGoModulesInTidyOrder } from './package-tree.ts';\n\nconst { major, valid } = semver;\nconst gitExec = withGitEnvironment(['go']);\n\nfunction getUpdateImportPathCmds(\n updatedDeps: PackageDependency[],\n { constraints }: UpdateArtifactsConfig,\n): string[] {\n // Check if we fail to parse any major versions and log that they're skipped\n const invalidMajorDeps = updatedDeps.filter(\n ({ newVersion }) => !valid(newVersion),\n );\n if (invalidMajorDeps.length > 0) {\n invalidMajorDeps.forEach(({ depName }) =>\n logger.warn(\n { depName },\n 'Ignoring dependency: Could not get major version',\n ),\n );\n }\n\n const updateImportCommands = updatedDeps\n .filter(\n ({ newVersion }) =>\n valid(newVersion) && !newVersion!.endsWith('+incompatible'),\n )\n .map(({ depName, newVersion }) => ({\n depName: depName!,\n newMajor: major(newVersion!),\n }))\n // Skip path updates going from v0 to v1\n .filter(\n ({ depName, newMajor }) =>\n depName.startsWith('gopkg.in/') || newMajor > 1,\n )\n\n .map(\n ({ depName, newMajor }) =>\n `mod upgrade --mod-name=${quote(depName)} -t=${newMajor}`,\n );\n\n if (updateImportCommands.length > 0) {\n let installMarwanModArgs =\n 'install github.com/marwan-at-work/mod/cmd/mod@latest';\n const gomodModCompatibility = constraints?.gomodMod;\n if (gomodModCompatibility) {\n if (\n gomodModCompatibility.startsWith('v') &&\n isValid(gomodModCompatibility.replace(regEx(/^v/), ''))\n ) {\n installMarwanModArgs = installMarwanModArgs.replace(\n regEx(/@latest$/),\n `@${gomodModCompatibility}`,\n );\n } else {\n logger.debug(\n { gomodModCompatibility },\n 'marwan-at-work/mod compatibility range is not valid - skipping',\n );\n }\n } else {\n logger.debug(\n 'No marwan-at-work/mod compatibility range found - installing marwan-at-work/mod latest',\n );\n }\n updateImportCommands.unshift(`go ${installMarwanModArgs}`);\n }\n\n return updateImportCommands;\n}\n\nfunction useModcacherw(goVersion: string | undefined): boolean {\n if (!isString(goVersion)) {\n return true;\n }\n\n return semver.intersects(goVersion, `>=1.14`);\n}\n\nexport async function updateArtifacts({\n packageFileName: goModFileName,\n updatedDeps,\n newPackageFileContent: newGoModContent,\n config,\n}: UpdateArtifact): Promise<UpdateArtifactsResult[] | null> {\n logger.debug(`gomod.updateArtifacts(${goModFileName})`);\n\n const sumFileName = goModFileName.replace(regEx(/\\.mod$/), '.sum');\n const existingGoSumContent = await readLocalFile(sumFileName);\n if (!existingGoSumContent) {\n logger.debug('No go.sum found');\n return null;\n }\n const goModDir = upath.dirname(goModFileName);\n const goModFileBaseName = upath.basename(goModFileName);\n const modFileFlag =\n goModFileBaseName === 'go.mod'\n ? ''\n : ` -modfile=${quote(goModFileBaseName)}`;\n\n // The \"vendor\" directory can be next to the go.mod, but also in the parent directory in case\n // the go workspaces are used.\n const vendorDir = await findLocalSiblingOrParent(goModFileName, 'vendor');\n const vendorModulesFileName = upath.join(vendorDir ?? '', 'modules.txt');\n const useVendor =\n !!config.postUpdateOptions?.includes('gomodVendor') ||\n (!config.postUpdateOptions?.includes('gomodSkipVendor') &&\n vendorDir &&\n (await readLocalFile(vendorModulesFileName)) !== null);\n let massagedGoMod = newGoModContent;\n const useGoGenerate = !!config.postUpdateOptions?.includes('goGenerate');\n const allowedUnsafeExecutions = GlobalConfig.get('allowedUnsafeExecutions');\n const goGenerateAllowed = allowedUnsafeExecutions?.includes('goGenerate');\n\n if (config.postUpdateOptions?.includes('gomodMassage')) {\n // Regex match inline replace directive, example:\n // replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\n // https://go.dev/ref/mod#go-mod-file-replace\n\n // replace bracket after comments, so it doesn't break the regex, doing a complex regex causes problems\n // when there's a comment and \")\" after it, the regex will read replace block until comment.. and stop.\n massagedGoMod = massagedGoMod\n .split('\\n')\n .map((line) => {\n if (line.trim().startsWith('//')) {\n return line.replace(')', 'renovate-replace-bracket');\n }\n return line;\n })\n .join('\\n');\n\n const inlineReplaceRegEx = regEx(\n /(\\r?\\n)(replace\\s+[^\\s]+\\s+=>\\s+\\.\\.\\/.*)/g,\n );\n\n // $1 will be matched with the (\\r?n) group\n // $2 will be matched with the inline replace match, example\n // \"// renovate-replace replace golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\"\n const inlineCommentOut = '$1// renovate-replace $2';\n\n // Regex match replace directive block, example:\n // replace (\n // golang.org/x/net v1.2.3 => example.com/fork/net v1.4.5\n // )\n const blockReplaceRegEx = regEx(/(\\r?\\n)replace\\s*\\([^)]+\\s*\\)/g);\n\n /**\n * replacerFunction for commenting out replace blocks\n * @param match A string representing a golang replace directive block\n * @returns A commented out block with // renovate-replace\n */\n function blockCommentOut(match: string): string {\n return match.replace(regEx(/(\\r?\\n)/g), '$1// renovate-replace ');\n }\n\n // Comment out golang replace directives\n massagedGoMod = massagedGoMod\n .replace(inlineReplaceRegEx, inlineCommentOut)\n .replace(blockReplaceRegEx, blockCommentOut);\n\n if (massagedGoMod !== newGoModContent) {\n logger.debug(\n 'Removed some relative replace statements and comments from go.mod',\n );\n }\n }\n const goConstraints = deriveGoToolchainConstraints(config, newGoModContent);\n\n try {\n await writeLocalFile(goModFileName, massagedGoMod);\n\n const cmd = 'go';\n const env = getEnv();\n const execOptions: ExecOptions = {\n cwdFile: goModFileName,\n extraEnv: {\n GOPATH: await ensureCacheDir('go'),\n GOPROXY: env.GOPROXY,\n GOPRIVATE: env.GOPRIVATE,\n GONOPROXY: env.GONOPROXY,\n GONOSUMDB: env.GONOSUMDB,\n GOSUMDB: env.GOSUMDB,\n GOINSECURE: env.GOINSECURE,\n /* v8 ignore next -- TODO: add test */\n GOFLAGS: useModcacherw(goConstraints) ? '-modcacherw' : null,\n CGO_ENABLED: GlobalConfig.get('binarySource') === 'docker' ? '0' : null,\n },\n docker: {},\n toolConstraints: [\n {\n toolName: 'golang',\n constraint: goConstraints,\n },\n ],\n };\n\n const execCommands: string[] = [];\n\n let goGetDirs: string | undefined;\n if (config.goGetDirs) {\n goGetDirs = config.goGetDirs\n .filter((dir) => {\n const isValid = isValidLocalPath(dir);\n if (!isValid) {\n logger.warn({ dir }, 'Invalid path in goGetDirs');\n }\n return isValid;\n })\n .map(quote)\n .join(' ');\n\n if (goGetDirs === '') {\n throw new Error('Invalid goGetDirs');\n }\n }\n\n let args = `get${modFileFlag} `;\n\n if (goConstraints && !semver.intersects(goConstraints, `>=1.18`)) {\n // For Go versions < 1.18, we need to use the -d flag to avoid builds or installs\n // https://go.dev/doc/go1.18#go-get\n args += `-d `;\n }\n\n args += `-t ${goGetDirs ?? './...'}`;\n logger.trace({ cmd, args }, 'go get command included');\n execCommands.push(`${cmd} ${args}`);\n\n // Update import paths on major updates\n const isImportPathUpdateRequired =\n config.postUpdateOptions?.includes('gomodUpdateImportPaths') &&\n config.updateType === 'major';\n\n if (isImportPathUpdateRequired) {\n const updateImportCmds = getUpdateImportPathCmds(updatedDeps, config);\n if (updateImportCmds.length > 0) {\n logger.debug(updateImportCmds, 'update import path commands included');\n // The updates\n execCommands.push(...updateImportCmds);\n }\n }\n\n const mustSkipGoModTidy =\n !config.postUpdateOptions?.includes('gomodUpdateImportPaths') &&\n config.updateType === 'major';\n if (mustSkipGoModTidy) {\n logger.debug('go mod tidy command skipped');\n }\n\n let tidyOpts = '';\n if (config.postUpdateOptions?.includes('gomodTidy1.17')) {\n tidyOpts += ' -compat=1.17';\n }\n if (config.postUpdateOptions?.includes('gomodTidyE')) {\n tidyOpts += ' -e';\n }\n\n // dependent modules can only be tidied once the updated module is settled\n const isGoModTidyAllRequired =\n config.postUpdateOptions?.includes('gomodTidyAll') === true;\n const isGoModTidyRequired =\n !mustSkipGoModTidy &&\n (config.postUpdateOptions?.includes('gomodTidy') === true ||\n config.postUpdateOptions?.includes('gomodTidy1.17') === true ||\n config.postUpdateOptions?.includes('gomodTidyE') === true ||\n isGoModTidyAllRequired ||\n (config.updateType === 'major' && isImportPathUpdateRequired));\n if (isGoModTidyRequired) {\n args = `mod tidy${modFileFlag}${tidyOpts}`;\n logger.debug('go mod tidy command included');\n execCommands.push(`${cmd} ${args}`);\n }\n\n let goWorkSumFileName = upath.join(goModDir, 'go.work.sum');\n if (useVendor) {\n // If we find a go.work, then use go workspace vendoring.\n const goWorkFile = await findLocalSiblingOrParent(\n goModFileName,\n 'go.work',\n );\n\n if (goWorkFile) {\n goWorkSumFileName = upath.join(\n upath.dirname(goWorkFile),\n 'go.work.sum',\n );\n\n args = 'work vendor';\n logger.debug('using go work vendor');\n execCommands.push(`${cmd} ${args}`);\n\n args = 'work sync';\n logger.debug('using go work sync');\n execCommands.push(`${cmd} ${args}`);\n } else {\n args = `mod vendor${modFileFlag}`;\n logger.debug('using go mod vendor');\n execCommands.push(`${cmd} ${args}`);\n }\n\n if (isGoModTidyRequired) {\n args = `mod tidy${modFileFlag}${tidyOpts}`;\n logger.debug('go mod tidy command included');\n execCommands.push(`${cmd} ${args}`);\n }\n }\n\n // We tidy one more time as a solution for #6795\n if (isGoModTidyRequired) {\n args = `mod tidy${modFileFlag}${tidyOpts}`;\n logger.debug('go mod tidy command included');\n execCommands.push(`${cmd} ${args}`);\n }\n\n let dependentModules: string[] = [];\n if (isGoModTidyAllRequired) {\n try {\n dependentModules = await getGoModulesInTidyOrder(goModFileName);\n for (const dependent of dependentModules) {\n const dir = upath.relative(goModDir, upath.dirname(dependent));\n execCommands.push(`${cmd} -C ${quote(dir)} mod tidy${tidyOpts}`);\n }\n logger.debug({ dependentModules }, 'go mod tidy commands included');\n } catch (err) {\n logger.warn({ err }, 'Failed to find dependent Go modules');\n }\n }\n\n if (useGoGenerate) {\n if (goGenerateAllowed) {\n logger.debug('go generate command included');\n execCommands.push(`${cmd} generate ./...`);\n } else {\n logger.once.warn(\n `go generate command requested as a post update action, but goGenerate is not permitted in the allowedUnsafeExecutions`,\n );\n }\n }\n\n await gitExec(execCommands, execOptions);\n\n const status = await getRepoStatus();\n const dependentFiles = dependentModules.flatMap((f) => [\n f,\n f.replace(regEx(/\\.mod$/), '.sum'),\n ]);\n\n if (\n !status.modified.includes(sumFileName) &&\n !status.modified.includes(goModFileName) &&\n !status.modified.includes(goWorkSumFileName) &&\n !dependentFiles.some((f) => status.modified.includes(f))\n ) {\n return null;\n }\n\n const res: UpdateArtifactsResult[] = [];\n if (status.modified.includes(sumFileName)) {\n logger.debug('Returning updated go.sum');\n res.push({\n file: {\n type: 'addition',\n path: sumFileName,\n contents: await readLocalFile(sumFileName),\n },\n });\n }\n\n if (status.modified.includes(goWorkSumFileName)) {\n logger.debug('Returning updated go.work.sum');\n res.push({\n file: {\n type: 'addition',\n path: goWorkSumFileName,\n contents: await readLocalFile(goWorkSumFileName),\n },\n });\n }\n\n for (const f of dependentFiles) {\n if (status.modified.includes(f)) {\n logger.trace(`Returning updated ${f}`);\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n\n // Include all the .go file import changes\n if (isImportPathUpdateRequired) {\n logger.debug('Returning updated go source files for import path changes');\n for (const f of status.modified) {\n if (f.endsWith('.go')) {\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n }\n\n const alreadyAdded = new Set<string>();\n const alreadyDeleted = new Set<string>();\n if (useVendor) {\n for (const f of status.modified.concat(status.not_added)) {\n if (vendorDir && f.startsWith(vendorDir)) {\n alreadyAdded.add(f);\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n for (const f of coerceArray(status.deleted)) {\n if (vendorDir && f.startsWith(vendorDir)) {\n alreadyDeleted.add(f);\n res.push({\n file: {\n type: 'deletion',\n path: f,\n },\n });\n }\n }\n }\n\n // TODO: throws in tests (#22198)\n const finalGoModContent = (await readLocalFile(goModFileName, 'utf8'))!\n .replace(regEx(/\\/\\/ renovate-replace /g), '')\n .replace(regEx(/renovate-replace-bracket/g), ')');\n if (finalGoModContent !== newGoModContent) {\n const artifactResult: UpdateArtifactsResult = {\n file: {\n type: 'addition',\n path: goModFileName,\n contents: finalGoModContent,\n },\n };\n\n const updatedDepNames = filterMap(updatedDeps, (dep) => dep?.depName);\n const extraDepsNotice = getExtraDepsNotice(\n newGoModContent,\n finalGoModContent,\n updatedDepNames,\n );\n\n if (extraDepsNotice) {\n artifactResult.notice = {\n file: goModFileName,\n message: extraDepsNotice,\n };\n }\n\n logger.debug('Found updated go.mod after go.sum update');\n res.push(artifactResult);\n alreadyAdded.add(goModFileName);\n }\n\n // add all files added when in `go generate` mode.\n // unfortunately there is not a good way as there is with vendoring or go import path updates to detect this.\n // Do this at the very very end to ensure we only capture files which would have been explicitly\n // modified, added, or deleted from a `go generate` invocation\n if (useGoGenerate && goGenerateAllowed) {\n logger.debug(\n 'Updating all modified files since generated files were added',\n );\n for (const f of status.modified.concat(status.created)) {\n if (!alreadyAdded.has(f)) {\n res.push({\n file: {\n type: 'addition',\n path: f,\n contents: await readLocalFile(f),\n },\n });\n }\n }\n for (const f of coerceArray(status.deleted)) {\n if (!alreadyDeleted.has(f)) {\n res.push({\n file: {\n type: 'deletion',\n path: f,\n },\n });\n }\n }\n }\n return res;\n } catch (err) {\n if (err.message === TEMPORARY_ERROR) {\n throw err;\n }\n logger.debug({ err }, 'Failed to update go.sum');\n return [\n {\n artifactError: {\n fileName: sumFileName,\n stderr: err.message,\n },\n },\n ];\n }\n}\n\nfunction getGoConstraints(content: string): string | undefined {\n // prefer toolchain directive when go.mod has one\n const toolchainMatch = regEx(/^toolchain\\s*go(?<gover>\\d+\\.\\d+\\.\\d+)$/m).exec(\n content,\n );\n const toolchainVer = toolchainMatch?.groups?.gover;\n if (toolchainVer) {\n logger.debug(\n `Using go version ${toolchainVer} found in toolchain directive`,\n );\n return toolchainVer;\n }\n\n // If go.mod doesn't have toolchain directive and has a full go version spec,\n // for example `go 1.23.6`, pick this version, this doesn't match major.minor version spec.\n //\n // This is because when go.mod have same version defined in go directive and toolchain directive,\n // go will remove toolchain directive from go.mod.\n //\n // For example, go will rewrite `go 1.23.5\\ntoolchain go1.23.5` to `go 1.23.5` by default,\n // in this case, the go directive is the toolchain directive.\n const goFullVersion = regEx(/^go\\s*(?<gover>\\d+\\.\\d+\\.\\d+)$/m).exec(content)\n ?.groups?.gover;\n if (goFullVersion) {\n return goFullVersion;\n }\n\n const re = regEx(/^go\\s*(?<gover>\\d+\\.\\d+)$/m);\n const match = re.exec(content);\n if (!match?.groups?.gover) {\n return undefined;\n }\n return `^${match.groups.gover}`;\n}\n\n/**\n * Derive the version of the Go toolchain needed to run this project.\n *\n * This matches with the `golang` Containerbase tool.\n *\n * In precedence order:\n *\n * 1. config: \\`constraints.go\\`\n * 1. \\`go.mod\\`: \\`toolchain\\` directive\n * 1. \\`go.mod\\`: \\`go\\` directive\n *\n * NOTE that the \\`constraints.golang\\` is not used (TODO #42601)\n */\nexport function deriveGoToolchainConstraints(\n config: UpdateArtifactsConfig,\n newGoModContent: string,\n): string | undefined {\n return config.constraints?.go ?? getGoConstraints(newGoModContent);\n}\n"],"mappings":"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"}
|
|
@@ -81,7 +81,7 @@ function parseGcv(propsFileName, fileContents) {
|
|
|
81
81
|
return extractedDeps;
|
|
82
82
|
}
|
|
83
83
|
function globToRegex(depName) {
|
|
84
|
-
return regEx(depName.replace(/\*/g, "_WC_CHAR_").replace(/[/\-\\^$*+?.()|[\]{}]/g, "\\$&").replace(/_WC_CHAR_/g, ".*?"));
|
|
84
|
+
return regEx(depName.replace(regEx(/\*/g), "_WC_CHAR_").replace(regEx(/[/\-\\^$*+?.()|[\]{}]/g), "\\$&").replace(regEx(/_WC_CHAR_/g), ".*?"));
|
|
85
85
|
}
|
|
86
86
|
/**
|
|
87
87
|
* Parses `versions.lock`
|
|
@@ -114,7 +114,7 @@ function parsePropsFile(input) {
|
|
|
114
114
|
const depVerRegexMap = /* @__PURE__ */ new Map();
|
|
115
115
|
let startOfLineIdx = 0;
|
|
116
116
|
const isCrLf = input.indexOf("\r\n") > 0;
|
|
117
|
-
const validGlob = /^[a-zA-Z][-_a-zA-Z0-9.:*]
|
|
117
|
+
const validGlob = regEx(/^[a-zA-Z][-_a-zA-Z0-9.:*]+$/);
|
|
118
118
|
for (const line of input.split(newlineRegex)) {
|
|
119
119
|
const lineMatch = propsLineRegex.exec(line);
|
|
120
120
|
if (lineMatch?.groups) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"consistent-versions-plugin.js","names":["fs.getSiblingFileName"],"sources":["../../../../../lib/modules/manager/gradle/extract/consistent-versions-plugin.ts"],"sourcesContent":["import { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { coerceString } from '../../../../util/string.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type { GradleManagerData } from '../types.ts';\nimport { isDependencyString, versionLikeSubstring } from '../utils.ts';\n\nexport const VERSIONS_PROPS = 'versions.props';\nexport const VERSIONS_LOCK = 'versions.lock';\nexport const LOCKFIlE_HEADER_TEXT = regEx(\n /^# Run \\.\\/gradlew (?:--write-locks|writeVersionsLock|writeVersionsLocks) to regenerate this file/,\n);\n\n/**\n * Determines if Palantir gradle-consistent-versions is in use, https://github.com/palantir/gradle-consistent-versions.\n * Both `versions.props` and `versions.lock` must exist and the special header line of lock file must match\n *\n * @param versionsPropsFilename is the full file name path of `versions.props`\n * @param fileContents map with file contents of all files\n */\nexport function usesGcv(\n versionsPropsFilename: string,\n fileContents: Record<string, string | null>,\n): boolean {\n const versionsLockFile: string = fs.getSiblingFileName(\n versionsPropsFilename,\n VERSIONS_LOCK,\n );\n\n return !!fileContents[versionsLockFile]?.match(LOCKFIlE_HEADER_TEXT);\n}\n\n/**\n * Confirms whether the provided file name is the props file\n */\nexport function isGcvPropsFile(fileName: string): boolean {\n return fileName === VERSIONS_PROPS || fileName.endsWith(`/${VERSIONS_PROPS}`);\n}\n\n/**\n * Confirms whether the provided file name is the lock file\n */\nexport function isGcvLockFile(fileName: string): boolean {\n return fileName === VERSIONS_LOCK || fileName.endsWith(`/${VERSIONS_LOCK}`);\n}\n\n/**\n * Parses Gradle-Consistent-Versions files to figure out what dependencies, versions\n * and groups they contain. The parsing goes like this:\n * - Parse `versions.props` into deps (or groups) and versions, remembering file offsets\n * - Parse `versions.lock` into deps and lock-versions\n * - For each exact dep in props file, lookup the lock-version from lock file\n * - For each group/regex dep in props file, lookup the set of exact deps and versions in lock file\n *\n * @param propsFileName name and path of the props file\n * @param fileContents text content of all files\n */\nexport function parseGcv(\n propsFileName: string,\n fileContents: Record<string, string | null>,\n): PackageDependency<GradleManagerData>[] {\n const propsFileContent = coerceString(fileContents[propsFileName]);\n const lockFileName = fs.getSiblingFileName(propsFileName, VERSIONS_LOCK);\n const lockFileContent = coerceString(fileContents[lockFileName]);\n const lockFileMap = parseLockFile(lockFileContent);\n const [propsFileExactMap, propsFileRegexMap] =\n parsePropsFile(propsFileContent);\n\n const extractedDeps: PackageDependency<GradleManagerData>[] = [];\n\n // For each exact dep in props file\n for (const [propDep, versionAndPosition] of propsFileExactMap) {\n if (lockFileMap.has(propDep)) {\n const newDep: Record<string, any> = {\n managerData: {\n packageFile: propsFileName,\n fileReplacePosition: versionAndPosition.filePos,\n },\n depName: propDep,\n currentValue: versionAndPosition.version,\n lockedVersion: lockFileMap.get(propDep)?.version,\n depType: lockFileMap.get(propDep)?.depType,\n } satisfies PackageDependency<GradleManagerData>;\n extractedDeps.push(newDep);\n // Remove from the lockfile map so the same exact lib will not be included in globbing\n lockFileMap.delete(propDep);\n }\n }\n\n // For each regular expression dep in props file (starting with the longest glob string)...\n for (const [propDepGlob, propVerAndPos] of propsFileRegexMap) {\n const globRegex = globToRegex(propDepGlob);\n for (const [exactDep, lockVersionAndDepType] of lockFileMap) {\n if (globRegex.test(exactDep)) {\n const newDep: Record<string, any> = {\n managerData: {\n packageFile: propsFileName,\n fileReplacePosition: propVerAndPos.filePos,\n },\n depName: exactDep,\n currentValue: propVerAndPos.version,\n lockedVersion: lockVersionAndDepType.version,\n depType: lockVersionAndDepType.depType,\n sharedVariableName: propDepGlob,\n } satisfies PackageDependency<GradleManagerData>;\n extractedDeps.push(newDep);\n // Remove from the lockfile map so the same lib will not be included in more generic globs later\n lockFileMap.delete(exactDep);\n }\n }\n }\n return extractedDeps;\n}\n\n// Translate glob syntax to a regex that does the same. Note that we cannot use replaceAll as it does not exist in Node14\n// Loosely borrowed mapping to regex from https://github.com/palantir/gradle-consistent-versions/blob/develop/src/main/java/com/palantir/gradle/versions/FuzzyPatternResolver.java\nfunction globToRegex(depName: string): RegExp {\n return regEx(\n depName\n .replace(/\\*/g, '_WC_CHAR_')\n .replace(/[/\\-\\\\^$*+?.()|[\\]{}]/g, '\\\\$&')\n .replace(/_WC_CHAR_/g, '.*?'),\n );\n}\n\ninterface VersionWithPosition {\n version: string;\n filePos: number;\n}\n\ninterface VersionWithDepType {\n version: string;\n depType: string;\n}\n\n/**\n * Parses `versions.lock`\n */\nexport function parseLockFile(input: string): Map<string, VersionWithDepType> {\n const lockLineRegex = regEx(\n `^(?<depName>[^:]+:[^:]+):(?<lockVersion>[^ ]+) \\\\(\\\\d+ constraints: [0-9a-f]+\\\\)$`,\n );\n\n const depVerMap = new Map<string, VersionWithDepType>();\n let isTestDepType = false;\n for (const line of input.split(newlineRegex)) {\n const lineMatch = lockLineRegex.exec(line);\n if (lineMatch?.groups) {\n const { depName, lockVersion } = lineMatch.groups;\n if (isDependencyString(`${depName}:${lockVersion}`)) {\n depVerMap.set(depName, {\n version: lockVersion,\n depType: isTestDepType ? 'test' : 'dependencies',\n });\n }\n } else if (line === '[Test dependencies]') {\n isTestDepType = true; // We know that all lines below this header are test dependencies\n }\n }\n logger.trace(\n `Found ${depVerMap.size} locked dependencies in ${VERSIONS_LOCK}.`,\n );\n return depVerMap;\n}\n\n/**\n * Parses `versions.props`, this is CR/LF safe\n * @param input the entire property file from file system\n * @return two maps, first being exact matches, second regex matches\n */\nexport function parsePropsFile(\n input: string,\n): [Map<string, VersionWithPosition>, Map<string, VersionWithPosition>] {\n const propsLineRegex = regEx(\n `^(?<depName>[^:]+:[^=]+?) *= *(?<propsVersion>.*)$`,\n );\n const depVerExactMap = new Map<string, VersionWithPosition>();\n const depVerRegexMap = new Map<string, VersionWithPosition>();\n\n let startOfLineIdx = 0;\n const isCrLf = input.indexOf('\\r\\n') > 0;\n const validGlob = /^[a-zA-Z][-_a-zA-Z0-9.:*]+$/;\n for (const line of input.split(newlineRegex)) {\n const lineMatch = propsLineRegex.exec(line);\n if (lineMatch?.groups) {\n const { depName, propsVersion } = lineMatch.groups;\n if (\n validGlob.test(depName) &&\n versionLikeSubstring(propsVersion) !== null\n ) {\n const startPosInLine = line.lastIndexOf(propsVersion);\n const propVersionPos = startOfLineIdx + startPosInLine;\n if (depName.includes('*')) {\n depVerRegexMap.set(depName, {\n version: propsVersion,\n filePos: propVersionPos,\n });\n } else {\n depVerExactMap.set(depName, {\n version: propsVersion,\n filePos: propVersionPos,\n });\n }\n }\n }\n startOfLineIdx += line.length + (isCrLf ? 2 : 1);\n }\n logger.trace(\n `Found ${depVerExactMap.size} dependencies and ${depVerRegexMap.size} wildcard dependencies in ${VERSIONS_PROPS}.`,\n );\n return [\n depVerExactMap,\n new Map(\n [...depVerRegexMap].sort(([ka], [kb]) => ka.localeCompare(kb)).reverse(),\n ),\n ];\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"consistent-versions-plugin.js","names":["fs.getSiblingFileName"],"sources":["../../../../../lib/modules/manager/gradle/extract/consistent-versions-plugin.ts"],"sourcesContent":["import { logger } from '../../../../logger/index.ts';\nimport * as fs from '../../../../util/fs/index.ts';\nimport { newlineRegex, regEx } from '../../../../util/regex.ts';\nimport { coerceString } from '../../../../util/string.ts';\nimport type { PackageDependency } from '../../types.ts';\nimport type { GradleManagerData } from '../types.ts';\nimport { isDependencyString, versionLikeSubstring } from '../utils.ts';\n\nexport const VERSIONS_PROPS = 'versions.props';\nexport const VERSIONS_LOCK = 'versions.lock';\nexport const LOCKFIlE_HEADER_TEXT = regEx(\n /^# Run \\.\\/gradlew (?:--write-locks|writeVersionsLock|writeVersionsLocks) to regenerate this file/,\n);\n\n/**\n * Determines if Palantir gradle-consistent-versions is in use, https://github.com/palantir/gradle-consistent-versions.\n * Both `versions.props` and `versions.lock` must exist and the special header line of lock file must match\n *\n * @param versionsPropsFilename is the full file name path of `versions.props`\n * @param fileContents map with file contents of all files\n */\nexport function usesGcv(\n versionsPropsFilename: string,\n fileContents: Record<string, string | null>,\n): boolean {\n const versionsLockFile: string = fs.getSiblingFileName(\n versionsPropsFilename,\n VERSIONS_LOCK,\n );\n\n return !!fileContents[versionsLockFile]?.match(LOCKFIlE_HEADER_TEXT);\n}\n\n/**\n * Confirms whether the provided file name is the props file\n */\nexport function isGcvPropsFile(fileName: string): boolean {\n return fileName === VERSIONS_PROPS || fileName.endsWith(`/${VERSIONS_PROPS}`);\n}\n\n/**\n * Confirms whether the provided file name is the lock file\n */\nexport function isGcvLockFile(fileName: string): boolean {\n return fileName === VERSIONS_LOCK || fileName.endsWith(`/${VERSIONS_LOCK}`);\n}\n\n/**\n * Parses Gradle-Consistent-Versions files to figure out what dependencies, versions\n * and groups they contain. The parsing goes like this:\n * - Parse `versions.props` into deps (or groups) and versions, remembering file offsets\n * - Parse `versions.lock` into deps and lock-versions\n * - For each exact dep in props file, lookup the lock-version from lock file\n * - For each group/regex dep in props file, lookup the set of exact deps and versions in lock file\n *\n * @param propsFileName name and path of the props file\n * @param fileContents text content of all files\n */\nexport function parseGcv(\n propsFileName: string,\n fileContents: Record<string, string | null>,\n): PackageDependency<GradleManagerData>[] {\n const propsFileContent = coerceString(fileContents[propsFileName]);\n const lockFileName = fs.getSiblingFileName(propsFileName, VERSIONS_LOCK);\n const lockFileContent = coerceString(fileContents[lockFileName]);\n const lockFileMap = parseLockFile(lockFileContent);\n const [propsFileExactMap, propsFileRegexMap] =\n parsePropsFile(propsFileContent);\n\n const extractedDeps: PackageDependency<GradleManagerData>[] = [];\n\n // For each exact dep in props file\n for (const [propDep, versionAndPosition] of propsFileExactMap) {\n if (lockFileMap.has(propDep)) {\n const newDep: Record<string, any> = {\n managerData: {\n packageFile: propsFileName,\n fileReplacePosition: versionAndPosition.filePos,\n },\n depName: propDep,\n currentValue: versionAndPosition.version,\n lockedVersion: lockFileMap.get(propDep)?.version,\n depType: lockFileMap.get(propDep)?.depType,\n } satisfies PackageDependency<GradleManagerData>;\n extractedDeps.push(newDep);\n // Remove from the lockfile map so the same exact lib will not be included in globbing\n lockFileMap.delete(propDep);\n }\n }\n\n // For each regular expression dep in props file (starting with the longest glob string)...\n for (const [propDepGlob, propVerAndPos] of propsFileRegexMap) {\n const globRegex = globToRegex(propDepGlob);\n for (const [exactDep, lockVersionAndDepType] of lockFileMap) {\n if (globRegex.test(exactDep)) {\n const newDep: Record<string, any> = {\n managerData: {\n packageFile: propsFileName,\n fileReplacePosition: propVerAndPos.filePos,\n },\n depName: exactDep,\n currentValue: propVerAndPos.version,\n lockedVersion: lockVersionAndDepType.version,\n depType: lockVersionAndDepType.depType,\n sharedVariableName: propDepGlob,\n } satisfies PackageDependency<GradleManagerData>;\n extractedDeps.push(newDep);\n // Remove from the lockfile map so the same lib will not be included in more generic globs later\n lockFileMap.delete(exactDep);\n }\n }\n }\n return extractedDeps;\n}\n\n// Translate glob syntax to a regex that does the same. Note that we cannot use replaceAll as it does not exist in Node14\n// Loosely borrowed mapping to regex from https://github.com/palantir/gradle-consistent-versions/blob/develop/src/main/java/com/palantir/gradle/versions/FuzzyPatternResolver.java\nfunction globToRegex(depName: string): RegExp {\n return regEx(\n depName\n .replace(regEx(/\\*/g), '_WC_CHAR_')\n .replace(regEx(/[/\\-\\\\^$*+?.()|[\\]{}]/g), '\\\\$&')\n .replace(regEx(/_WC_CHAR_/g), '.*?'),\n );\n}\n\ninterface VersionWithPosition {\n version: string;\n filePos: number;\n}\n\ninterface VersionWithDepType {\n version: string;\n depType: string;\n}\n\n/**\n * Parses `versions.lock`\n */\nexport function parseLockFile(input: string): Map<string, VersionWithDepType> {\n const lockLineRegex = regEx(\n `^(?<depName>[^:]+:[^:]+):(?<lockVersion>[^ ]+) \\\\(\\\\d+ constraints: [0-9a-f]+\\\\)$`,\n );\n\n const depVerMap = new Map<string, VersionWithDepType>();\n let isTestDepType = false;\n for (const line of input.split(newlineRegex)) {\n const lineMatch = lockLineRegex.exec(line);\n if (lineMatch?.groups) {\n const { depName, lockVersion } = lineMatch.groups;\n if (isDependencyString(`${depName}:${lockVersion}`)) {\n depVerMap.set(depName, {\n version: lockVersion,\n depType: isTestDepType ? 'test' : 'dependencies',\n });\n }\n } else if (line === '[Test dependencies]') {\n isTestDepType = true; // We know that all lines below this header are test dependencies\n }\n }\n logger.trace(\n `Found ${depVerMap.size} locked dependencies in ${VERSIONS_LOCK}.`,\n );\n return depVerMap;\n}\n\n/**\n * Parses `versions.props`, this is CR/LF safe\n * @param input the entire property file from file system\n * @return two maps, first being exact matches, second regex matches\n */\nexport function parsePropsFile(\n input: string,\n): [Map<string, VersionWithPosition>, Map<string, VersionWithPosition>] {\n const propsLineRegex = regEx(\n `^(?<depName>[^:]+:[^=]+?) *= *(?<propsVersion>.*)$`,\n );\n const depVerExactMap = new Map<string, VersionWithPosition>();\n const depVerRegexMap = new Map<string, VersionWithPosition>();\n\n let startOfLineIdx = 0;\n const isCrLf = input.indexOf('\\r\\n') > 0;\n const validGlob = regEx(/^[a-zA-Z][-_a-zA-Z0-9.:*]+$/);\n for (const line of input.split(newlineRegex)) {\n const lineMatch = propsLineRegex.exec(line);\n if (lineMatch?.groups) {\n const { depName, propsVersion } = lineMatch.groups;\n if (\n validGlob.test(depName) &&\n versionLikeSubstring(propsVersion) !== null\n ) {\n const startPosInLine = line.lastIndexOf(propsVersion);\n const propVersionPos = startOfLineIdx + startPosInLine;\n if (depName.includes('*')) {\n depVerRegexMap.set(depName, {\n version: propsVersion,\n filePos: propVersionPos,\n });\n } else {\n depVerExactMap.set(depName, {\n version: propsVersion,\n filePos: propVersionPos,\n });\n }\n }\n }\n startOfLineIdx += line.length + (isCrLf ? 2 : 1);\n }\n logger.trace(\n `Found ${depVerExactMap.size} dependencies and ${depVerRegexMap.size} wildcard dependencies in ${VERSIONS_PROPS}.`,\n );\n return [\n depVerExactMap,\n new Map(\n [...depVerRegexMap].sort(([ka], [kb]) => ka.localeCompare(kb)).reverse(),\n ),\n ];\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import "../../../constants/error-messages.js";
|
|
2
|
-
import { newlineRegex } from "../../../util/regex.js";
|
|
2
|
+
import { newlineRegex, regEx } from "../../../util/regex.js";
|
|
3
3
|
import { replaceAt } from "../../../util/string.js";
|
|
4
4
|
import { logger } from "../../../logger/index.js";
|
|
5
5
|
import { localPathExists, readLocalFile, writeLocalFile } from "../../../util/fs/index.js";
|
|
@@ -92,7 +92,7 @@ async function updateArtifacts({ packageFileName, newPackageFileContent, updated
|
|
|
92
92
|
cmd += ` --gradle-distribution-url ${quote(distributionUrl)}`;
|
|
93
93
|
if (newPackageFileContent.includes("distributionSha256Sum=")) {
|
|
94
94
|
checksum = await getDistributionChecksum(distributionUrl);
|
|
95
|
-
await writeLocalFile(packageFileName, newPackageFileContent.replace(/distributionSha256Sum
|
|
95
|
+
await writeLocalFile(packageFileName, newPackageFileContent.replace(regEx(/distributionSha256Sum=.*/), `distributionSha256Sum=${checksum}`));
|
|
96
96
|
cmd += ` --gradle-distribution-sha256-sum ${quote(checksum)}`;
|
|
97
97
|
}
|
|
98
98
|
} else cmd += ` --gradle-version ${quote(config.newValue)}`;
|