From 6373399e59dcb597a95e104c1378b5379b87c7bf Mon Sep 17 00:00:00 2001 From: Leah Amelia Chen Date: Fri, 28 Feb 2025 22:31:12 +0100 Subject: [PATCH] os: deprioritize GHOSTTY_RESOURCES_DIR for debug builds When one develops Ghostty while using Ghostty it could lead to an interesting conundrum: the freshly built Ghostty would use the parent Ghostty's resources, which would be stale and not reflect any new changes to resources. This is especially bad for translators, since their translations would not be reflected in the newly built Ghostty if they happen to run it under older Ghostty, which is not only counterintuitive and also painful in terms of workflow. Now, on debug builds we always try to use the terminfo detection method first in order to locate the zig-out/share/ghostty folder, and only fall back to GHOSTTY_RESOURCES_DIR if the executable is for some reason no longer in zig-out. You can test this behavior by manually moving the Ghostty executable out of zig-out, and then launching it with and without Ghostty. --- src/os/resourcesdir.zig | 31 +++++++++++++++++++++++++------ 1 file changed, 25 insertions(+), 6 deletions(-) diff --git a/src/os/resourcesdir.zig b/src/os/resourcesdir.zig index 4ef256c1ac..ae7c33bc38 100644 --- a/src/os/resourcesdir.zig +++ b/src/os/resourcesdir.zig @@ -9,14 +9,22 @@ const Allocator = std.mem.Allocator; /// This is highly Ghostty-specific and can likely be generalized at /// some point but we can cross that bridge if we ever need to. pub fn resourcesDir(alloc: std.mem.Allocator) !?[]const u8 { - // If we have an environment variable set, we always use that. + // Use the GHOSTTY_RESOURCES_DIR environment variable in release builds. + // + // In debug builds we try using terminfo detection first instead, since + // if debug Ghostty is launched by an older version of Ghostty, it + // would inherit the old, stale resources of older Ghostty instead of the + // freshly built ones under zig-out/share/ghostty. + // // Note: we ALWAYS want to allocate here because the result is always // freed, do not try to use internal_os.getenv or posix getenv. - if (std.process.getEnvVarOwned(alloc, "GHOSTTY_RESOURCES_DIR")) |dir| { - if (dir.len > 0) return dir; - } else |err| switch (err) { - error.EnvironmentVariableNotFound => {}, - else => return err, + if (comptime builtin.mode != .Debug) { + if (std.process.getEnvVarOwned(alloc, "GHOSTTY_RESOURCES_DIR")) |dir| { + if (dir.len > 0) return dir; + } else |err| switch (err) { + error.EnvironmentVariableNotFound => {}, + else => return err, + } } // This is the sentinel value we look for in the path to know @@ -52,6 +60,17 @@ pub fn resourcesDir(alloc: std.mem.Allocator) !?[]const u8 { } } + // If terminfo detection failed in debug builds (somehow), + // fallback and use the provided resources dir. + if (comptime builtin.mode == .Debug) { + if (std.process.getEnvVarOwned(alloc, "GHOSTTY_RESOURCES_DIR")) |dir| { + if (dir.len > 0) return dir; + } else |err| switch (err) { + error.EnvironmentVariableNotFound => {}, + else => return err, + } + } + return null; }