mirror of
https://github.com/R0m1k3/Loki.git
synced 2026-10-11 17:26:57 +02:00
Socle du renommage jean -> AJEAN, sans aucun impact visible pour le parc installe. Trois briques : - module github.com/nathaninline/ajean, cmd/ajean, internal/ajean, package ajean. Purement interne. - AjeanHome() remplace JeanHome(). Les defauts deviennent %ProgramData%\ajean et /etc/ajean, avec migration du dossier existant au premier lancement. La migration est un os.Rename dans le dossier parent de l'ancien chemin : intra-volume, donc atomique et instantane meme avec des .gguf de plusieurs dizaines de Go. Si le rename echoue (handle ouvert sous Windows, droits, volume en lecture seule) on CONTINUE sur l'ancien chemin et on retentera : jamais de copie, jamais de suppression, le pire cas est "rien n'a bouge". $AJEAN_HOME et $JEAN_HOME restent tous deux honores, ainsi que /etc/default/ajean et /etc/default/jean : un chemin impose a la main est un ordre, on ne le migre pas. - l'auto-MAJ accepte desormais ajean-<os>-<arch> ET jean-<os>-<arch>, dans cet ordre. Indispensable dans les deux sens : les binaires deja installes ne connaissent que jean-*, et ce binaire-ci doit pouvoir s'installer depuis une release anterieure au renommage. Couvert par des tests, dont le repli quand un handle ouvert bloque le rename sous Windows.
64 lines
2.1 KiB
Go
64 lines
2.1 KiB
Go
package ajean
|
|
|
|
import "testing"
|
|
|
|
// relWith fabrique une release ne contenant que les assets nommés.
|
|
func relWith(names ...string) *ghRelease {
|
|
rel := &ghRelease{TagName: "v9.9.9"}
|
|
for _, n := range names {
|
|
rel.Assets = append(rel.Assets, struct {
|
|
Name string `json:"name"`
|
|
BrowserDownloadURL string `json:"browser_download_url"`
|
|
Size int64 `json:"size"`
|
|
}{Name: n, BrowserDownloadURL: "https://example.invalid/" + n, Size: 42})
|
|
}
|
|
return rel
|
|
}
|
|
|
|
// Une release de transition publie les deux noms : on doit préférer ajean-*.
|
|
func TestPickAssetPrefersAjean(t *testing.T) {
|
|
names := updateAssetNames()
|
|
got, url, _ := pickAsset(relWith(names[1], names[0]))
|
|
if got != names[0] {
|
|
t.Fatalf("got %q, attendu la préférence %q", got, names[0])
|
|
}
|
|
if url == "" {
|
|
t.Fatal("URL vide")
|
|
}
|
|
}
|
|
|
|
// Release future, purgée des anciens noms : ajean-* seul suffit.
|
|
func TestPickAssetAjeanOnly(t *testing.T) {
|
|
names := updateAssetNames()
|
|
if got, _, _ := pickAsset(relWith(names[0])); got != names[0] {
|
|
t.Fatalf("got %q, attendu %q", got, names[0])
|
|
}
|
|
}
|
|
|
|
// Ancienne release, antérieure au renommage : le repli sur jean-* doit marcher,
|
|
// sinon un client neuf ne pourrait pas s'installer depuis une release existante.
|
|
func TestPickAssetFallsBackToLegacy(t *testing.T) {
|
|
names := updateAssetNames()
|
|
got, _, _ := pickAsset(relWith(names[1]))
|
|
if got != names[1] {
|
|
t.Fatalf("got %q, attendu le repli %q", got, names[1])
|
|
}
|
|
}
|
|
|
|
// Le nom renvoyé sert à vérifier le SHA-256 : il doit être celui réellement
|
|
// choisi, pas le nom préféré, sinon la vérification échoue sur un repli.
|
|
func TestPickAssetReturnsCheckedName(t *testing.T) {
|
|
names := updateAssetNames()
|
|
got, url, size := pickAsset(relWith(names[1]))
|
|
if got != names[1] || url != "https://example.invalid/"+names[1] || size != 42 {
|
|
t.Fatalf("incohérence nom/URL/taille: %q %q %d", got, url, size)
|
|
}
|
|
}
|
|
|
|
// Aucun asset pour cette plateforme → pas d'URL, l'appelant doit pouvoir le voir.
|
|
func TestPickAssetNoMatch(t *testing.T) {
|
|
if _, url, _ := pickAsset(relWith("ajean-plan9-386", "SHA256SUMS")); url != "" {
|
|
t.Fatalf("URL inattendue: %q", url)
|
|
}
|
|
}
|