v0.291.0: decision 78 (R-726) — a returning household's first night sets the orphaned copy aside; R-838 — traefik v3.7.13, cloudflared 2026.9.3, filebrowser 1.5.6-stable, a release now moves a running file browser, check-infra-pins.py
gates / gates (push) Successful in 31s

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_0159rPz1ZhFKsS53msqPYxtS
This commit is contained in:
2026-10-04 10:56:19 +02:00
parent 99a1497560
commit fc796dd95e
8 changed files with 258 additions and 18 deletions
@@ -255,3 +255,30 @@ func TestEnsureBaseStack_TunnelOrder(t *testing.T) {
})
}
}
// R-838: a release that raises FileBrowserImage reaches a RUNNING file browser — only the image line changes (the
// storage mounts SyncFileBrowserMounts wrote stay byte-for-byte) and it is recreated once. Red-proof: make
// ensureFileBrowser return nil for a running container again and the first sub-step fails.
func TestReconcileFileBrowserImage_MovesOnlyTheImage(t *testing.T) {
state := stubDocker(t)
touch(t, filepath.Join(state, "running-filebrowser"), "")
m, calls := tunnelTestManager(t, "")
dir := t.TempDir()
old := strings.Replace(infra.RenderFileBrowserCompose("example.hu", []string{" - /mnt/felhom-drives/d1/userdata:/srv/d1"}), infra.FileBrowserImage, "gtstef/filebrowser:1.3.3-stable", 1)
touch(t, filepath.Join(dir, "docker-compose.yml"), old)
if err := m.ensureFileBrowser(dir); err != nil {
t.Fatal(err)
}
got, _ := os.ReadFile(filepath.Join(dir, "docker-compose.yml"))
want := strings.Replace(old, "gtstef/filebrowser:1.3.3-stable", infra.FileBrowserImage, 1)
if string(got) != want {
t.Fatalf("compose after the move:\n%s\nwant only the image line changed:\n%s", got, want)
}
if len(*calls) != 1 || (*calls)[0].args != "up -d" {
t.Fatalf("want one `up -d`, got %+v", *calls)
}
// Same image → nothing.
if err := m.ensureFileBrowser(dir); err != nil || len(*calls) != 1 {
t.Fatalf("an up-to-date file browser was touched: err %v calls %+v", err, *calls)
}
}