From 927915093af5196099ae26645c07e90ddf1b2330 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Fri, 14 Mar 2025 15:24:39 +0400 Subject: [PATCH 01/11] Init changelog & version 0.4.0p82 --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 5332e13..51102c4 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,5 @@ +## Release 0.4.0p82 du 14/03/2025-15:24 + ## Release 0.4.0p74 du 14/03/2025-15:23 * `cf9fab5` maj src/php From 2cdc05981013dc403afe26c08f3cfef36f737642 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 11:43:34 +0400 Subject: [PATCH 02/11] modifs.mineures sans commentaires --- php/src/ref/schema/ref_schema.php | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/php/src/ref/schema/ref_schema.php b/php/src/ref/schema/ref_schema.php index cee4786..62045a9 100644 --- a/php/src/ref/schema/ref_schema.php +++ b/php/src/ref/schema/ref_schema.php @@ -8,12 +8,8 @@ class ref_schema { "pkey" => 0, "allowed_values" => ["scalar", "assoc", "list"], ], - "title" => ["?string", null, "libellé de la valeur"], - "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"], + "compute_func" => ["?callable", null, "fonction qui calcule les valeurs des champs computed"], + "validate_func" => ["?callable", null, "fonction qui vérifie la conformité de l'objet dans son ensemble"], ]; /** @var array meta-schema d'un schéma de nature scalaire */ @@ -38,7 +34,7 @@ class ref_schema { "name" => ["?string", null, "identifiant de la valeur"], "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"], - "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 = [ From 8cbe9c7654f1f099df8544caba2cc71d6b7596e0 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 20:24:34 +0400 Subject: [PATCH 03/11] =?UTF-8?q?template=20ignore=20les=20fichiers=20bina?= =?UTF-8?q?ires=20(impl=C3=A9mentation=20gros=20doigt)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bash/src/template.sh | 19 +++++++++++++++++-- runphp/build | 14 +++----------- 2 files changed, 20 insertions(+), 13 deletions(-) diff --git a/bash/src/template.sh b/bash/src/template.sh index 3201b6a..c3d3376 100644 --- a/bash/src/template.sh +++ b/bash/src/template.sh @@ -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' 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" 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' 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" function template_copy_missing() { @@ -205,6 +207,18 @@ function template_generate_scripts() { #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() { local awkscript sedscript workfile userfile ac_set_tmpfile awkscript @@ -213,6 +227,7 @@ function template_process_userfiles() { ac_set_tmpfile workfile for userfile in "${userfiles[@]}"; do + _template_can_process "$userfile" || continue if cat "$userfile" | awk -f "$awkscript" | sed -rf "$sedscript" >"$workfile"; then if testdiff "$workfile" "$userfile"; then # n'écrire le fichier que s'il a changé diff --git a/runphp/build b/runphp/build index 4e324d0..f87f43e 100755 --- a/runphp/build +++ b/runphp/build @@ -81,17 +81,9 @@ function build_check_env() { updated=1 setx distname=basename -- "$distfile" distname="${distname#.}"; distname="${distname%.dist}" - # ignorer les fichiers binaires - #XXX remplacer par un code plus robuste, peut-être à - # intégrer directement dans template: - case "$distname" in - *.png|*.jpg) ;; - *) - setx distfile=dirname -- "$distfile" - distfile="$distfile/$distname" - updatedfiles+=("${distfile#$PROJDIR/}") - ;; - esac + setx distfile=dirname -- "$distfile" + distfile="$distfile/$distname" + updatedfiles+=("${distfile#$PROJDIR/}") fi done else From 2fd5b9933d20ecc8d961f37abb63f9b1c133581f Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Mon, 17 Mar 2025 20:47:30 +0400 Subject: [PATCH 04/11] support fichiers template --- runphp/build | 64 +++++++++++++++++++++++++++++++++------------------ runphp/runphp | 23 ++++++++++++++---- 2 files changed, 59 insertions(+), 28 deletions(-) diff --git a/runphp/build b/runphp/build index f87f43e..25d53fa 100755 --- a/runphp/build +++ b/runphp/build @@ -6,7 +6,7 @@ RUNPHP="$MYDIR/runphp" RUNPHP_STANDALONE= PROJDIR=; COMPOSERDIR=; COMPOSERPHAR=; VENDORDIR=; BUILDENV0=; BUILDENV= BUILD_IMAGES=(php-apache mariadb10); export BUILD_FLAVOUR=; DIST=; IMAGENAME= -DISTFILES=() +DISTFILES=(); TEMPLATEFILES=(); VARFILES=() source "$RUNPHP" || exit 1 source "$PROJDIR/$VENDORDIR/nulib/php/load.sh" || exit 1 require: template @@ -56,41 +56,59 @@ function dcrunning() { function build_check_env() { eval "$(template_locals)" - local updatedenv distfile distname - local -a updatedfiles distfiles + local updatedenv file name + local -a updatedfiles files if template_copy_missing "$PROJDIR/$BUILDENV0"; then updated=1 updatedenv=1 fi - for distfile in "${DISTFILES[@]}"; do - if [ -f "$PROJDIR/$distfile" ]; then - if template_copy_missing "$PROJDIR/$distfile"; then + for file in "${DISTFILES[@]}"; do + if [ -f "$PROJDIR/$file" ]; then + if template_copy_missing "$PROJDIR/$file"; then updated=1 - setx distname=basename -- "$distfile" - distname="${distname#.}"; distname="${distname%.dist}" - setx distfile=dirname -- "$distfile" - distfile="$distfile/$distname" - updatedfiles+=("$distfile") + setx name=basename -- "$file" + name="${name#.}"; name="${name%.}" + setx file=dirname -- "$file" + file="$file/$name" + updatedfiles+=("$file") fi - elif [ -d "$PROJDIR/$distfile" ]; then - local distdir="$PROJDIR/$distfile" - setx -a distfiles=find "$distdir" -type f -name ".*.dist" - for distfile in "${distfiles[@]}"; do - if template_copy_missing "$distfile"; then + elif [ -d "$PROJDIR/$file" ]; then + local dir="$PROJDIR/$file" + setx -a files=find "$dir" -type f -name ".*.dist" + for file in "${files[@]}"; do + if template_copy_missing "$file"; then updated=1 - setx distname=basename -- "$distfile" - distname="${distname#.}"; distname="${distname%.dist}" - setx distfile=dirname -- "$distfile" - distfile="$distfile/$distname" - updatedfiles+=("${distfile#$PROJDIR/}") + setx name=basename -- "$file" + name="${name#.}"; name="${name%.}" + setx file=dirname -- "$file" + file="$file/$name" + updatedfiles+=("${file#$PROJDIR/}") fi done else - ewarn "$distfile: fichier introuvable" + ewarn "$file: fichier dist introuvable" fi 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 enote "IMPORTANT: vous devez paramétrer certains fichiers avant de pouvoir construire les images" diff --git a/runphp/runphp b/runphp/runphp index 4bfe2ed..ea30726 100755 --- a/runphp/runphp +++ b/runphp/runphp @@ -47,14 +47,27 @@ DIST= # Nom de base de l'image (sans le registry), e.g prefix/ IMAGENAME= -## Fichiers .dist -## Lors du build, les fichiers de la forme .name.dist sont copiés vers un -## fichier name sauf s'il existe déjà +## Fichiers .dist et .template +# 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 +# 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 -# fichiers .*.dist dans l'arborescence du répertoire sont recherchés +# Liste de fichiers (ou de répertoires à considérer). Pour chaque répertoire, +# les fichiers .*.dist dans l'arborescence du répertoire sont recherchés 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 ################################################################################ From 2e61d7bc211b83610159c68539bae6e4b7dca147 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 18 Mar 2025 10:43:29 +0400 Subject: [PATCH 05/11] modifs.mineures sans commentaires --- php/src/ref/schema/ref_schema.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/php/src/ref/schema/ref_schema.php b/php/src/ref/schema/ref_schema.php index 62045a9..c3fe76c 100644 --- a/php/src/ref/schema/ref_schema.php +++ b/php/src/ref/schema/ref_schema.php @@ -38,11 +38,11 @@ class ref_schema { ]; const MESSAGES = [ - "missing" => "{key}: Vous devez spécifier cette valeur", - "unavailable" => "{key}: Vous devez spécifier cette valeur", - "null" => "{key}: cette valeur ne doit pas être nulle", - "empty" => "{key}: cette valeur ne doit pas être vide", - "invalid" => "{key}: {orig}: cette valeur est invalide", + "missing" => "Vous devez spécifier cette valeur", + "unavailable" => "Vous devez spécifier cette valeur", + "null" => "Cette valeur ne doit pas être nulle", + "empty" => "Cette valeur ne doit pas être vide", + "invalid" => "Cette valeur est invalide", ]; /** @var array meta-schema d'un schéma de nature associative */ From df9bc0d97193896bd6f4019682801e0d52b30a35 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Wed, 19 Mar 2025 06:38:48 +0400 Subject: [PATCH 06/11] modifs.mineures sans commentaires --- php/src/ref/schema/ref_schema.php | 22 ++++++++++++++-------- 1 file changed, 14 insertions(+), 8 deletions(-) diff --git a/php/src/ref/schema/ref_schema.php b/php/src/ref/schema/ref_schema.php index c3fe76c..f1af52e 100644 --- a/php/src/ref/schema/ref_schema.php +++ b/php/src/ref/schema/ref_schema.php @@ -4,16 +4,15 @@ namespace nulib\ref\schema; class ref_schema { /** @var array schéma des natures de schéma */ const NATURE_METASCHEMA = [ - "nature" => ["string", null, "nature du schéma", - "pkey" => 0, + 0 => ["string", null, "nature du schéma", "allowed_values" => ["scalar", "assoc", "list"], ], "compute_func" => ["?callable", null, "fonction qui calcule les valeurs des champs computed"], "validate_func" => ["?callable", null, "fonction qui vérifie la conformité de l'objet dans son ensemble"], ]; - /** @var array meta-schema d'un schéma de nature scalaire */ - const SCALAR_METASCHEMA = [ + /** @var array meta-schéma d'une valeur */ + const VALUE_METASCHEMA = [ "type" => ["array", null, "types possibles de la valeur", "required" => true], "default" => [null, null, "valeur par défaut si la valeur n'existe pas"], "title" => ["?string", null, "libellé de la valeur"], @@ -45,11 +44,18 @@ class ref_schema { "invalid" => "Cette valeur est invalide", ]; - /** @var array meta-schema d'un schéma de nature associative */ - const ASSOC_METASCHEMA = [ + /** @var array clés supplémentaires de schéma de la nature scalaire */ + const SCALAR_NATURE_METASCHEMA = [ ]; - /** @var array meta-schema d'un schéma de nature liste */ - const LIST_METASCHEMA = [ + /** @var array clés supplémentaires de schéma de la nature associative */ + 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 = [ ]; } From c3357de203b51d821935ee28e6cbd53473f81100 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Thu, 20 Mar 2025 08:06:31 +0400 Subject: [PATCH 07/11] modifs.mineures sans commentaires --- php/src/StateException.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/php/src/StateException.php b/php/src/StateException.php index b54d13a..3eadf1d 100644 --- a/php/src/StateException.php +++ b/php/src/StateException.php @@ -15,9 +15,9 @@ class StateException extends LogicException { 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"; - if ($prefix) $prefix = "$prefix: "; - return new static($prefix.$message); + if ($suffix) $suffix = ": $suffix"; + return new static($message.$suffix); } } From 0e9c4e971d2e84420a84341422df9acea4907998 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 23 Mar 2025 06:58:56 +0400 Subject: [PATCH 08/11] renommer fichier de config pman --- .pman.yml => .composer.pman.yml | 0 bin/_pman-composer_local_deps.php | 2 +- bin/_pman-composer_select_profile.php | 4 ++-- php/src/tools/pman/ComposerFile.php | 2 +- ...amlConfigFile.php => ComposerPmanFile.php} | 22 +++++++++++++++++-- 5 files changed, 24 insertions(+), 6 deletions(-) rename .pman.yml => .composer.pman.yml (100%) rename php/src/tools/pman/{PmanYamlConfigFile.php => ComposerPmanFile.php} (72%) diff --git a/.pman.yml b/.composer.pman.yml similarity index 100% rename from .pman.yml rename to .composer.pman.yml diff --git a/bin/_pman-composer_local_deps.php b/bin/_pman-composer_local_deps.php index badae7b..868c1e3 100755 --- a/bin/_pman-composer_local_deps.php +++ b/bin/_pman-composer_local_deps.php @@ -3,7 +3,7 @@ require __DIR__ . "/../vendor/autoload.php"; use nulib\tools\pman\ComposerFile; -use nulib\tools\pman\PmanYamlConfigFile; +use nulib\tools\pman\ComposerPmanFile; use nulib\ValueException; $composer = new ComposerFile(); diff --git a/bin/_pman-composer_select_profile.php b/bin/_pman-composer_select_profile.php index 431259b..bf8cde3 100755 --- a/bin/_pman-composer_select_profile.php +++ b/bin/_pman-composer_select_profile.php @@ -3,11 +3,11 @@ require __DIR__ . "/../vendor/autoload.php"; use nulib\tools\pman\ComposerFile; -use nulib\tools\pman\PmanYamlConfigFile; +use nulib\tools\pman\ComposerPmanFile; use nulib\ValueException; $composer = new ComposerFile(); -$config = new PmanYamlConfigFile(); +$config = new ComposerPmanFile(); if ($argc <= 1) { throw new ValueException("Il faut spécifier le profil à sélectionner"); diff --git a/php/src/tools/pman/ComposerFile.php b/php/src/tools/pman/ComposerFile.php index d85a957..1cb8ed0 100644 --- a/php/src/tools/pman/ComposerFile.php +++ b/php/src/tools/pman/ComposerFile.php @@ -77,7 +77,7 @@ class ComposerFile { "nulib/php" => "nulib", ]; - function selectProfile(string $profile, PmanYamlConfigFile $config): void { + function selectProfile(string $profile, ComposerPmanFile $config): void { $config = $config->getProfileConfig($profile); // corriger les liens $deps = cl::merge(array_keys($config["require"]), array_keys($config["require-dev"])); diff --git a/php/src/tools/pman/PmanYamlConfigFile.php b/php/src/tools/pman/ComposerPmanFile.php similarity index 72% rename from php/src/tools/pman/PmanYamlConfigFile.php rename to php/src/tools/pman/ComposerPmanFile.php index c0998dd..b0520c0 100644 --- a/php/src/tools/pman/PmanYamlConfigFile.php +++ b/php/src/tools/pman/ComposerPmanFile.php @@ -6,9 +6,27 @@ use nulib\ext\yaml; use nulib\os\path; use nulib\ValueException; -class PmanYamlConfigFile { +class ComposerPmanFile { + const NAMES = [".composer.pman", ".pman"]; + const EXTS = [".yml", ".yaml"]; + function __construct(string $configFile=".", bool $ensureExists=true) { - if (is_dir($configFile)) $configFile = path::join($configFile, '.pman.yml'); + if (is_dir($configFile)) { + $found = false; + foreach (self::NAMES as $name) { + foreach (self::EXTS as $ext) { + $file = path::join($configFile, "$name$ext"); + if (file_exists($file)) { + $configFile = $file; + $found = true; + break; + } + } + } + if (!$found) { + $configFile = path::join($configFile, self::NAMES[0].self::EXTS[0]); + } + } if ($ensureExists && !file_exists($configFile)) { $message = path::ppath($configFile).": fichier introuvable"; throw new ValueException($message); From 5beb5e662126855ec1ba24c8e16e7a898b050796 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Sun, 23 Mar 2025 12:09:35 +0400 Subject: [PATCH 09/11] corriger la prise en compte du proxy --- runphp/build | 6 ++++++ runphp/runphp | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/runphp/build b/runphp/build index 25d53fa..3f7c7b6 100755 --- a/runphp/build +++ b/runphp/build @@ -11,6 +11,12 @@ source "$RUNPHP" || exit 1 source "$PROJDIR/$VENDORDIR/nulib/php/load.sh" || exit 1 require: template +# recenser les valeur de proxy +declare -A PROXY_VARS +for var in {HTTPS,ALL,NO}_PROXY {http,https,all,no}_proxy; do + is_defined "$var" && PROXY_VARS[${var,,}]="${!var}" +done + BUILD_ARGS=( DIST NDIST REGISTRY diff --git a/runphp/runphp b/runphp/runphp index ea30726..e24aba5 100755 --- a/runphp/runphp +++ b/runphp/runphp @@ -311,7 +311,6 @@ function host_init_env() { ## Charger la configuration # Recenser les valeur de proxy - declare -A PROXY_VARS for var in {HTTPS,ALL,NO}_PROXY {http,https,all,no}_proxy; do is_defined "$var" && PROXY_VARS[${var,,}]="${!var}" done @@ -633,6 +632,7 @@ function container_exec() { if [ "$RUNPHP_MODE" != docker ]; then # Lancement depuis l'extérieur du container + declare -A PROXY_VARS host_parse_args "$@" host_init_env From 39bc8fed3bc99e2814662f400887643b531902b0 Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 25 Mar 2025 08:47:13 +0400 Subject: [PATCH 10/11] Init changelog & version 0.4.1p74 --- CHANGES.md | 7 +++++++ VERSION.txt | 2 +- 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/CHANGES.md b/CHANGES.md index 51102c4..60676ac 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,10 @@ +## Release 0.4.1p74 du 25/03/2025-08:47 + +* `5beb5e6` corriger la prise en compte du proxy +* `0e9c4e9` renommer fichier de config pman +* `2fd5b99` support fichiers template +* `8cbe9c7` template ignore les fichiers binaires (implémentation gros doigt) + ## Release 0.4.0p82 du 14/03/2025-15:24 ## Release 0.4.0p74 du 14/03/2025-15:23 diff --git a/VERSION.txt b/VERSION.txt index 1d0ba9e..267577d 100644 --- a/VERSION.txt +++ b/VERSION.txt @@ -1 +1 @@ -0.4.0 +0.4.1 From e8ac4ed8be0b4f3fd832c9e85b59c45fbc27e3cb Mon Sep 17 00:00:00 2001 From: Jephte Clain Date: Tue, 25 Mar 2025 08:47:45 +0400 Subject: [PATCH 11/11] Init changelog & version 0.4.1p82 --- CHANGES.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/CHANGES.md b/CHANGES.md index 60676ac..f054030 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,3 +1,5 @@ +## Release 0.4.1p82 du 25/03/2025-08:47 + ## Release 0.4.1p74 du 25/03/2025-08:47 * `5beb5e6` corriger la prise en compte du proxy