readInstalledVersionNorm(); $currentRaw = $this->readInstalledVersionRaw() ?? ($currentNorm ? 'v'.$currentNorm : null); $appPath = base_path(); $cmd = <</dev/null || true cd {$appPath} git fetch --tags --force --quiet origin +refs/tags/*:refs/tags/* (git tag -l 'v*' --sort=-v:refname | head -n1) || true BASH; $latestTagRaw = trim((string) shell_exec($cmd)); if ($latestTagRaw === '') { $latestTagRaw = trim((string) shell_exec("cd {$appPath} && git tag -l --sort=-v:refname | head -n1")); } $latestNorm = $this->normalizeVersion($latestTagRaw); // Nichts gefunden -> alles leeren if (!$latestNorm) { cache()->forget('updates:latest'); cache()->forget('updates:latest_raw'); cache()->forget('mailwolt.update_available'); // legacy $this->warn('Keine Release-Tags gefunden.'); return self::SUCCESS; } // Nur wenn wirklich neuer als installiert -> Keys setzen if ($currentNorm && version_compare($latestNorm, $currentNorm, '>')) { cache()->forever('updates:latest', $latestNorm); cache()->forever('updates:latest_raw', $latestTagRaw ?: ('v'.$latestNorm)); cache()->forever('mailwolt.update_available', $latestNorm); // legacy-kompat $this->info("Update verfügbar: {$latestTagRaw} (installiert: ".($currentRaw ?? $currentNorm).")"); } else { // Kein Update -> Keys löschen cache()->forget('updates:latest'); cache()->forget('updates:latest_raw'); cache()->forget('mailwolt.update_available'); // legacy $this->info("Aktuell (installiert: ".($currentRaw ?? $currentNorm ?? 'unbekannt').")."); } cache()->put('updates:last_checked_at', now(), now()->addMinutes(10)); return self::SUCCESS; } /* ===== Helpers ===== */ private function readInstalledVersionNorm(): ?string { // Lokal: git describe gibt immer den aktuellen Stand if (app()->isLocal()) { $tag = @trim((string) shell_exec('git -C ' . escapeshellarg(base_path()) . ' describe --tags --abbrev=0 2>/dev/null')); $v = $this->normalizeVersion($tag); if ($v) return $v; } $paths = [ '/var/lib/mailwolt/version', base_path('VERSION'), ]; foreach ($paths as $p) { $raw = @trim(@file_get_contents($p) ?: ''); if ($raw !== '') return $this->normalizeVersion($raw); } $raw = $this->readInstalledVersionRaw(); return $raw ? $this->normalizeVersion($raw) : null; } private function readInstalledVersionRaw(): ?string { $p = '/var/lib/mailwolt/version_raw'; // vom Wrapper (z.B. "v1.0.25" oder "v1.0.25-3-gabcd") $raw = @trim(@file_get_contents($p) ?: ''); return $raw !== '' ? $raw : null; } private function normalizeVersion(?string $v): ?string { if (!$v) return null; $v = trim($v); if ($v === '') return null; $v = ltrim($v, "vV \t\n\r\0\x0B"); // führendes v entfernen $v = preg_replace('/-.*$/', '', $v); // Build-/dirty-Suffix abschneiden return $v !== '' ? $v : null; } }