Files
ghostty/macos/Sources/Features/Update/UpdateDelegate.swift
2026-08-05 15:15:40 +02:00

35 lines
1.5 KiB
Swift

import Sparkle
import Cocoa
extension UpdateDriver: SPUUpdaterDelegate {
func feedURLString(for updater: SPUUpdater) -> String? {
guard let appDelegate = NSApplication.shared.delegate as? AppDelegate else {
return nil
}
// Sparkle supports a native concept of "channels" but it requires that
// you share a single appcast file. We don't want to do that so we
// do this instead.
switch appDelegate.ghostty.config.autoUpdateChannel {
case .tip: return "https://tip.files.ghostty.org/appcast.xml"
case .stable: return "https://release.files.ghostty.org/appcast.xml"
}
}
/// Called when an update is scheduled to install silently,
/// which occurs when `auto-update = download`.
///
/// When `auto-update = check`, Sparkle will call the corresponding
/// delegate method on the responsible driver instead.
func updater(_ updater: SPUUpdater, willInstallUpdateOnQuit item: SUAppcastItem, immediateInstallationBlock immediateInstallHandler: @escaping () -> Void) -> Bool {
viewModel.state = .installing(.init(
appcastItem: item,
retryTerminatingApplication: immediateInstallHandler
))
AppDelegate.logger.info("Version: \(item.displayVersionString) installed silently, waiting for relaunch...")
// Even when hasUnobtrusiveTarget is false, we don't show the alert immediately.
// We wait until the user manually checks for updates or relaunches.
return true
}
}