ci(forgejo): limit json_field extraction to top-level keys #30

Merged
notazof merged 1 commit from fix/forgejo-release-json-field-id into release/1.0.6 2026-08-17 03:26:54 +01:00
Showing only changes of commit 5186ffb7c8 - Show all commits

ci(forgejo): limit json_field extraction to top-level keys

L'API Forgejo renvoie pour /releases/tags/<tag> un objet JSON
pretty-printed où l'id racine (release.id, ex. 10706) est sur la
première ligne, mais l'objet author contient aussi un id (souvent 1
pour le premier user du repo). L'ancienne regex sed matchait la
première occurrence globale de "id" dans le fichier, donc elle
retombait sur author.id=1 et le PATCH /releases/1 tombait en 404
'The target couldn't be found'.

Fix : on pipe le fichier dans 'head -3' pour ne matcher que les
premières lignes (couvre largement le préambule de l'objet release).
Si Forgejo renvoie du JSON minifié (une seule ligne), head -3
renvoie toute la ligne et la regex matche le premier id (la racine,
parce que les champs auteur sont après les champs racine).
Paul Schneider 2026-08-17 03:26:11 +01:00
Signed by: notazof
GPG key ID: 1DD5D838E5343B06

View file

@ -236,12 +236,16 @@ jobs:
printf '%s' "$s"
}
# Extraction d'un champ JSON scalaire (string ou number) depuis
# un fichier. Utilise sed basique, suffisant pour les champs
# id / tag_name que l'API renvoie en clair.
# Extraction d'un champ JSON scalaire de premier niveau depuis un
# fichier. On ne lit que les premières lignes pour éviter de
# matcher un champ homonyme dans un objet imbriqué (par ex.
# le champ "id" de l'auteur d'une release Forgejo, qui vaut
# typiquement 1 pour le premier user du repo). Sans cette
# restriction, le PATCH sur /releases/<id extrait> tombe en
# 404 "The target couldn't be found".
json_field() {
local file="$1" field="$2"
sed -n "s/.*\"$field\"[[:space:]]*:[[:space:]]*\"\?\([^\",}]*\)\"\?.*/\1/p" "$file" | head -1
head -3 "$file" | sed -n "s/.*\"$field\"[[:space:]]*:[[:space:]]*\"\?\([0-9][0-9]*\)\"\?.*/\1/p" | head -1
}
# 1. Vérifier si la release existe déjà pour ce tag.