dependency_services: Use ^ constraints for widened intervals when possible (#3349)
diff --git a/lib/src/command/dependency_services.dart b/lib/src/command/dependency_services.dart
index dd3379f..0e731f4 100644
--- a/lib/src/command/dependency_services.dart
+++ b/lib/src/command/dependency_services.dart
@@ -403,18 +403,22 @@
final min = original.min;
final max = original.max;
if (max != null && newVersion >= max) {
- return VersionRange(
- min: min,
- includeMin: original.includeMin,
- max: newVersion.nextBreaking.firstPreRelease,
+ return compatibleWithIfPossible(
+ VersionRange(
+ min: min,
+ includeMin: original.includeMin,
+ max: newVersion.nextBreaking.firstPreRelease,
+ ),
);
}
if (min != null && newVersion <= min) {
- return VersionRange(
- min: newVersion,
- includeMin: true,
- max: max,
- includeMax: original.includeMax);
+ return compatibleWithIfPossible(
+ VersionRange(
+ min: newVersion,
+ includeMin: true,
+ max: max,
+ includeMax: original.includeMax),
+ );
}
}
@@ -422,3 +426,11 @@
throw ArgumentError.value(
original, 'original', 'Must be a Version range or empty');
}
+
+VersionConstraint compatibleWithIfPossible(VersionRange versionRange) {
+ final min = versionRange.min;
+ if (min != null && min.nextBreaking.firstPreRelease == versionRange.max) {
+ return VersionConstraint.compatibleWith(min);
+ }
+ return versionRange;
+}
diff --git a/test/dependency_services/dependency_services_test.dart b/test/dependency_services/dependency_services_test.dart
index f25cf2d..694e229 100644
--- a/test/dependency_services/dependency_services_test.dart
+++ b/test/dependency_services/dependency_services_test.dart
@@ -203,7 +203,8 @@
testWithGolden('multibreaking', (context) async {
final server = (await servePackages())
..serve('foo', '1.0.0')
- ..serve('bar', '1.0.0');
+ ..serve('bar', '1.0.0')
+ ..serve('baz', '1.0.0');
await d.dir(appPath, [
d.pubspec({
@@ -211,6 +212,8 @@
'dependencies': {
'foo': '^1.0.0',
'bar': '^1.0.0',
+ // Pinned version. See that the widened constraint is correct.
+ 'baz': '1.0.0',
},
})
]).create();
@@ -221,7 +224,7 @@
..serve('foo', '3.0.0', deps: {'bar': '^2.0.0'}) // multi breaking
..serve('foo', '3.0.1', deps: {'bar': '^2.0.0'})
..serve('bar', '2.0.0', deps: {'foo': '^3.0.0'})
- ..serve('transitive', '1.0.0');
+ ..serve('baz', '1.1.0');
await listReportApply(context, [
_PackageVersion('foo', Version.parse('3.0.1'),
constraint: VersionConstraint.parse('^3.0.0')),
diff --git a/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt b/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt
index 10f5426..32bc04e 100644
--- a/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt
+++ b/test/testdata/goldens/dependency_services/dependency_services_test/multibreaking.txt
@@ -1,7 +1,7 @@
# GENERATED BY: test/dependency_services/dependency_services_test.dart
$ cat pubspec.yaml
-{"name":"app","dependencies":{"foo":"^1.0.0","bar":"^1.0.0"},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+{"name":"app","dependencies":{"foo":"^1.0.0","bar":"^1.0.0","baz":"1.0.0"},"environment":{"sdk":">=0.1.2 <1.0.0"}}
$ cat pubspec.lock
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
@@ -13,6 +13,13 @@
url: "http://localhost:$PORT"
source: hosted
version: "1.0.0"
+ baz:
+ dependency: "direct main"
+ description:
+ name: baz
+ url: "http://localhost:$PORT"
+ source: hosted
+ version: "1.0.0"
foo:
dependency: "direct main"
description:
@@ -35,6 +42,12 @@
"constraint": "^1.0.0"
},
{
+ "name": "baz",
+ "version": "1.0.0",
+ "kind": "direct",
+ "constraint": "1.0.0"
+ },
+ {
"name": "foo",
"version": "1.0.0",
"kind": "direct",
@@ -81,6 +94,38 @@
]
},
{
+ "name": "baz",
+ "version": "1.0.0",
+ "kind": "direct",
+ "latest": "1.1.0",
+ "constraint": "1.0.0",
+ "compatible": [],
+ "singleBreaking": [
+ {
+ "name": "baz",
+ "version": "1.1.0",
+ "kind": "direct",
+ "constraintBumped": "^1.1.0",
+ "constraintWidened": "^1.0.0",
+ "constraintBumpedIfNeeded": "^1.1.0",
+ "previousVersion": "1.0.0",
+ "previousConstraint": "1.0.0"
+ }
+ ],
+ "multiBreaking": [
+ {
+ "name": "baz",
+ "version": "1.1.0",
+ "kind": "direct",
+ "constraintBumped": "^1.1.0",
+ "constraintWidened": "^1.0.0",
+ "constraintBumpedIfNeeded": "^1.1.0",
+ "previousVersion": "1.0.0",
+ "previousConstraint": "1.0.0"
+ }
+ ]
+ },
+ {
"name": "foo",
"version": "1.0.0",
"kind": "direct",
@@ -145,7 +190,7 @@
-------------------------------- END OF OUTPUT ---------------------------------
$ cat pubspec.yaml
-{"name":"app","dependencies":{"foo":^3.0.0,"bar":^2.0.0},"environment":{"sdk":">=0.1.2 <1.0.0"}}
+{"name":"app","dependencies":{"foo":^3.0.0,"bar":^2.0.0,"baz":"1.0.0"},"environment":{"sdk":">=0.1.2 <1.0.0"}}
$ cat pubspec.lock
# Generated by pub
# See https://dart.dev/tools/pub/glossary#lockfile
@@ -157,6 +202,13 @@
url: "http://localhost:$PORT"
source: hosted
version: "2.0.0"
+ baz:
+ dependency: "direct main"
+ description:
+ name: baz
+ url: "http://localhost:$PORT"
+ source: hosted
+ version: "1.0.0"
foo:
dependency: "direct main"
description: