Compare commits

..

5 Commits

6 changed files with 61 additions and 103 deletions

View File

@ -1,5 +1,3 @@
## Release 0.4.0p82 du 14/03/2025-15:24
## Release 0.4.0p74 du 14/03/2025-15:23 ## Release 0.4.0p74 du 14/03/2025-15:23
* `cf9fab5` maj src/php * `cf9fab5` maj src/php

View File

@ -19,8 +19,7 @@ Copier \$1 vers \$2 de façon inconditionnelle
Si \$2 n'est pas spécifié, on assume que \$1 est de la forme '.file.ext' Si \$2 n'est pas spécifié, on assume que \$1 est de la forme '.file.ext'
et \$2 vaudra alors 'file' et \$2 vaudra alors 'file'
si un fichier \${2#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à si un fichier \${2#.}.local existe, prendre ce fichier à la place comme source
la place comme source
Ajouter file au tableau userfiles" Ajouter file au tableau userfiles"
function template_copy_replace() { function template_copy_replace() {
@ -48,8 +47,7 @@ Copier \$1 vers \$2 si ce fichier n'existe pas déjà
Si \$2 n'est pas spécifié, on assume que \$1 est de la forme '.file.ext' Si \$2 n'est pas spécifié, on assume que \$1 est de la forme '.file.ext'
et \$2 vaudra alors 'file' et \$2 vaudra alors 'file'
si un fichier \${1#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à si un fichier \${2#.}.local existe, prendre ce fichier à la place comme source
la place comme source
Ajouter file au tableau userfiles" Ajouter file au tableau userfiles"
function template_copy_missing() { function template_copy_missing() {
@ -207,18 +205,6 @@ function template_generate_scripts() {
#etitle "sedscript" cat "$sedscript" #etitle "sedscript" cat "$sedscript"
} }
function: _template_can_process "\
Indiquer si \$1 est un fichier texte, qui peut être traité par
template_process_userfiles"
function _template_can_process() {
case "$1" in
*.png|*.jpg|*.gif|*.bmp) return 1;;
*.zip|*.jar|*.war|*.ear) return 1;;
*.tar|*.gz|*.tgz|*.bz2|*.tbz2) return 1;;
*) return 0;;
esac
}
function template_process_userfiles() { function template_process_userfiles() {
local awkscript sedscript workfile userfile local awkscript sedscript workfile userfile
ac_set_tmpfile awkscript ac_set_tmpfile awkscript
@ -227,7 +213,6 @@ function template_process_userfiles() {
ac_set_tmpfile workfile ac_set_tmpfile workfile
for userfile in "${userfiles[@]}"; do for userfile in "${userfiles[@]}"; do
_template_can_process "$userfile" || continue
if cat "$userfile" | awk -f "$awkscript" | sed -rf "$sedscript" >"$workfile"; then if cat "$userfile" | awk -f "$awkscript" | sed -rf "$sedscript" >"$workfile"; then
if testdiff "$workfile" "$userfile"; then if testdiff "$workfile" "$userfile"; then
# n'écrire le fichier que s'il a changé # n'écrire le fichier que s'il a changé

View File

@ -15,9 +15,9 @@ class StateException extends LogicException {
return new static($prefix.$message); return new static($prefix.$message);
} }
static final function unexpected_state(?string $suffix=null): self { static final function unexpected_state(?string $prefix=null): self {
$message = "unexpected state"; $message = "unexpected state";
if ($suffix) $suffix = ": $suffix"; if ($prefix) $prefix = "$prefix: ";
return new static($message.$suffix); return new static($prefix.$message);
} }
} }

View File

@ -4,15 +4,20 @@ namespace nulib\ref\schema;
class ref_schema { class ref_schema {
/** @var array schéma des natures de schéma */ /** @var array schéma des natures de schéma */
const NATURE_METASCHEMA = [ const NATURE_METASCHEMA = [
0 => ["string", null, "nature du schéma", "nature" => ["string", null, "nature du schéma",
"pkey" => 0,
"allowed_values" => ["scalar", "assoc", "list"], "allowed_values" => ["scalar", "assoc", "list"],
], ],
"compute_func" => ["?callable", null, "fonction qui calcule les valeurs des champs computed"], "title" => ["?string", null, "libellé de la valeur"],
"validate_func" => ["?callable", null, "fonction qui vérifie la conformité de l'objet dans son ensemble"], "required" => ["bool", false, "la valeur est-elle requise?"],
"nullable" => ["?bool", null, "la valeur peut-elle être nulle?"],
"desc" => ["?content", null, "description de la valeur"],
"name" => ["?key", null, "identifiant de la valeur"],
"schema" => ["?array", null, "définition du schéma"],
]; ];
/** @var array meta-schéma d'une valeur */ /** @var array meta-schema d'un schéma de nature scalaire */
const VALUE_METASCHEMA = [ const SCALAR_METASCHEMA = [
"type" => ["array", null, "types possibles de la valeur", "required" => true], "type" => ["array", null, "types possibles de la valeur", "required" => true],
"default" => [null, null, "valeur par défaut si la valeur n'existe pas"], "default" => [null, null, "valeur par défaut si la valeur n'existe pas"],
"title" => ["?string", null, "libellé de la valeur"], "title" => ["?string", null, "libellé de la valeur"],
@ -33,29 +38,22 @@ class ref_schema {
"name" => ["?string", null, "identifiant de la valeur"], "name" => ["?string", null, "identifiant de la valeur"],
"pkey" => ["?pkey", null, "chemin de clé de la valeur dans un tableau associatif"], "pkey" => ["?pkey", null, "chemin de clé de la valeur dans un tableau associatif"],
"header" => ["?string", null, "nom de l'en-tête s'il faut présenter cette donnée dans un tableau"], "header" => ["?string", null, "nom de l'en-tête s'il faut présenter cette donnée dans un tableau"],
"computed" => ["?bool", null, "ce champ est-il calculé? si oui, il n'est pas demandé en entrée ni validé"], "composite" => ["?bool", null, "ce champ fait-il partie d'une valeur composite?"],
]; ];
const MESSAGES = [ const MESSAGES = [
"missing" => "Vous devez spécifier cette valeur", "missing" => "{key}: Vous devez spécifier cette valeur",
"unavailable" => "Vous devez spécifier cette valeur", "unavailable" => "{key}: Vous devez spécifier cette valeur",
"null" => "Cette valeur ne doit pas être nulle", "null" => "{key}: cette valeur ne doit pas être nulle",
"empty" => "Cette valeur ne doit pas être vide", "empty" => "{key}: cette valeur ne doit pas être vide",
"invalid" => "Cette valeur est invalide", "invalid" => "{key}: {orig}: cette valeur est invalide",
]; ];
/** @var array clés supplémentaires de schéma de la nature scalaire */ /** @var array meta-schema d'un schéma de nature associative */
const SCALAR_NATURE_METASCHEMA = [ const ASSOC_METASCHEMA = [
]; ];
/** @var array clés supplémentaires de schéma de la nature associative */ /** @var array meta-schema d'un schéma de nature liste */
const ASSOC_NATURE_METASCHEMA = [ const LIST_METASCHEMA = [
"ensure_array" => ["bool", false, "faut-il s'assurer que le tableau destination est non nul?"],
"ensure_keys" => ["bool", true, "faut-il s'assurer que toutes les clés existent?"],
"ensure_order" => ["bool", true, "faut-il s'assurer que les clés soient dans l'ordre?"],
];
/** @var array clés supplémentaires de schéma de la nature liste */
const LIST_NATURE_METASCHEMA = [
]; ];
} }

View File

@ -6,7 +6,7 @@ RUNPHP="$MYDIR/runphp"
RUNPHP_STANDALONE= RUNPHP_STANDALONE=
PROJDIR=; COMPOSERDIR=; COMPOSERPHAR=; VENDORDIR=; BUILDENV0=; BUILDENV= PROJDIR=; COMPOSERDIR=; COMPOSERPHAR=; VENDORDIR=; BUILDENV0=; BUILDENV=
BUILD_IMAGES=(php-apache mariadb10); export BUILD_FLAVOUR=; DIST=; IMAGENAME= BUILD_IMAGES=(php-apache mariadb10); export BUILD_FLAVOUR=; DIST=; IMAGENAME=
DISTFILES=(); TEMPLATEFILES=(); VARFILES=() DISTFILES=()
source "$RUNPHP" || exit 1 source "$RUNPHP" || exit 1
source "$PROJDIR/$VENDORDIR/nulib/php/load.sh" || exit 1 source "$PROJDIR/$VENDORDIR/nulib/php/load.sh" || exit 1
require: template require: template
@ -56,59 +56,49 @@ function dcrunning() {
function build_check_env() { function build_check_env() {
eval "$(template_locals)" eval "$(template_locals)"
local updatedenv file name local updatedenv distfile distname
local -a updatedfiles files local -a updatedfiles distfiles
if template_copy_missing "$PROJDIR/$BUILDENV0"; then if template_copy_missing "$PROJDIR/$BUILDENV0"; then
updated=1 updated=1
updatedenv=1 updatedenv=1
fi fi
for file in "${DISTFILES[@]}"; do for distfile in "${DISTFILES[@]}"; do
if [ -f "$PROJDIR/$file" ]; then if [ -f "$PROJDIR/$distfile" ]; then
if template_copy_missing "$PROJDIR/$file"; then if template_copy_missing "$PROJDIR/$distfile"; then
updated=1 updated=1
setx name=basename -- "$file" setx distname=basename -- "$distfile"
name="${name#.}"; name="${name%.}" distname="${distname#.}"; distname="${distname%.dist}"
setx file=dirname -- "$file" setx distfile=dirname -- "$distfile"
file="$file/$name" distfile="$distfile/$distname"
updatedfiles+=("$file") updatedfiles+=("$distfile")
fi fi
elif [ -d "$PROJDIR/$file" ]; then elif [ -d "$PROJDIR/$distfile" ]; then
local dir="$PROJDIR/$file" local distdir="$PROJDIR/$distfile"
setx -a files=find "$dir" -type f -name ".*.dist" setx -a distfiles=find "$distdir" -type f -name ".*.dist"
for file in "${files[@]}"; do for distfile in "${distfiles[@]}"; do
if template_copy_missing "$file"; then if template_copy_missing "$distfile"; then
updated=1 updated=1
setx name=basename -- "$file" setx distname=basename -- "$distfile"
name="${name#.}"; name="${name%.}" distname="${distname#.}"; distname="${distname%.dist}"
setx file=dirname -- "$file" # ignorer les fichiers binaires
file="$file/$name" #XXX remplacer par un code plus robuste, peut-être à
updatedfiles+=("${file#$PROJDIR/}") # intégrer directement dans template:
case "$distname" in
*.png|*.jpg) ;;
*)
setx distfile=dirname -- "$distfile"
distfile="$distfile/$distname"
updatedfiles+=("${distfile#$PROJDIR/}")
;;
esac
fi fi
done done
else else
ewarn "$file: fichier dist introuvable" ewarn "$distfile: fichier introuvable"
fi fi
done done
for file in "${TEMPLATEFILES[@]}"; do template_process_userfiles
if [ -f "$PROJDIR/$file" ]; then
template_copy_replace "$PROJDIR/$file"
elif [ -d "$PROJDIR/$file" ]; then
local dir="$PROJDIR/$file"
setx -a files=find "$dir" -type f -name ".*.template"
for file in "${files[@]}"; do
template_copy_replace "$file"
done
else
ewarn "$file: fichier template introuvable"
fi
done
local -a varfiles
for file in "${VARFILES[@]}"; do
varfiles+=("$PROJDIR/$file")
done
template_process_userfiles "${varfiles[@]}"
if [ -n "$updated" ]; then if [ -n "$updated" ]; then
enote "IMPORTANT: vous devez paramétrer certains fichiers avant de pouvoir construire les images" enote "IMPORTANT: vous devez paramétrer certains fichiers avant de pouvoir construire les images"

View File

@ -47,27 +47,14 @@ DIST=
# Nom de base de l'image (sans le registry), e.g prefix/ # Nom de base de l'image (sans le registry), e.g prefix/
IMAGENAME= IMAGENAME=
## Fichiers .dist et .template ## Fichiers .dist
# Lors du build, les fichiers de la forme .name.dist sont copiés vers un ## Lors du build, les fichiers de la forme .name.dist sont copiés vers un
# fichier name sauf s'il existe déjà. Si un fichier name.dist.local existe, il ## fichier name sauf s'il existe déjà
# est utilisé à la place de .name.dist
# Les fichiers de la forme .name.template sont copiés *systématiquement* vers
# le fichier name. Si un fichier name.template.local existe, il est utilisé à
# la place de .name.template
# Liste de fichiers (ou de répertoires à considérer). Pour chaque répertoire, # Liste de fichiers (ou de répertoirs à considérer). Pour chaque répertoire, les
# les fichiers .*.dist dans l'arborescence du répertoire sont recherchés # fichiers .*.dist dans l'arborescence du répertoire sont recherchés
DISTFILES=() DISTFILES=()
# Liste de fichiers (ou de répertoires à considérer). Pour chaque répertoire,
# les fichiers .*.template dans l'arborescence du répertoire sont recherchés
TEMPLATEFILES=()
# Fichiers contenant les valeurs des variables utilisées pour l'interpolation
# des fichiers dist et template. Seules les variables définies dans ces fichiers
# sont interpolées.
VARFILES=()
#EOF:runphp.userconf:ne pas modifier cette ligne #EOF:runphp.userconf:ne pas modifier cette ligne
################################################################################ ################################################################################