Compare commits

...

7 Commits
dev82 ... dev74

6 changed files with 103 additions and 61 deletions

View File

@ -1,3 +1,5 @@
## 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,7 +19,8 @@ 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, prendre ce fichier à la place comme source si un fichier \${2#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à
la place comme source
Ajouter file au tableau userfiles" Ajouter file au tableau userfiles"
function template_copy_replace() { function template_copy_replace() {
@ -47,7 +48,8 @@ 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 \${2#.}.local existe, prendre ce fichier à la place comme source si un fichier \${1#.}.local existe (e.g 'file.ext.local'), prendre ce fichier à
la place comme source
Ajouter file au tableau userfiles" Ajouter file au tableau userfiles"
function template_copy_missing() { function template_copy_missing() {
@ -205,6 +207,18 @@ 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
@ -213,6 +227,7 @@ 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 $prefix=null): self { static final function unexpected_state(?string $suffix=null): self {
$message = "unexpected state"; $message = "unexpected state";
if ($prefix) $prefix = "$prefix: "; if ($suffix) $suffix = ": $suffix";
return new static($prefix.$message); return new static($message.$suffix);
} }
} }

View File

@ -4,20 +4,15 @@ 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 = [
"nature" => ["string", null, "nature du schéma", 0 => ["string", null, "nature du schéma",
"pkey" => 0,
"allowed_values" => ["scalar", "assoc", "list"], "allowed_values" => ["scalar", "assoc", "list"],
], ],
"title" => ["?string", null, "libellé de la valeur"], "compute_func" => ["?callable", null, "fonction qui calcule les valeurs des champs computed"],
"required" => ["bool", false, "la valeur est-elle requise?"], "validate_func" => ["?callable", null, "fonction qui vérifie la conformité de l'objet dans son ensemble"],
"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-schema d'un schéma de nature scalaire */ /** @var array meta-schéma d'une valeur */
const SCALAR_METASCHEMA = [ const VALUE_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"],
@ -38,22 +33,29 @@ 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"],
"composite" => ["?bool", null, "ce champ fait-il partie d'une valeur composite?"], "computed" => ["?bool", null, "ce champ est-il calculé? si oui, il n'est pas demandé en entrée ni validé"],
]; ];
const MESSAGES = [ const MESSAGES = [
"missing" => "{key}: Vous devez spécifier cette valeur", "missing" => "Vous devez spécifier cette valeur",
"unavailable" => "{key}: Vous devez spécifier cette valeur", "unavailable" => "Vous devez spécifier cette valeur",
"null" => "{key}: cette valeur ne doit pas être nulle", "null" => "Cette valeur ne doit pas être nulle",
"empty" => "{key}: cette valeur ne doit pas être vide", "empty" => "Cette valeur ne doit pas être vide",
"invalid" => "{key}: {orig}: cette valeur est invalide", "invalid" => "Cette valeur est invalide",
]; ];
/** @var array meta-schema d'un schéma de nature associative */ /** @var array clés supplémentaires de schéma de la nature scalaire */
const ASSOC_METASCHEMA = [ const SCALAR_NATURE_METASCHEMA = [
]; ];
/** @var array meta-schema d'un schéma de nature liste */ /** @var array clés supplémentaires de schéma de la nature associative */
const LIST_METASCHEMA = [ const ASSOC_NATURE_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=() DISTFILES=(); TEMPLATEFILES=(); VARFILES=()
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,49 +56,59 @@ function dcrunning() {
function build_check_env() { function build_check_env() {
eval "$(template_locals)" eval "$(template_locals)"
local updatedenv distfile distname local updatedenv file name
local -a updatedfiles distfiles local -a updatedfiles files
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 distfile in "${DISTFILES[@]}"; do for file in "${DISTFILES[@]}"; do
if [ -f "$PROJDIR/$distfile" ]; then if [ -f "$PROJDIR/$file" ]; then
if template_copy_missing "$PROJDIR/$distfile"; then if template_copy_missing "$PROJDIR/$file"; then
updated=1 updated=1
setx distname=basename -- "$distfile" setx name=basename -- "$file"
distname="${distname#.}"; distname="${distname%.dist}" name="${name#.}"; name="${name%.}"
setx distfile=dirname -- "$distfile" setx file=dirname -- "$file"
distfile="$distfile/$distname" file="$file/$name"
updatedfiles+=("$distfile") updatedfiles+=("$file")
fi fi
elif [ -d "$PROJDIR/$distfile" ]; then elif [ -d "$PROJDIR/$file" ]; then
local distdir="$PROJDIR/$distfile" local dir="$PROJDIR/$file"
setx -a distfiles=find "$distdir" -type f -name ".*.dist" setx -a files=find "$dir" -type f -name ".*.dist"
for distfile in "${distfiles[@]}"; do for file in "${files[@]}"; do
if template_copy_missing "$distfile"; then if template_copy_missing "$file"; then
updated=1 updated=1
setx distname=basename -- "$distfile" setx name=basename -- "$file"
distname="${distname#.}"; distname="${distname%.dist}" name="${name#.}"; name="${name%.}"
# ignorer les fichiers binaires setx file=dirname -- "$file"
#XXX remplacer par un code plus robuste, peut-être à file="$file/$name"
# intégrer directement dans template: updatedfiles+=("${file#$PROJDIR/}")
case "$distname" in
*.png|*.jpg) ;;
*)
setx distfile=dirname -- "$distfile"
distfile="$distfile/$distname"
updatedfiles+=("${distfile#$PROJDIR/}")
;;
esac
fi fi
done done
else else
ewarn "$distfile: fichier introuvable" ewarn "$file: fichier dist introuvable"
fi fi
done done
template_process_userfiles for file in "${TEMPLATEFILES[@]}"; do
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,14 +47,27 @@ 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 ## Fichiers .dist et .template
## 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à # fichier name sauf s'il existe déjà. Si un fichier name.dist.local existe, il
# 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épertoirs à considérer). Pour chaque répertoire, les # Liste de fichiers (ou de répertoires à considérer). Pour chaque répertoire,
# fichiers .*.dist dans l'arborescence du répertoire sont recherchés # les 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
################################################################################ ################################################################################