Ignore:
Timestamp:
08/07/2026 05:41:20 PM (5 weeks ago)
Author:
Robin <roboburr@…>
Branches:
main
Children:
c25eff7
Parents:
ba76bf5 (diff), a4fea5e (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge de drie nieuwste van GitHub, met hun exporter-fix boven de mijne

De parallelle sessie pushte drie commits terwijl deze kant aan het werk was. Een
ervan, 6248497, repareert dezelfde exporter-tijdzonebug die hier een uur eerder in
ba76bf5 was gerepareerd. Twee keer hetzelfde werk, langs twee routes gevonden: daar
via een vraag van Bart, hier via de test die in Europe/Amsterdam omviel.

Het enige conflict zat dan ook in ArchiveExportService.js, op precies die functie.
Hun versie is aangehouden, en dat is geen hoffelijkheid maar een meting: hun regex
accepteert ook een stempel zonder seconden ("2026-07-01 12:56"), waar de mijne
seconden eist. Ze pakten bovendien export-archive.mjs, import-archive.mjs en een
nieuwe instance-env.mjs mee, plus een test in archive-export.test.js. Mijn variant is
daarmee vervallen en verdwijnt uit de boom; de bug blijft gedekt.

Nagemeten dat die keuze de dekking niet kost: archive-import 21 groen en
archive-export 16 groen, in UTC en in Europe/Amsterdam. Zonder een fix valt de
import-test alleen buiten UTC om, dus de tijdzone-afhankelijkheid is echt weg.

Changed files:
src/services/ArchiveExportService.js

  • conflict opgelost ten gunste van 6248497; de eigen toISO is eruit

remarks: dit is de derde keer vandaag dat de GitHub-mirror faalde omdat GitHub
verder stond dan prutfolio.git. De VPS is volgens de deploy-afspraak canoniek,
maar de andere sessie pusht rechtstreeks naar GitHub, dus het divergeert elke paar
uur opnieuw en dat kostte nu dubbel werk. Eén bron aanwijzen is een besluit voor
Robin, geen technische keuze.

-robo
Co-Authored-By: Claude Opus 4.8 <noreply@…>

File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/services/ArchiveExportService.js

    rba76bf5 red5e7ab  
    3838
    3939const sha256 = (buf) => crypto.createHash('sha256').update(buf).digest('hex');
    40 // SQLite's CURRENT_TIMESTAMP schrijft 'YYYY-MM-DD HH:MM:SS' in UTC, zonder marker.
    41 // Kale Date.parse leest dat als LOKALE tijd, dus op een server op UTC+2 ging er twee
    42 // uur van elke stempel af voordat hij het archief in ging. Die verschuiving wordt bij
    43 // het exporteren ingebakken en valt niet weg bij het importeren: exporteer je in
    44 // Amsterdam, dan is die post overal permanent twee uur te vroeg, en in zomer- en
    45 // wintertijd verschillend. Het raakte de stempels die de database zelf zet (concepten,
    46 // ingeplande posts, gearchiveerde antwoorden), niet die uit de editor, dus de schade
    47 // was stil en gedeeltelijk. EXPORT-FORMAT.md schreef altijd al "ISO 8601, UTC" voor.
    48 // Zelfde regel als isoStamp() in ActivityPubService en stampMs() in guardianship/offers.
    49 const SQL_STAMP = /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}:\d{2}(\.\d+)?$/;
     40/**
     41 * Naar ISO 8601 in UTC.
     42 *
     43 * SQLite schrijft CURRENT_TIMESTAMP als "2026-07-01 12:56:10" -- in UTC, maar
     44 * ZONDER zone erbij. Date.parse leest die vorm als LOKALE tijd, en dan schuift
     45 * elk tijdstempel in het archief mee met de tijdzone van de machine die de export
     46 * draait. Op een server in Amsterdam is dat twee uur, en dat merk je pas als je
     47 * ergens anders importeert.
     48 *
     49 * Gevonden doordat Bart vroeg of dit wel naar UTC normaliseert. De testmachine
     50 * draait op UTC, dus geen enkele test kon het zien.
     51 */
    5052const toISO = (d) => {
    51   const s = String(d == null ? '' : d);
    52   const t = Date.parse(SQL_STAMP.test(s) ? `${s.replace(' ', 'T')}Z` : s);
     53  if (!d) return null;
     54  const s = String(d).trim();
     55  const zonderZone = /^\d{4}-\d{2}-\d{2}[ T]\d{2}:\d{2}(:\d{2}(\.\d+)?)?$/.test(s);
     56  const t = Date.parse(zonderZone ? `${s.replace(' ', 'T')}Z` : s);
    5357  return isNaN(t) ? null : new Date(t).toISOString();
    5458};
     
    243247  const origin = (opts.origin || process.env.PUBLIC_BASE_URL || '').replace(/\/+$/, '');
    244248  const site = db.prepare('SELECT * FROM sites WHERE slug = ?').get(slug);
    245   if (!site) throw new Error(`onbekende site: ${slug}`);
     249  if (!site) {
     250    // De naam van de INSTANCE (de map, de unit) en de slug van de SITE in zijn
     251    // database zijn twee dingen. Ze vallen vaak samen en soms niet, en dan zat je
     252    // met een foutmelding die je liet raden. Zeg dus wat er wel in staat.
     253    let bestaand = [];
     254    try { bestaand = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen sites-tabel */ }
     255    const wat = slug ? `onbekende site: ${slug}` : 'geen site opgegeven';
     256    throw new Error(bestaand.length
     257      ? `${wat}. In deze database staat: ${bestaand.join(', ')}`
     258      : `${wat}. In deze database staat geen enkele site -- wijst DATABASE_PATH naar de juiste?`);
     259  }
    246260
    247261  const bestanden = new Map();       // pad -> Buffer
Note: See TracChangeset for help on using the changeset viewer.