summaryrefslogtreecommitdiff
path: root/src/pardes.zig
diff options
context:
space:
mode:
authorGabriel Schneider <[email protected]>2026-09-29 09:03:41 -0300
committerGabriel Schneider <[email protected]>2026-10-01 00:12:16 -0300
commit78d6f64e72be2a22c40feaf012636bc8f04d46de (patch)
treeae2f5828eb32f78e1536a75235706828067e6e0b /src/pardes.zig
parent039ae6aa70d963f942d8a5747060c67599664af9 (diff)
downloadpardes-78d6f64e72be2a22c40feaf012636bc8f04d46de.tar.gz
pardes-78d6f64e72be2a22c40feaf012636bc8f04d46de.zip
A shell given a directory is not taken to be in this process's before it has spoken, so it logs no rename to the session's and back
Each host read /proc/<pid>/cwd right after forking the shell and at every frame after; before the shell's chdir that says this process's directory, a rename to it, then the real one a frame later, a rename back. A shell given a directory is named by it already (newShell) and is no longer asked at fork; and until it has printed anything, an answer naming this process's directory is not taken. Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'src/pardes.zig')
-rw-r--r--src/pardes.zig6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/pardes.zig b/src/pardes.zig
index c6e68517..24595045 100644
--- a/src/pardes.zig
+++ b/src/pardes.zig
@@ -4999,6 +4999,11 @@ pub const Pardes = struct {
else => "",
};
if (std.mem.eql(u8, cur, cwd)) return;
+ // A shell started in a directory is asked where it is before it has
+ // said anything: its chdir may not have happened yet, and the answer
+ // is this process's directory, a rename to undo. That answer, then,
+ // is not taken.
+ if (pane.isTerminal() and !pane.shell_spoke and pane.cwd == .owned and std.mem.eql(u8, cwd, p.sessionDir())) return;
pane.setOwnedCwd(cwd) catch |err| return p.reportError(id, "directory", err);
if (look.lookHoverPane(p) == id) look.cancelLookHover(p);
// A terminal is named by its directory, so /log hears it renamed; one
@@ -5560,6 +5565,7 @@ pub const Pardes = struct {
},
.output => |o| {
const pane = p.panes[o.pane] orelse return;
+ pane.shell_spoke = true;
ctlfs.events.notePtyOutput(p, o.pane, o.bytes);
panes.Terminal.feedOutput(p, pane, o.bytes);
ctlfs.pty.noteMarks(p, o.pane, pane);