Fix another bug in SDK override logic (#1782)
We'd previously been disabling SDK overrides any time the minimum
constraint was a pre-release version, whether or not that version had
anything to do with the SDK. We not only disable the overrides when
the minimum constraint is a pre-release version *of the current SDK*.
Closes #1781
Closes #1780
See dart-lang/sdk#31926
See dart-lang/sdk#31940
diff --git a/lib/src/pubspec.dart b/lib/src/pubspec.dart
index 9fb64fb..ae5935e 100644
--- a/lib/src/pubspec.dart
+++ b/lib/src/pubspec.dart
@@ -391,7 +391,11 @@
if (!allowPreReleaseSdk) return false;
if (!sdk.version.isPreRelease) return false;
if (sdkConstraint.includeMax) return false;
- if (sdkConstraint.min != null && sdkConstraint.min.isPreRelease) {
+ if (sdkConstraint.min != null &&
+ sdkConstraint.min.isPreRelease &&
+ sdkConstraint.min.major == sdk.version.major &&
+ sdkConstraint.min.minor == sdk.version.minor &&
+ sdkConstraint.min.patch == sdk.version.patch) {
return false;
}
if (sdkConstraint.max == null) return false;
diff --git a/test/version_solver_test.dart b/test/version_solver_test.dart
index 18f9786..04f7d14 100644
--- a/test/version_solver_test.dart
+++ b/test/version_solver_test.dart
@@ -1216,18 +1216,18 @@
output: isNot(contains('PUB_ALLOW_PRERELEASE_SDK')));
});
- test("no min pre-release constraint", () async {
+ test("no min pre-release constraint that matches the current SDK",
+ () async {
await d.dir(appPath, [
await d.pubspec({
'name': 'myapp',
- 'environment': {'sdk': '>=1.2.3-dev.2.0 <2.0.0'}
+ 'environment': {'sdk': '>=1.2.3-dev.2.0 <1.2.3'}
})
]).create();
await expectResolves(
- environment: {'_PUB_TEST_SDK_VERSION': '1.2.3-dev.1.0'},
- error: 'Package myapp requires SDK version >=1.2.3-dev.2.0 <2.0.0 '
- 'but the current SDK is 1.2.3-dev.1.0.');
+ environment: {'_PUB_TEST_SDK_VERSION': '1.2.3-dev.3.0'},
+ output: isNot(contains('PUB_ALLOW_PRERELEASE_SDK')));
});
test("no build release constraints", () async {
@@ -1244,18 +1244,34 @@
});
});
- test("works generally", () async {
- await d.dir(appPath, [
- await d.pubspec({
- 'name': 'myapp',
- 'environment': {'sdk': '<1.2.3'}
- })
- ]).create();
+ group("allows", () {
+ test("an exclusive max that matches the current SDK", () async {
+ await d.dir(appPath, [
+ await d.pubspec({
+ 'name': 'myapp',
+ 'environment': {'sdk': '<1.2.3'}
+ })
+ ]).create();
- await expectResolves(
- environment: {'_PUB_TEST_SDK_VERSION': '1.2.3-dev.1.0'},
- output: allOf(contains('PUB_ALLOW_PRERELEASE_SDK'),
- contains('<=1.2.3-dev.1.0'), contains('myapp')));
+ await expectResolves(
+ environment: {'_PUB_TEST_SDK_VERSION': '1.2.3-dev.1.0'},
+ output: allOf(contains('PUB_ALLOW_PRERELEASE_SDK'),
+ contains('<=1.2.3-dev.1.0'), contains('myapp')));
+ });
+
+ test("a pre-release min that doesn't match the current SDK", () async {
+ await d.dir(appPath, [
+ await d.pubspec({
+ 'name': 'myapp',
+ 'environment': {'sdk': '>=1.0.0-dev.1.0 <1.2.3'}
+ })
+ ]).create();
+
+ await expectResolves(
+ environment: {'_PUB_TEST_SDK_VERSION': '1.2.3-dev.1.0'},
+ output: allOf(contains('PUB_ALLOW_PRERELEASE_SDK'),
+ contains('<=1.2.3-dev.1.0'), contains('myapp')));
+ });
});
});
}