Buendel und Manifest muessen dieselbe Fassung tragen - Test dagegen

Am iPhone gesehen: der Server meldete 2026.9.5.29, das mitgelieferte Buendel
war noch .28. buendelPasst() verlangt Gleichheit, die App hielt sich deshalb
fuer nicht erneuerbar - und die Meldung schickte den Eigentuemer zu Xcode,
obwohl nur meine Veroeffentlichung unvollstaendig war: ich hatte die
Versionsnummer erhoeht, ohne npm run ota laufen zu lassen. Betraf .29 und .30.

Zwei Aenderungen:

* buendelversion.test.ts vergleicht die Version in bundle.json mit der in
  manifest.json. Gegengeprueft: der Test faellt, wenn sie auseinanderlaufen.
  Damit wird daraus ein Fehlschlag vor der Auslieferung statt einer
  irrefuehrenden Meldung auf dem Telefon.
* Der Hinweis unterscheidet jetzt zwei Faelle. Liegt ein Buendel, das nur
  nicht zur Serverfassung passt, heisst es, die App koenne sich erneuern,
  sobald eine Veroeffentlichung ein passendes mitbringt. Nach Xcode wird nur
  noch verwiesen, wenn gar kein Buendel da ist.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
2026-09-05 16:23:47 +02:00
parent 2a4337e030
commit 45259ae9ba
5 changed files with 43 additions and 3 deletions
@@ -0,0 +1,27 @@
/**
* Das OTA-Bündel muss dieselbe Fassung tragen wie das Manifest der
* Integration.
*
* Am 05.09.2026 am iPhone aufgefallen: der Server meldete 2026.9.5.29, das
* mitgelieferte Bündel war noch 2026.9.5.28. `buendelPasst()` verlangt
* Gleichheit — die App hielt sich deshalb für nicht erneuerbar und schickte
* den Eigentümer zu Xcode, obwohl nur die Veröffentlichung unvollständig war:
* die Versionsnummer war erhöht worden, ohne `npm run ota` laufen zu lassen.
*
* Dieser Test macht daraus einen Fehlschlag vor der Auslieferung statt einer
* irreführenden Meldung auf dem Telefon.
*/
import { readFileSync } from "node:fs"
import { describe, expect, it } from "vitest"
const lies = (pfad: string) => JSON.parse(readFileSync(pfad, "utf8")) as { version?: string }
describe("OTA-Bündel und Manifest", () => {
it("tragen dieselbe Versionsnummer", () => {
const manifest = lies("../custom_components/audi_dashboard/manifest.json")
const buendel = lies("../custom_components/audi_dashboard/frontend/app/bundle.json")
expect(buendel.version).toBe(manifest.version)
})
})
+14 -1
View File
@@ -103,6 +103,17 @@ export function Versionshinweis({
const perOta = buendelPasst(otaBuendel, eigeneVersion(), serverVersion)
/* Es liegt ein Bündel, es passt nur (noch) nicht zur Fassung, die der Server
ausliefert. Das ist KEIN Xcode-Fall.
Am 05.09.2026 am iPhone gesehen: Server auf 2026.9.5.29, Bündel auf .28,
App auf .22 - die Meldung schickte den Eigentümer zu Xcode, obwohl die App
sich über die Luft erneuern könnte, sobald eine Veröffentlichung ein
passendes Bündel mitbringt. Ursache war eine Veröffentlichung, die die
Versionsnummer erhöhte, ohne das Bündel neu zu bauen (dagegen wacht jetzt
ein Test, siehe buendelversion.test.ts). */
const buendelHinkt = !perOta && !!otaBuendel?.version && otaBuendel.version !== serverVersion
const schliessen = () => {
if (laeuft) return
if (serverVersion) gesehenSchreiben(serverVersion)
@@ -132,7 +143,9 @@ export function Versionshinweis({
description={
perOta
? `Diese App läuft auf ${eigeneVersion() ?? "einer unbekannten Fassung"}, bereit liegt ${serverVersion}. Sie kann sich direkt hier erneuern.`
: `Diese App läuft auf ${eigeneVersion() ?? "einer unbekannten Fassung"}, der Server liefert ${serverVersion}. Dafür liegt hier kein passendes Bündel — sie muss über Xcode neu aufgespielt werden.`
: buendelHinkt
? `Diese App läuft auf ${eigeneVersion() ?? "einer unbekannten Fassung"}, der Server liefert ${serverVersion}. Das hier bereitliegende Bündel gehört noch zu ${otaBuendel?.version} - die App kann sich erneuern, sobald eine Veröffentlichung ein passendes mitbringt.`
: `Diese App läuft auf ${eigeneVersion() ?? "einer unbekannten Fassung"}, der Server liefert ${serverVersion}. Dafür liegt hier kein Bündel — sie muss über Xcode neu aufgespielt werden.`
}
actions={
perOta
@@ -1 +1 @@
{"version":"2026.9.5.31","sha256":"94ba956b9cd47adbd0b38a3f94bd304b23032bb00c4192ada89536a716b2b51b","bytes":324628,"gebaut":"2026-09-05T14:20:13Z"}
{"version":"2026.9.5.32","sha256":"40c58828e0c94b39976fb1320f7fd5053a4eb1779151f124dc8442dc833072d1","bytes":324696,"gebaut":"2026-09-05T14:23:35Z"}
@@ -1,7 +1,7 @@
{
"domain": "audi_dashboard",
"name": "Audi Dashboard",
"version": "2026.9.5.31",
"version": "2026.9.5.32",
"documentation": "https://gitea.nothaft.cloud/paul/audi-app/src/branch/main/README.md",
"issue_tracker": "https://gitea.nothaft.cloud/paul/audi-app/issues",
"codeowners": [