diff --git a/build.zig b/build.zig index 4fba3dc9..5aa44660 100644 --- a/build.zig +++ b/build.zig @@ -46,8 +46,12 @@ pub fn build(b: *Build) !void { var stdout = std.fs.File.stdout().writer(&.{}); try stdout.interface.print("Lightpanda {f}\n", .{version}); + const version_string = b.fmt("{f}", .{version}); + const version_encoded = std.mem.replaceOwned(u8, b.allocator, version_string, "+", "%2B") catch @panic("OOM"); + var opts = b.addOptions(); - opts.addOption([]const u8, "version", b.fmt("{f}", .{version})); + opts.addOption([]const u8, "version", version_string); + opts.addOption([]const u8, "version_encoded", version_encoded); opts.addOption(?[]const u8, "snapshot_path", snapshot_path); const enable_tsan = b.option(bool, "tsan", "Enable Thread Sanitizer") orelse false; diff --git a/src/crash_handler.zig b/src/crash_handler.zig index b6dd6b78..8fe8d37b 100644 --- a/src/crash_handler.zig +++ b/src/crash_handler.zig @@ -47,7 +47,7 @@ pub noinline fn crash( writer.print("\nreason: {s}\n", .{reason}) catch abort(); writer.print("OS: {s}\n", .{@tagName(builtin.os.tag)}) catch abort(); writer.print("mode: {s}\n", .{@tagName(builtin.mode)}) catch abort(); - writer.print("version: {s}\n", .{lp.build_config.version}) catch abort(); + writer.print("version: {s}\n", .{lp.build_config.version_encoded}) catch abort(); inline for (@typeInfo(@TypeOf(args)).@"struct".fields) |f| { writer.writeAll(f.name ++ ": ") catch break; @import("log.zig").writeValue(.pretty, @field(args, f.name), writer) catch abort(); @@ -86,7 +86,15 @@ fn report(reason: []const u8, begin_addr: usize, args: anytype) !void { var url_buffer: [4096]u8 = undefined; const url = blk: { var writer: std.Io.Writer = .fixed(&url_buffer); - try writer.print("https://crash.lightpanda.io/c?v={s}&r=", .{lp.build_config.version}); + try writer.writeAll("https://crash.lightpanda.io/c?v="); + for (lp.build_config.version) |b| { + if (b == '+') { + try writer.writeAll("%2B"); + } else { + try writer.writeByte(b); + } + } + try writer.writeAll("&r="); for (reason) |b| { switch (b) { 'A'...'Z', 'a'...'z', '0'...'9', '-', '.', '_' => try writer.writeByte(b),