get("{$giteaUrl}/api/v1/repos/{$giteaRepo}/releases/latest"); if ($response->successful()) { $latestVersion = $response->json('tag_name', ''); $releaseNotes = $response->json('body', ''); $updateAvailable = !empty($latestVersion) && version_compare( ltrim($latestVersion, 'v'), ltrim($currentVersion, 'v'), '>' ); Cache::put('app_update_available', $updateAvailable ? $latestVersion : false, now()->addHours(6)); Cache::put('app_update_checked_at', now()->toDateTimeString(), now()->addHours(6)); $checkedAt = now()->toDateTimeString(); } else { $error = "Gitea nicht erreichbar (HTTP {$response->status()})."; } } catch (\Exception $e) { $error = 'Verbindungsfehler: ' . $e->getMessage(); } } return view('admin.update', compact( 'currentVersion', 'latestVersion', 'updateAvailable', 'releaseNotes', 'error', 'checkedAt', 'giteaUrl', 'giteaRepo' )); } public function install(Request $request): RedirectResponse { $tag = $request->input('tag'); // Update-Command synchron ausführen und Ausgabe erfassen Artisan::call('app:install-update', array_filter(['--tag' => $tag])); $log = Artisan::output(); $success = !str_contains($log, 'fehlgeschlagen') && !str_contains($log, 'FAILURE'); return redirect()->route('admin.update.index')->with([ 'update_result' => $success ? 'success' : 'error', 'update_log' => $log, ]); } }