diff options
| author | Krzysztof Wolicki <der.teufel.mail@gmail.com> | 2024-09-24 22:38:13 +0200 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-09-24 13:38:13 -0700 |
| commit | 4d09fb491f1a2e3c4404807c5f4b2c2e114f911b (patch) | |
| tree | 24a448890700074276eb75159ea3fc7c5a33b9d7 /src | |
| parent | 5e4da1ff30d673d96809497e9bce555edef813a7 (diff) | |
| download | zig-4d09fb491f1a2e3c4404807c5f4b2c2e114f911b.tar.gz zig-4d09fb491f1a2e3c4404807c5f4b2c2e114f911b.zip | |
fetch: fix mutating unrelated fields when saving (#19816)
closes #19725
Diffstat (limited to 'src')
| -rw-r--r-- | src/Package/Manifest.zig | 7 | ||||
| -rw-r--r-- | src/main.zig | 15 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/Package/Manifest.zig b/src/Package/Manifest.zig index eb82ef039d..4eed6cc386 100644 --- a/src/Package/Manifest.zig +++ b/src/Package/Manifest.zig @@ -18,8 +18,10 @@ pub const MultiHashHexDigest = [multihash_hex_digest_len]u8; pub const Dependency = struct { location: Location, location_tok: Ast.TokenIndex, + location_node: Ast.Node.Index, hash: ?[]const u8, hash_tok: Ast.TokenIndex, + hash_node: Ast.Node.Index, node: Ast.Node.Index, name_tok: Ast.TokenIndex, lazy: bool, @@ -293,8 +295,10 @@ const Parse = struct { var dep: Dependency = .{ .location = undefined, .location_tok = 0, + .location_node = undefined, .hash = null, .hash_tok = 0, + .hash_node = undefined, .node = node, .name_tok = 0, .lazy = false, @@ -320,6 +324,7 @@ const Parse = struct { }; has_location = true; dep.location_tok = main_tokens[field_init]; + dep.location_node = field_init; } else if (mem.eql(u8, field_name, "path")) { if (has_location) { return fail(p, main_tokens[field_init], "dependency should specify only one of 'url' and 'path' fields.", .{}); @@ -332,12 +337,14 @@ const Parse = struct { }; has_location = true; dep.location_tok = main_tokens[field_init]; + dep.location_node = field_init; } else if (mem.eql(u8, field_name, "hash")) { dep.hash = parseHash(p, field_init) catch |err| switch (err) { error.ParseFailure => continue, else => |e| return e, }; dep.hash_tok = main_tokens[field_init]; + dep.hash_node = field_init; } else if (mem.eql(u8, field_name, "lazy")) { dep.lazy = parseBool(p, field_init) catch |err| switch (err) { error.ParseFailure => continue, diff --git a/src/main.zig b/src/main.zig index 95f1ad569b..3e7813019e 100644 --- a/src/main.zig +++ b/src/main.zig @@ -7214,8 +7214,21 @@ fn cmdFetch( .path => {}, } } + + const location_replace = try std.fmt.allocPrint( + arena, + "\"{}\"", + .{std.zig.fmtEscapes(path_or_url)}, + ); + const hash_replace = try std.fmt.allocPrint( + arena, + "\"{}\"", + .{std.zig.fmtEscapes(&hex_digest)}, + ); + warn("overwriting existing dependency named '{s}'", .{name}); - try fixups.replace_nodes_with_string.put(gpa, dep.node, new_node_init); + try fixups.replace_nodes_with_string.put(gpa, dep.location_node, location_replace); + try fixups.replace_nodes_with_string.put(gpa, dep.hash_node, hash_replace); } else if (manifest.dependencies.count() > 0) { // Add fixup for adding another dependency. const deps = manifest.dependencies.values(); |
