renovate 40.4.0 → 40.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/options/index.js +34 -2
- package/dist/config/options/index.js.map +1 -1
- package/dist/config/types.d.ts +8 -1
- package/dist/config/types.js.map +1 -1
- package/dist/workers/repository/update/branch/bump-versions.d.ts +2 -0
- package/dist/workers/repository/update/branch/bump-versions.js +191 -0
- package/dist/workers/repository/update/branch/bump-versions.js.map +1 -0
- package/dist/workers/repository/update/branch/index.js +3 -0
- package/dist/workers/repository/update/branch/index.js.map +1 -1
- package/package.json +1 -1
- package/renovate-schema.json +63 -1
package/dist/config/types.d.ts
CHANGED
@@ -25,6 +25,7 @@ export interface RenovateSharedConfig {
|
|
25
25
|
automerge?: boolean;
|
26
26
|
automergeSchedule?: string[];
|
27
27
|
automergeStrategy?: MergeStrategy;
|
28
|
+
bumpVersions?: BumpVersionConfig[];
|
28
29
|
branchName?: string;
|
29
30
|
branchNameStrict?: boolean;
|
30
31
|
branchPrefix?: string;
|
@@ -308,7 +309,7 @@ export interface ValidationMessage {
|
|
308
309
|
topic: string;
|
309
310
|
message: string;
|
310
311
|
}
|
311
|
-
export type AllowedParents = 'customDatasources' | 'customManagers' | 'hostRules' | 'logLevelRemap' | 'packageRules' | 'postUpgradeTasks' | 'vulnerabilityAlerts';
|
312
|
+
export type AllowedParents = 'bumpVersions' | 'customDatasources' | 'customManagers' | 'hostRules' | 'logLevelRemap' | 'packageRules' | 'postUpgradeTasks' | 'vulnerabilityAlerts';
|
312
313
|
export interface RenovateOptionBase {
|
313
314
|
/**
|
314
315
|
* If true, the option can only be configured by people with access to the Renovate instance.
|
@@ -440,4 +441,10 @@ export interface ValidationResult {
|
|
440
441
|
errors: ValidationMessage[];
|
441
442
|
warnings: ValidationMessage[];
|
442
443
|
}
|
444
|
+
export interface BumpVersionConfig {
|
445
|
+
bumpType: string;
|
446
|
+
filePatterns: string[];
|
447
|
+
matchStrings: string[];
|
448
|
+
name: string | null;
|
449
|
+
}
|
443
450
|
export {};
|
package/dist/config/types.js.map
CHANGED
@@ -1 +1 @@
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/config/types.ts"],"names":[],"mappings":";;;AAqNa,QAAA,yBAAyB,GAAG;IACvC,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;CACP,CAAC;AAmGX,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import type { PlatformId } from '../constants';\nimport type { LogLevelRemap } from '../logger/types';\nimport type { CustomManager } from '../modules/manager/custom/types';\nimport type { RepoSortMethod, SortMethod } from '../modules/platform/types';\nimport type { HostRule, SkipReason } from '../types';\nimport type { StageName } from '../types/skip-reason';\nimport type { GitNoVerifyOption } from '../util/git/types';\nimport type { MergeConfidence } from '../util/merge-confidence/types';\nimport type { Timestamp } from '../util/timestamp';\n\nexport type RenovateConfigStage =\n | 'global'\n | 'inherit'\n | 'repository'\n | 'package'\n | 'branch'\n | 'pr';\n\nexport type RepositoryCacheConfig = 'disabled' | 'enabled' | 'reset';\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport type RepositoryCacheType = 'local' | string;\nexport type DryRunConfig = 'extract' | 'lookup' | 'full';\nexport type RequiredConfig = 'required' | 'optional' | 'ignored';\n\nexport interface GroupConfig extends Record<string, unknown> {\n branchName?: string;\n branchTopic?: string;\n}\n\nexport type RecreateWhen = 'auto' | 'never' | 'always';\nexport type PlatformCommitOptions = 'auto' | 'disabled' | 'enabled';\n// TODO: Proper typings\nexport interface RenovateSharedConfig {\n $schema?: string;\n addLabels?: string[];\n autoReplaceGlobalMatch?: boolean;\n automerge?: boolean;\n automergeSchedule?: string[];\n automergeStrategy?: MergeStrategy;\n branchName?: string;\n branchNameStrict?: boolean;\n branchPrefix?: string;\n branchPrefixOld?: string;\n commitMessage?: string;\n commitMessageAction?: string;\n commitMessageExtra?: string;\n commitMessageLowerCase?: 'auto' | 'never';\n commitMessagePrefix?: string;\n commitMessageTopic?: string;\n confidential?: boolean;\n changelogUrl?: string;\n dependencyDashboardApproval?: boolean;\n draftPR?: boolean;\n enabled?: boolean;\n enabledManagers?: string[];\n extends?: string[];\n managerFilePatterns?: string[];\n force?: RenovateConfig;\n gitIgnoredAuthors?: string[];\n group?: GroupConfig;\n groupName?: string;\n groupSlug?: string;\n hashedBranchLength?: number;\n ignoreDeps?: string[];\n ignorePaths?: string[];\n ignoreTests?: boolean;\n includePaths?: string[];\n internalChecksAsSuccess?: boolean;\n keepUpdatedLabel?: string;\n labels?: string[];\n manager?: string;\n milestone?: number;\n npmrc?: string;\n npmrcMerge?: boolean;\n platformCommit?: PlatformCommitOptions;\n postUpgradeTasks?: PostUpgradeTasks;\n prBodyColumns?: string[];\n prBodyDefinitions?: Record<string, string>;\n prCreation?: 'immediate' | 'not-pending' | 'status-success' | 'approval';\n prPriority?: number;\n productLinks?: Record<string, string>;\n pruneBranchAfterAutomerge?: boolean;\n rebaseLabel?: string;\n rebaseWhen?: string;\n recreateClosed?: boolean;\n recreateWhen?: RecreateWhen;\n repository?: string;\n repositoryCache?: RepositoryCacheConfig;\n repositoryCacheType?: RepositoryCacheType;\n respectLatest?: boolean;\n schedule?: string[];\n semanticCommitScope?: string | null;\n semanticCommitType?: string;\n semanticCommits?: 'auto' | 'enabled' | 'disabled';\n stopUpdatingLabel?: string;\n suppressNotifications?: string[];\n timezone?: string;\n unicodeEmoji?: boolean;\n}\n\n// Config options used only within the global worker\n// The below should contain config options where stage=global\nexport interface GlobalOnlyConfig {\n autodiscover?: boolean;\n autodiscoverFilter?: string[] | string;\n autodiscoverNamespaces?: string[];\n autodiscoverProjects?: string[];\n autodiscoverTopics?: string[];\n baseDir?: string;\n cacheDir?: string;\n containerbaseDir?: string;\n detectHostRulesFromEnv?: boolean;\n dockerCliOptions?: string;\n endpoint?: string;\n forceCli?: boolean;\n gitNoVerify?: GitNoVerifyOption[];\n gitPrivateKey?: string;\n globalExtends?: string[];\n mergeConfidenceDatasources?: string[];\n mergeConfidenceEndpoint?: string;\n platform?: PlatformId;\n prCommitsPerRunLimit?: number;\n privateKey?: string;\n privateKeyOld?: string;\n privateKeyPath?: string;\n privateKeyPathOld?: string;\n redisPrefix?: string;\n redisUrl?: string;\n repositories?: RenovateRepository[];\n useCloudMetadataServices?: boolean;\n deleteConfigFile?: boolean;\n}\n\n// Config options used within the repository worker, but not user configurable\n// The below should contain config options where globalOnly=true\nexport interface RepoGlobalConfig {\n allowedCommands?: string[];\n allowCustomCrateRegistries?: boolean;\n allowPlugins?: boolean;\n allowScripts?: boolean;\n allowedEnv?: string[];\n allowedHeaders?: string[];\n binarySource?: 'docker' | 'global' | 'install' | 'hermit';\n cacheDir?: string;\n cacheHardTtlMinutes?: number;\n cacheTtlOverride?: Record<string, number>;\n containerbaseDir?: string;\n customEnvVariables?: Record<string, string>;\n dockerChildPrefix?: string;\n dockerCliOptions?: string;\n dockerSidecarImage?: string;\n dockerUser?: string;\n dryRun?: DryRunConfig;\n encryptedWarning?: string;\n endpoint?: string;\n executionTimeout?: number;\n exposeAllEnv?: boolean;\n gitTimeout?: number;\n githubTokenWarn?: boolean;\n includeMirrors?: boolean;\n localDir?: string;\n migratePresets?: Record<string, string>;\n platform?: PlatformId;\n presetCachePersistence?: boolean;\n httpCacheTtlDays?: number;\n autodiscoverRepoSort?: RepoSortMethod;\n autodiscoverRepoOrder?: SortMethod;\n userAgent?: string;\n dockerMaxPages?: number;\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n cachePrivatePackages?: boolean;\n}\n\nexport interface LegacyAdminConfig {\n localDir?: string;\n\n logContext?: string;\n\n onboarding?: boolean;\n onboardingBranch?: string;\n onboardingCommitMessage?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingPrTitle?: string;\n onboardingConfig?: RenovateSharedConfig;\n onboardingConfigFileName?: string;\n\n requireConfig?: RequiredConfig;\n}\n\nexport type ExecutionMode = 'branch' | 'update';\n\nexport interface PostUpgradeTasks {\n commands?: string[];\n fileFilters?: string[];\n executionMode: ExecutionMode;\n}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepository =\n | string\n | {\n repository: string;\n secrets?: Record<string, string>;\n };\n\nexport type UseBaseBranchConfigType = 'merge' | 'none';\nexport type ConstraintsFilter = 'strict' | 'none';\n\nexport const allowedStatusCheckStrings = [\n 'minimumReleaseAge',\n 'mergeConfidence',\n 'configValidation',\n 'artifactError',\n] as const;\nexport type StatusCheckKey = (typeof allowedStatusCheckStrings)[number];\ntype UserEnv = Record<string, string>;\n// TODO: Proper typings\nexport interface RenovateConfig\n extends LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n Record<string, unknown> {\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n reportPath?: string;\n reportType?: 'logging' | 'file' | 's3' | null;\n depName?: string;\n baseBranches?: string[];\n commitBody?: string;\n useBaseBranchConfig?: UseBaseBranchConfigType;\n baseBranch?: string;\n defaultBranch?: string;\n branchList?: string[];\n cloneSubmodulesFilter?: string[];\n description?: string | string[];\n force?: RenovateConfig;\n errors?: ValidationMessage[];\n\n gitAuthor?: string;\n\n hostRules?: HostRule[];\n\n inheritConfig?: boolean;\n inheritConfigFileName?: string;\n inheritConfigRepoName?: string;\n inheritConfigStrict?: boolean;\n\n ignorePresets?: string[];\n forkProcessing?: 'auto' | 'enabled' | 'disabled';\n isFork?: boolean;\n\n fileList?: string[];\n configWarningReuseIssue?: boolean;\n dependencyDashboard?: boolean;\n dependencyDashboardAutoclose?: boolean;\n dependencyDashboardChecks?: Record<string, string>;\n dependencyDashboardIssue?: number;\n dependencyDashboardTitle?: string;\n dependencyDashboardHeader?: string;\n dependencyDashboardFooter?: string;\n dependencyDashboardLabels?: string[];\n dependencyDashboardOSVVulnerabilitySummary?: 'none' | 'all' | 'unresolved';\n packageFile?: string;\n packageRules?: PackageRule[];\n postUpdateOptions?: string[];\n branchConcurrentLimit?: number | null;\n prConcurrentLimit?: number;\n prHourlyLimit?: number;\n forkModeDisallowMaintainerEdits?: boolean;\n\n defaultRegistryUrls?: string[];\n registryUrls?: string[] | null;\n registryAliases?: Record<string, string>;\n\n repoIsOnboarded?: boolean;\n repoIsActivated?: boolean;\n\n updateInternalDeps?: boolean;\n updateType?: UpdateType;\n\n warnings?: ValidationMessage[];\n vulnerabilityAlerts?: RenovateSharedConfig;\n osvVulnerabilityAlerts?: boolean;\n vulnerabilitySeverity?: string;\n customManagers?: CustomManager[];\n customDatasources?: Record<string, CustomDatasourceConfig>;\n\n fetchChangeLogs?: FetchChangeLogsOptions;\n secrets?: Record<string, string>;\n\n constraints?: Record<string, string>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\n /**\n * User configured environment variables that Renovate uses when executing package manager commands\n */\n env?: UserEnv;\n logLevelRemap?: LogLevelRemap[];\n\n branchTopic?: string;\n additionalBranchPrefix?: string;\n sharedVariableName?: string;\n}\n\nconst CustomDatasourceFormats = ['json', 'plain', 'yaml', 'html'] as const;\nexport type CustomDatasourceFormats = (typeof CustomDatasourceFormats)[number];\n\nexport interface CustomDatasourceConfig {\n defaultRegistryUrlTemplate?: string;\n format?: CustomDatasourceFormats;\n transformTemplates?: string[];\n}\n\nexport interface AllConfig\n extends RenovateConfig,\n GlobalOnlyConfig,\n RepoGlobalConfig {}\n\nexport interface AssigneesAndReviewersConfig {\n assigneesFromCodeOwners?: boolean;\n expandCodeOwnersGroups?: boolean;\n assignees?: string[];\n assigneesSampleSize?: number;\n ignoreReviewers?: string[];\n reviewersFromCodeOwners?: boolean;\n reviewers?: string[];\n reviewersSampleSize?: number;\n additionalReviewers?: string[];\n filterUnavailableUsers?: boolean;\n}\n\nexport type UpdateType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pin'\n | 'digest'\n | 'pinDigest'\n | 'lockFileMaintenance'\n | 'lockfileUpdate'\n | 'rollback'\n | 'bump'\n | 'replacement';\n\nexport type FetchChangeLogsOptions = 'off' | 'branch' | 'pr';\n\nexport type MatchStringsStrategy = 'any' | 'recursive' | 'combination';\n\nexport type MergeStrategy =\n | 'auto'\n | 'fast-forward'\n | 'merge-commit'\n | 'rebase'\n | 'squash';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig,\n UpdateConfig,\n Record<string, unknown> {\n description?: string | string[];\n isVulnerabilityAlert?: boolean;\n matchBaseBranches?: string[];\n matchCategories?: string[];\n matchConfidence?: MergeConfidence[];\n matchCurrentAge?: string;\n matchCurrentValue?: string;\n matchCurrentVersion?: string;\n matchDatasources?: string[];\n matchDepNames?: string[];\n matchDepTypes?: string[];\n matchFileNames?: string[];\n matchManagers?: string[];\n matchNewValue?: string;\n matchPackageNames?: string[];\n matchRepositories?: string[];\n matchSourceUrls?: string[];\n matchUpdateTypes?: UpdateType[];\n matchJsonata?: string[];\n registryUrls?: string[] | null;\n vulnerabilitySeverity?: string;\n vulnerabilityFixVersion?: string;\n}\n\nexport interface ValidationMessage {\n topic: string;\n message: string;\n}\n\nexport type AllowedParents =\n | 'customDatasources'\n | 'customManagers'\n | 'hostRules'\n | 'logLevelRemap'\n | 'packageRules'\n | 'postUpgradeTasks'\n | 'vulnerabilityAlerts';\nexport interface RenovateOptionBase {\n /**\n * If true, the option can only be configured by people with access to the Renovate instance.\n * Furthermore, the option should be documented in docs/usage/self-hosted-configuration.md.\n */\n globalOnly?: boolean;\n\n inheritConfigSupport?: boolean;\n\n allowedValues?: string[];\n\n allowString?: boolean;\n\n cli?: boolean;\n\n description: string;\n\n env?: false | string;\n\n /**\n * Do not validate object children\n */\n freeChoice?: boolean;\n\n mergeable?: boolean;\n\n autogenerated?: boolean;\n\n name: string;\n\n parents?: AllowedParents[];\n\n stage?: RenovateConfigStage;\n\n experimental?: boolean;\n\n experimentalDescription?: string;\n\n experimentalIssues?: number[];\n\n advancedUse?: boolean;\n\n /**\n * This is used to add depreciation message in the docs\n */\n deprecationMsg?: string;\n\n /**\n * For internal use only: add it to any config option that supports regex or glob matching\n */\n patternMatch?: boolean;\n\n /**\n * For internal use only: add it to any config option of type integer that supports negative integers\n */\n allowNegative?: boolean;\n\n /**\n * Managers which support this option, leave undefined if all managers support it.\n */\n supportedManagers?: string[];\n\n /**\n * Platforms which support this option, leave undefined if all platforms support it.\n */\n supportedPlatforms?: PlatformId[];\n}\n\nexport interface RenovateArrayOption<\n T extends string | number | Record<string, unknown> = Record<string, unknown>,\n> extends RenovateOptionBase {\n default?: T[] | null;\n mergeable?: boolean;\n type: 'array';\n subType?: 'string' | 'object' | 'number';\n}\n\nexport interface RenovateStringArrayOption extends RenovateArrayOption<string> {\n format?: 'regex';\n subType: 'string';\n}\n\nexport interface RenovateNumberArrayOption extends RenovateArrayOption<number> {\n subType: 'number';\n}\n\nexport interface RenovateBooleanOption extends RenovateOptionBase {\n default?: boolean | null;\n type: 'boolean';\n}\n\nexport interface RenovateIntegerOption extends RenovateOptionBase {\n default?: number | null;\n type: 'integer';\n}\n\nexport interface RenovateStringOption extends RenovateOptionBase {\n default?: string | null;\n format?: 'regex';\n\n // Not used\n replaceLineReturns?: boolean;\n type: 'string';\n}\n\nexport interface RenovateObjectOption extends RenovateOptionBase {\n default?: any;\n additionalProperties?: Record<string, unknown> | boolean;\n mergeable?: boolean;\n type: 'object';\n}\n\nexport type RenovateOptions =\n | RenovateStringOption\n | RenovateNumberArrayOption\n | RenovateStringArrayOption\n | RenovateIntegerOption\n | RenovateBooleanOption\n | RenovateArrayOption\n | RenovateObjectOption;\n\nexport interface PackageRuleInputConfig extends Record<string, unknown> {\n versioning?: string;\n packageFile?: string;\n lockFiles?: string[];\n depType?: string;\n depTypes?: string[];\n depName?: string;\n packageName?: string | null;\n newValue?: string | null;\n currentValue?: string | null;\n currentVersion?: string;\n lockedVersion?: string;\n updateType?: UpdateType;\n mergeConfidenceLevel?: MergeConfidence | undefined;\n isBump?: boolean;\n sourceUrl?: string | null;\n categories?: string[];\n baseBranch?: string;\n manager?: string;\n datasource?: string;\n packageRules?: (PackageRule & PackageRuleInputConfig)[];\n releaseTimestamp?: Timestamp | null;\n repository?: string;\n currentVersionAgeInDays?: number;\n currentVersionTimestamp?: string;\n enabled?: boolean;\n skipReason?: SkipReason;\n skipStage?: StageName;\n}\n\nexport interface ConfigMigration {\n configMigration?: boolean;\n}\n\nexport interface MigratedConfig {\n isMigrated: boolean;\n migratedConfig: RenovateConfig;\n}\n\nexport interface MigratedRenovateConfig extends RenovateConfig {\n endpoints?: HostRule[];\n pathRules: PackageRule[];\n packages: PackageRule[];\n\n node?: RenovateConfig;\n travis?: RenovateConfig;\n gradle?: RenovateConfig;\n}\n\nexport interface ManagerConfig extends RenovateConfig {\n manager: string;\n}\n\nexport interface ValidationResult {\n errors: ValidationMessage[];\n warnings: ValidationMessage[];\n}\n"]}
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../lib/config/types.ts"],"names":[],"mappings":";;;AAsNa,QAAA,yBAAyB,GAAG;IACvC,mBAAmB;IACnB,iBAAiB;IACjB,kBAAkB;IAClB,eAAe;CACP,CAAC;AAmGX,MAAM,uBAAuB,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,CAAU,CAAC","sourcesContent":["import type { PlatformId } from '../constants';\nimport type { LogLevelRemap } from '../logger/types';\nimport type { CustomManager } from '../modules/manager/custom/types';\nimport type { RepoSortMethod, SortMethod } from '../modules/platform/types';\nimport type { HostRule, SkipReason } from '../types';\nimport type { StageName } from '../types/skip-reason';\nimport type { GitNoVerifyOption } from '../util/git/types';\nimport type { MergeConfidence } from '../util/merge-confidence/types';\nimport type { Timestamp } from '../util/timestamp';\n\nexport type RenovateConfigStage =\n | 'global'\n | 'inherit'\n | 'repository'\n | 'package'\n | 'branch'\n | 'pr';\n\nexport type RepositoryCacheConfig = 'disabled' | 'enabled' | 'reset';\n// eslint-disable-next-line @typescript-eslint/no-redundant-type-constituents\nexport type RepositoryCacheType = 'local' | string;\nexport type DryRunConfig = 'extract' | 'lookup' | 'full';\nexport type RequiredConfig = 'required' | 'optional' | 'ignored';\n\nexport interface GroupConfig extends Record<string, unknown> {\n branchName?: string;\n branchTopic?: string;\n}\n\nexport type RecreateWhen = 'auto' | 'never' | 'always';\nexport type PlatformCommitOptions = 'auto' | 'disabled' | 'enabled';\n// TODO: Proper typings\nexport interface RenovateSharedConfig {\n $schema?: string;\n addLabels?: string[];\n autoReplaceGlobalMatch?: boolean;\n automerge?: boolean;\n automergeSchedule?: string[];\n automergeStrategy?: MergeStrategy;\n bumpVersions?: BumpVersionConfig[];\n branchName?: string;\n branchNameStrict?: boolean;\n branchPrefix?: string;\n branchPrefixOld?: string;\n commitMessage?: string;\n commitMessageAction?: string;\n commitMessageExtra?: string;\n commitMessageLowerCase?: 'auto' | 'never';\n commitMessagePrefix?: string;\n commitMessageTopic?: string;\n confidential?: boolean;\n changelogUrl?: string;\n dependencyDashboardApproval?: boolean;\n draftPR?: boolean;\n enabled?: boolean;\n enabledManagers?: string[];\n extends?: string[];\n managerFilePatterns?: string[];\n force?: RenovateConfig;\n gitIgnoredAuthors?: string[];\n group?: GroupConfig;\n groupName?: string;\n groupSlug?: string;\n hashedBranchLength?: number;\n ignoreDeps?: string[];\n ignorePaths?: string[];\n ignoreTests?: boolean;\n includePaths?: string[];\n internalChecksAsSuccess?: boolean;\n keepUpdatedLabel?: string;\n labels?: string[];\n manager?: string;\n milestone?: number;\n npmrc?: string;\n npmrcMerge?: boolean;\n platformCommit?: PlatformCommitOptions;\n postUpgradeTasks?: PostUpgradeTasks;\n prBodyColumns?: string[];\n prBodyDefinitions?: Record<string, string>;\n prCreation?: 'immediate' | 'not-pending' | 'status-success' | 'approval';\n prPriority?: number;\n productLinks?: Record<string, string>;\n pruneBranchAfterAutomerge?: boolean;\n rebaseLabel?: string;\n rebaseWhen?: string;\n recreateClosed?: boolean;\n recreateWhen?: RecreateWhen;\n repository?: string;\n repositoryCache?: RepositoryCacheConfig;\n repositoryCacheType?: RepositoryCacheType;\n respectLatest?: boolean;\n schedule?: string[];\n semanticCommitScope?: string | null;\n semanticCommitType?: string;\n semanticCommits?: 'auto' | 'enabled' | 'disabled';\n stopUpdatingLabel?: string;\n suppressNotifications?: string[];\n timezone?: string;\n unicodeEmoji?: boolean;\n}\n\n// Config options used only within the global worker\n// The below should contain config options where stage=global\nexport interface GlobalOnlyConfig {\n autodiscover?: boolean;\n autodiscoverFilter?: string[] | string;\n autodiscoverNamespaces?: string[];\n autodiscoverProjects?: string[];\n autodiscoverTopics?: string[];\n baseDir?: string;\n cacheDir?: string;\n containerbaseDir?: string;\n detectHostRulesFromEnv?: boolean;\n dockerCliOptions?: string;\n endpoint?: string;\n forceCli?: boolean;\n gitNoVerify?: GitNoVerifyOption[];\n gitPrivateKey?: string;\n globalExtends?: string[];\n mergeConfidenceDatasources?: string[];\n mergeConfidenceEndpoint?: string;\n platform?: PlatformId;\n prCommitsPerRunLimit?: number;\n privateKey?: string;\n privateKeyOld?: string;\n privateKeyPath?: string;\n privateKeyPathOld?: string;\n redisPrefix?: string;\n redisUrl?: string;\n repositories?: RenovateRepository[];\n useCloudMetadataServices?: boolean;\n deleteConfigFile?: boolean;\n}\n\n// Config options used within the repository worker, but not user configurable\n// The below should contain config options where globalOnly=true\nexport interface RepoGlobalConfig {\n allowedCommands?: string[];\n allowCustomCrateRegistries?: boolean;\n allowPlugins?: boolean;\n allowScripts?: boolean;\n allowedEnv?: string[];\n allowedHeaders?: string[];\n binarySource?: 'docker' | 'global' | 'install' | 'hermit';\n cacheDir?: string;\n cacheHardTtlMinutes?: number;\n cacheTtlOverride?: Record<string, number>;\n containerbaseDir?: string;\n customEnvVariables?: Record<string, string>;\n dockerChildPrefix?: string;\n dockerCliOptions?: string;\n dockerSidecarImage?: string;\n dockerUser?: string;\n dryRun?: DryRunConfig;\n encryptedWarning?: string;\n endpoint?: string;\n executionTimeout?: number;\n exposeAllEnv?: boolean;\n gitTimeout?: number;\n githubTokenWarn?: boolean;\n includeMirrors?: boolean;\n localDir?: string;\n migratePresets?: Record<string, string>;\n platform?: PlatformId;\n presetCachePersistence?: boolean;\n httpCacheTtlDays?: number;\n autodiscoverRepoSort?: RepoSortMethod;\n autodiscoverRepoOrder?: SortMethod;\n userAgent?: string;\n dockerMaxPages?: number;\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n cachePrivatePackages?: boolean;\n}\n\nexport interface LegacyAdminConfig {\n localDir?: string;\n\n logContext?: string;\n\n onboarding?: boolean;\n onboardingBranch?: string;\n onboardingCommitMessage?: string;\n onboardingNoDeps?: 'auto' | 'enabled' | 'disabled';\n onboardingRebaseCheckbox?: boolean;\n onboardingPrTitle?: string;\n onboardingConfig?: RenovateSharedConfig;\n onboardingConfigFileName?: string;\n\n requireConfig?: RequiredConfig;\n}\n\nexport type ExecutionMode = 'branch' | 'update';\n\nexport interface PostUpgradeTasks {\n commands?: string[];\n fileFilters?: string[];\n executionMode: ExecutionMode;\n}\n\nexport type UpdateConfig<\n T extends RenovateSharedConfig = RenovateSharedConfig,\n> = Partial<Record<UpdateType, T | null>>;\n\nexport type RenovateRepository =\n | string\n | {\n repository: string;\n secrets?: Record<string, string>;\n };\n\nexport type UseBaseBranchConfigType = 'merge' | 'none';\nexport type ConstraintsFilter = 'strict' | 'none';\n\nexport const allowedStatusCheckStrings = [\n 'minimumReleaseAge',\n 'mergeConfidence',\n 'configValidation',\n 'artifactError',\n] as const;\nexport type StatusCheckKey = (typeof allowedStatusCheckStrings)[number];\ntype UserEnv = Record<string, string>;\n// TODO: Proper typings\nexport interface RenovateConfig\n extends LegacyAdminConfig,\n RenovateSharedConfig,\n UpdateConfig<PackageRule>,\n AssigneesAndReviewersConfig,\n ConfigMigration,\n Record<string, unknown> {\n s3Endpoint?: string;\n s3PathStyle?: boolean;\n reportPath?: string;\n reportType?: 'logging' | 'file' | 's3' | null;\n depName?: string;\n baseBranches?: string[];\n commitBody?: string;\n useBaseBranchConfig?: UseBaseBranchConfigType;\n baseBranch?: string;\n defaultBranch?: string;\n branchList?: string[];\n cloneSubmodulesFilter?: string[];\n description?: string | string[];\n force?: RenovateConfig;\n errors?: ValidationMessage[];\n\n gitAuthor?: string;\n\n hostRules?: HostRule[];\n\n inheritConfig?: boolean;\n inheritConfigFileName?: string;\n inheritConfigRepoName?: string;\n inheritConfigStrict?: boolean;\n\n ignorePresets?: string[];\n forkProcessing?: 'auto' | 'enabled' | 'disabled';\n isFork?: boolean;\n\n fileList?: string[];\n configWarningReuseIssue?: boolean;\n dependencyDashboard?: boolean;\n dependencyDashboardAutoclose?: boolean;\n dependencyDashboardChecks?: Record<string, string>;\n dependencyDashboardIssue?: number;\n dependencyDashboardTitle?: string;\n dependencyDashboardHeader?: string;\n dependencyDashboardFooter?: string;\n dependencyDashboardLabels?: string[];\n dependencyDashboardOSVVulnerabilitySummary?: 'none' | 'all' | 'unresolved';\n packageFile?: string;\n packageRules?: PackageRule[];\n postUpdateOptions?: string[];\n branchConcurrentLimit?: number | null;\n prConcurrentLimit?: number;\n prHourlyLimit?: number;\n forkModeDisallowMaintainerEdits?: boolean;\n\n defaultRegistryUrls?: string[];\n registryUrls?: string[] | null;\n registryAliases?: Record<string, string>;\n\n repoIsOnboarded?: boolean;\n repoIsActivated?: boolean;\n\n updateInternalDeps?: boolean;\n updateType?: UpdateType;\n\n warnings?: ValidationMessage[];\n vulnerabilityAlerts?: RenovateSharedConfig;\n osvVulnerabilityAlerts?: boolean;\n vulnerabilitySeverity?: string;\n customManagers?: CustomManager[];\n customDatasources?: Record<string, CustomDatasourceConfig>;\n\n fetchChangeLogs?: FetchChangeLogsOptions;\n secrets?: Record<string, string>;\n\n constraints?: Record<string, string>;\n skipInstalls?: boolean | null;\n\n constraintsFiltering?: ConstraintsFilter;\n\n checkedBranches?: string[];\n customizeDashboard?: Record<string, string>;\n\n statusCheckNames?: Record<StatusCheckKey, string | null>;\n /**\n * User configured environment variables that Renovate uses when executing package manager commands\n */\n env?: UserEnv;\n logLevelRemap?: LogLevelRemap[];\n\n branchTopic?: string;\n additionalBranchPrefix?: string;\n sharedVariableName?: string;\n}\n\nconst CustomDatasourceFormats = ['json', 'plain', 'yaml', 'html'] as const;\nexport type CustomDatasourceFormats = (typeof CustomDatasourceFormats)[number];\n\nexport interface CustomDatasourceConfig {\n defaultRegistryUrlTemplate?: string;\n format?: CustomDatasourceFormats;\n transformTemplates?: string[];\n}\n\nexport interface AllConfig\n extends RenovateConfig,\n GlobalOnlyConfig,\n RepoGlobalConfig {}\n\nexport interface AssigneesAndReviewersConfig {\n assigneesFromCodeOwners?: boolean;\n expandCodeOwnersGroups?: boolean;\n assignees?: string[];\n assigneesSampleSize?: number;\n ignoreReviewers?: string[];\n reviewersFromCodeOwners?: boolean;\n reviewers?: string[];\n reviewersSampleSize?: number;\n additionalReviewers?: string[];\n filterUnavailableUsers?: boolean;\n}\n\nexport type UpdateType =\n | 'major'\n | 'minor'\n | 'patch'\n | 'pin'\n | 'digest'\n | 'pinDigest'\n | 'lockFileMaintenance'\n | 'lockfileUpdate'\n | 'rollback'\n | 'bump'\n | 'replacement';\n\nexport type FetchChangeLogsOptions = 'off' | 'branch' | 'pr';\n\nexport type MatchStringsStrategy = 'any' | 'recursive' | 'combination';\n\nexport type MergeStrategy =\n | 'auto'\n | 'fast-forward'\n | 'merge-commit'\n | 'rebase'\n | 'squash';\n\n// TODO: Proper typings\nexport interface PackageRule\n extends RenovateSharedConfig,\n UpdateConfig,\n Record<string, unknown> {\n description?: string | string[];\n isVulnerabilityAlert?: boolean;\n matchBaseBranches?: string[];\n matchCategories?: string[];\n matchConfidence?: MergeConfidence[];\n matchCurrentAge?: string;\n matchCurrentValue?: string;\n matchCurrentVersion?: string;\n matchDatasources?: string[];\n matchDepNames?: string[];\n matchDepTypes?: string[];\n matchFileNames?: string[];\n matchManagers?: string[];\n matchNewValue?: string;\n matchPackageNames?: string[];\n matchRepositories?: string[];\n matchSourceUrls?: string[];\n matchUpdateTypes?: UpdateType[];\n matchJsonata?: string[];\n registryUrls?: string[] | null;\n vulnerabilitySeverity?: string;\n vulnerabilityFixVersion?: string;\n}\n\nexport interface ValidationMessage {\n topic: string;\n message: string;\n}\n\nexport type AllowedParents =\n | 'bumpVersions'\n | 'customDatasources'\n | 'customManagers'\n | 'hostRules'\n | 'logLevelRemap'\n | 'packageRules'\n | 'postUpgradeTasks'\n | 'vulnerabilityAlerts';\nexport interface RenovateOptionBase {\n /**\n * If true, the option can only be configured by people with access to the Renovate instance.\n * Furthermore, the option should be documented in docs/usage/self-hosted-configuration.md.\n */\n globalOnly?: boolean;\n\n inheritConfigSupport?: boolean;\n\n allowedValues?: string[];\n\n allowString?: boolean;\n\n cli?: boolean;\n\n description: string;\n\n env?: false | string;\n\n /**\n * Do not validate object children\n */\n freeChoice?: boolean;\n\n mergeable?: boolean;\n\n autogenerated?: boolean;\n\n name: string;\n\n parents?: AllowedParents[];\n\n stage?: RenovateConfigStage;\n\n experimental?: boolean;\n\n experimentalDescription?: string;\n\n experimentalIssues?: number[];\n\n advancedUse?: boolean;\n\n /**\n * This is used to add depreciation message in the docs\n */\n deprecationMsg?: string;\n\n /**\n * For internal use only: add it to any config option that supports regex or glob matching\n */\n patternMatch?: boolean;\n\n /**\n * For internal use only: add it to any config option of type integer that supports negative integers\n */\n allowNegative?: boolean;\n\n /**\n * Managers which support this option, leave undefined if all managers support it.\n */\n supportedManagers?: string[];\n\n /**\n * Platforms which support this option, leave undefined if all platforms support it.\n */\n supportedPlatforms?: PlatformId[];\n}\n\nexport interface RenovateArrayOption<\n T extends string | number | Record<string, unknown> = Record<string, unknown>,\n> extends RenovateOptionBase {\n default?: T[] | null;\n mergeable?: boolean;\n type: 'array';\n subType?: 'string' | 'object' | 'number';\n}\n\nexport interface RenovateStringArrayOption extends RenovateArrayOption<string> {\n format?: 'regex';\n subType: 'string';\n}\n\nexport interface RenovateNumberArrayOption extends RenovateArrayOption<number> {\n subType: 'number';\n}\n\nexport interface RenovateBooleanOption extends RenovateOptionBase {\n default?: boolean | null;\n type: 'boolean';\n}\n\nexport interface RenovateIntegerOption extends RenovateOptionBase {\n default?: number | null;\n type: 'integer';\n}\n\nexport interface RenovateStringOption extends RenovateOptionBase {\n default?: string | null;\n format?: 'regex';\n\n // Not used\n replaceLineReturns?: boolean;\n type: 'string';\n}\n\nexport interface RenovateObjectOption extends RenovateOptionBase {\n default?: any;\n additionalProperties?: Record<string, unknown> | boolean;\n mergeable?: boolean;\n type: 'object';\n}\n\nexport type RenovateOptions =\n | RenovateStringOption\n | RenovateNumberArrayOption\n | RenovateStringArrayOption\n | RenovateIntegerOption\n | RenovateBooleanOption\n | RenovateArrayOption\n | RenovateObjectOption;\n\nexport interface PackageRuleInputConfig extends Record<string, unknown> {\n versioning?: string;\n packageFile?: string;\n lockFiles?: string[];\n depType?: string;\n depTypes?: string[];\n depName?: string;\n packageName?: string | null;\n newValue?: string | null;\n currentValue?: string | null;\n currentVersion?: string;\n lockedVersion?: string;\n updateType?: UpdateType;\n mergeConfidenceLevel?: MergeConfidence | undefined;\n isBump?: boolean;\n sourceUrl?: string | null;\n categories?: string[];\n baseBranch?: string;\n manager?: string;\n datasource?: string;\n packageRules?: (PackageRule & PackageRuleInputConfig)[];\n releaseTimestamp?: Timestamp | null;\n repository?: string;\n currentVersionAgeInDays?: number;\n currentVersionTimestamp?: string;\n enabled?: boolean;\n skipReason?: SkipReason;\n skipStage?: StageName;\n}\n\nexport interface ConfigMigration {\n configMigration?: boolean;\n}\n\nexport interface MigratedConfig {\n isMigrated: boolean;\n migratedConfig: RenovateConfig;\n}\n\nexport interface MigratedRenovateConfig extends RenovateConfig {\n endpoints?: HostRule[];\n pathRules: PackageRule[];\n packages: PackageRule[];\n\n node?: RenovateConfig;\n travis?: RenovateConfig;\n gradle?: RenovateConfig;\n}\n\nexport interface ManagerConfig extends RenovateConfig {\n manager: string;\n}\n\nexport interface ValidationResult {\n errors: ValidationMessage[];\n warnings: ValidationMessage[];\n}\n\nexport interface BumpVersionConfig {\n bumpType: string;\n filePatterns: string[];\n matchStrings: string[];\n name: string | null;\n}\n"]}
|
@@ -0,0 +1,191 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.bumpVersions = bumpVersions;
|
4
|
+
const semver_1 = require("semver");
|
5
|
+
const logger_1 = require("../../../../logger");
|
6
|
+
const scm_1 = require("../../../../modules/platform/scm");
|
7
|
+
const array_1 = require("../../../../util/array");
|
8
|
+
const fs_1 = require("../../../../util/fs");
|
9
|
+
const regex_1 = require("../../../../util/regex");
|
10
|
+
const string_match_1 = require("../../../../util/string-match");
|
11
|
+
const template_1 = require("../../../../util/template");
|
12
|
+
const file_match_1 = require("../../extract/file-match");
|
13
|
+
async function bumpVersions(config) {
|
14
|
+
const bumpVersions = config.bumpVersions;
|
15
|
+
if (!bumpVersions?.length) {
|
16
|
+
return;
|
17
|
+
}
|
18
|
+
// skip if no packageFiles or artifacts have been updated
|
19
|
+
if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) {
|
20
|
+
return;
|
21
|
+
}
|
22
|
+
const allFiles = await scm_1.scm.getFileList();
|
23
|
+
const fileList = (0, file_match_1.getFilteredFileList)(config, allFiles);
|
24
|
+
const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);
|
25
|
+
const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);
|
26
|
+
for (const bumpVersionConfig of bumpVersions) {
|
27
|
+
await bumpVersion(bumpVersionConfig, config, fileList, packageFileChanges, artifactFileChanges);
|
28
|
+
}
|
29
|
+
// update the config with the new files
|
30
|
+
config.updatedPackageFiles = Object.values(packageFileChanges).flat();
|
31
|
+
config.updatedArtifacts = Object.values(artifactFileChanges).flat();
|
32
|
+
}
|
33
|
+
async function bumpVersion(config, branchConfig, fileList, packageFiles, artifactFiles) {
|
34
|
+
const bumpVersionsDescr = config.name
|
35
|
+
? `bumpVersions(${config.name})`
|
36
|
+
: 'bumpVersions';
|
37
|
+
const files = [];
|
38
|
+
try {
|
39
|
+
files.push(...getMatchedFiles(config.filePatterns, branchConfig, fileList));
|
40
|
+
}
|
41
|
+
catch (e) {
|
42
|
+
addArtifactError(branchConfig, `Failed to calculate matched files for bumpVersions: ${e.message}`);
|
43
|
+
return;
|
44
|
+
}
|
45
|
+
// prepare the matchStrings
|
46
|
+
const matchStringsRegexes = [];
|
47
|
+
for (const matchString of config.matchStrings) {
|
48
|
+
try {
|
49
|
+
const templated = (0, template_1.compile)(matchString, branchConfig);
|
50
|
+
matchStringsRegexes.push((0, regex_1.regEx)(templated));
|
51
|
+
}
|
52
|
+
catch (e) {
|
53
|
+
addArtifactError(branchConfig, `Failed to compile matchString for ${bumpVersionsDescr}: ${e.message}`, matchString);
|
54
|
+
}
|
55
|
+
}
|
56
|
+
for (const filePath of files) {
|
57
|
+
const fileContents = await getFileContent(bumpVersionsDescr, filePath, packageFiles, artifactFiles);
|
58
|
+
if (!fileContents) {
|
59
|
+
continue;
|
60
|
+
}
|
61
|
+
for (const matchStringRegex of matchStringsRegexes) {
|
62
|
+
// extracting the version from the file
|
63
|
+
const regexResult = matchStringRegex.exec(fileContents);
|
64
|
+
if (!regexResult) {
|
65
|
+
continue;
|
66
|
+
}
|
67
|
+
const version = regexResult.groups?.version;
|
68
|
+
if (!version) {
|
69
|
+
logger_1.logger.debug({ file: filePath }, `${bumpVersionsDescr}: No version found`);
|
70
|
+
continue;
|
71
|
+
}
|
72
|
+
// getting new version
|
73
|
+
let newVersion = null;
|
74
|
+
try {
|
75
|
+
const bumpType = (0, template_1.compile)(config.bumpType, branchConfig);
|
76
|
+
newVersion = (0, semver_1.inc)(version, bumpType);
|
77
|
+
}
|
78
|
+
catch (e) {
|
79
|
+
addArtifactError(branchConfig, `Failed to calculate new version for ${bumpVersionsDescr}: ${e.message}`, filePath);
|
80
|
+
}
|
81
|
+
if (!newVersion) {
|
82
|
+
logger_1.logger.debug({ file: filePath }, `${bumpVersionsDescr}: Could not bump version`);
|
83
|
+
continue;
|
84
|
+
}
|
85
|
+
// replace the content of the `version` group with newVersion
|
86
|
+
const newFileContents = fileContents
|
87
|
+
.toString()
|
88
|
+
.replace(matchStringRegex, (match, ...groups) => {
|
89
|
+
const { version } = groups.pop();
|
90
|
+
return match.replace(version, newVersion);
|
91
|
+
});
|
92
|
+
// update the file. Add it to the buckets if exists or create a new artifact update
|
93
|
+
if (packageFiles[filePath]) {
|
94
|
+
packageFiles[filePath].push({
|
95
|
+
type: 'addition',
|
96
|
+
path: filePath,
|
97
|
+
contents: newFileContents,
|
98
|
+
});
|
99
|
+
}
|
100
|
+
else {
|
101
|
+
artifactFiles[filePath] ??= [];
|
102
|
+
artifactFiles[filePath].push({
|
103
|
+
type: 'addition',
|
104
|
+
path: filePath,
|
105
|
+
contents: newFileContents,
|
106
|
+
});
|
107
|
+
}
|
108
|
+
}
|
109
|
+
}
|
110
|
+
}
|
111
|
+
/**
|
112
|
+
* Get files that match ANY of the fileMatches pattern. fileMatches are compiled with the branchConfig.
|
113
|
+
* @param filePatternTemplates list of regex patterns
|
114
|
+
* @param branchConfig compile metadata
|
115
|
+
* @param fileList list of files to match against
|
116
|
+
*/
|
117
|
+
function getMatchedFiles(filePatternTemplates, branchConfig, fileList) {
|
118
|
+
// prepare file regex
|
119
|
+
const filePatterns = [];
|
120
|
+
for (const filePatternTemplateElement of filePatternTemplates) {
|
121
|
+
const filePattern = (0, template_1.compile)(filePatternTemplateElement, branchConfig);
|
122
|
+
filePatterns.push(filePattern);
|
123
|
+
}
|
124
|
+
// get files that match the fileMatch
|
125
|
+
const files = [];
|
126
|
+
for (const file of fileList) {
|
127
|
+
if ((0, string_match_1.matchRegexOrGlobList)(file, filePatterns)) {
|
128
|
+
files.push(file);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
return files;
|
132
|
+
}
|
133
|
+
function fileChangeListToMap(list) {
|
134
|
+
const record = {};
|
135
|
+
for (const fileChange of (0, array_1.coerceArray)(list)) {
|
136
|
+
record[fileChange.path] ??= [];
|
137
|
+
record[fileChange.path].push(fileChange);
|
138
|
+
}
|
139
|
+
return record;
|
140
|
+
}
|
141
|
+
function addArtifactError(branchConfig, message, fileName) {
|
142
|
+
branchConfig.artifactErrors ??= [];
|
143
|
+
branchConfig.artifactErrors.push({
|
144
|
+
stderr: message,
|
145
|
+
fileName,
|
146
|
+
});
|
147
|
+
}
|
148
|
+
async function getFileContent(bumpVersionsDescr, filePath, packageFiles, artifactFiles) {
|
149
|
+
const packageFileChanges = parseFileChanges(filePath, packageFiles);
|
150
|
+
const artifactFileChanges = parseFileChanges(filePath, artifactFiles);
|
151
|
+
// skip if the file is deleted as it virtually doesn't exist
|
152
|
+
if (packageFileChanges.state === 'deleted' ||
|
153
|
+
artifactFileChanges.state === 'deleted') {
|
154
|
+
return null;
|
155
|
+
}
|
156
|
+
if (packageFileChanges.state === 'modified') {
|
157
|
+
const lastChange = packageFileChanges.content;
|
158
|
+
if (lastChange) {
|
159
|
+
return lastChange;
|
160
|
+
}
|
161
|
+
}
|
162
|
+
if (artifactFileChanges.state === 'modified') {
|
163
|
+
const lastChange = artifactFileChanges.content;
|
164
|
+
if (lastChange) {
|
165
|
+
return lastChange;
|
166
|
+
}
|
167
|
+
}
|
168
|
+
try {
|
169
|
+
return await (0, fs_1.readLocalFile)(filePath, 'utf8');
|
170
|
+
}
|
171
|
+
catch (e) {
|
172
|
+
logger_1.logger.warn({ file: filePath }, `${bumpVersionsDescr}: Could not read file: ${e.message}`);
|
173
|
+
return null;
|
174
|
+
}
|
175
|
+
}
|
176
|
+
function parseFileChanges(filePath, changeRecord) {
|
177
|
+
const changes = (0, array_1.coerceArray)(changeRecord[filePath]);
|
178
|
+
// skip if we can fetch from record
|
179
|
+
if (!changes.length) {
|
180
|
+
return { state: 'unmodified' };
|
181
|
+
}
|
182
|
+
const lastChange = changes[changes.length - 1];
|
183
|
+
if (lastChange.type === 'deletion') {
|
184
|
+
return { state: 'deleted' };
|
185
|
+
}
|
186
|
+
return {
|
187
|
+
state: 'modified',
|
188
|
+
content: lastChange.contents?.toString() ?? null,
|
189
|
+
};
|
190
|
+
}
|
191
|
+
//# sourceMappingURL=bump-versions.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"bump-versions.js","sourceRoot":"","sources":["../../../../../lib/workers/repository/update/branch/bump-versions.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ReleaseType, inc } from 'semver';\nimport type { BumpVersionConfig } from '../../../../config/types';\nimport { logger } from '../../../../logger';\nimport { scm } from '../../../../modules/platform/scm';\nimport { coerceArray } from '../../../../util/array';\nimport { readLocalFile } from '../../../../util/fs';\nimport type { FileChange } from '../../../../util/git/types';\nimport { regEx } from '../../../../util/regex';\nimport { matchRegexOrGlobList } from '../../../../util/string-match';\nimport { compile } from '../../../../util/template';\nimport type { BranchConfig } from '../../../types';\nimport { getFilteredFileList } from '../../extract/file-match';\n\ntype ParseFileChangesResult =\n | { state: 'modified'; content: string | null }\n | { state: 'deleted' }\n | { state: 'unmodified' };\n\nexport async function bumpVersions(config: BranchConfig): Promise<void> {\n const bumpVersions = config.bumpVersions;\n if (!bumpVersions?.length) {\n return;\n }\n\n // skip if no packageFiles or artifacts have been updated\n if (!config.updatedPackageFiles?.length && !config.updatedArtifacts?.length) {\n return;\n }\n\n const allFiles = await scm.getFileList();\n const fileList = getFilteredFileList(config, allFiles);\n\n const packageFileChanges = fileChangeListToMap(config.updatedPackageFiles);\n const artifactFileChanges = fileChangeListToMap(config.updatedArtifacts);\n\n for (const bumpVersionConfig of bumpVersions) {\n await bumpVersion(\n bumpVersionConfig,\n config,\n fileList,\n packageFileChanges,\n artifactFileChanges,\n );\n }\n\n // update the config with the new files\n config.updatedPackageFiles = Object.values(packageFileChanges).flat();\n config.updatedArtifacts = Object.values(artifactFileChanges).flat();\n}\n\nasync function bumpVersion(\n config: BumpVersionConfig,\n branchConfig: BranchConfig,\n fileList: string[],\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<void> {\n const bumpVersionsDescr = config.name\n ? `bumpVersions(${config.name})`\n : 'bumpVersions';\n\n const files: string[] = [];\n try {\n files.push(...getMatchedFiles(config.filePatterns, branchConfig, fileList));\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate matched files for bumpVersions: ${e.message}`,\n );\n return;\n }\n // prepare the matchStrings\n const matchStringsRegexes: RegExp[] = [];\n for (const matchString of config.matchStrings) {\n try {\n const templated = compile(matchString, branchConfig);\n matchStringsRegexes.push(regEx(templated));\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to compile matchString for ${bumpVersionsDescr}: ${e.message}`,\n matchString,\n );\n }\n }\n\n for (const filePath of files) {\n const fileContents = await getFileContent(\n bumpVersionsDescr,\n filePath,\n packageFiles,\n artifactFiles,\n );\n if (!fileContents) {\n continue;\n }\n\n for (const matchStringRegex of matchStringsRegexes) {\n // extracting the version from the file\n const regexResult = matchStringRegex.exec(fileContents);\n if (!regexResult) {\n continue;\n }\n const version = regexResult.groups?.version;\n if (!version) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: No version found`,\n );\n continue;\n }\n\n // getting new version\n let newVersion: string | null = null;\n try {\n const bumpType = compile(config.bumpType, branchConfig);\n newVersion = inc(version, bumpType as ReleaseType);\n } catch (e) {\n addArtifactError(\n branchConfig,\n `Failed to calculate new version for ${bumpVersionsDescr}: ${e.message}`,\n filePath,\n );\n }\n if (!newVersion) {\n logger.debug(\n { file: filePath },\n `${bumpVersionsDescr}: Could not bump version`,\n );\n continue;\n }\n\n // replace the content of the `version` group with newVersion\n const newFileContents: string = fileContents\n .toString()\n .replace(matchStringRegex, (match, ...groups) => {\n const { version } = groups.pop();\n return match.replace(version, newVersion);\n });\n\n // update the file. Add it to the buckets if exists or create a new artifact update\n if (packageFiles[filePath]) {\n packageFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n } else {\n artifactFiles[filePath] ??= [];\n artifactFiles[filePath].push({\n type: 'addition',\n path: filePath,\n contents: newFileContents,\n });\n }\n }\n }\n}\n\n/**\n * Get files that match ANY of the fileMatches pattern. fileMatches are compiled with the branchConfig.\n * @param filePatternTemplates list of regex patterns\n * @param branchConfig compile metadata\n * @param fileList list of files to match against\n */\nfunction getMatchedFiles(\n filePatternTemplates: string[],\n branchConfig: BranchConfig,\n fileList: string[],\n): string[] {\n // prepare file regex\n const filePatterns: string[] = [];\n for (const filePatternTemplateElement of filePatternTemplates) {\n const filePattern = compile(filePatternTemplateElement, branchConfig);\n filePatterns.push(filePattern);\n }\n // get files that match the fileMatch\n const files: string[] = [];\n for (const file of fileList) {\n if (matchRegexOrGlobList(file, filePatterns)) {\n files.push(file);\n }\n }\n return files;\n}\n\nfunction fileChangeListToMap(\n list: FileChange[] | undefined,\n): Record<string, FileChange[]> {\n const record: Record<string, FileChange[]> = {};\n for (const fileChange of coerceArray(list)) {\n record[fileChange.path] ??= [];\n record[fileChange.path].push(fileChange);\n }\n return record;\n}\n\nfunction addArtifactError(\n branchConfig: BranchConfig,\n message: string,\n fileName?: string,\n): void {\n branchConfig.artifactErrors ??= [];\n branchConfig.artifactErrors.push({\n stderr: message,\n fileName,\n });\n}\n\nasync function getFileContent(\n bumpVersionsDescr: string,\n filePath: string,\n packageFiles: Record<string, FileChange[]>,\n artifactFiles: Record<string, FileChange[]>,\n): Promise<string | null> {\n const packageFileChanges = parseFileChanges(filePath, packageFiles);\n const artifactFileChanges = parseFileChanges(filePath, artifactFiles);\n\n // skip if the file is deleted as it virtually doesn't exist\n if (\n packageFileChanges.state === 'deleted' ||\n artifactFileChanges.state === 'deleted'\n ) {\n return null;\n }\n\n if (packageFileChanges.state === 'modified') {\n const lastChange = packageFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n if (artifactFileChanges.state === 'modified') {\n const lastChange = artifactFileChanges.content;\n if (lastChange) {\n return lastChange;\n }\n }\n\n try {\n return await readLocalFile(filePath, 'utf8');\n } catch (e) {\n logger.warn(\n { file: filePath },\n `${bumpVersionsDescr}: Could not read file: ${e.message}`,\n );\n return null;\n }\n}\n\nfunction parseFileChanges(\n filePath: string,\n changeRecord: Record<string, FileChange[]>,\n): ParseFileChangesResult {\n const changes = coerceArray(changeRecord[filePath]);\n\n // skip if we can fetch from record\n if (!changes.length) {\n return { state: 'unmodified' };\n }\n\n const lastChange = changes[changes.length - 1];\n if (lastChange.type === 'deletion') {\n return { state: 'deleted' };\n }\n return {\n state: 'modified',\n content: lastChange.contents?.toString() ?? null,\n };\n}\n"]}
|
@@ -24,6 +24,7 @@ const pr_1 = require("../pr");
|
|
24
24
|
const automerge_1 = require("../pr/automerge");
|
25
25
|
const artifacts_1 = require("./artifacts");
|
26
26
|
const automerge_2 = require("./automerge");
|
27
|
+
const bump_versions_1 = require("./bump-versions");
|
27
28
|
const check_existing_1 = require("./check-existing");
|
28
29
|
const commit_1 = require("./commit");
|
29
30
|
const execute_post_upgrade_commands_1 = tslib_1.__importDefault(require("./execute-post-upgrade-commands"));
|
@@ -390,6 +391,8 @@ async function processBranch(branchConfig) {
|
|
390
391
|
config.updatedArtifacts = updatedArtifacts;
|
391
392
|
config.artifactErrors = artifactErrors;
|
392
393
|
}
|
394
|
+
// modifies the file changes in place to allow having a version bump in a packageFile or artifact
|
395
|
+
await (0, bump_versions_1.bumpVersions)(config);
|
393
396
|
(0, logger_1.removeMeta)(['dep']);
|
394
397
|
if (config.artifactErrors?.length) {
|
395
398
|
if (config.releaseTimestamp) {
|