feat(sync): the folder loop, the hooks and the panel — it can be switched on now

The three layers underneath were already there and unreachable: the change-log
format (7d664bd), the identity column (724e68b) and the no-backfill decision
(c48294b). This is the wiring that gives the operator a switch.

Settings, all profile-scoped, because each profile can point at its own logbook:
the folder, this PC's name, the machine id minted once from it, the per-peer read
offsets and the tie-break counter. Scoping the machine id is what keeps two
profiles sharing one folder from writing two logbooks into one file.

Three hooks. Add and update publish asynchronously, down with the rest of the
after-the-fact work — a folder on a network share can block for seconds and a
contact belongs on screen long before another machine hears about it. Deletion
publishes SYNCHRONOUSLY and BEFORE the row goes, for the same reason
deleteRemoteCopies does: once it is gone its identity is gone with it and the
tombstone names nothing.

The apply path uses the repository directly and never AddQSO/UpdateQSO/DeleteQSO
— those publish, and a change applied here would be written straight back out,
two machines echoing each other for ever.

Saving writes a probe file to the chosen folder rather than asking whether it
exists. A read-only cloud folder, or a share whose credentials expired, exists
perfectly well and would swallow every contact in silence; if the probe fails the
switch goes back off instead of sitting on while nothing is written.

The panel is mostly status, and deliberately: every part of this runs on another
machine and on a sync client OpsLog cannot see, so "it is not working" has to be
answerable from the settings page — which PCs are in the folder, when each last
logged, what is waiting unread.

Four tests on the apply path, the middle two being the ones that matter: an edit
made on the other PC lands on the copy already here, matched on the contact
itself, instead of becoming a second row — that is what makes the no-backfill
decision safe — and a contact with the same station on another band stays a
separate contact.
This commit is contained in:
2026-08-17 01:34:00 +02:00
parent eab11db766
commit 91b21a4a36
9 changed files with 979 additions and 2 deletions
+4 -2
View File
@@ -9,7 +9,8 @@
"French: seventeen strings were still in English, the whole update panel among them, plus Spot lifetime and Chase new grids.",
"Selecting a QSO shows the entity the QSO records, not one re-derived from its callsign — a 3Y0K contact logged as Bouvet showed the Antarctica matrix.",
"Back-entering a QSO resolves the ClubLog exception at the CONTACTS date, so a DXpedition entered months later gets the entity it had then.",
"QRZ.com sends an island reference for an operator on one, and OpsLog read past it — it now fills the IOTA award reference before the QSO is logged."
"QRZ.com sends an island reference for an operator on one, and OpsLog read past it — it now fills the IOTA award reference before the QSO is logged.",
"Sync across PCs: point every OpsLog at one folder you already synchronise and your contacts follow you between machines."
],
"fr": [
"Ouvrir le panneau Awards ne tire plus plusieurs fois le journal entier en même temps — un gros log occupait brièvement des gigaoctets de mémoire.",
@@ -18,7 +19,8 @@
"Français : dix-sept textes étaient restés en anglais, dont tout le panneau de mise à jour, la durée de vie des spots et Chasser les nouveaux locators.",
"Sélectionner un QSO affiche lentité que le QSO enregistre, pas une recalculée depuis lindicatif — un 3Y0K logué Bouvet montrait la matrice Antarctique.",
"Saisir un QSO a posteriori résout lexception ClubLog à la date DU CONTACT : une DXpedition entrée des mois après retrouve lentité quelle avait alors.",
"QRZ.com envoie la référence d’île dun opérateur sur une île, et OpsLog lignorait — elle remplit désormais la référence IOTA avant lenregistrement du QSO."
"QRZ.com envoie la référence d’île dun opérateur sur une île, et OpsLog lignorait — elle remplit désormais la référence IOTA avant lenregistrement du QSO.",
"Synchro entre PC : fais pointer chaque OpsLog vers un dossier déjà synchronisé et tes contacts te suivent dune machine à lautre."
]
},
{