mirror of
https://github.com/l0ng-ai/tty7.git
synced 2026-09-22 08:02:24 +00:00
The panel picks a free name, downloads to a sibling temp, then renames onto it — and `rename` replaces whatever it lands on without a word. The gap between choosing the name and arriving at it is the whole transfer, and `~/Downloads` is a directory a browser, another tool, or the user writes to as well. `claimed_downloads` closes that gap against tty7 racing itself and can say nothing about anyone else, so the comment that numbering the second copy means a download "cannot lose a file" was true only of tty7's own copies. Now the rename is refused if anything is sitting there. That costs a retry, which numbers the file the way a second download already does, so the promise holds. Still a check before an act — nothing portable makes rename refuse an occupied name — but the window goes from a whole transfer to the moment either side of one line. `symlink_metadata`, not `metadata`: the latter follows a link, finds nothing, and calls a dangling symlink a free name — and the rename would then destroy a link the user made. The two read as interchangeable, so there is a test for that case specifically. The download itself has no harness here — it needs a live `SftpSession`, and this module's tests cover pure helpers — so the guard is carried by that predicate test and the compiler, not by an end-to-end run.