Show a progress bar and live log while Hammerhead, edges and sites update
CI / test (push) Successful in 5m21s
Release / release (push) Successful in 6m9s

The updater reports each step (checking, downloading with percent, verifying, installing, restarting).
Edges and sites send that progress and their log with their reports; Hammerhead serves it to a dialog
that opens when an update starts, and keeps its own last update log on disk across the restart.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
This commit is contained in:
VeillaxandClaude Sonnet 5.5 committed 2026-10-26 18:05:42 -06:00
1 parent 9bd48917c7
commit 2b7cb5dd35
11 files changed
+306 -13

No files matched your search

+36
View File
@@ -5,6 +5,9 @@ import (
"fmt"
"net/http"
"net/http/httptest"
"os"
"path/filepath"
"strings"
"testing"
)
@@ -52,3 +55,36 @@ func TestCheckForUpdates(t *testing.T) {
t.Errorf("unreachable server: %d %s", code, b)
}
}
func TestSelfUpdateLogSurvivesTheRestartItEndsWith(t *testing.T) {
dir := t.TempDir()
if err := os.WriteFile(filepath.Join(dir, "update.log"), []byte("12:00:00 Checking\n12:00:09 Installed v0.3.0; restarting into it\n"), 0o600); err != nil {
t.Fatal(err)
}
s, err := New(dir, Options{AdminEmail: "admin@test.local", AdminPassword: "password123", MasterKey: key, Version: "v0.3.0"})
if err != nil {
t.Fatal(err)
}
defer s.Close()
do := apiClient(t, s)
code, b := do("GET", "/api/admin/update/status", nil)
var out struct {
Running bool
Stage string
Pct int
Lines []string
Version string
}
json.Unmarshal(b, &out)
last := ""
if len(out.Lines) > 0 {
last = out.Lines[len(out.Lines)-1]
}
if code != 200 || out.Running || out.Stage != "done" || out.Pct != 100 || len(out.Lines) != 3 || !strings.Contains(last, "now running v0.3.0") {
t.Fatalf("status: %d %s", code, b)
}
// starting an update needs auto-update on
if code, b := do("POST", "/api/admin/update/apply", nil); code != 400 || !strings.Contains(string(b), "HAMMERHEAD_AUTO_UPDATE") {
t.Fatalf("apply without auto-update: %d %s", code, b)
}
}