Skip to content

Commit

Permalink
feat(config)!: default to rangeStrategy=auto, prefer update-lockfile (#…
Browse files Browse the repository at this point in the history
…19942)

Changes `rangeStrategy` default value from `'replace'` to `'auto'`. Also changes `auto` behavior so that `update-lockfile` is preferred if the manager
supports the `updateLockedDependency()` function.

Closes #19800

BREAKING CHANGE: Renovate will now default to updating locked dependency versions. To revert to previous behavior, configure rangeStrategy=replace.
  • Loading branch information
rarkins committed Mar 10, 2023
1 parent dcd298a commit 016e647
Show file tree
Hide file tree
Showing 33 changed files with 122 additions and 47 deletions.
2 changes: 1 addition & 1 deletion lib/config/options/index.ts
Expand Up @@ -1344,7 +1344,7 @@ const options: RenovateOptions[] = [
name: 'rangeStrategy',
description: 'Determines how to modify or update existing ranges.',
type: 'string',
default: 'replace',
default: 'auto',
allowedValues: [
'auto',
'pin',
Expand Down
3 changes: 2 additions & 1 deletion lib/config/presets/common.ts
@@ -1,5 +1,6 @@
export const removedPresets: Record<string, string | null> = {
':autodetectPinVersions': ':autodetectRangeStrategy',
':autodetectPinVersions': null,
':autodetectRangeStrategy': null,
':automergeBranchMergeCommit': ':automergeBranch',
':automergeBranchPush': ':automergeBranch',
':base': 'config:base',
Expand Down
1 change: 0 additions & 1 deletion lib/config/presets/index.spec.ts
Expand Up @@ -839,7 +839,6 @@ describe('config/presets/index', () => {
':dependencyDashboard',
':semanticPrefixFixDepsChoreOthers',
':ignoreModulesAndTests',
':autodetectRangeStrategy',
':prHourlyLimit2',
':prConcurrentLimit10',
'group:monorepos',
Expand Down
1 change: 0 additions & 1 deletion lib/config/presets/internal/config.ts
Expand Up @@ -9,7 +9,6 @@ export const presets: Record<string, Preset> = {
':dependencyDashboard',
':semanticPrefixFixDepsChoreOthers',
':ignoreModulesAndTests',
':autodetectRangeStrategy',
':prHourlyLimit2',
':prConcurrentLimit10',
'group:monorepos',
Expand Down
4 changes: 0 additions & 4 deletions lib/config/presets/internal/default.ts
Expand Up @@ -10,10 +10,6 @@ export const presets: Record<string, Preset> = {
assignees: ['{{arg0}}'],
description: 'Assign PRs to `{{arg0}}`.',
},
autodetectRangeStrategy: {
description: 'Automatically detect the best rangeStrategy to use.',
rangeStrategy: 'auto',
},
automergeAll: {
automerge: true,
description:
Expand Down
2 changes: 1 addition & 1 deletion lib/modules/manager/cargo/index.ts
Expand Up @@ -3,6 +3,7 @@ import { CrateDatasource } from '../../datasource/crate';
import * as cargoVersioning from '../../versioning/cargo';
import { updateArtifacts } from './artifacts';
import { extractPackageFile } from './extract';
export { getRangeStrategy } from './range';

export const language: ProgrammingLanguage = 'rust';
export const supportsLockFileMaintenance = true;
Expand All @@ -13,7 +14,6 @@ export const defaultConfig = {
commitMessageTopic: 'Rust crate {{depName}}',
fileMatch: ['(^|/)Cargo\\.toml$'],
versioning: cargoVersioning.id,
rangeStrategy: 'bump',
};

export const supportedDatasources = [CrateDatasource.id];
14 changes: 14 additions & 0 deletions lib/modules/manager/cargo/range.spec.ts
@@ -0,0 +1,14 @@
import type { RangeConfig } from '../types';
import { getRangeStrategy } from '.';

describe('modules/manager/cargo/range', () => {
it('returns same if not auto', () => {
const config: RangeConfig = { rangeStrategy: 'widen' };
expect(getRangeStrategy(config)).toBe('widen');
});

it('defaults to bump', () => {
const config: RangeConfig = { rangeStrategy: 'auto' };
expect(getRangeStrategy(config)).toBe('bump');
});
});
8 changes: 8 additions & 0 deletions lib/modules/manager/cargo/range.ts
@@ -0,0 +1,8 @@
import type { RangeStrategy } from '../../../types';
import type { RangeConfig } from '../types';

export function getRangeStrategy({
rangeStrategy,
}: RangeConfig): RangeStrategy {
return rangeStrategy === 'auto' ? 'bump' : rangeStrategy;
}
1 change: 0 additions & 1 deletion lib/modules/manager/circleci/extract.ts
Expand Up @@ -41,7 +41,6 @@ export function extractPackageFile(content: string): PackageFileContent | null {
packageName: orbName,
commitMessageTopic: '{{{depName}}} orb',
versioning: npmVersioning.id,
rangeStrategy: 'pin',
};
deps.push(dep);
}
Expand Down
1 change: 1 addition & 0 deletions lib/modules/manager/circleci/index.ts
@@ -1,6 +1,7 @@
import { DockerDatasource } from '../../datasource/docker';
import { OrbDatasource } from '../../datasource/orb';
import { extractPackageFile } from './extract';
export { getRangeStrategy } from './range';

export { extractPackageFile };

Expand Down
14 changes: 14 additions & 0 deletions lib/modules/manager/circleci/range.spec.ts
@@ -0,0 +1,14 @@
import type { RangeConfig } from '../types';
import { getRangeStrategy } from '.';

describe('modules/manager/circleci/range', () => {
it('returns same if not auto', () => {
const config: RangeConfig = { rangeStrategy: 'widen' };
expect(getRangeStrategy(config)).toBe('widen');
});

it('defaults to bump', () => {
const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
expect(getRangeStrategy(config)).toBe('pin');
});
});
8 changes: 8 additions & 0 deletions lib/modules/manager/circleci/range.ts
@@ -0,0 +1,8 @@
import type { RangeStrategy } from '../../../types';
import type { RangeConfig } from '../types';

export function getRangeStrategy({
rangeStrategy,
}: RangeConfig): RangeStrategy {
return rangeStrategy === 'auto' ? 'pin' : rangeStrategy;
}
8 changes: 4 additions & 4 deletions lib/modules/manager/composer/range.spec.ts
Expand Up @@ -12,7 +12,7 @@ describe('modules/manager/composer/range', () => {
rangeStrategy: 'auto',
depType: 'require-dev',
};
expect(getRangeStrategy(config)).toBe('replace');
expect(getRangeStrategy(config)).toBe('update-lockfile');
});

it('replaces project require', () => {
Expand All @@ -21,7 +21,7 @@ describe('modules/manager/composer/range', () => {
managerData: { composerJsonType: 'project' },
depType: 'require',
};
expect(getRangeStrategy(config)).toBe('replace');
expect(getRangeStrategy(config)).toBe('update-lockfile');
});

it('widens complex ranges', () => {
Expand All @@ -42,9 +42,9 @@ describe('modules/manager/composer/range', () => {
expect(getRangeStrategy(config)).toBe('widen');
});

it('defaults to replace', () => {
it('defaults to update-lockfile', () => {
const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
expect(getRangeStrategy(config)).toBe('replace');
expect(getRangeStrategy(config)).toBe('update-lockfile');
});

it('defaults to widen for TYPO3 extensions', () => {
Expand Down
2 changes: 1 addition & 1 deletion lib/modules/manager/composer/range.ts
Expand Up @@ -23,5 +23,5 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy {
) {
return 'widen';
}
return 'replace';
return 'update-lockfile';
}
2 changes: 1 addition & 1 deletion lib/modules/manager/conan/index.ts
@@ -1,12 +1,12 @@
export { extractPackageFile } from './extract';
export { getRangeStrategy } from './range';
import { ConanDatasource } from '../../datasource/conan';
import * as conan from '../../versioning/conan';

export const defaultConfig = {
fileMatch: ['(^|/)conanfile\\.(txt|py)$'],
datasource: ConanDatasource.id,
versioning: conan.id,
rangeStrategy: 'bump',
enabled: false, // See https://github.com/renovatebot/renovate/issues/14170
};

Expand Down
14 changes: 14 additions & 0 deletions lib/modules/manager/conan/range.spec.ts
@@ -0,0 +1,14 @@
import type { RangeConfig } from '../types';
import { getRangeStrategy } from '.';

describe('modules/manager/conan/range', () => {
it('returns same if not auto', () => {
const config: RangeConfig = { rangeStrategy: 'widen' };
expect(getRangeStrategy(config)).toBe('widen');
});

it('defaults to bump', () => {
const config: RangeConfig = { rangeStrategy: 'auto', depType: 'require' };
expect(getRangeStrategy(config)).toBe('bump');
});
});
8 changes: 8 additions & 0 deletions lib/modules/manager/conan/range.ts
@@ -0,0 +1,8 @@
import type { RangeStrategy } from '../../../types';
import type { RangeConfig } from '../types';

export function getRangeStrategy({
rangeStrategy,
}: RangeConfig): RangeStrategy {
return rangeStrategy === 'auto' ? 'bump' : rangeStrategy;
}
1 change: 0 additions & 1 deletion lib/modules/manager/gomod/extract.spec.ts
Expand Up @@ -67,7 +67,6 @@ replace (
currentValue: '1.18',
datasource: 'golang-version',
versioning: 'go-mod-directive',
rangeStrategy: 'replace',
},
{
managerData: {
Expand Down
1 change: 0 additions & 1 deletion lib/modules/manager/gomod/extract.ts
Expand Up @@ -46,7 +46,6 @@ function getGoDep(lineNumber: number, goVer: string): PackageDependency {
currentValue: goVer,
datasource: GolangVersionDatasource.id,
versioning: 'go-mod-directive',
rangeStrategy: 'replace',
};
}

Expand Down
3 changes: 3 additions & 0 deletions lib/modules/manager/index.ts
Expand Up @@ -87,6 +87,9 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy | null {
return managerRangeStrategy;
}
if (rangeStrategy === 'auto') {
if (m.updateLockedDependency) {
return 'update-lockfile';
}
// default to 'replace' for auto
return 'replace';
}
Expand Down
20 changes: 2 additions & 18 deletions lib/modules/manager/npm/range.spec.ts
Expand Up @@ -7,22 +7,6 @@ describe('modules/manager/npm/range', () => {
expect(getRangeStrategy(config)).toBe('widen');
});

it('replaces devDependencies', () => {
const config: RangeConfig = {
rangeStrategy: 'auto',
depType: 'devDependencies',
};
expect(getRangeStrategy(config)).toBe('replace');
});

it('replaces app dependencies', () => {
const config: RangeConfig = {
rangeStrategy: 'auto',
depType: 'dependencies',
};
expect(getRangeStrategy(config)).toBe('replace');
});

it('widens peerDependencies', () => {
const config: RangeConfig = {
rangeStrategy: 'auto',
Expand All @@ -49,11 +33,11 @@ describe('modules/manager/npm/range', () => {
expect(getRangeStrategy(config)).toBe('widen');
});

it('defaults to replace', () => {
it('defaults to update-lockfile', () => {
const config: RangeConfig = {
rangeStrategy: 'auto',
depType: 'dependencies',
};
expect(getRangeStrategy(config)).toBe('replace');
expect(getRangeStrategy(config)).toBe('update-lockfile');
});
});
2 changes: 1 addition & 1 deletion lib/modules/manager/npm/range.ts
Expand Up @@ -25,5 +25,5 @@ export function getRangeStrategy(config: RangeConfig): RangeStrategy {
if (isComplexRange) {
return 'widen';
}
return 'replace';
return 'update-lockfile';
}
12 changes: 10 additions & 2 deletions lib/modules/manager/range.spec.ts
Expand Up @@ -16,12 +16,20 @@ describe('modules/manager/range', () => {
rangeStrategy: 'auto',
depType: 'dependencies',
};
expect(getRangeStrategy(config)).toBe('replace');
expect(getRangeStrategy(config)).toBe('update-lockfile');
});

it('defaults to update-lockfile if updateLockedDependency() is supported', () => {
const config: RangeConfig = {
manager: 'bundler',
rangeStrategy: 'auto',
};
expect(getRangeStrategy(config)).toBe('update-lockfile');
});

it('defaults to replace', () => {
const config: RangeConfig = {
manager: 'circleci',
manager: 'sbt',
rangeStrategy: 'auto',
};
expect(getRangeStrategy(config)).toBe('replace');
Expand Down
2 changes: 1 addition & 1 deletion lib/modules/manager/swift/index.ts
Expand Up @@ -2,6 +2,7 @@ import { GitTagsDatasource } from '../../datasource/git-tags';
import * as swiftVersioning from '../../versioning/swift';

export { extractPackageFile } from './extract';
export { getRangeStrategy } from './range';

export const displayName = 'Swift Package Manager';
export const url = 'https://www.swift.org/package-manager/';
Expand All @@ -11,6 +12,5 @@ export const supportedDatasources = [GitTagsDatasource.id];
export const defaultConfig = {
fileMatch: ['(^|/)Package\\.swift'],
versioning: swiftVersioning.id,
rangeStrategy: 'bump',
pinDigests: false,
};
16 changes: 16 additions & 0 deletions lib/modules/manager/swift/range.spec.ts
@@ -0,0 +1,16 @@
import type { RangeConfig } from '../types';
import { getRangeStrategy } from '.';

describe('modules/manager/swift/range', () => {
describe('getRangeStrategy()', () => {
it('returns same if not auto', () => {
const config: RangeConfig = { rangeStrategy: 'widen' };
expect(getRangeStrategy(config)).toBe('widen');
});

it('defaults to update-lockfile', () => {
const config: RangeConfig = { rangeStrategy: 'auto' };
expect(getRangeStrategy(config)).toBe('bump');
});
});
});
8 changes: 8 additions & 0 deletions lib/modules/manager/swift/range.ts
@@ -0,0 +1,8 @@
import type { RangeStrategy } from '../../../types';
import type { RangeConfig } from '../types';

export function getRangeStrategy({
rangeStrategy,
}: RangeConfig): RangeStrategy {
return rangeStrategy === 'auto' ? 'bump' : rangeStrategy;
}
@@ -1,4 +1,4 @@
{
"filename": "renovate.json",
"content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectRangeStrategy\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\"main\"]\n}\n"
"content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\"main\"]\n}\n"
}
@@ -1,5 +1,5 @@
{
"content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectRangeStrategy\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n",
"content": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n",
"filename": "renovate.json",
"indent": {
"amount": 2,
Expand Down
@@ -1,5 +1,5 @@
{
"content": "{\n extends: [\n ':separateMajorReleases',\n ':prImmediately',\n ':renovatePrefix',\n ':semanticPrefixFixDepsChoreOthers',\n ':updateNotScheduled',\n ':automergeDisabled',\n ':maintainLockFilesDisabled',\n ':autodetectRangeStrategy',\n 'group:monorepos',\n ],\n onboarding: false,\n rangeStrategy: 'replace',\n semanticCommits: 'enabled',\n timezone: 'US/Central',\n baseBranches: [\n 'main',\n ],\n}\n",
"content": "{\n extends: [\n ':separateMajorReleases',\n ':prImmediately',\n ':renovatePrefix',\n ':semanticPrefixFixDepsChoreOthers',\n ':updateNotScheduled',\n ':automergeDisabled',\n ':maintainLockFilesDisabled',\n 'group:monorepos',\n ],\n onboarding: false,\n rangeStrategy: 'replace',\n semanticCommits: 'enabled',\n timezone: 'US/Central',\n baseBranches: [\n 'main',\n ],\n}\n",
"filename": "renovate.json5",
"indent": {
"amount": 2,
Expand Down
Expand Up @@ -7,7 +7,6 @@
":updateNotScheduled",
":automergeDisabled",
":maintainLockFilesDisabled",
":autodetectRangeStrategy",
"group:monorepos"
],
"onboarding": false,
Expand Down
Expand Up @@ -8,7 +8,6 @@
":updateNotScheduled",
":automergeDisabled",
":maintainLockFilesDisabled",
":autodetectRangeStrategy",
"group:monorepos",
"helpers:oddIsUnstablePackages"
],
Expand Down
Expand Up @@ -7,7 +7,6 @@
':updateNotScheduled',
':automergeDisabled',
':maintainLockFilesDisabled',
':autodetectRangeStrategy',
'group:monorepos',
'helpers:oddIsUnstablePackages'
],
Expand Down
@@ -1,4 +1,4 @@
{
"configFileName": "renovate.json",
"migratedContent": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \":autodetectRangeStrategy\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n"
"migratedContent": "{\n \"extends\": [\n \":separateMajorReleases\",\n \":prImmediately\",\n \":renovatePrefix\",\n \":semanticPrefixFixDepsChoreOthers\",\n \":updateNotScheduled\",\n \":automergeDisabled\",\n \":maintainLockFilesDisabled\",\n \"group:monorepos\"\n ],\n \"onboarding\": false,\n \"rangeStrategy\": \"replace\",\n \"semanticCommits\": \"enabled\",\n \"timezone\": \"US/Central\",\n \"baseBranches\": [\n \"main\"\n ]\n}\n"
}

0 comments on commit 016e647

Please sign in to comment.