| ... | @@ -57,6 +57,7 @@ name: []const u8, | ... | @@ -57,6 +57,7 @@ name: []const u8, |
| 57 | version: std.SemanticVersion, | 57 | version: std.SemanticVersion, |
| 58 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), | 58 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), |
| 59 | paths: std.StringArrayHashMapUnmanaged(void), | 59 | paths: std.StringArrayHashMapUnmanaged(void), |
| | 60 | minimum_zig_version: ?std.SemanticVersion, |
| 60 | | 61 | |
| 61 | errors: []ErrorMessage, | 62 | errors: []ErrorMessage, |
| 62 | arena_state: std.heap.ArenaAllocator.State, | 63 | arena_state: std.heap.ArenaAllocator.State, |
| ... | @@ -87,6 +88,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani | ... | @@ -87,6 +88,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani |
| 87 | .dependencies = .{}, | 88 | .dependencies = .{}, |
| 88 | .paths = .{}, | 89 | .paths = .{}, |
| 89 | .allow_missing_paths_field = options.allow_missing_paths_field, | 90 | .allow_missing_paths_field = options.allow_missing_paths_field, |
| | 91 | .minimum_zig_version = null, |
| 90 | .buf = .{}, | 92 | .buf = .{}, |
| 91 | }; | 93 | }; |
| 92 | defer p.buf.deinit(gpa); | 94 | defer p.buf.deinit(gpa); |
| ... | @@ -104,6 +106,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani | ... | @@ -104,6 +106,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani |
| 104 | .version = p.version, | 106 | .version = p.version, |
| 105 | .dependencies = try p.dependencies.clone(p.arena), | 107 | .dependencies = try p.dependencies.clone(p.arena), |
| 106 | .paths = try p.paths.clone(p.arena), | 108 | .paths = try p.paths.clone(p.arena), |
| | 109 | .minimum_zig_version = p.minimum_zig_version, |
| 107 | .errors = try p.arena.dupe(ErrorMessage, p.errors.items), | 110 | .errors = try p.arena.dupe(ErrorMessage, p.errors.items), |
| 108 | .arena_state = arena_instance.state, | 111 | .arena_state = arena_instance.state, |
| 109 | }; | 112 | }; |
| ... | @@ -160,6 +163,7 @@ const Parse = struct { | ... | @@ -160,6 +163,7 @@ const Parse = struct { |
| 160 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), | 163 | dependencies: std.StringArrayHashMapUnmanaged(Dependency), |
| 161 | paths: std.StringArrayHashMapUnmanaged(void), | 164 | paths: std.StringArrayHashMapUnmanaged(void), |
| 162 | allow_missing_paths_field: bool, | 165 | allow_missing_paths_field: bool, |
| | 166 | minimum_zig_version: ?std.SemanticVersion, |
| 163 | | 167 | |
| 164 | const InnerError = error{ ParseFailure, OutOfMemory }; | 168 | const InnerError = error{ ParseFailure, OutOfMemory }; |
| 165 | | 169 | |
| ... | @@ -198,6 +202,12 @@ const Parse = struct { | ... | @@ -198,6 +202,12 @@ const Parse = struct { |
| 198 | break :v undefined; | 202 | break :v undefined; |
| 199 | }; | 203 | }; |
| 200 | have_version = true; | 204 | have_version = true; |
| | 205 | } else if (mem.eql(u8, field_name, "minimum_zig_version")) { |
| | 206 | const version_text = try parseString(p, field_init); |
| | 207 | p.minimum_zig_version = std.SemanticVersion.parse(version_text) catch |err| v: { |
| | 208 | try appendError(p, main_tokens[field_init], "unable to parse semantic version: {s}", .{@errorName(err)}); |
| | 209 | break :v null; |
| | 210 | }; |
| 201 | } else { | 211 | } else { |
| 202 | // Ignore unknown fields so that we can add fields in future zig | 212 | // Ignore unknown fields so that we can add fields in future zig |
| 203 | // versions without breaking older zig versions. | 213 | // versions without breaking older zig versions. |
| ... | @@ -545,6 +555,7 @@ test "basic" { | ... | @@ -545,6 +555,7 @@ test "basic" { |
| 545 | var manifest = try Manifest.parse(gpa, ast); | 555 | var manifest = try Manifest.parse(gpa, ast); |
| 546 | defer manifest.deinit(gpa); | 556 | defer manifest.deinit(gpa); |
| 547 | | 557 | |
| | 558 | try testing.expect(manifest.errors.len == 0); |
| 548 | try testing.expectEqualStrings("foo", manifest.name); | 559 | try testing.expectEqualStrings("foo", manifest.name); |
| 549 | | 560 | |
| 550 | try testing.expectEqual(@as(std.SemanticVersion, .{ | 561 | try testing.expectEqual(@as(std.SemanticVersion, .{ |
| ... | @@ -563,4 +574,62 @@ test "basic" { | ... | @@ -563,4 +574,62 @@ test "basic" { |
| 563 | "1220f1b680b6065fcfc94fe777f22e73bcb7e2767e5f4d99d4255fe76ded69c7a35f", | 574 | "1220f1b680b6065fcfc94fe777f22e73bcb7e2767e5f4d99d4255fe76ded69c7a35f", |
| 564 | manifest.dependencies.values()[0].hash orelse return error.TestFailed, | 575 | manifest.dependencies.values()[0].hash orelse return error.TestFailed, |
| 565 | ); | 576 | ); |
| | 577 | |
| | 578 | try testing.expect(manifest.minimum_zig_version == null); |
| | 579 | } |
| | 580 | |
| | 581 | test "minimum_zig_version" { |
| | 582 | const gpa = testing.allocator; |
| | 583 | |
| | 584 | const example = |
| | 585 | \\.{ |
| | 586 | \\ .name = "foo", |
| | 587 | \\ .version = "3.2.1", |
| | 588 | \\ .minimum_zig_version = "0.11.1", |
| | 589 | \\} |
| | 590 | ; |
| | 591 | |
| | 592 | var ast = try std.zig.Ast.parse(gpa, example, .zon); |
| | 593 | defer ast.deinit(gpa); |
| | 594 | |
| | 595 | try testing.expect(ast.errors.len == 0); |
| | 596 | |
| | 597 | var manifest = try Manifest.parse(gpa, ast); |
| | 598 | defer manifest.deinit(gpa); |
| | 599 | |
| | 600 | try testing.expect(manifest.errors.len == 0); |
| | 601 | try testing.expect(manifest.dependencies.count() == 0); |
| | 602 | |
| | 603 | try testing.expect(manifest.minimum_zig_version != null); |
| | 604 | |
| | 605 | try testing.expectEqual(@as(std.SemanticVersion, .{ |
| | 606 | .major = 0, |
| | 607 | .minor = 11, |
| | 608 | .patch = 1, |
| | 609 | }), manifest.minimum_zig_version.?); |
| | 610 | } |
| | 611 | |
| | 612 | test "minimum_zig_version - invalid version" { |
| | 613 | const gpa = testing.allocator; |
| | 614 | |
| | 615 | const example = |
| | 616 | \\.{ |
| | 617 | \\ .name = "foo", |
| | 618 | \\ .version = "3.2.1", |
| | 619 | \\ .minimum_zig_version = "X.11.1", |
| | 620 | \\} |
| | 621 | ; |
| | 622 | |
| | 623 | var ast = try std.zig.Ast.parse(gpa, example, .zon); |
| | 624 | defer ast.deinit(gpa); |
| | 625 | |
| | 626 | try testing.expect(ast.errors.len == 0); |
| | 627 | |
| | 628 | var manifest = try Manifest.parse(gpa, ast); |
| | 629 | defer manifest.deinit(gpa); |
| | 630 | |
| | 631 | try testing.expect(manifest.errors.len == 1); |
| | 632 | try testing.expect(manifest.dependencies.count() == 0); |
| | 633 | |
| | 634 | try testing.expect(manifest.minimum_zig_version == null); |
| 566 | } | 635 | } |