Noms de release lisibles, et incompatibles avec l'updater 0.7

ajean-linux, ajean-linux-arm, ajean-macos, ajean-macos-arm,
ajean-windows.exe, ajean-windows-arm.exe.

Le schema ne correspond plus a ajean-<GOOS>-<GOARCH> que cherchent les 0.7 :
leur mise a jour automatique ne trouve aucun asset et echoue sans rien
remplacer. C'est voulu — sinon elle installait le binaire 0.8 sans migrer, le
service de lien repartait en boucle d'echec sur « link serve » disparu et le
moteur perdait sa configuration.

assetNameFor est isolee pour etre testee sur les six plateformes, plus un test
qui verifie explicitement l'absence de collision avec le schema 0.7.
This commit is contained in:
nathaninline committed 2026-08-07 19:30:26 +02:00
1 parent 664b13753b
commit 071caea516
6 files changed
+92 -35

No files matched your search

+26 -6
View File
@@ -35,13 +35,33 @@ type ghRelease struct {
}
// updateAssetName est le nom de l'asset de release pour la plateforme courante :
// ajean-<os>-<arch>[.exe]. Un seul nom publié, un seul nom cherché.
func updateAssetName() string {
suffix := runtime.GOOS + "-" + runtime.GOARCH
if runtime.GOOS == "windows" {
suffix += ".exe"
// ajean-linux, ajean-linux-arm, ajean-macos, ajean-macos-arm, ajean-windows.exe,
// ajean-windows-arm.exe. Un seul nom publié, un seul nom cherché.
//
// Ces noms sont volontairement lisibles — « macos » plutôt que « darwin », pas
// de « amd64 » pour le cas courant — et volontairement DIFFÉRENTS du schéma
// ajean-<GOOS>-<GOARCH> qu'utilisaient les versions 0.7 : leur mise à jour
// automatique ne trouve donc aucun asset et échoue sans rien remplacer, au lieu
// d'installer un binaire 0.8 sur une machine encore agencée en 0.7 — ce qui
// laissait le service de lien en boucle d'échec. La 0.7 se met à jour à la main,
// par réinstallation.
func updateAssetName() string { return assetNameFor(runtime.GOOS, runtime.GOARCH) }
// assetNameFor est séparée pour être vérifiable sur les six plateformes, et pas
// seulement sur celle qui exécute les tests.
func assetNameFor(goos, goarch string) string {
name := "ajean-" + map[string]string{
"darwin": "macos",
"linux": "linux",
"windows": "windows",
}[goos]
if goarch == "arm64" {
name += "-arm"
}
return "ajean-" + suffix
if goos == "windows" {
name += ".exe"
}
return name
}
// pickAsset trouve dans la release l'asset de cette plateforme. Renvoie son nom
+33 -1
View File
@@ -1,6 +1,9 @@
package ajean
import "testing"
import (
"runtime"
"testing"
)
// relWith fabrique une release ne contenant que les assets nommés.
func relWith(names ...string) *ghRelease {
@@ -34,3 +37,32 @@ func TestPickAssetSansCorrespondance(t *testing.T) {
t.Fatalf("URL inattendue: %q", url)
}
}
// Le schéma de nommage ne doit PAS coïncider avec ajean-<GOOS>-<GOARCH> : c'est
// ce qui empêche la mise à jour automatique d'une 0.7 de s'installer sur une
// machine encore agencée en 0.7.
func TestNomDAssetDistinctDuSchema07(t *testing.T) {
legacy := "ajean-" + runtime.GOOS + "-" + runtime.GOARCH
if runtime.GOOS == "windows" {
legacy += ".exe"
}
if got := updateAssetName(); got == legacy {
t.Fatalf("le nom %q est celui que cherche la 0.7 — sa mise à jour casserait l'installation", got)
}
}
// Les six noms publiés par la release, vérifiés un par un.
func TestNomsDAssetParPlateforme(t *testing.T) {
for _, c := range []struct{ goos, goarch, want string }{
{"linux", "amd64", "ajean-linux"},
{"linux", "arm64", "ajean-linux-arm"},
{"darwin", "amd64", "ajean-macos"},
{"darwin", "arm64", "ajean-macos-arm"},
{"windows", "amd64", "ajean-windows.exe"},
{"windows", "arm64", "ajean-windows-arm.exe"},
} {
if got := assetNameFor(c.goos, c.goarch); got != c.want {
t.Errorf("%s/%s → %q, attendu %q", c.goos, c.goarch, got, c.want)
}
}
}