#!/usr/bin/env php dbPath()); $service = new CodebergSyncService( new CurlCodebergClient($config->codebergApiBase(), $config->codebergToken()), new TicketRepository($db), $config->codebergOwner(), $config->codebergRepo(), ); // Ohne --watch bleibt das Skript ein einmaliger Lauf (manueller Aufruf, siehe README). if (!in_array('--watch', $argv, true)) { $service->sync(); fwrite(STDOUT, "Codeberg-Sync abgeschlossen.\n"); return; } $trigger = new SyncTrigger($config->syncTriggerPath()); $interval = $config->syncIntervalSeconds(); fwrite(STDOUT, sprintf("[sync] Watch-Modus, periodischer Lauf alle %ds, Webhook-Trigger sofort.\n", $interval)); $lastRun = 0; while (true) { $triggered = $trigger->consume(); $due = (time() - $lastRun) >= $interval; if ($triggered || $due) { $lastRun = time(); try { $service->sync(); fwrite(STDOUT, sprintf("[sync] Lauf beendet (%s).\n", $triggered ? 'Webhook' : 'periodisch')); } catch (Throwable $e) { // Ein fehlgeschlagener Lauf (Codeberg nicht erreichbar, Rate-Limit) darf die // Schleife nicht beenden, sonst landet der Container in einer Restart-Schleife. fwrite(STDERR, sprintf("[sync] Lauf fehlgeschlagen: %s\n", $e->getMessage())); } } // Sekundentakt: bestimmt, wie schnell ein Webhook-Trigger bemerkt wird. Der Check ist // ein file_exists() auf einem lokalen Volume, kostet also praktisch nichts - im // Gegensatz zum Codeberg-Request, der weiterhin nur bei Bedarf laeuft. sleep(1); }