diff --git a/src/os/env.zig b/src/os/env.zig index 1c2270337..b9ebcc9c8 100644 --- a/src/os/env.zig +++ b/src/os/env.zig @@ -20,6 +20,16 @@ pub fn appendEnv( if (current.len == 0) return try alloc.dupe(u8, value); // Otherwise we must prefix. + return try appendEnvAlways(alloc, current, value); +} + +/// Always append value to environment, even when it is empty. +/// The returned value is always allocated so it must be freed. +pub fn appendEnvAlways( + alloc: Allocator, + current: []const u8, + value: []const u8, +) ![]u8 { return try std.fmt.allocPrint(alloc, "{s}{s}{s}", .{ current, PATH_SEP, diff --git a/src/termio/Exec.zig b/src/termio/Exec.zig index 65607c67f..69c139563 100644 --- a/src/termio/Exec.zig +++ b/src/termio/Exec.zig @@ -648,17 +648,14 @@ const Subprocess = struct { break :man; }; - if (env.get("MANPATH")) |manpath| { - // Append to the existing MANPATH. It's very unlikely that our bundle's - // resources directory already appears here so we don't spend the time - // searching for it. - try env.put( - "MANPATH", - try internal_os.appendEnv(alloc, manpath, dir), - ); - } else { - try env.put("MANPATH", dir); - } + const manpath = env.get("MANPATH") orelse ""; + // Always append with colon in front, as it mean that if + // `MANPATH` is empty, then it should be treated as an extra + // path instead of overriding all paths set by OS. + try env.put( + "MANPATH", + try internal_os.appendEnvAlways(alloc, manpath, dir), + ); } }