Обновления: кнопка «Обновить» показывает настоящий результат, устаревшие данные не предлагаются
Жалоба со стенда: в «Обновлениях» висит ЛК 0.2.0, нажимаешь «Обновить» — ничего не происходит. На деле обновление уходило в фон и падало («манифест HTTP 404: релизов в канале нет» — стенд на канале stable, релизы выкладываются в beta), а отказ оседал в незаметной строке «Последняя проверка». - Модули обновляются на месте и во flash показывается фактический результат; в фон уходит только обновление ядра, где ответа установщика всё равно не дождаться (bj-server перезапускается раньше). - Строка результата при отказе показывается предупреждением, а не серым текстом. - Если последняя проверка не удалась, кнопки установки скрыты, у версии — пояснение «нажмите „Проверить обновления“»: предлагать установку по данным неудачной проверки нельзя. - Версии запоминаются вместе с каналом (components_channel); при смене канала прошлые данные забываются — они относились к другому каналу. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Q4YVo4UMopqT5DzicqpPjL
This commit is contained in:
@@ -119,6 +119,16 @@ func (u *Updater) CheckForUpdate(ctx context.Context) (UpdateStatus, error) {
|
||||
return st, nil
|
||||
}
|
||||
|
||||
// updateChannel — канал обновлений установки (пусто = stable).
|
||||
func updateChannel(s UpdateSettings) string {
|
||||
if c := strings.TrimSpace(s.Channel); c != "" {
|
||||
return c
|
||||
}
|
||||
return "stable"
|
||||
}
|
||||
|
||||
func (u *Updater) channel() string { return updateChannel(u.rc.Snapshot().Update) }
|
||||
|
||||
func (u *Updater) saveCheckResult(st UpdateStatus, avail map[string]string) {
|
||||
cfg := u.rc.Snapshot().Update
|
||||
cfg.LastCheck = time.Now().UTC()
|
||||
@@ -127,6 +137,7 @@ func (u *Updater) saveCheckResult(st UpdateStatus, avail map[string]string) {
|
||||
cfg.Notes = st.Notes
|
||||
if avail != nil {
|
||||
cfg.Components = avail
|
||||
cfg.ComponentsChannel = u.channel()
|
||||
}
|
||||
if err := u.rc.SaveUpdateSettings(cfg); err != nil {
|
||||
log.Printf("lk-gateway: сохранение результата проверки обновления: %v", err)
|
||||
@@ -284,7 +295,13 @@ func (u *Updater) ensureSplitModules(ctx context.Context) {
|
||||
// установленное на этом сервере и версии из последней проверки.
|
||||
func updateComponentRows(rc *RuntimeConfig) ([]release.ComponentState, bool) {
|
||||
rows := release.Plan("", nil, release.LoadInstalled(release.InstalledFile), BuildVersion)
|
||||
avail := rc.Snapshot().Update.Components
|
||||
set := rc.Snapshot().Update
|
||||
avail := set.Components
|
||||
// Версии из проверки в другом канале к текущему каналу не относятся: по ним
|
||||
// «Обновить» уходило бы в пустоту («релизов в канале нет»).
|
||||
if set.ComponentsChannel != "" && set.ComponentsChannel != updateChannel(set) {
|
||||
avail = nil
|
||||
}
|
||||
var out []release.ComponentState
|
||||
any := false
|
||||
vers := systemVersions(rc)
|
||||
@@ -299,6 +316,16 @@ func updateComponentRows(rc *RuntimeConfig) ([]release.ComponentState, bool) {
|
||||
}
|
||||
}
|
||||
release.MarkSplitModules(out, func(f string) bool { return moduleAllowed(rc, f) })
|
||||
// Последняя проверка не удалась — предлагать установку по старым данным нельзя:
|
||||
// кнопка ушла бы в тот же отказ. Показываем причину и просим проверить заново.
|
||||
if updateResultFailed(set.LastResult) {
|
||||
for i := range out {
|
||||
if out[i].Update && out[i].Available != "" {
|
||||
out[i].Blocked = "проверка обновлений не удалась — нажмите «Проверить обновления»"
|
||||
}
|
||||
out[i].Update = false
|
||||
}
|
||||
}
|
||||
for _, r := range out {
|
||||
any = any || r.Update
|
||||
}
|
||||
@@ -460,3 +487,30 @@ func (u *Updater) ApplyBundle(ctx context.Context, zipPath string) (string, erro
|
||||
}
|
||||
return msg, nil
|
||||
}
|
||||
|
||||
// updateTouchesCore — затронет ли обновление ядро (тогда ответа установщика не дождаться).
|
||||
func updateTouchesCore(rc *RuntimeConfig, names []string) bool {
|
||||
if len(names) == 0 {
|
||||
// «Обновить всё»: ядро попадёт в набор, если для него есть новая версия
|
||||
rows, _ := updateComponentRows(rc)
|
||||
for _, r := range rows {
|
||||
if r.Core && r.Update {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
for _, n := range names {
|
||||
if c, ok := release.ComponentByName(n); ok && c.Core {
|
||||
return true
|
||||
}
|
||||
}
|
||||
return false
|
||||
}
|
||||
|
||||
// updateResultFailed — последняя строка результата говорит об отказе.
|
||||
func updateResultFailed(result string) bool {
|
||||
r := strings.ToLower(result)
|
||||
return strings.Contains(r, "не применено") || strings.Contains(r, "ошибка") ||
|
||||
strings.Contains(r, "не удалось") || strings.Contains(r, "недоступ")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user