Fix a crashing bug (#19)
VersionRange.difference() with a VersionUnion didn't expect to get an
empty constraint, but it was possible to do so.
Closes #18
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6d54692..d50c768 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,3 +1,8 @@
+# 1.3.3
+
+* Fix a bug where `VersionRange.difference()` with a union constraint that
+ covered the entire range would crash.
+
# 1.3.2
* Fix a checked-mode error in `VersionRange.difference()`.
diff --git a/lib/src/version_range.dart b/lib/src/version_range.dart
index 99f2924..bce869b 100644
--- a/lib/src/version_range.dart
+++ b/lib/src/version_range.dart
@@ -379,7 +379,9 @@
if (strictlyHigher(range, current)) break;
var difference = current.difference(range);
- if (difference is VersionUnion) {
+ if (difference.isEmpty) {
+ return VersionConstraint.empty;
+ } else if (difference is VersionUnion) {
// If [range] split [current] in half, we only need to continue
// checking future ranges against the latter half.
assert(difference.ranges.length == 2);
diff --git a/pubspec.yaml b/pubspec.yaml
index 93fb035..eac5cb0 100644
--- a/pubspec.yaml
+++ b/pubspec.yaml
@@ -1,5 +1,5 @@
name: pub_semver
-version: 1.3.3-dev
+version: 1.3.3
author: Dart Team <misc@dartlang.org>
description: >
Versions and version constraints implementing pub's versioning policy. This
diff --git a/test/version_range_test.dart b/test/version_range_test.dart
index e95b3d6..cefd9d3 100644
--- a/test/version_range_test.dart
+++ b/test/version_range_test.dart
@@ -606,6 +606,14 @@
new VersionRange(min: v130, max: v140)
])));
});
+
+ test("with a version union that covers the whole range, returns empty", () {
+ expect(
+ new VersionRange(min: v114, max: v140).difference(
+ new VersionConstraint.unionOf(
+ [v003, new VersionRange(min: v010)])),
+ equals(VersionConstraint.empty));
+ });
});
test('isEmpty', () {