• exec/load/door_deploy.js src/doors/syncretro/deploy.js

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Tue Jul 14 21:04:15 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/9ba41ffc77430e157543bb0d
    Modified Files:
    exec/load/door_deploy.js src/doors/syncretro/deploy.js
    Log Message:
    syncretro: deploy to the live install only (no double pass)

    The "deploy to the live install only" fix that stopped the sibling doors double-addressing one directory landed in door_deploy()'s destination
    logic -- and SyncRetro does not use it. SyncRetro uses door_deploy.js for
    the COPY (door_deploy_file's content-hash guard) and the target token, but
    one binary serves N console dirs found by scanning, not one xtrn/<door>
    named by a spec, so it carries its own destination logic. That logic still scanned BOTH the in-tree bundle (<checkout>/xtrn/) and the live install (<ctrl>/../xtrn/).

    On the recommended install (install-sbbs.mk SYMLINK=1) the live xtrn IS a symlink to the repo's, so those two scans address ONE directory, and the
    guard meant to collapse them cannot see it: fullpath() normalizes a path
    but does not resolve it, so a symlink and its target never compare equal,
    and Synchronet's JS has no stat() to compare inodes with. The second pass
    then found the bytes the first had just written and printed "already this
    build -- nothing to copy" directly after "Deployed" -- a contradiction precisely when a sysop is checking whether their build landed. Reported by Accession.

    So scan the live install, full stop; fall back to the in-tree bundle only
    when no console is installed there (a bare checkout for packaging/CI), and
    say so. Same reasoning and same fix as door_deploy(). Where live and
    checkout are genuinely two directories (a copy install), the in-tree copy
    was pointless anyway -- nothing launches from the checkout.

    Also normalize the "already this build" line in door_deploy.js to print fullpath(dst): it was showing the raw <ctrl>/../xtrn/... form beside a normalized "Deployed:" path, which was half of why the output read as a contradiction. Benefits every door.

    Verified under jsexec against a fake install in all three layouts:
    symlinked install (each console visited once, no phantom second pass), copy-style install (live updated, checkout untouched), and bare checkout
    (falls back to the bundle and says why).

    Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>

    ---
    þ Synchronet þ Vertrauen þ Home of Synchronet þ [vert/cvs/bbs].synchro.net