authorgravatar for h_n91@hotmail.comDraagrenKirneh <h_n91@hotmail.com> 2023-04-13 15:52:28+02:00
committergravatar for andrew@ziglang.orgAndrew Kelley <andrew@ziglang.org> 2023-10-18 18:58:58-07:00
log1882ff95e7aefcb4059f669d1ef6d92906831a77
tree7fe9459482af4e953b22840559038882d35be773
parent1bbe521074727e0ac474413aa23fa1f6121c577c

Package.Manifest: add minimum_zig_version field


1 files changed, 69 insertions(+), 0 deletions(-)

src/Package/Manifest.zig+69
......@@ -57,6 +57,7 @@ name: []const u8,
5757version: std.SemanticVersion,
5858dependencies: std.StringArrayHashMapUnmanaged(Dependency),
5959paths: std.StringArrayHashMapUnmanaged(void),
60minimum_zig_version: ?std.SemanticVersion,
6061
6162errors: []ErrorMessage,
6263arena_state: std.heap.ArenaAllocator.State,
......@@ -87,6 +88,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani
8788 .dependencies = .{},
8889 .paths = .{},
8990 .allow_missing_paths_field = options.allow_missing_paths_field,
91 .minimum_zig_version = null,
9092 .buf = .{},
9193 };
9294 defer p.buf.deinit(gpa);
......@@ -104,6 +106,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani
104106 .version = p.version,
105107 .dependencies = try p.dependencies.clone(p.arena),
106108 .paths = try p.paths.clone(p.arena),
109 .minimum_zig_version = p.minimum_zig_version,
107110 .errors = try p.arena.dupe(ErrorMessage, p.errors.items),
108111 .arena_state = arena_instance.state,
109112 };
......@@ -160,6 +163,7 @@ const Parse = struct {
160163 dependencies: std.StringArrayHashMapUnmanaged(Dependency),
161164 paths: std.StringArrayHashMapUnmanaged(void),
162165 allow_missing_paths_field: bool,
166 minimum_zig_version: ?std.SemanticVersion,
163167
164168 const InnerError = error{ ParseFailure, OutOfMemory };
165169
......@@ -198,6 +202,12 @@ const Parse = struct {
198202 break :v undefined;
199203 };
200204 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 };
201211 } else {
202212 // Ignore unknown fields so that we can add fields in future zig
203213 // versions without breaking older zig versions.
......@@ -545,6 +555,7 @@ test "basic" {
545555 var manifest = try Manifest.parse(gpa, ast);
546556 defer manifest.deinit(gpa);
547557
558 try testing.expect(manifest.errors.len == 0);
548559 try testing.expectEqualStrings("foo", manifest.name);
549560
550561 try testing.expectEqual(@as(std.SemanticVersion, .{
......@@ -563,4 +574,62 @@ test "basic" {
563574 "1220f1b680b6065fcfc94fe777f22e73bcb7e2767e5f4d99d4255fe76ded69c7a35f",
564575 manifest.dependencies.values()[0].hash orelse return error.TestFailed,
565576 );
577
578 try testing.expect(manifest.minimum_zig_version == null);
579}
580
581test "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
612test "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);
566635}