From 1882ff95e7aefcb4059f669d1ef6d92906831a77 Mon Sep 17 00:00:00 2001 From: DraagrenKirneh Date: Thu, 13 Apr 2023 15:52:28 +0200 Subject: [PATCH 1/3] Package.Manifest: add minimum_zig_version field --- src/Package/Manifest.zig | 69 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 69 insertions(+) diff --git a/src/Package/Manifest.zig b/src/Package/Manifest.zig index 36b2149422..938b945138 100644 --- a/src/Package/Manifest.zig +++ b/src/Package/Manifest.zig @@ -57,6 +57,7 @@ name: []const u8, version: std.SemanticVersion, dependencies: std.StringArrayHashMapUnmanaged(Dependency), paths: std.StringArrayHashMapUnmanaged(void), +minimum_zig_version: ?std.SemanticVersion, errors: []ErrorMessage, arena_state: std.heap.ArenaAllocator.State, @@ -87,6 +88,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani .dependencies = .{}, .paths = .{}, .allow_missing_paths_field = options.allow_missing_paths_field, + .minimum_zig_version = null, .buf = .{}, }; defer p.buf.deinit(gpa); @@ -104,6 +106,7 @@ pub fn parse(gpa: Allocator, ast: std.zig.Ast, options: ParseOptions) Error!Mani .version = p.version, .dependencies = try p.dependencies.clone(p.arena), .paths = try p.paths.clone(p.arena), + .minimum_zig_version = p.minimum_zig_version, .errors = try p.arena.dupe(ErrorMessage, p.errors.items), .arena_state = arena_instance.state, }; @@ -160,6 +163,7 @@ const Parse = struct { dependencies: std.StringArrayHashMapUnmanaged(Dependency), paths: std.StringArrayHashMapUnmanaged(void), allow_missing_paths_field: bool, + minimum_zig_version: ?std.SemanticVersion, const InnerError = error{ ParseFailure, OutOfMemory }; @@ -198,6 +202,12 @@ const Parse = struct { break :v undefined; }; have_version = true; + } else if (mem.eql(u8, field_name, "minimum_zig_version")) { + const version_text = try parseString(p, field_init); + p.minimum_zig_version = std.SemanticVersion.parse(version_text) catch |err| v: { + try appendError(p, main_tokens[field_init], "unable to parse semantic version: {s}", .{@errorName(err)}); + break :v null; + }; } else { // Ignore unknown fields so that we can add fields in future zig // versions without breaking older zig versions. @@ -545,6 +555,7 @@ test "basic" { var manifest = try Manifest.parse(gpa, ast); defer manifest.deinit(gpa); + try testing.expect(manifest.errors.len == 0); try testing.expectEqualStrings("foo", manifest.name); try testing.expectEqual(@as(std.SemanticVersion, .{ @@ -563,4 +574,62 @@ test "basic" { "1220f1b680b6065fcfc94fe777f22e73bcb7e2767e5f4d99d4255fe76ded69c7a35f", manifest.dependencies.values()[0].hash orelse return error.TestFailed, ); + + try testing.expect(manifest.minimum_zig_version == null); +} + +test "minimum_zig_version" { + const gpa = testing.allocator; + + const example = + \\.{ + \\ .name = "foo", + \\ .version = "3.2.1", + \\ .minimum_zig_version = "0.11.1", + \\} + ; + + var ast = try std.zig.Ast.parse(gpa, example, .zon); + defer ast.deinit(gpa); + + try testing.expect(ast.errors.len == 0); + + var manifest = try Manifest.parse(gpa, ast); + defer manifest.deinit(gpa); + + try testing.expect(manifest.errors.len == 0); + try testing.expect(manifest.dependencies.count() == 0); + + try testing.expect(manifest.minimum_zig_version != null); + + try testing.expectEqual(@as(std.SemanticVersion, .{ + .major = 0, + .minor = 11, + .patch = 1, + }), manifest.minimum_zig_version.?); +} + +test "minimum_zig_version - invalid version" { + const gpa = testing.allocator; + + const example = + \\.{ + \\ .name = "foo", + \\ .version = "3.2.1", + \\ .minimum_zig_version = "X.11.1", + \\} + ; + + var ast = try std.zig.Ast.parse(gpa, example, .zon); + defer ast.deinit(gpa); + + try testing.expect(ast.errors.len == 0); + + var manifest = try Manifest.parse(gpa, ast); + defer manifest.deinit(gpa); + + try testing.expect(manifest.errors.len == 1); + try testing.expect(manifest.dependencies.count() == 0); + + try testing.expect(manifest.minimum_zig_version == null); } From 777af14b57c65a28da488a3aa0cdf91affd3deec Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 18 Oct 2023 18:55:14 -0700 Subject: [PATCH 2/3] Package.Manifest: fix bitrotted unit tests --- src/Package/Manifest.zig | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Package/Manifest.zig b/src/Package/Manifest.zig index 938b945138..c634d8fe3e 100644 --- a/src/Package/Manifest.zig +++ b/src/Package/Manifest.zig @@ -538,6 +538,7 @@ test "basic" { \\.{ \\ .name = "foo", \\ .version = "3.2.1", + \\ .paths = .{""}, \\ .dependencies = .{ \\ .bar = .{ \\ .url = "https://example.com/baz.tar.gz", @@ -552,7 +553,7 @@ test "basic" { try testing.expect(ast.errors.len == 0); - var manifest = try Manifest.parse(gpa, ast); + var manifest = try Manifest.parse(gpa, ast, .{}); defer manifest.deinit(gpa); try testing.expect(manifest.errors.len == 0); @@ -568,7 +569,7 @@ test "basic" { try testing.expectEqualStrings("bar", manifest.dependencies.keys()[0]); try testing.expectEqualStrings( "https://example.com/baz.tar.gz", - manifest.dependencies.values()[0].url, + manifest.dependencies.values()[0].location.url, ); try testing.expectEqualStrings( "1220f1b680b6065fcfc94fe777f22e73bcb7e2767e5f4d99d4255fe76ded69c7a35f", @@ -585,6 +586,7 @@ test "minimum_zig_version" { \\.{ \\ .name = "foo", \\ .version = "3.2.1", + \\ .paths = .{""}, \\ .minimum_zig_version = "0.11.1", \\} ; @@ -594,7 +596,7 @@ test "minimum_zig_version" { try testing.expect(ast.errors.len == 0); - var manifest = try Manifest.parse(gpa, ast); + var manifest = try Manifest.parse(gpa, ast, .{}); defer manifest.deinit(gpa); try testing.expect(manifest.errors.len == 0); @@ -617,6 +619,7 @@ test "minimum_zig_version - invalid version" { \\ .name = "foo", \\ .version = "3.2.1", \\ .minimum_zig_version = "X.11.1", + \\ .paths = .{""}, \\} ; @@ -625,7 +628,7 @@ test "minimum_zig_version - invalid version" { try testing.expect(ast.errors.len == 0); - var manifest = try Manifest.parse(gpa, ast); + var manifest = try Manifest.parse(gpa, ast, .{}); defer manifest.deinit(gpa); try testing.expect(manifest.errors.len == 1); From b795925ee421cb7d12eed37e98ceb2dacce6a729 Mon Sep 17 00:00:00 2001 From: Andrew Kelley Date: Wed, 18 Oct 2023 18:55:25 -0700 Subject: [PATCH 3/3] doc: add minimum_zig_version field reference --- doc/build.zig.zon.md | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/doc/build.zig.zon.md b/doc/build.zig.zon.md index 7d1af4f678..2aaac3af3f 100644 --- a/doc/build.zig.zon.md +++ b/doc/build.zig.zon.md @@ -24,6 +24,15 @@ Struct. Each dependency must either provide a `url` and `hash`, or a `path`. +### `minimum_zig_version` + +String. Optional. + +[semver](https://semver.org/) + +This is currently advisory only; the compiler does does not yet do anything +with this version. + #### `url` String.