Changeset ed5e7ab in Klonkt for scripts


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@…>

Location:
scripts
Files:
1 added
2 edited

Legend:

Unmodified
Added
Removed
  • scripts/export-archive.mjs

    rba76bf5 red5e7ab  
    66//     node scripts/export-archive.mjs <slug> --out boiert.zip
    77//     node scripts/export-archive.mjs <slug> --dir ./archief
     8//
     9// Op een machine met meerdere instances leest hij de .env van die instance zelf
     10// (standaard /var/lib/klonkt/<slug>/.env). Dat is niet netjesheid maar noodzaak:
     11// zonder die .env opent hij de database die toevallig in de code-map ligt, en op
     12// een server die ooit de enkelvoudige opzet draaide is dat een oude lege. Dan
     13// komt er een archief uit dat MELDT dat het gelukt is en nul posts bevat.
     14//
     15//     --data-root <map>   waar de instances staan (standaard /var/lib/klonkt)
     16//     --env <pad>         een .env rechtstreeks aanwijzen
    817//
    918// Het formaat staat in docs/EXPORT-FORMAT.md.
     
    1524import fs from 'fs';
    1625import path from 'path';
    17 import { buildArchive, zipArchive, writeArchiveDir } from '../src/services/ArchiveExportService.js';
     26import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs';
    1827
    1928const args = process.argv.slice(2);
    20 const slug = args.find((a) => !a.startsWith('-'));
    21 const vlag = (naam) => { const i = args.indexOf(naam); return i >= 0 ? (args[i + 1] || true) : null; };
     29// Twee namen, en ze zijn niet hetzelfde. De eerste is de INSTANCE (de map onder
     30// de data-root, de systemd-unit); de tweede, optioneel, is de slug van de SITE in
     31// die database. Laat je hem weg en er staat er precies een, dan is de keuze niet
     32// dubbelzinnig en hoef je hem niet te weten.
     33const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env', '--out', '--dir']);
     34const instance = vrij[0];
     35let slug = vrij[1] || null;
     36const vlag = (naam) => vlaggen[naam] ?? null;
    2237
    23 if (!slug) {
    24   console.error('gebruik: node scripts/export-archive.mjs <slug> [--dry-run | --out <zip> | --dir <map>]');
     38if (!instance) {
     39  console.error('gebruik: node scripts/export-archive.mjs <instance> [site-slug] [--data-root <map>] [--env <pad>] [--dry-run | --out <zip> | --dir <map>]');
    2540  process.exit(1);
    2641}
    2742
    28 const uit = buildArchive(slug);
     43// EERST de instance kiezen, DAN pas de service laden: src/config/database.js
     44// leest DATABASE_PATH bij import en opent de database meteen.
     45let gekozen;
     46try {
     47  gekozen = kiesInstance(instance, {
     48    dataRoot: typeof vlag('--data-root') === 'string' ? vlag('--data-root') : null,
     49    envPad: typeof vlag('--env') === 'string' ? vlag('--env') : null,
     50  });
     51} catch (e) { console.error(e.message); process.exit(1); }
     52eisOrigin(gekozen.bron);
     53
     54const { buildArchive, zipArchive, writeArchiveDir } = await import('../src/services/ArchiveExportService.js');
     55const { default: db } = await import('../src/config/database.js');
     56
     57// Geen slug gegeven? Dan mag de database het zeggen, mits het antwoord eenduidig is.
     58if (!slug) {
     59  let sites = [];
     60  try { sites = db.prepare('SELECT slug FROM sites ORDER BY rowid').all().map((r) => r.slug); } catch { /* geen tabel */ }
     61  if (sites.length === 1) {
     62    [slug] = sites;
     63    console.log(`site niet opgegeven, en er staat er precies een: ${slug}`);
     64  } else if (sites.length === 0) {
     65    console.error(`in ${process.env.DATABASE_PATH || 'deze database'} staat geen enkele site.`);
     66    process.exit(1);
     67  } else {
     68    console.error(`meerdere sites in deze database: ${sites.join(', ')}\nGeef er een op: node scripts/export-archive.mjs ${instance} <site-slug>`);
     69    process.exit(1);
     70  }
     71}
     72
     73let uit;
     74try { uit = buildArchive(slug); }
     75catch (e) {
     76  console.error(`${e.message}`);
     77  if (gekozen.bron) console.error(`(gelezen uit ${gekozen.bron})`);
     78  else console.error('(geen instance-.env gevonden -- op een split install: --data-root /var/lib/klonkt)');
     79  process.exit(1);
     80}
    2981const t = uit.counts;
    30 console.log(`site      : ${uit.manifest.site.slug} (${uit.manifest.origin || 'geen PUBLIC_BASE_URL'})`);
     82console.log(`site      : ${uit.manifest.site.slug} (${uit.manifest.origin})`);
     83console.log(`instellingen uit: ${gekozen.bron || 'de omgeving'}`);
     84console.log(`database  : ${process.env.DATABASE_PATH || '(standaard in de code-map)'}`);
    3185console.log(`posts     : ${t.posts}`);
    3286console.log(`antwoorden: ${t.replies}   (alleen-lezen archief)`);
  • scripts/import-archive.mjs

    rba76bf5 red5e7ab  
    1717// en hoort een aparte, bewuste actie te zijn.
    1818
    19 import { readArchive, importArchive } from '../src/services/ArchiveImportService.js';
     19import { kiesInstance, eisOrigin, splitsArgs } from './instance-env.mjs';
    2020
    2121const args = process.argv.slice(2);
    22 const vrij = args.filter((a) => !a.startsWith('-'));
     22const { vrij, vlaggen } = splitsArgs(args, ['--data-root', '--env']);
    2323const [slug, bron] = vrij;
    2424
    2525if (!slug || !bron) {
    26   console.error('gebruik: node scripts/import-archive.mjs <slug> <archief.zip|map> [--dry-run] [--overwrite]');
     26  console.error('gebruik: node scripts/import-archive.mjs <slug> <archief.zip|map> [--data-root <map>] [--env <pad>] [--dry-run] [--overwrite]');
    2727  process.exit(1);
    2828}
     29
     30// EERST de instance kiezen, DAN pas de service laden -- database.js opent de
     31// database bij import. Bij een IMPORT weegt dit zwaarder dan bij een export: in
     32// de verkeerde database schrijven is niet terug te draaien.
     33const vlag = (naam) => vlaggen[naam] ?? null;
     34let gekozen;
     35try {
     36  gekozen = kiesInstance(slug, { dataRoot: vlag('--data-root'), envPad: vlag('--env') });
     37} catch (e) { console.error(e.message); process.exit(1); }
     38eisOrigin(gekozen.bron);
     39console.log(`instellingen uit: ${gekozen.bron || 'de omgeving'}`);
     40console.log(`database        : ${process.env.DATABASE_PATH || '(standaard in de code-map)'}`);
     41
     42const { readArchive, importArchive } = await import('../src/services/ArchiveImportService.js');
    2943
    3044let files;
Note: See TracChangeset for help on using the changeset viewer.