diff --git a/src/main.zig b/src/main.zig index 0e704f4..2497ccc 100644 --- a/src/main.zig +++ b/src/main.zig @@ -34,13 +34,13 @@ pub fn main(init: process.Init) !void { }); defer fern.deinit(); + var rev_buf: [0x80]u8 = undefined; if (!maivi.dev) - maivi.rev = init.environ_map.get("MAIVI_REV") orelse rev_str(init.io, init.gpa, config.root) catch |e| + maivi.rev = init.environ_map.get("MAIVI_REV") orelse rev_str(init.io, &rev_buf, config.root) catch |e| blk: { fern.warn().msg("version info cannot be retrieved from git. version must be provided using MAIVI_REV").err(e).log(); break :blk null; }; - defer if (maivi.rev) |rev| init.gpa.free(rev); try maivi.init(init.io, init.gpa, &config); defer maivi.deinit(); @@ -57,12 +57,12 @@ pub fn main(init: process.Init) !void { try maivi.listen(); } -fn rev_str(io: Io, gpa: Allocator, root: []const u8) ![]const u8 { +fn rev_str(io: Io, buf: []u8, root: []const u8) ![]const u8 { if (!process.can_spawn) { return error.NoChildProcess; } - const rev = try spawn(io, gpa, &[_][]const u8{ + const rev = try spawn(io, buf, &[_][]const u8{ "git", "-C", root, // affects the --git-dir argument "--git-dir", ".git", // affected by the -C argument @@ -72,7 +72,7 @@ fn rev_str(io: Io, gpa: Allocator, root: []const u8) ![]const u8 { return std.mem.trim(u8, rev, std.ascii.whitespace[0..]); } -fn spawn(io: Io, gpa: Allocator, argv: []const []const u8) ![]const u8 { +fn spawn(io: Io, buf: []u8, argv: []const []const u8) ![]u8 { var child = try process.spawn(io, .{ .argv = argv, .stdin = .ignore, @@ -81,19 +81,17 @@ fn spawn(io: Io, gpa: Allocator, argv: []const []const u8) ![]const u8 { }); errdefer child.kill(io); - var stdout_reader = child.stdout.?.readerStreaming(io, &.{}); - const stdout = stdout_reader.interface.allocRemaining(gpa, .limited(0x80)) catch return error.ReadFailure; - errdefer gpa.free(stdout); + var rbuf: [0x80]u8 = undefined; + var stdout_reader = child.stdout.?.readerStreaming(io, &rbuf); + const n = try stdout_reader.interface.readSliceShort(buf); const term = try child.wait(io); - switch (term) { - .exited => |code| { - if (code != 0) { - return error.ExitCodeFailure; - } - return stdout; - }, - .signal, .stopped => return error.ProcessTerminated, - .unknown => return error.ProcessTerminated, - } + return switch (term) { + .exited => |code| if (code != 0) + error.ExitCodeFailure + else + return buf[0..n], + .signal, .stopped => error.ProcessTerminated, + .unknown => error.ProcessTerminated, + }; }