• exec/load/door_deploy.js src/doors/syncconquer/deploy.js src/doors/syn

    From Rob Swindell (on Debian Linux)@VERT to Git commit to main/sbbs/master on Mon Jul 13 21:37:59 2026
    https://gitlab.synchro.net/main/sbbs/-/commit/d343993cf8abd5940d44f503
    Modified Files:
    exec/load/door_deploy.js src/doors/syncconquer/deploy.js src/doors/syncdoom/deploy.js src/doors/syncduke/deploy.js src/doors/syncmoo1/deploy.js src/doors/syncretro/deploy.js
    Log Message:
    doors: deploy the built binary to the live install only

    door_deploy() had two destinations: the in-tree bundle (<checkout>/xtrn/<door>/) and the live install (the xtrn/<door> dir beside system.ctrl_dir). On the recommended install those are ONE FILE -- install- sbbs.mk SYMLINK=1 does "ln -sf $(REPODIR)/xtrn $(SBBSDIR)", so the live xtrn
    is a symlink to the repo's -- 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 was therefore harmless but baffling. It hashed the
    destination, found the bytes the first pass had just written, and reported

    [deploy] Deployed: /home/user/sbbs/repo/xtrn/syncdoom/syncdoom
    [deploy] /home/user/sbbs/ctrl/../xtrn/syncdoom/syncdoom is already this
    build -- nothing to copy

    which reads as a contradiction precisely when a sysop is asking "did my build land?" -- and cost a round of head-scratching on IRC. (Only one write ever happened: the content check that stopped the second is the same guard that keeps a copy onto a symlinked destination from truncating its own source.)

    Where the two ARE different directories -- a copy-style install, or a checkout that is not the install -- the in-tree copy was pointless: nothing launches from the checkout (xtrn.ini runs the door out of the live dir, and install- xtrn fetches the binary via get-binary.js), so it only littered the working tree with a gitignored multi-megabyte binary.

    So deploy to the live install, full stop. A bare checkout with no BBS
    installed (packaging, CI) still falls back to the in-tree bundle, and says so. No layout now addresses one file twice.

    Verified by running deploy.js under jsexec against a fake install for each layout: symlinked install (one copy, one line), copy-style install (live updated, no stray binary in the checkout), bare checkout (falls back to the bundle), and a second run with nothing rebuilt ("already this build -- nothing to copy").

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