Fix : badge 'absent' faux positif sur ZIPs en sous-dossier de channel

Le commit 7ff5e56 avait changé $zips pour stocker des chemins relatifs
(asterion-vr/proserve-1.5.3.zip) afin de lister les ZIPs en sous-dossier,
mais le check par-row utilisait toujours basename(URL) → comparait
"proserve-1.5.3.zip" contre ["asterion-vr/proserve-1.5.3.zip"], donc
in_array() retournait toujours false → badge "absent" alors que le ZIP
était bien là.

Fix : on compute zipRel depuis l'URL de la même façon que $zips (extrait
tout après /builds/), pour que les deux côtés du in_array() utilisent le
même format. Le tooltip "attendu :" affiche aussi le chemin relatif
complet, c'est plus clair pour le SFTP.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-05-05 08:37:35 +02:00
parent 7638a7a25c
commit 0c69bb1c85

View File

@@ -496,8 +496,16 @@ Layout::header('Versions', 'versions');
</thead> </thead>
<tbody> <tbody>
<?php foreach ($manifest['versions'] ?? [] as $v): <?php foreach ($manifest['versions'] ?? [] as $v):
$zipBase = basename(parse_url($v['download']['url'], PHP_URL_PATH) ?? ''); // Format relatif depuis builds/. Pour le default channel, ça donne juste
$zipExists = in_array($zipBase, $zips, true); // "proserve-X.Y.Z.zip" ; pour les autres channels, "asterion-vr/proserve-X.Y.Z.zip".
// Doit matcher exactement ce que produit $zips (cf. plus haut, glob sur 1
// niveau de sous-dossier max + chemin relatif normalisé en slash forward).
$urlPath = parse_url($v['download']['url'] ?? '', PHP_URL_PATH) ?: '';
$zipPos = strpos($urlPath, '/builds/');
$zipRel = $zipPos !== false
? ltrim(substr($urlPath, $zipPos + strlen('/builds/')), '/\\')
: basename($urlPath);
$zipExists = in_array($zipRel, $zips, true);
$hashed = !empty($v['download']['sha256']) && !str_starts_with($v['download']['sha256'], 'REPLACE'); $hashed = !empty($v['download']['sha256']) && !str_starts_with($v['download']['sha256'], 'REPLACE');
$hashSkipped = strtolower((string)($v['download']['hashAlgorithm'] ?? 'sha256')) === 'none'; $hashSkipped = strtolower((string)($v['download']['hashAlgorithm'] ?? 'sha256')) === 'none';
?> ?>
@@ -513,10 +521,10 @@ Layout::header('Versions', 'versions');
<td> <td>
<?php if ($zipExists): ?> <?php if ($zipExists): ?>
<span class="badge badge-success">présent</span> <span class="badge badge-success">présent</span>
<span class="muted"><?= Layout::formatBytes($zipSizes[$zipBase] ?? 0) ?></span> <span class="muted"><?= Layout::formatBytes($zipSizes[$zipRel] ?? 0) ?></span>
<?php else: ?> <?php else: ?>
<span class="badge badge-warning">absent</span> <span class="badge badge-warning">absent</span>
<div class="muted" style="font-size: 11px;">attendu : <code><?= htmlspecialchars($zipBase) ?></code></div> <div class="muted" style="font-size: 11px;">attendu : <code><?= htmlspecialchars($zipRel) ?></code></div>
<?php endif; ?> <?php endif; ?>
</td> </td>
<td> <td>