fix: instead of overriding MANPATHs set by OS, append to them

Quoting `man man`:

>  If MANPATH begins with a colon, it is appended to the default list;

Alternatively we can think about:

> if it ends with a colon, it is prepended to the default list;

To take preference over existing values, but that shouldn't be really a
problem, as there rather isn't much of another projects named `ghostty`.
This commit is contained in:
Łukasz Niemier
2024-07-19 00:36:42 +02:00
parent bf2450479e
commit 255e50124c
2 changed files with 18 additions and 11 deletions

View File

@ -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,

View File

@ -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),
);
}
}