Merge origin/main: Navis 2.7.2+2 with app icon and update UX.

Combine remote update check/skip flow with green N AppIcon packaging for macOS.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
M4
2026-07-29 18:08:01 +03:00
co-authored by Cursor
35 changed files with 255 additions and 264 deletions
+16 -11
View File
@@ -1,4 +1,4 @@
//go:build windows
//go:build windows
package main
@@ -92,7 +92,7 @@ func main() {
cfgPath: cfgPath,
logBuf: logBuf,
updateStatus: update.Status{
Current: update.CurrentVersion,
Current: update.DisplayVersion(),
ManifestURL: update.DefaultManifestURL,
},
}
@@ -204,7 +204,7 @@ func (a *app) getState() (uiState, error) {
CorePath: corePath,
ConfigPath: a.cfgPath,
Profiles: cfg.ListProfiles(),
Version: update.CurrentVersion,
Version: update.DisplayVersion(),
Update: a.updateStatus,
Pings: append([]netcheck.Result(nil), a.pings...),
Subscription: cfg.SubscriptionURL,
@@ -418,7 +418,7 @@ func (a *app) checkUpdate() (update.Status, error) {
st, err := update.Check(ctx, update.DefaultManifestURL)
a.mu.Lock()
if err != nil {
st.Current = update.CurrentVersion
st.Current = update.DisplayVersion()
st.ManifestURL = update.DefaultManifestURL
st.Error = err.Error()
}
@@ -428,6 +428,14 @@ func (a *app) checkUpdate() (update.Status, error) {
}
func (a *app) applyUpdate() (string, error) {
// Explicit user action only — never called from autoCheckUpdate.
st, err := a.checkUpdate()
if err != nil {
return "", err
}
if !st.Available {
return "", fmt.Errorf("обновление не требуется (текущая %s)", update.DisplayVersion())
}
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Minute)
defer cancel()
latest, err := update.Apply(ctx, update.DefaultManifestURL)
@@ -444,14 +452,11 @@ func (a *app) applyUpdate() (string, error) {
}
func (a *app) autoCheckUpdate() {
// Only refresh update status for the UI banner — never auto-install.
// (Previously auto-apply caused an infinite update loop when the feed version
// stayed ahead of the shipped CurrentVersion in the downloaded binary.)
time.Sleep(3 * time.Second)
st, err := a.checkUpdate()
if err != nil || !st.Available {
return
}
// Auto-apply + relaunch when a newer build is published.
time.Sleep(1500 * time.Millisecond)
_, _ = a.applyUpdate()
_, _ = a.checkUpdate()
}
func openURL(raw string) error {