aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-12-22 02:38:44 -0800
committerGravatar Jarred Sumner <jarred@jarredsumner.com> 2021-12-22 02:38:44 -0800
commit6cbe506915e4dc15283e2d00df329494127f6a9d (patch)
treeee5f2b561ceef6e8a1586d4e1b7d8e13cb312403 /src
parent3d6ac8faced399d5ba2fec195e25aca2727c75ce (diff)
downloadbun-6cbe506915e4dc15283e2d00df329494127f6a9d.tar.gz
bun-6cbe506915e4dc15283e2d00df329494127f6a9d.tar.zst
bun-6cbe506915e4dc15283e2d00df329494127f6a9d.zip
[bun install] Fix bug with `>=` ranges (and improve test coverage)
Diffstat (limited to 'src')
-rw-r--r--src/install/semver.zig193
1 files changed, 115 insertions, 78 deletions
diff --git a/src/install/semver.zig b/src/install/semver.zig
index c2f2b4f43..ce0208a0e 100644
--- a/src/install/semver.zig
+++ b/src/install/semver.zig
@@ -1295,94 +1295,121 @@ pub const Query = struct {
else => {},
}
- {
- var _version = version;
- switch (this.wildcard) {
- .major => {
- return Range{
- .left = .{ .op = .gte, .version = _version },
- .right = .{
- .op = .lte,
- .version = Version{
- .major = std.math.maxInt(u32),
- .minor = std.math.maxInt(u32),
- .patch = std.math.maxInt(u32),
- },
+ return switch (this.wildcard) {
+ .major => Range{
+ .left = .{ .op = .gte, .version = version },
+ .right = .{
+ .op = .lte,
+ .version = Version{
+ .major = std.math.maxInt(u32),
+ .minor = std.math.maxInt(u32),
+ .patch = std.math.maxInt(u32),
+ },
+ },
+ },
+ .minor => switch (this.tag) {
+ .lte => Range{
+ .left = .{
+ .op = .lte,
+ .version = Version{
+ .major = version.major,
+ .minor = std.math.maxInt(u32),
+ .patch = std.math.maxInt(u32),
},
- };
+ },
},
- .minor => {
- switch (this.tag) {
- .lt, .lte => {
- return Range{
- .left = .{
- .op = if (this.tag == .lt) .lt else .lte,
- .version = Version{
- .major = version.major,
- .minor = 0,
- .patch = 0,
- },
- },
- };
+ .lt => Range{
+ .left = .{
+ .op = .lt,
+ .version = Version{
+ .major = version.major,
+ .minor = 0,
+ .patch = 0,
},
- else => {
- return Range{
- .left = .{
- .op = if (this.tag == .gt) .gt else .gte,
- .version = Version{
- .major = version.major,
- .minor = std.math.maxInt(u32),
- .patch = std.math.maxInt(u32),
- },
- },
- };
+ },
+ },
+
+ .gt => Range{
+ .left = .{
+ .op = .gt,
+ .version = Version{
+ .major = version.major,
+ .minor = std.math.maxInt(u32),
+ .patch = std.math.maxInt(u32),
},
- }
+ },
},
- .patch => {
- switch (this.tag) {
- .lt, .lte => {
- return Range{
- .left = .{
- .op = if (this.tag == .lt) .lt else .lte,
- .version = Version{
- .major = version.major,
- .minor = version.minor,
- .patch = 0,
- },
- },
- };
+
+ .gte => Range{
+ .left = .{
+ .op = .gte,
+ .version = Version{
+ .major = version.major,
+ .minor = 0,
+ .patch = 0,
},
- else => {
- return Range{
- .left = .{
- .op = if (this.tag == .gt) .gt else .gte,
- .version = Version{
- .major = version.major,
- .minor = version.minor,
- .patch = std.math.maxInt(u32),
- },
- },
- };
+ },
+ },
+ else => unreachable,
+ },
+ .patch => switch (this.tag) {
+ .lte => Range{
+ .left = .{
+ .op = .lte,
+ .version = Version{
+ .major = version.major,
+ .minor = version.minor,
+ .patch = std.math.maxInt(u32),
},
- }
+ },
},
- .none => {
- return Range{
- .left = .{
- .op = switch (this.tag) {
- .gt => .gt,
- .gte => .gte,
- .lt => .lt,
- .lte => .lte,
- else => unreachable,
- },
- .version = version,
+ .lt => Range{
+ .left = .{
+ .op = .lt,
+ .version = Version{
+ .major = version.major,
+ .minor = version.minor,
+ .patch = 0,
},
- };
+ },
},
- }
- }
+
+ .gt => Range{
+ .left = .{
+ .op = .gt,
+ .version = Version{
+ .major = version.major,
+ .minor = version.minor,
+ .patch = std.math.maxInt(u32),
+ },
+ },
+ },
+
+ .gte => Range{
+ .left = .{
+ .op = .gte,
+ .version = Version{
+ .major = version.major,
+ .minor = version.minor,
+ .patch = 0,
+ },
+ },
+ },
+ else => unreachable,
+ },
+ .none => Range{
+ .left = .{
+ .op = switch (this.tag) {
+ .gt => .gt,
+ .gte => .gte,
+ .lt => .lt,
+ .lte => .lte,
+ else => unreachable,
+ },
+ .version = version,
+ },
+ },
+ };
}
pub const Tag = enum {
@@ -1835,6 +1862,16 @@ test "Range parsing" {
expect.range("^1.1.4", "1.1.4", @src());
+ expect.range(">=3", "3.5.0", @src());
+ expect.notRange(">=3", "2.999.999", @src());
+ expect.range(">=3", "3.5.1", @src());
+ expect.range(">=3", "4", @src());
+
+ expect.range("<6 >= 5", "5.0.0", @src());
+ expect.notRange("<6 >= 5", "4.0.0", @src());
+ expect.notRange("<6 >= 5", "6.0.0", @src());
+ expect.notRange("<6 >= 5", "6.0.1", @src());
+
expect.range(">2", "3", @src());
expect.notRange(">2", "2.1", @src());
expect.notRange(">2", "2", @src());