diff options
| author | Gabriel Schneider <[email protected]> | 2026-10-01 20:50:48 -0300 |
|---|---|---|
| committer | Gabriel Schneider <[email protected]> | 2026-10-01 22:07:48 -0300 |
| commit | 406f483288c7689bdd2e1f3f68b276c61ca9412a (patch) | |
| tree | b6398fb9974b91441563fd655d18ddaf182a2a5a /test/fs.py | |
| parent | b55cb01d2777760ed79b545dfca7115837591577 (diff) | |
| download | pardes-406f483288c7689bdd2e1f3f68b276c61ca9412a.tar.gz pardes-406f483288c7689bdd2e1f3f68b276c61ca9412a.zip | |
An Edit's held write: < | > commands no longer block their 9P connection (answered like a held read, so a status read or a filter reading the session's own mount runs beside it), a Tflush or hang-up of the write kills the commands' process groups and changes nothing; e loads by Get's way (asked once, clean after, undo puts the name back); ~ in e r w f B; B checks every name first; an Edit that runs commands is a write of its own, refused up front with other lines; Edit's +Errors output keeps the keyboard where it was; X goes in pane order; a refused write open says its errno; the reference's Coming from acme rows say what Get file's undo, failure and directory refusal, Putall's answer, Zerox across Dump and Incl's directories now do
Co-Authored-By: Claude Opus 5.5 <[email protected]>
Diffstat (limited to 'test/fs.py')
| -rw-r--r-- | test/fs.py | 31 |
1 files changed, 31 insertions, 0 deletions
@@ -1085,6 +1085,37 @@ def edit_commands(binary): assert time.monotonic() - began < .5 and not done.is_set(), 'the editor waited on the command' worker.join(timeout=15) assert done.is_set() + # On the same connection: the Edit's write is held, and a read sent + # after it is answered first; a Tflush of it stops it, changes + # nothing, and frees the way for the next Edit. + def send(kind, tag, payload): + client.socket.sendall(struct.pack('<IBH', 7 + len(payload), kind, tag) + payload) + + def answer(): + size, kind, tag = struct.unpack('<IBH', client.receive(7)) + return kind, tag, client.receive(size - 7) + ctl = client.open(f'/pane/{a}/ctl', 1) + status = client.open('/status', 0) + line = b'Edit , | sleep 1; cat\n' + began = time.monotonic() + send(118, 900, struct.pack('<IQI', ctl, 0, len(line)) + line) + send(116, 901, struct.pack('<IQI', status, 0, 4096)) + first = answer() + assert first[1] == 901 and first[0] == 117 and time.monotonic() - began < .5, (first[:2], time.monotonic() - began) + second = answer() + assert second[1] == 900 and second[0] == 119, second + line = b'Edit , | sleep 5; tr a-z A-Z\n' + send(118, 902, struct.pack('<IQI', ctl, 0, len(line)) + line) + time.sleep(.3) + send(108, 903, struct.pack('<H', 902)) + tags = sorted(answer()[1] for _ in range(2)) + assert tags == [902, 903], tags + client.close(ctl) + client.close(status) + time.sleep(1) + client.write(f'/pane/{a}/ctl', b'Edit , | cat\n') + time.sleep(4.5) + assert client.read(f'/pane/{a}/body') == b'APPLE\nFIG\nPEAR\n', client.read(f'/pane/{a}/body') # X: each open file whose line matches; w writes it. client.write(f'/pane/{a}/ctl', b'Edit X/b\\.txt$/ ,s/apple/APPLE/\n') assert client.read(f'/pane/{b}/body') == b'APPLE pie\n' |
