From 9a2378ba74a7d61d426fb4df9a6f94ce89195d8b Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 06:07:52 +0400
Subject: [PATCH 01/23] =?UTF-8?q?pman:=20am=C3=A9liorer=20l'ergonomie?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bash/src/pman.sh | 10 +++--
bin/pdev | 44 ++++++++++++----------
bin/pman | 98 +++++++++++++++++++++++++++++++++++-------------
bin/prel | 28 +++++++-------
4 files changed, 116 insertions(+), 64 deletions(-)
diff --git a/bash/src/pman.sh b/bash/src/pman.sh
index dcd9dfb..93bd6ce 100644
--- a/bash/src/pman.sh
+++ b/bash/src/pman.sh
@@ -224,13 +224,15 @@ function load_config() {
if [ -n "$ConfigFile" ]; then
source "$ConfigFile" || die || return
elif [ -n "$ConfigBranch" ]; then
+ # c'est le seul cas où ConfigFile reste vide
if ! array_contains LocalBranches "$ConfigBranch"; then
die "$ConfigBranch: branche de configuration introuvable" || return
else
- ac_set_tmpfile ConfigFile
- git show "$ConfigBranch:.pman.conf" >"$ConfigFile" 2>/dev/null
- [ -s "$ConfigFile" ] || die "$ConfigBranch: aucune configuration trouvée sur cette branche" || return
- source "$ConfigFile"
+ local config
+ ac_set_tmpfile config
+ git show "$ConfigBranch:.pman.conf" >"$config" 2>/dev/null
+ [ -s "$config" ] || die "$ConfigBranch: aucune configuration trouvée sur cette branche" || return
+ source "$config"
fi
elif [ -f .pman.conf ]; then
ConfigFile="$(pwd)/.pman.conf"
diff --git a/bin/pdev b/bin/pdev
index 6a2f5d1..8424508 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -25,6 +25,9 @@ function ensure_branches() {
}
function merge_action() {
+ [ -z "$ShouldPush" ] && enote "\
+L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine"
+
enote "\
Ce script va
- fusionner la branche ${COULEUR_BLEUE}$SrcBranch${COULEUR_NORMALE} dans ${COULEUR_ROUGE}$DestBranch${COULEUR_NORMALE}${Push:+
@@ -54,7 +57,7 @@ EOF
fi
EOF
- if [ -z "$ForbidDelete" ]; then
+ if [ -n "$ShouldDelete" ]; then
_scripta <
Date: Mon, 3 Mar 2025 06:42:24 +0400
Subject: [PATCH 02/23] ajout pwip
---
bash/src/pman.sh | 17 +++++++++++---
bin/pdev | 24 +++++++------------
bin/pman | 11 ---------
bin/prel | 12 +++-------
bin/pwip | 60 ++++++++++++++++++++++++++++++++++++++++++++++++
5 files changed, 85 insertions(+), 39 deletions(-)
create mode 100755 bin/pwip
diff --git a/bash/src/pman.sh b/bash/src/pman.sh
index 93bd6ce..f2f5d3d 100644
--- a/bash/src/pman.sh
+++ b/bash/src/pman.sh
@@ -159,6 +159,7 @@ function load_branches() {
local what="${1:-all}"; shift
case "$what" in
all)
+ [ -n "$Origin" ] || Origin=origin
setx CurrentBranch=git_get_branch
setx -a LocalBranches=git_list_branches
setx -a RemoteBranches=git_list_rbranches "$Origin"
@@ -195,12 +196,12 @@ function load_branches() {
ReleaseBranch=
HotfixBranch=
MainBranch=
- Dist=Branch
- for branch in "${AllBranches[@]}"; do
+ DistBranch=
+ for branch in "${LocalBranches[@]}"; do
if [ "$branch" == "$UPSTREAM" ]; then
UpstreamBranch="$branch"
elif [[ "$branch" == "$FEATURE"* ]]; then
- FeatureBranch+=("$branch")
+ FeatureBranches+=("$branch")
elif [ "$branch" == "$DEVELOP" ]; then
DevelopBranch="$branch"
elif [[ "$branch" == "$RELEASE"* ]]; then
@@ -252,6 +253,16 @@ function load_config() {
################################################################################
# Divers
+function resolve_should_push() {
+ local quiet="$1"
+ ShouldPush=1
+ if ! git_have_remote "$Origin" && [ -n "$Push" ]; then
+ [ -n "$quiet" ] || enote "L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine"
+ ShouldPush=
+ fi
+ [ -z "$ShouldPush" ] && Push=
+}
+
function _push_branches() {
[ ${#push_branches[*]} -gt 0 ] || return
[ -n "$Origin" ] || Origin=origin
diff --git a/bin/pdev b/bin/pdev
index 8424508..10c522c 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -139,7 +139,7 @@ args=(
" [source]
CONFIGURATION
-Le fichier .pman.conf contient la configuration des branches.Les variables
+Le fichier .pman.conf contient la configuration des branches. Les variables
supplémentaires suivantes peuvent être définies:
AFTER_MERGE_
AFTER_DELETE_
@@ -186,12 +186,7 @@ load_branches all
load_config "$MYNAME"
load_branches current "$1"
-ShouldPush=1
-[ -n "$Origin" ] || Origin=origin
-if ! git_have_remote "$Origin" && [ -n "$Push" ]; then
- ShouldPush=
-fi
-[ -z "$ShouldPush" ] && Push=
+resolve_should_push quiet
# puis faire l'action que l'on nous demande
case "$action" in
@@ -213,17 +208,14 @@ merge)
esac
[ -z "$ShouldDelete" ] && Delete=
git_ensure_cleancheckout
- if ! array_contains LocalBranches "$SrcBranch"; then
- # si la branche source n'existe pas, la créer
- args=(--origin "$Origin")
- if [ -n "$ConfigFile" ]; then args+=(--config-file "$ConfigFile")
- elif [ -n "$ConfigBranch" ]; then args+=(--config-branch "$ConfigBranch")
- fi
- [ -z "$Push" ] && args+=(--no-push)
- exec "$MYDIR/pman" "${args[@]}" "$FEATURE${SrcBranch#$FEATURE}"
- else
+ if array_contains LocalBranches "$SrcBranch"; then
ensure_branches
merge_action "$@"
+ elif array_contains AllBranches "$SrcBranch"; then
+ enote "$SrcBranch: une branche du même nom existe dans l'origine"
+ die "$SrcBranch: branche locale introuvable"
+ else
+ die "$SrcBranch: branche introuvable"
fi
;;
*)
diff --git a/bin/pman b/bin/pman
index cda0729..aef33b5 100755
--- a/bin/pman
+++ b/bin/pman
@@ -34,16 +34,6 @@ function show_action() {
# Initialisation
################################################################################
-function resolve_should_push() {
- ShouldPush=1
- [ -n "$Origin" ] || Origin=origin
- if ! git_have_remote "$Origin" && [ -n "$Push" ]; then
- enote "L'option --no-push a été forcée puisque ce dépôt n'a pas d'origine"
- ShouldPush=
- fi
- [ -z "$ShouldPush" ] && Push=
-}
-
function _init_config() {
if [ ! -f .pman.conf -o -n "$ForceCreate" ]; then
ac_set_tmpfile config
@@ -73,7 +63,6 @@ function init_repo_action() {
[ ${#LocalBranches[*]} -eq 0 ] || die "Ce dépôt a déjà été initialisé"
- [ -n "$Origin" ] || Origin=origin
_init_config || exit_with ewarn "Initialisation du dépôt annulée"
einfo "Création de la branche $MAIN"
diff --git a/bin/prel b/bin/prel
index 095dea6..8dceaaa 100755
--- a/bin/prel
+++ b/bin/prel
@@ -189,9 +189,8 @@ args=(
" -v VERSION [source]
CONFIGURATION
-Le fichier .pman.conf contient la configuration des branches
-
-Les variables supplémentaires suivantes peuvent être définies:
+Le fichier .pman.conf contient la configuration des branches. Les variables
+supplémentaires suivantes peuvent être définies:
AFTER_CREATE_RELEASE
AFTER_MERGE_RELEASE
AFTER_PUSH_RELEASE"
@@ -239,12 +238,7 @@ load_branches current "$1"; shift
[ -n "$ManualRelease" ] && Merge=
[ -z "$Merge" ] && Push=
-ShouldPush=1
-[ -n "$Origin" ] || Origin=origin
-if ! git_have_remote "$Origin" && [ -n "$Push" ]; then
- ShouldPush=
-fi
-[ -z "$ShouldPush" ] && Push=
+resolve_should_push quiet
# puis faire l'action que l'on nous demande
case "$action" in
diff --git a/bin/pwip b/bin/pwip
new file mode 100755
index 0000000..787676b
--- /dev/null
+++ b/bin/pwip
@@ -0,0 +1,60 @@
+#!/bin/bash
+# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
+source "$(dirname -- "$0")/../load.sh" || exit 1
+require: git pman pman.conf
+
+git_cleancheckout_DIRTY="\
+Vous avez des modifications locales.
+Enregistrez ces modifications avant de créer une nouvelle branche"
+
+chdir=
+Origin=
+ConfigBranch=
+ConfigFile=
+[ -z "$PMAN_NO_PUSH" ] && Push=1 || Push=
+args=(
+ "créer une branche de feature"
+ ""
+ -d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
+ -O:,--origin Origin= "++\
+origine à partir de laquelle les branches distantes sont considérées"
+ -B:,--config-branch ConfigBranch= "++\
+branche à partir de laquelle charger la configuration"
+ -c:,--config-file:CONFIG ConfigFile= "++\
+fichier de configuration des branches. cette option est prioritaire sur --config-branch
+par défaut, utiliser le fichier .pman.conf dans le répertoire du dépôt s'il existe"
+ -n,--no-push Push= "\
+ne pas pousser les branches vers leur origine après la fusion"
+ --push Push=1 "++\
+pousser les branches vers leur origine après la fusion.
+c'est l'option par défaut"
+)
+parse_args "$@"; set -- "${args[@]}"
+
+# charger la configuration
+ensure_gitdir "$chdir"
+load_branches all
+load_config "$MYNAME"
+load_branches current
+
+branch="$1"
+if [ -z "$branch" -a ${#FeatureBranches[*]} -eq 1 ]; then
+ branch="${FeatureBranches[0]}"
+fi
+[ -n "$branch" ] || die "Vous devez spécifier la branche à créer"
+branch="$FEATURE${branch#$FEATURE}"
+
+resolve_should_push
+git_ensure_cleancheckout
+
+if array_contains AllBranches "$branch"; then
+ git checkout -q "$branch"
+else
+ # si la branche source n'existe pas, la créer
+ args=(--origin "$Origin")
+ if [ -n "$ConfigFile" ]; then args+=(--config-file "$ConfigFile")
+ elif [ -n "$ConfigBranch" ]; then args+=(--config-branch "$ConfigBranch")
+ fi
+ [ -z "$Push" ] && args+=(--no-push)
+ exec "$MYDIR/pman" "${args[@]}" "$branch"
+fi
From 882549375c607b6b3d42367461236e408eea52cc Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 06:51:49 +0400
Subject: [PATCH 03/23] pman: tenir compte des branches distantes
---
bin/pman | 21 +++++++++++++++++++--
1 file changed, 19 insertions(+), 2 deletions(-)
diff --git a/bin/pman b/bin/pman
index aef33b5..d4b91a9 100755
--- a/bin/pman
+++ b/bin/pman
@@ -97,7 +97,12 @@ function _ensure_main_branch() {
}
function checkout_main_action() {
- _ensure_main_branch
+ if [ -z "$MainBranch" ]; then
+ array_contains AllBranches "$MAIN" && exit_with enote "\
+$MAIN: une branche du même nom existe dans l'origine
+ git checkout $MAIN"
+ _ensure_main_branch
+ fi
git checkout -q "$MAIN"
}
@@ -110,6 +115,9 @@ function init_develop_action() {
local -a push_branches
if [ -z "$DevelopBranch" ]; then
+ array_contains AllBranches "$DEVELOP" && exit_with enote "\
+$DEVELOP: une branche du même nom existe dans l'origine
+ git checkout $DEVELOP"
_ensure_main_branch
_ensure_develop_branch
@@ -136,6 +144,9 @@ function init_upstream_action() {
local -a push_branches; local config
if [ -z "$UpstreamBranch" ]; then
+ array_contains AllBranches "$UPSTREAM" && exit_with enote "\
+$UPSTREAM: une branche du même nom existe dans l'origine
+ git checkout $UPSTREAM"
_ensure_develop_branch
_ensure_upstream_branch
@@ -178,6 +189,9 @@ function init_dist_action() {
local -a push_branches
if [ -z "$DistBranch" ]; then
+ array_contains AllBranches "$DIST" && exit_with enote "\
+$DIST: une branche du même nom existe dans l'origine
+ git checkout $DIST"
_ensure_main_branch
_ensure_dist_branch
@@ -203,7 +217,10 @@ function init_feature_action() {
[ -n "$branch" ] || die "Vous devez spécifier le nom de la branche"
branch="$FEATURE$branch"
- if ! array_contains AllBranches "$branch"; then
+ if ! array_contains LocalBranches "$branch"; then
+ array_contains AllBranches "$branch" && exit_with enote "\
+$branch: une branche du même nom existe dans l'origine
+ git checkout $branch"
_ensure_develop_branch
resolve_should_push
From ead5b5adcf164d9611e7d92e4b50ba07daa5d7fe Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 08:09:58 +0400
Subject: [PATCH 04/23] support automatique options verbosity et interaction
---
bash/src/base.args.sh | 140 +++++++++++++++++++++++++++++++-----------
bash/src/pretty.sh | 8 ++-
2 files changed, 111 insertions(+), 37 deletions(-)
diff --git a/bash/src/base.args.sh b/bash/src/base.args.sh
index 393a7c5..43e63ae 100644
--- a/bash/src/base.args.sh
+++ b/bash/src/base.args.sh
@@ -124,8 +124,8 @@ optdesc
commence par ++, c'est une option avancée qui n'est pas affichée par défaut."
function parse_args() {
eval "$NULIB__DISABLE_SET_X"
+ [ -n "$NULIB_ARGS_ONERROR_RETURN" ] && set_die_return
local __r=
- local __DIE='[ -n "$NULIB_ARGS_ONERROR_RETURN" ] && return 1 || die'
if ! is_array args; then
eerror "Invalid args definition: args must be defined"
@@ -145,17 +145,33 @@ function parse_args() {
__r=1
else
__DEFS=("$@")
- __parse_args || __r=1
+ __nulib_args_parse_args || __r=1
fi
eval "$NULIB__ENABLE_SET_X"
if [ -n "$__r" ]; then
- eval "$__DIE"
+ die || return
fi
}
-function __parse_args() {
+function __nulib_args_add_sopt() {
+ local noauto="$1"; shift
+ local def
+ for def in "$@"; do
+ array_contains "$noauto" "$def" || __sopts="$__sopts$def"
+ done
+}
+function __nulib_args_add_lopt() {
+ local noauto="$1"; shift
+ local def
+ for def in "$@"; do
+ array_contains "$noauto" "$def" || __lopts="$__lopts${__lopts:+,}$def"
+ done
+}
+function __nulib_args_parse_args() {
## tout d'abord, construire la liste des options
local __AUTOH=1 __AUTOHELP=1 # faut-il gérer automatiquement l'affichage de l'aide?
- local __AUTOD=1 __AUTODEBUG=1 # faut-il rajouter les options -D et --debug
+ local -a __NOAUTOL __NOAUTOLOGTO # faut-il rajouter les options pour gérer la journalisation?
+ local -a __NOAUTOV __NOAUTOVERBOSITY # options de verbosité qui ont été définies par l'utilisateur
+ local -a __NOAUTOI __NOAUTOINTERACTION # options d'interaction qui ont été définies par l'utilisateur
local __ADVHELP # y a-t-il des options avancées?
local __popt __sopts __lopts
local -a __defs
@@ -165,10 +181,10 @@ function __parse_args() {
+) __popt="$1"; shift; continue;;
-) __popt="$1"; shift; continue;;
-*) IFS=, read -a __defs <<<"$1"; shift;;
- *) eerror "Invalid arg definition: expected option, got '$1'"; eval "$__DIE";;
+ *) die "Invalid arg definition: expected option, got '$1'" || return;;
esac
# est-ce que l'option prend un argument?
- local __def __witharg __valdesc
+ local __def __longdef __witharg __valdesc
__witharg=
for __def in "${__defs[@]}"; do
if [ "${__def%::*}" != "$__def" ]; then
@@ -180,23 +196,36 @@ function __parse_args() {
# définitions __sopts et __lopts
for __def in "${__defs[@]}"; do
__def="${__def%%:*}"
+ __longdef=
if [[ "$__def" == --* ]]; then
# --longopt
__def="${__def#--}"
__lopts="$__lopts${__lopts:+,}$__def$__witharg"
+ __longdef=1
elif [[ "$__def" == -* ]] && [ ${#__def} -eq 2 ]; then
# -o
__def="${__def#-}"
__sopts="$__sopts$__def$__witharg"
- [ "$__def" == h ] && __AUTOH=
- [ "$__def" == D ] && __AUTOD=
+ case "$__def" in
+ h) __AUTOH=;;
+ L) __NOAUTOL+=("-$__def");;
+ Q|q|v|D) __NOAUTOV+=("-$__def");;
+ b|y|i) __NOAUTOI+=("-$__def");;
+ esac
else
# -longopt ou longopt
__def="${__def#-}"
__lopts="$__lopts${__lopts:+,}$__def$__witharg"
+ __longdef=1
+ fi
+ if [ -n "$__longdef" ]; then
+ case "$__def" in
+ help|help++) __AUTOHELP=;;
+ log-to) __NOAUTOLOGTO+=("--$__def");;
+ very-quiet|quiet|verbose|debug) __NOAUTOVERBOSITY+=("--$__def");;
+ batch|automatic|interactive) __NOAUTOINTERACTION+=("--$__def");;
+ esac
fi
- [ "$__def" == help -o "$__def" == help++ ] && __AUTOHELP=
- [ "$__def" == debug ] && __AUTODEBUG=
done
# sauter l'action
shift
@@ -209,8 +238,12 @@ function __parse_args() {
[ -n "$__AUTOH" ] && __sopts="${__sopts}h"
[ -n "$__AUTOHELP" ] && __lopts="$__lopts${__lopts:+,}help,help++"
- [ -n "$__AUTOD" ] && __sopts="${__sopts}D"
- [ -n "$__AUTODEBUG" ] && __lopts="$__lopts${__lopts:+,}debug"
+ __nulib_args_add_sopt __NOAUTOL L
+ __nulib_args_add_lopt __NOAUTOLOGTO log-to
+ __nulib_args_add_sopt __NOAUTOV Q q v D
+ __nulib_args_add_lopt __NOAUTOVERBOSITY very-quiet quiet verbose debug
+ __nulib_args_add_sopt __NOAUTOI b y i
+ __nulib_args_add_lopt __NOAUTOINTERACTION batch automatic interactive
__sopts="$__popt$__sopts"
local -a __getopt_args
@@ -222,7 +255,7 @@ function __parse_args() {
else
# relancer pour avoir le message d'erreur
LANG=C getopt "${__getopt_args[@]}" 2>&1 1>/dev/null
- eval "$__DIE"
+ die || return
fi
## puis traiter les options
@@ -373,7 +406,7 @@ $prefix$usage"
fi
[[ "$1" == -* ]] || break
option_="$1"; shift
- __parse_opt "$option_"
+ __nulib_args_parse_opt "$option_"
if [ -n "$__witharg" ]; then
# l'option prend un argument
value_="$1"; shift
@@ -387,7 +420,7 @@ $prefix$usage"
unset -f inc@ res@ add@ set@ showhelp@
args=("$@")
}
-function __parse_opt() {
+function __nulib_args_parse_opt() {
# $1 est l'option spécifiée
local option_="$1"
set -- "${__DEFS[@]}"
@@ -460,27 +493,62 @@ function __parse_opt() {
[ -n "$__found" ] && return 0
done
- if [ -n "$__AUTOH" -a "$option_" == -h ]; then
- __action="showhelp@"
- return 0
- fi
- if [ -n "$__AUTOHELP" ]; then
- if [ "$option_" == --help ]; then
- __action="showhelp@"
- return 0
- elif [ "$option_" == --help++ ]; then
- __action="showhelp@ ++"
+ case "$option_" in
+ -h)
+ if [ -n "$__AUTOH" ]; then
+ __action='showhelp@'
return 0
fi
- fi
- if [ -n "$__AUTOD" -a "$option_" == -D ]; then
- __action=set_debug
- return 0
- fi
- if [ -n "$__AUTODEBUG" -a "$option_" == --debug ]; then
- __action=set_debug
- return 0
- fi
+ ;;
+ --help)
+ if [ -n "$__AUTOHELP" ]; then
+ __action='showhelp@'
+ return 0
+ fi
+ ;;
+ --help++)
+ if [ -n "$__AUTOHELP" ]; then
+ __action='showhelp@ ++'
+ return 0
+ fi
+ ;;
+ -L)
+ if ! array_contains __NOAUTOL "$option_"; then
+ __action='elogto $value_'
+ return 0
+ fi
+ ;;
+ --log-to)
+ if ! array_contains __NOAUTOL "$option_"; then
+ __action='elogto $value_'
+ return 0
+ fi
+ ;;
+ -Q|-q|-v|-D)
+ if ! array_contains __NOAUTOV "$option_"; then
+ __action='set_verbosity $option_'
+ return 0
+ fi
+ ;;
+ --very-quiet|--quiet|--verbose|--debug)
+ if ! array_contains __NOAUTOVERBOSITY "$option_"; then
+ __action='set_verbosity $option_'
+ return 0
+ fi
+ ;;
+ -b|-y|-i)
+ if ! array_contains __NOAUTOI "$option_"; then
+ __action='set_interaction $option_'
+ return 0
+ fi
+ ;;
+ --batch|--automatic|--interactive)
+ if ! array_contains __NOAUTOINTERACTION "$option_"; then
+ __action='set_interaction $option_'
+ return 0
+ fi
+ ;;
+ esac
# ici, l'option n'a pas été trouvée, on ne devrait pas arriver ici
- eerror "Unexpected option '$option_'"; eval "$__DIE"
+ die "Unexpected option '$option_'" || return
}
diff --git a/bash/src/pretty.sh b/bash/src/pretty.sh
index 2d4f32c..de252fc 100644
--- a/bash/src/pretty.sh
+++ b/bash/src/pretty.sh
@@ -108,11 +108,17 @@ function set_interaction() {
# set_interaction en fonction des arguments de la ligne de commande. A utiliser
# de cette manière:
# parse_opts ... "${PRETTYOPTS[@]}" @ args -- ...
-PRETTYOPTS=(
+# NB: ce n'est pas nécessaire, sauf si on veut afficher ces options dans l'aide
+LOGTOOPTS=(
-L:,--log-to:LOGFILE '$elogto $value_' "++enregistrer les messages dans le fichier spécifié"
+)
+VERBOSITYOPTS=(
-Q,--very-quiet,-q,--quiet,-v,--verbose,-D,--debug '$set_verbosity $option_' "++spécifier le niveau de verbiage"
+)
+INTERACTIONOPTS=(
-b,--batch,-y,--automatic,-i,--interactive '$set_interaction $option_' "++spécifier le niveau d'interaction"
)
+PRETTYOPTS=("${LOGTOOPTS[@]}" "${VERBOSITYOPTS[@]}" "${INTERACTIONOPTS[@]}")
function show_error() { [ "$__verbosity" -ge 1 ]; }
function show_warn() { [ "$__verbosity" -ge 2 ]; }
From 8e3569ac4bc74842ec0d9da8b6dfc2c74a23743c Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 08:10:24 +0400
Subject: [PATCH 05/23] =?UTF-8?q?ne=20plus=20utiliser=20tooenc=20par=20d?=
=?UTF-8?q?=C3=A9faut.=20renommer=20tooenc=20en=20uecho?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bash/src/_output_color.sh | 60 +++++++++++++++++------------------
bash/src/_output_vanilla.sh | 62 ++++++++++++++++++-------------------
bash/src/base.input.sh | 31 ++++++++++---------
bash/src/base.output.sh | 14 +++++----
bash/tests/test-output.sh | 1 -
5 files changed, 85 insertions(+), 83 deletions(-)
diff --git a/bash/src/_output_color.sh b/bash/src/_output_color.sh
index ce0dd77..afe6428 100644
--- a/bash/src/_output_color.sh
+++ b/bash/src/_output_color.sh
@@ -6,15 +6,15 @@ function __esection() {
local length="${COLUMNS:-80}"
setx lsep=__complete "$prefix" "$length" -
- tooenc "$COULEUR_BLEUE$lsep$COULEUR_NORMALE"
+ recho "$COULEUR_BLEUE$lsep$COULEUR_NORMALE"
[ -n "$*" ] || return 0
length=$((length - 1))
setx -a lines=echo "$1"
for line in "${lines[@]}"; do
setx line=__complete "$prefix- $line" "$length"
- tooenc "$COULEUR_BLEUE$line-$COULEUR_NORMALE"
+ recho "$COULEUR_BLEUE$line-$COULEUR_NORMALE"
done
- tooenc "$COULEUR_BLEUE$lsep$COULEUR_NORMALE"
+ recho "$COULEUR_BLEUE$lsep$COULEUR_NORMALE"
}
function __etitle() {
local -a lines; local maxlen=0
@@ -23,10 +23,10 @@ function __etitle() {
setx -a lines=echo "$1"
for line in "${lines[@]}"; do
[ ${#line} -gt $maxlen ] && maxlen=${#line}
- tooenc "${prefix}${COULEUR_BLEUE}T $line$COULEUR_NORMALE"
+ recho "${prefix}${COULEUR_BLEUE}T $line$COULEUR_NORMALE"
done
maxlen=$((maxlen + 2))
- tooenc "${prefix}${COULEUR_BLEUE}T$(__complete "" $maxlen -)${COULEUR_NORMALE}"
+ recho "${prefix}${COULEUR_BLEUE}T$(__complete "" $maxlen -)${COULEUR_NORMALE}"
}
function __edesc() {
local -a lines
@@ -34,7 +34,7 @@ function __edesc() {
setx -a lines=echo "$1"
for line in "${lines[@]}"; do
- tooenc "${prefix}${COULEUR_BLEUE}>${COULEUR_NORMALE} $line"
+ recho "${prefix}${COULEUR_BLEUE}>${COULEUR_NORMALE} $line"
done
}
function __ebanner() {
@@ -43,35 +43,35 @@ function __ebanner() {
local length="${COLUMNS:-80}"
setx lsep=__complete "$prefix" "$length" =
- tooenc "$COULEUR_ROUGE$lsep"
+ recho "$COULEUR_ROUGE$lsep"
length=$((length - 1))
setx -a lines=echo "$1"
for line in "" "${lines[@]}" ""; do
setx line=__complete "$prefix= $line" "$length"
- tooenc "$line="
+ recho "$line="
done
- tooenc "$lsep$COULEUR_NORMALE"
+ recho "$lsep$COULEUR_NORMALE"
}
-function __eimportant() { tooenc "$(__edate)$(__eindent0)${COULEUR_ROUGE}!${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __eattention() { tooenc "$(__edate)$(__eindent0)${COULEUR_JAUNE}*${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __eerror() { tooenc "$(__edate)$(__eindent0)${COULEUR_ROUGE}E${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __ewarn() { tooenc "$(__edate)$(__eindent0)${COULEUR_JAUNE}W${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __enote() { tooenc "$(__edate)$(__eindent0)${COULEUR_VERTE}N${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __einfo() { tooenc "$(__edate)$(__eindent0)${COULEUR_BLEUE}I${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __edebug() { tooenc "$(__edate)$(__eindent0)${COULEUR_BLANCHE}D${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __eimportant() { recho "$(__edate)$(__eindent0)${COULEUR_ROUGE}!${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __eattention() { recho "$(__edate)$(__eindent0)${COULEUR_JAUNE}*${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __eerror() { recho "$(__edate)$(__eindent0)${COULEUR_ROUGE}E${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __ewarn() { recho "$(__edate)$(__eindent0)${COULEUR_JAUNE}W${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __enote() { recho "$(__edate)$(__eindent0)${COULEUR_VERTE}N${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __einfo() { recho "$(__edate)$(__eindent0)${COULEUR_BLEUE}I${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __edebug() { recho "$(__edate)$(__eindent0)${COULEUR_BLANCHE}D${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estep() { tooenc "$(__edate)$(__eindent0)${COULEUR_BLANCHE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepe() { tooenc "$(__edate)$(__eindent0)${COULEUR_ROUGE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepw() { tooenc "$(__edate)$(__eindent0)${COULEUR_JAUNE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepn() { tooenc "$(__edate)$(__eindent0)${COULEUR_VERTE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepi() { tooenc "$(__edate)$(__eindent0)${COULEUR_BLEUE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estep_() { tooenc_ "$(__edate)$(__eindent0)${COULEUR_BLANCHE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepe_() { tooenc_ "$(__edate)$(__eindent0)${COULEUR_ROUGE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepw_() { tooenc_ "$(__edate)$(__eindent0)${COULEUR_JAUNE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepn_() { tooenc_ "$(__edate)$(__eindent0)${COULEUR_VERTE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __estepi_() { tooenc_ "$(__edate)$(__eindent0)${COULEUR_BLEUE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estep() { recho "$(__edate)$(__eindent0)${COULEUR_BLANCHE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepe() { recho "$(__edate)$(__eindent0)${COULEUR_ROUGE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepw() { recho "$(__edate)$(__eindent0)${COULEUR_JAUNE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepn() { recho "$(__edate)$(__eindent0)${COULEUR_VERTE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepi() { recho "$(__edate)$(__eindent0)${COULEUR_BLEUE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estep_() { recho_ "$(__edate)$(__eindent0)${COULEUR_BLANCHE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepe_() { recho_ "$(__edate)$(__eindent0)${COULEUR_ROUGE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepw_() { recho_ "$(__edate)$(__eindent0)${COULEUR_JAUNE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepn_() { recho_ "$(__edate)$(__eindent0)${COULEUR_VERTE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __estepi_() { recho_ "$(__edate)$(__eindent0)${COULEUR_BLEUE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __action() { tooenc "$(__edate)$(__eindent0)${COULEUR_BLANCHE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __asuccess() { tooenc "$(__edate)$(__eindent0)${COULEUR_VERTE}✔${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __afailure() { tooenc "$(__edate)$(__eindent0)${COULEUR_ROUGE}✘${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
-function __adone() { tooenc "$(__edate)$(__eindent0)$(__eindent "$1")"; }
+function __action() { recho "$(__edate)$(__eindent0)${COULEUR_BLANCHE}.${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __asuccess() { recho "$(__edate)$(__eindent0)${COULEUR_VERTE}✔${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __afailure() { recho "$(__edate)$(__eindent0)${COULEUR_ROUGE}✘${COULEUR_NORMALE} $(__eindent "$1" " ")"; }
+function __adone() { recho "$(__edate)$(__eindent0)$(__eindent "$1")"; }
diff --git a/bash/src/_output_vanilla.sh b/bash/src/_output_vanilla.sh
index c37509d..cbd466f 100644
--- a/bash/src/_output_vanilla.sh
+++ b/bash/src/_output_vanilla.sh
@@ -6,23 +6,23 @@ function __esection() {
local length="${COLUMNS:-80}"
setx lsep=__complete "$prefix" "$length" -
- tooenc "$lsep"
+ recho "$lsep"
[ -n "$*" ] || return 0
length=$((length - 1))
setx -a lines=echo "$1"
for line in "${lines[@]}"; do
setx line=__complete "$prefix- $line" "$length"
- tooenc "$line-"
+ recho "$line-"
done
- tooenc "$lsep"
+ recho "$lsep"
}
function __etitle() {
local p="TITLE: " i=" "
- tooenc "$(__edate)$(__eindent0)${p}$(__eindent "$1" "$i")"
+ recho "$(__edate)$(__eindent0)${p}$(__eindent "$1" "$i")"
}
function __edesc() {
local p="DESC: " i=" "
- tooenc "$(__edate)$(__eindent0)${p}$(__eindent "$1" "$i")"
+ recho "$(__edate)$(__eindent0)${p}$(__eindent "$1" "$i")"
}
function __ebanner() {
local -a lines
@@ -30,37 +30,37 @@ function __ebanner() {
local length="${COLUMNS:-80}"
setx lsep=__complete "$prefix" "$length" =
- tooenc "$lsep"
+ recho "$lsep"
length=$((length - 1))
setx -a lines=echo "$1"
for line in "" "${lines[@]}" ""; do
setx line=__complete "$prefix= $line" "$length"
- tooenc "$line="
+ recho "$line="
done
- tooenc "$lsep"
+ recho "$lsep"
}
-function __eimportant() { tooenc "$(__edate)$(__eindent0)IMPORTANT! $(__eindent "$1" " ")"; }
-function __eattention() { tooenc "$(__edate)$(__eindent0)ATTENTION! $(__eindent "$1" " ")"; }
-function __eerror() { tooenc "$(__edate)$(__eindent0)ERROR: $(__eindent "$1" " ")"; }
-function __ewarn() { tooenc "$(__edate)$(__eindent0)WARNING: $(__eindent "$1" " ")"; }
-function __enote() { tooenc "$(__edate)$(__eindent0)NOTE: $(__eindent "$1" " ")"; }
-function __einfo() { tooenc "$(__edate)$(__eindent0)INFO: $(__eindent "$1" " ")"; }
-function __edebug() { tooenc "$(__edate)$(__eindent0)DEBUG: $(__eindent "$1" " ")"; }
-function __eecho() { tooenc "$(__edate)$(__eindent0)$(__eindent "$1")"; }
-function __eecho_() { tooenc_ "$(__edate)$(__eindent0)$(__eindent "$1")"; }
+function __eimportant() { recho "$(__edate)$(__eindent0)IMPORTANT! $(__eindent "$1" " ")"; }
+function __eattention() { recho "$(__edate)$(__eindent0)ATTENTION! $(__eindent "$1" " ")"; }
+function __eerror() { recho "$(__edate)$(__eindent0)ERROR: $(__eindent "$1" " ")"; }
+function __ewarn() { recho "$(__edate)$(__eindent0)WARNING: $(__eindent "$1" " ")"; }
+function __enote() { recho "$(__edate)$(__eindent0)NOTE: $(__eindent "$1" " ")"; }
+function __einfo() { recho "$(__edate)$(__eindent0)INFO: $(__eindent "$1" " ")"; }
+function __edebug() { recho "$(__edate)$(__eindent0)DEBUG: $(__eindent "$1" " ")"; }
+function __eecho() { recho "$(__edate)$(__eindent0)$(__eindent "$1")"; }
+function __eecho_() { recho_ "$(__edate)$(__eindent0)$(__eindent "$1")"; }
-function __estep() { tooenc "$(__edate)$(__eindent0). $(__eindent "$1" " ")"; }
-function __estepe() { tooenc "$(__edate)$(__eindent0).E $(__eindent "$1" " ")"; }
-function __estepw() { tooenc "$(__edate)$(__eindent0).W $(__eindent "$1" " ")"; }
-function __estepn() { tooenc "$(__edate)$(__eindent0).N $(__eindent "$1" " ")"; }
-function __estepi() { tooenc "$(__edate)$(__eindent0).I $(__eindent "$1" " ")"; }
-function __estep_() { tooenc_ "$(__edate)$(__eindent0). $(__eindent "$1" " ")"; }
-function __estepe_() { tooenc_ "$(__edate)$(__eindent0).E $(__eindent "$1" " ")"; }
-function __estepw_() { tooenc_ "$(__edate)$(__eindent0).W $(__eindent "$1" " ")"; }
-function __estepn_() { tooenc_ "$(__edate)$(__eindent0).N $(__eindent "$1" " ")"; }
-function __estepi_() { tooenc_ "$(__edate)$(__eindent0).I $(__eindent "$1" " ")"; }
+function __estep() { recho "$(__edate)$(__eindent0). $(__eindent "$1" " ")"; }
+function __estepe() { recho "$(__edate)$(__eindent0).E $(__eindent "$1" " ")"; }
+function __estepw() { recho "$(__edate)$(__eindent0).W $(__eindent "$1" " ")"; }
+function __estepn() { recho "$(__edate)$(__eindent0).N $(__eindent "$1" " ")"; }
+function __estepi() { recho "$(__edate)$(__eindent0).I $(__eindent "$1" " ")"; }
+function __estep_() { recho_ "$(__edate)$(__eindent0). $(__eindent "$1" " ")"; }
+function __estepe_() { recho_ "$(__edate)$(__eindent0).E $(__eindent "$1" " ")"; }
+function __estepw_() { recho_ "$(__edate)$(__eindent0).W $(__eindent "$1" " ")"; }
+function __estepn_() { recho_ "$(__edate)$(__eindent0).N $(__eindent "$1" " ")"; }
+function __estepi_() { recho_ "$(__edate)$(__eindent0).I $(__eindent "$1" " ")"; }
-function __action() { tooenc "$(__edate)$(__eindent0)ACTION: $(__eindent "$1" " ")"; }
-function __asuccess() { tooenc "$(__edate)$(__eindent0)(OK) $(__eindent "$1" " ")"; }
-function __afailure() { tooenc "$(__edate)$(__eindent0)(KO) $(__eindent "$1" " ")"; }
-function __adone() { tooenc "$(__edate)$(__eindent0)$(__eindent "$1")"; }
+function __action() { recho "$(__edate)$(__eindent0)ACTION: $(__eindent "$1" " ")"; }
+function __asuccess() { recho "$(__edate)$(__eindent0)(OK) $(__eindent "$1" " ")"; }
+function __afailure() { recho "$(__edate)$(__eindent0)(KO) $(__eindent "$1" " ")"; }
+function __adone() { recho "$(__edate)$(__eindent0)$(__eindent "$1")"; }
diff --git a/bash/src/base.input.sh b/bash/src/base.input.sh
index 9e9acf0..c81fbc8 100644
--- a/bash/src/base.input.sh
+++ b/bash/src/base.input.sh
@@ -62,7 +62,7 @@ function ask_yesno() {
else
__eecho_ "Voulez-vous continuer?" 1>&2
fi
- tooenc_ " $prompt " 1>&2
+ echo_ " $prompt " 1>&2
uread r
is_yes "${r:-$default}"
else
@@ -198,17 +198,17 @@ function __rv_read() {
__eecho_ "Entrez la valeur" 1>&2
fi
if [ -n "$__rv_readline" ]; then
- tooenc_ ": " 1>&2
+ echo_ ": " 1>&2
uread -e ${__rv_d:+-i"$__rv_d"} "${__rv_opts[@]}" __rv_r
else
if [ -n "$__rv_d" ]; then
if [ -n "$__rv_showdef" ]; then
- tooenc_ " [$__rv_d]" 1>&2
+ echo_ " [$__rv_d]" 1>&2
else
- tooenc_ " [****]" 1>&2
+ echo_ " [****]" 1>&2
fi
fi
- tooenc_ ": " 1>&2
+ echo_ ": " 1>&2
uread "${__rv_opts[@]}" __rv_r
[ -n "$__rv_nl" ] && echo
fi
@@ -217,6 +217,7 @@ function __rv_read() {
_setv "$__rv_v" "$__rv_r"
return 0
fi
+ echo
done
}
@@ -268,7 +269,7 @@ function simple_menu() {
else
__eecho_ "Entrez le numéro de l'option choisie" 1>&2
fi
- tooenc_ ": " 1>&2
+ echo_ ": " 1>&2
uread __sm_choice
# Valeur par défaut
@@ -291,7 +292,7 @@ function simple_menu() {
let __sm_c=$__sm_c+1
if [ "$__sm_c" -eq 5 ]; then
# sauter une ligne toutes les 4 tentatives
- tooenc "" 1>&2
+ echo 1>&2
__sm_c=0
fi
done
@@ -438,7 +439,7 @@ function __void_actions_menu() {
if [ $c -eq 0 ]; then
[ -n "$title" ] && __etitle "$title" 1>&2
__eecho_ "=== Actions disponibles: " 1>&2
- tooenc "$action_title" 1>&2
+ recho "$action_title" 1>&2
fi
if [ -n "$actyc" ]; then
__eecho_ "$actyc" 1>&2
@@ -447,7 +448,7 @@ function __void_actions_menu() {
else
__eecho_ "Entrez l'action à effectuer" 1>&2
fi
- tooenc_ ": " 1>&2
+ echo_ ": " 1>&2
uread choice
if [ -z "$choice" -a -n "$default_action" ]; then
select_action="$default_action"
@@ -468,7 +469,7 @@ function __void_actions_menu() {
let c=$c+1
if [ $c -eq 5 ]; then
# sauter une ligne toutes les 4 tentatives
- tooenc "" 1>&2
+ echo 1>&2
c=0
fi
done
@@ -484,21 +485,21 @@ function __options_actions_menu() {
i=1
for option in "${options[@]}"; do
if [ "$option" == "$select_option" ]; then
- tooenc "$i*- $option" 1>&2
+ echo "$i*- $option" 1>&2
else
- tooenc "$i - $option" 1>&2
+ echo "$i - $option" 1>&2
fi
let i=$i+1
done
__estepn_ "Actions disponibles: " 1>&2
- tooenc "$action_title" 1>&2
+ recho "$action_title" 1>&2
fi
if [ -n "$optyc" ]; then
__eecho_ "$optyc" 1>&2
else
__eecho_ "Entrez l'action et le numéro de l'option choisie" 1>&2
fi
- tooenc_ ": " 1>&2
+ echo_ ": " 1>&2
uread choice
# vérifier la saisie
@@ -572,7 +573,7 @@ function __options_actions_menu() {
let c=$c+1
if [ $c -eq 5 ]; then
# sauter une ligne toutes les 4 tentatives
- tooenc "" 1>&2
+ echo "" 1>&2
c=0
fi
done
diff --git a/bash/src/base.output.sh b/bash/src/base.output.sh
index ae51afd..15f2040 100644
--- a/bash/src/base.output.sh
+++ b/bash/src/base.output.sh
@@ -83,7 +83,7 @@ function err_isatty() {
################################################################################
-function tooenc() {
+function uecho() {
# $1 étant une chaine encodée en utf-8, l'afficher dans l'encoding de sortie $2
# qui vaut par défaut $NULIB_OUTPUT_ENCODING
local value="$1" to="${2:-$NULIB_OUTPUT_ENCODING}"
@@ -93,9 +93,8 @@ function tooenc() {
iconv -f -utf-8 -t "$to" <<<"$value"
fi
}
-function uecho() { tooenc "$*"; }
-function tooenc_() {
+function uecho_() {
# $1 étant une chaine encodée en utf-8, l'afficher sans passer à la ligne dans
# l'encoding de sortie $2 qui vaut par défaut $NULIB_OUTPUT_ENCODING
local value="$1" to="${2:-$NULIB_OUTPUT_ENCODING}"
@@ -105,7 +104,6 @@ function tooenc_() {
recho_ "$value" | iconv -f utf-8 -t "$to"
fi
}
-function uecho_() { tooenc_ "$*"; }
export NULIB_QUIETLOG
export NULIB__TMPLOG
@@ -210,7 +208,7 @@ function __eindent() {
# indenter les lignes de $1, sauf la première
local -a lines; local line first=1
local indent="$(__eindent0)$2"
- setx -a lines=echo "$1"
+ setx -a lines=recho "$1"
for line in "${lines[@]}"; do
if [ -n "$first" ]; then
recho "$line"
@@ -232,7 +230,11 @@ function __complete() {
}
PRETTYOPTS=()
-function set_verbosity() { :;}
+function set_verbosity() {
+ case "$1" in
+ -D|--debug) NULIB_DEBUG=1;;
+ esac
+}
function check_verbosity() { return 0; }
function get_verbosity_option() { :;}
diff --git a/bash/tests/test-output.sh b/bash/tests/test-output.sh
index 56a5812..3b369d7 100755
--- a/bash/tests/test-output.sh
+++ b/bash/tests/test-output.sh
@@ -7,7 +7,6 @@ Multiline=
Banner=
args=(
"afficher divers messages avec les fonctions e*"
- -D,--debug '$set_debug'
-d,--date NULIB_ELOG_DATE=1
-m,--myname NULIB_ELOG_MYNAME=1
-n,--nc,--no-color '$__set_no_colors 1'
From 01c65a6e6a80ce69c2794424cf22579a3327b5c2 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 08:11:24 +0400
Subject: [PATCH 06/23] tests verbosity et interaction
---
bash/tests/test-interaction.sh | 29 +++++++++++++++++++++++++++++
bash/tests/test-verbosity.sh | 24 ++++++++++++++++++++++++
2 files changed, 53 insertions(+)
create mode 100755 bash/tests/test-interaction.sh
create mode 100755 bash/tests/test-verbosity.sh
diff --git a/bash/tests/test-interaction.sh b/bash/tests/test-interaction.sh
new file mode 100755
index 0000000..db35861
--- /dev/null
+++ b/bash/tests/test-interaction.sh
@@ -0,0 +1,29 @@
+#!/bin/bash
+# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
+source "$(dirname -- "$0")/../src/nulib.sh" || exit 1
+#NULIB_NO_DISABLE_SET_X=1
+
+args=(
+ "tester diverses fonctions de saisie"
+)
+parse_args "$@"; set -- "${args[@]}"
+
+estep "inter non auto non"
+ask_yesno "oui ou non?" && echo oui || echo non
+estep "inter oui auto oui"
+ask_yesno "oui ou non?" O && echo oui || echo non
+estep "inter non auto non"
+ask_yesno "oui ou non?" N && echo oui || echo non
+estep "inter non auto oui"
+ask_yesno "oui ou non?" C && echo oui || echo non
+estep "inter oui auto non"
+ask_yesno "oui ou non?" X && echo oui || echo non
+
+estep "valeur par défaut vide"
+read_value "valeur" empty "" N; echo "valeur=$empty"
+
+estep "valeur par défaut non vide"
+read_value "valeur" default default N; echo "valeur=$default"
+
+estep "valeur requise"
+read_value "valeur" required; echo "valeur=$required"
diff --git a/bash/tests/test-verbosity.sh b/bash/tests/test-verbosity.sh
new file mode 100755
index 0000000..4b53d8f
--- /dev/null
+++ b/bash/tests/test-verbosity.sh
@@ -0,0 +1,24 @@
+#!/bin/bash
+# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
+source "$(dirname -- "$0")/../src/nulib.sh" || exit 1
+#NULIB_NO_DISABLE_SET_X=1
+
+args=(
+ "afficher divers messages avec les fonctions e*"
+)
+parse_args "$@"; set -- "${args[@]}"
+
+eimportant "important (q)"
+eattention "attention (q)"
+eerror "error (q)"
+ewarn "warn (q)"
+enote "note (qv)"
+einfo "info (qv)"
+eecho "echo (qv)"
+edebug "debug (D)"
+
+estep "step (qv)"
+estepe "stepe (qv)"
+estepw "stepw (qv)"
+estepn "stepn (qv)"
+estepi "stepi (qv)"
From 9def939cf1f01080aca005a1838f6f6a07ce88bd Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 08:50:07 +0400
Subject: [PATCH 07/23] =?UTF-8?q?p:=20support=20des=20projets=20d=C3=A9pen?=
=?UTF-8?q?dants=20composer?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
bin/_pman-composer_local_deps.php | 14 ++++++++++++
bin/p | 34 ++++++++++++++++++++++-------
php/src/tools/pman/ComposerFile.php | 22 +++++++++++++++++++
3 files changed, 62 insertions(+), 8 deletions(-)
create mode 100755 bin/_pman-composer_local_deps.php
diff --git a/bin/_pman-composer_local_deps.php b/bin/_pman-composer_local_deps.php
new file mode 100755
index 0000000..badae7b
--- /dev/null
+++ b/bin/_pman-composer_local_deps.php
@@ -0,0 +1,14 @@
+#!/usr/bin/php
+getLocalDeps();
+foreach ($deps as $dep => $path) {
+ echo "$path\n";
+}
\ No newline at end of file
diff --git a/bin/p b/bin/p
index 561d88a..aedfdfc 100755
--- a/bin/p
+++ b/bin/p
@@ -20,8 +20,18 @@ function git_status() {
fi
}
+function git_statuses() {
+ local cwd="$(pwd)" dir
+ for dir in "$@"; do
+ cd "$dir" || die
+ git_status --porcelain
+ cd "$cwd"
+ done
+}
+
chdir=
all=
+composer=
args=(
"afficher l'état du dépôt"
"[-d chdir] [-a patterns...]
@@ -29,6 +39,7 @@ args=(
Si l'option -a est utilisée, ce script accepte comme arguments une liste de patterns permettant de filtrer les répertoires concernés"
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
-a,--all all=1 "faire l'opération sur tous les sous-répertoires de BASEDIR qui sont des dépôts git"
+ -r,--composer composer=1 "faire l'opération sur tous les projets composer dépendants"
)
parse_args "$@"; set -- "${args[@]}"
@@ -50,16 +61,23 @@ if [ -n "$all" ]; then
dirs+=("${dir%/.git}")
done
fi
- setx cwd=pwd
- for dir in "${dirs[@]}"; do
- cd "$dir" || die
- git_status --porcelain
- cd "$cwd"
- done
+ git_statuses "${dirs[@]}"
+
+elif [ -n "$composer" ]; then
+ # projets dépendants
+ git_ensure_gitvcs
+ setx toplevel=git_get_toplevel
+ cd "$toplevel" || die
+ setx cwd=ppath2 . "$OrigCwd"
+ [ -f composer.json ] || die "$cwd: ce n'est pas un projet composer"
+
+ setx -a dirs="$MYDIR/_pman-composer_local_deps.php"
+ git_statuses "${dirs[@]}"
+
else
# répertoire courant uniquement
- setx toplevel=git_get_toplevel
- [ -n "$toplevel" ] && Cwd="$toplevel"
+ git_ensure_gitvcs
+ Cwd="$(git_get_toplevel)"
args=()
isatty || args+=(--porcelain)
diff --git a/php/src/tools/pman/ComposerFile.php b/php/src/tools/pman/ComposerFile.php
index 5a48a1c..d85a957 100644
--- a/php/src/tools/pman/ComposerFile.php
+++ b/php/src/tools/pman/ComposerFile.php
@@ -138,6 +138,28 @@ class ComposerFile {
}
}
+ function getLocalDeps(): array {
+ $deps = cl::merge(array_keys($this->getRequires()), array_keys($this->getRequireDevs()));
+ $paths = [];
+ foreach ($deps as $dep) {
+ $path = cl::get(self::PATHS, $dep, $dep);
+ $path = str_replace("/", "-", $path);
+ $path = "../$path";
+ $paths[$dep] = $path;
+ }
+ $repositories = $this->getRepositories();
+ $localDeps = [];
+ foreach ($deps as $dep) {
+ foreach ($repositories as $key => $repository) {
+ if ($repository["type"] === "path" && $repository["url"] === $paths[$dep]) {
+ $localDeps[$dep] = $repository["url"];
+ break;
+ }
+ }
+ }
+ return $localDeps;
+ }
+
function print(): void {
$contents = json::with($this->data, json::INDENT_TABS);
if ($contents) echo "$contents\n";
From 7e05caf4d76bb6c7b132aeaf32e94fc6fb0d5ed8 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 09:25:22 +0400
Subject: [PATCH 08/23] =?UTF-8?q?runphp:=20passer=20les=20arguments=20inch?=
=?UTF-8?q?ang=C3=A9s=20=C3=A0=20composer?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
runphp/runphp | 66 +++++++++++++++++++++++++++++----------------------
1 file changed, 37 insertions(+), 29 deletions(-)
diff --git a/runphp/runphp b/runphp/runphp
index 1a03b5f..4bfe2ed 100755
--- a/runphp/runphp
+++ b/runphp/runphp
@@ -455,15 +455,18 @@ OPTIONS
function host_docker_run() {
# lancer une commande avec docker
- SOPTS=+w:
- LOPTS=help,chdir:,no-use-rslave
- args="$(getopt -n "$MYNAME" -o "$SOPTS" -l "$LOPTS" -- "$@")" || exit 1; eval "set -- $args"
+ if [ "$1" == composer ]; then
+ : # pas d'analyse d'argument pour composer
+ else
+ SOPTS=+w:
+ LOPTS=help,chdir:,no-use-rslave
+ args="$(getopt -n "$MYNAME" -o "$SOPTS" -l "$LOPTS" -- "$@")" || exit 1; eval "set -- $args"
- while [ $# -gt 0 ]; do
- case "$1" in
- --) shift; break;;
- --help)
- eecho "\
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ --) shift; break;;
+ --help)
+ eecho "\
runphp: lancer une commande dans un environnement PHP déterminé
USAGE
@@ -490,14 +493,15 @@ OPTIONS
aller dans le répertoire spécifié avant de lancer la commande
--no-use-rslave
paramètre montage des volumes"
- exit 0
- ;;
- -w|--chdir) shift; Chdir="$1";;
- --no-use-rslave) UseRslave=;;
- *) die "$1: option non configurée";;
- esac
- shift
- done
+ exit 0
+ ;;
+ -w|--chdir) shift; Chdir="$1";;
+ --no-use-rslave) UseRslave=;;
+ *) die "$1: option non configurée";;
+ esac
+ shift
+ done
+ fi
args=(
run -it --rm
@@ -573,20 +577,24 @@ function container_exec() {
fi
fi
- SOPTS=+w:
- LOPTS=chdir:
- args="$(getopt -n "$MYNAME" -o "$SOPTS" -l "$LOPTS" -- "$@")" || exit 1; eval "set -- $args"
+ if [ "$1" == composer ]; then
+ : # pas d'analyse d'argument pour composer
+ else
+ SOPTS=+w:
+ LOPTS=chdir:
+ args="$(getopt -n "$MYNAME" -o "$SOPTS" -l "$LOPTS" -- "$@")" || exit 1; eval "set -- $args"
- chdir=
- action=
- while [ $# -gt 0 ]; do
- case "$1" in
- --) shift; break;;
- -w|--chdir) shift; chdir="$1";;
- *) die "$1: option non configurée";;
- esac
- shift
- done
+ chdir=
+ action=
+ while [ $# -gt 0 ]; do
+ case "$1" in
+ --) shift; break;;
+ -w|--chdir) shift; chdir="$1";;
+ *) die "$1: option non configurée";;
+ esac
+ shift
+ done
+ fi
if [ $# -eq 0 ]; then
die "no command specified"
From bd0da9cffebdd05b577a9a59f99b0a3b0d8f524e Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 12:54:10 +0400
Subject: [PATCH 09/23] prel/pdev: ajouter les hook BEFORE_*
---
bin/pdev | 30 +++++++++++++++++++++---------
bin/prel | 18 ++++++++++++++++++
2 files changed, 39 insertions(+), 9 deletions(-)
diff --git a/bin/pdev b/bin/pdev
index 10c522c..ede3ddc 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -36,7 +36,7 @@ Ce script va
local script=".git/pman-merge.sh"
local -a push_branches delete_branches
- local after
+ local hook
local comment=
local or_die=" || exit 1"
@@ -47,10 +47,15 @@ Ce script va
if [ -n "\$merge" ]; then
esection "Fusionner la branche"
EOF
- _mscript_merge_branch
- after="AFTER_MERGE_${SrcType^^}"; [ -n "${!after}" ] && _scripta <
AFTER_MERGE_
AFTER_DELETE_
+ BEFORE_PUSH_
AFTER_PUSH_
-xxxType valant UPSTREAM, DEVELOP, FEATURE, RELEASE, MAIN, HOTFIX, DIST"
+srcType et destType pouvant valoir UPSTREAM, DEVELOP, FEATURE, RELEASE, MAIN, HOTFIX, DIST"
-d:,--chdir:BASEDIR chdir= "répertoire dans lequel se placer avant de lancer les opérations"
-O:,--origin Origin= "++\
origine à partir de laquelle les branches distantes sont considérées"
diff --git a/bin/prel b/bin/prel
index 8dceaaa..026c046 100755
--- a/bin/prel
+++ b/bin/prel
@@ -85,6 +85,11 @@ Vous devrez:
# create
if [ -n "\$create" ]; then
esection "Création de la release"
+EOF
+ [ -n "$BEFORE_CREATE_RELEASE" ] && _scripta <
Date: Mon, 3 Mar 2025 13:05:39 +0400
Subject: [PATCH 11/23] bug
---
bin/prel | 2 +-
1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/bin/prel b/bin/prel
index eb4f559..5d2b5bf 100755
--- a/bin/prel
+++ b/bin/prel
@@ -158,7 +158,7 @@ En cas d'erreur de merge, veuillez corriger les erreurs puis continuer avec
Veuillez aussi consulter le script et/ou le relancer
./$script${Push:+ push}"
die
- elif [ -n "$Merge" -a -n "$Pushe" ]; then
+ elif [ -n "$Merge" -a -n "$Push" ]; then
[ -n "$_KeepScript" ] || rm "$script"
else
einfo "\
From 7b12600848abbae9a28b05a1ed814f5d48a31af2 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Mon, 3 Mar 2025 13:09:04 +0400
Subject: [PATCH 12/23] bug
---
bin/pdev | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)
diff --git a/bin/pdev b/bin/pdev
index b5f1eed..f6d00c7 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -107,6 +107,7 @@ EOF
fi
EOF
+ [ -n "$Delete" -o -z "$ShouldDelete" ] && Deleted=1 || Deleted=
[ -n "$ShouldDelete" -a -n "$Delete" ] && ShouldDelete=
[ -n "$ShouldPush" -a -n "$Push" ] && ShouldPush=
if [ -n "$_Fake" ]; then
@@ -119,7 +120,7 @@ En cas d'erreur de merge, veuillez corriger les erreurs puis continuer avec
Sinon, veuillez consulter le script et/ou le relancer
./$script${Delete:+ delete}${Push:+ push}"
die
- elif [ -n "$Delete" -a -n "$Push" ]; then
+ elif [ -n "$Deleted" -a -n "$Push" ]; then
[ -n "$_KeepScript" ] || rm "$script"
else
einfo "\
From a3116e5dace7160cd1b53a922220df1863405c7e Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Tue, 4 Mar 2025 08:08:16 +0400
Subject: [PATCH 13/23] =?UTF-8?q?ajout=20du=20sch=C3=A9ma?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
php/src/ref/schema/ref_schema.php | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/php/src/ref/schema/ref_schema.php b/php/src/ref/schema/ref_schema.php
index 9cfa10b..cee4786 100644
--- a/php/src/ref/schema/ref_schema.php
+++ b/php/src/ref/schema/ref_schema.php
@@ -6,7 +6,7 @@ class ref_schema {
const NATURE_METASCHEMA = [
"nature" => ["string", null, "nature du schéma",
"pkey" => 0,
- "allowed_values" => ["assoc", "list", "scalar"],
+ "allowed_values" => ["scalar", "assoc", "list"],
],
"title" => ["?string", null, "libellé de la valeur"],
"required" => ["bool", false, "la valeur est-elle requise?"],
@@ -31,9 +31,10 @@ class ref_schema {
"messages" => ["?array", null, "messages à afficher en cas d'erreur d'analyse"],
"formatter_func" => ["?callable", null, "fonction qui formatte la valeur pour affichage"],
"format" => [null, null, "format à utiliser pour l'affichage"],
- "" => ["array", "scalar", "nature du schéma",
- "" => ["assoc", "schema" => self::NATURE_METASCHEMA],
+ "" => ["array", ["scalar"], "nature du schéma",
+ "schema" => self::NATURE_METASCHEMA,
],
+ "schema" => ["?array", null, "schéma de la valeur si c'est un array"],
"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"],
From e8abaca6ae2a83bc7430dec866a721e379bbd719 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Tue, 4 Mar 2025 08:30:46 +0400
Subject: [PATCH 14/23] supprimer tests qui sont encore dans nur/ture
---
php/tests/php/access/KeyAccessTest.php | 67 ---------
php/tests/php/access/ValueAccessTest.php | 70 ---------
php/tests/php/content/cTest.php | 40 -----
php/tests/php/content/impl/AContent.php | 10 --
php/tests/php/content/impl/APrintable.php | 10 --
php/tests/php/content/impl/ATag.php | 23 ---
php/tests/php/content/impl/html.php | 14 --
php/tests/schema/_scalar/ScalarSchemaTest.php | 64 --------
php/tests/schema/types/boolTest.php | 111 --------------
php/tests/schema/types/floatTest.php | 139 ------------------
php/tests/schema/types/intTest.php | 139 ------------------
php/tests/schema/types/strTest.php | 123 ----------------
php/tests/schema/types/unionTest.php | 29 ----
13 files changed, 839 deletions(-)
delete mode 100644 php/tests/php/access/KeyAccessTest.php
delete mode 100644 php/tests/php/access/ValueAccessTest.php
delete mode 100644 php/tests/php/content/cTest.php
delete mode 100644 php/tests/php/content/impl/AContent.php
delete mode 100644 php/tests/php/content/impl/APrintable.php
delete mode 100644 php/tests/php/content/impl/ATag.php
delete mode 100644 php/tests/php/content/impl/html.php
delete mode 100644 php/tests/schema/_scalar/ScalarSchemaTest.php
delete mode 100644 php/tests/schema/types/boolTest.php
delete mode 100644 php/tests/schema/types/floatTest.php
delete mode 100644 php/tests/schema/types/intTest.php
delete mode 100644 php/tests/schema/types/strTest.php
delete mode 100644 php/tests/schema/types/unionTest.php
diff --git a/php/tests/php/access/KeyAccessTest.php b/php/tests/php/access/KeyAccessTest.php
deleted file mode 100644
index dc5bd4c..0000000
--- a/php/tests/php/access/KeyAccessTest.php
+++ /dev/null
@@ -1,67 +0,0 @@
- null, "false" => false, "empty" => ""];
-
- #
- $a = new KeyAccess($array, "inexistant");
- self::assertFalse($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $a = new KeyAccess($array, "null");
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame(null, $a->get($default));
-
- $a = new KeyAccess($array, "false");
- self::assertTrue($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $a = new KeyAccess($array, "empty");
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame("", $a->get($default));
-
- #
- $a = new KeyAccess($array, "null", ["allow_null" => false]);
- self::assertTrue($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $a = new KeyAccess($array, "null", ["allow_null" => true]);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame(null, $a->get($default));
-
- #
- $a = new KeyAccess($array, "false", ["allow_false" => false]);
- self::assertTrue($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $a = new KeyAccess($array, "false", ["allow_false" => true]);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame(false, $a->get($default));
-
- #
- $a = new KeyAccess($array, "empty", ["allow_empty" => false]);
- self::assertTrue($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $a = new KeyAccess($array, "empty", ["allow_empty" => true]);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame("", $a->get($default));
- }
-}
diff --git a/php/tests/php/access/ValueAccessTest.php b/php/tests/php/access/ValueAccessTest.php
deleted file mode 100644
index a7d08c9..0000000
--- a/php/tests/php/access/ValueAccessTest.php
+++ /dev/null
@@ -1,70 +0,0 @@
-exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $i = false;
- $a = new ValueAccess($i);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame(false, $a->get($default));
-
- $i = "";
- $a = new ValueAccess($i);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame("", $a->get($default));
-
- #
- $i = null;
- $a = new ValueAccess($i, ["allow_null" => false]);
- self::assertFalse($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $i = null;
- $a = new ValueAccess($i, ["allow_null" => true]);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame(null, $a->get($default));
-
- #
- $i = false;
- $a = new ValueAccess($i, ["allow_false" => false]);
- self::assertTrue($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $i = false;
- $a = new ValueAccess($i, ["allow_false" => true]);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame(false, $a->get($default));
-
- #
- $i = "";
- $a = new ValueAccess($i, ["allow_empty" => false]);
- self::assertTrue($a->exists());
- self::assertFalse($a->available());
- self::assertSame($default, $a->get($default));
-
- $i = "";
- $a = new ValueAccess($i, ["allow_empty" => true]);
- self::assertTrue($a->exists());
- self::assertTrue($a->available());
- self::assertSame("", $a->get($default));
- }
-}
diff --git a/php/tests/php/content/cTest.php b/php/tests/php/content/cTest.php
deleted file mode 100644
index 2f31b4a..0000000
--- a/php/tests/php/content/cTest.php
+++ /dev/null
@@ -1,40 +0,0 @@
-"));
- self::assertSame("pouet", c::to_string(["pouet"]));
- self::assertSame("hello world", c::to_string(["hello", "world"]));
- self::assertSame("hello1 world", c::to_string(["hello1", "world"]));
- self::assertSame("hello", c::to_string(["hello", ""]));
- self::assertSame("world", c::to_string(["", "world"]));
- self::assertSame("hello,world", c::to_string(["hello,", "world"]));
- self::assertSame("hello world", c::to_string(["hello ", "world"]));
- self::assertSame("hello. world", c::to_string(["hello.", "world"]));
- self::assertSame("hello.", c::to_string(["hello.", ""]));
-
- self::assertSame(
- "title<q/>
hellobrave<q/>world
",
- c::to_string([
- [html::H1, "title"],
- [html::P, [
- "hello",
- [html::SPAN, "brave"],
- [html::SPAN, ["world"]],
- ]],
- ]));
- }
-
- function testXxx() {
- $content = [[v::h1, "hello"]];
- self::assertSame("hello
", c::to_string($content));
- }
-}
-
diff --git a/php/tests/php/content/impl/AContent.php b/php/tests/php/content/impl/AContent.php
deleted file mode 100644
index c53c376..0000000
--- a/php/tests/php/content/impl/AContent.php
+++ /dev/null
@@ -1,10 +0,0 @@
-content"];
- }
-}
diff --git a/php/tests/php/content/impl/APrintable.php b/php/tests/php/content/impl/APrintable.php
deleted file mode 100644
index 7a75c2f..0000000
--- a/php/tests/php/content/impl/APrintable.php
+++ /dev/null
@@ -1,10 +0,0 @@
-printable
";
- }
-}
diff --git a/php/tests/php/content/impl/ATag.php b/php/tests/php/content/impl/ATag.php
deleted file mode 100644
index b4cc2ed..0000000
--- a/php/tests/php/content/impl/ATag.php
+++ /dev/null
@@ -1,23 +0,0 @@
-tag = $tag;
- $this->content = $content;
- }
-
- protected $tag;
- protected $content;
-
- function getContent(): iterable {
- return [
- "<$this->tag>",
- ...c::q($this->content),
- "$this->tag>",
- ];
- }
-}
diff --git a/php/tests/php/content/impl/html.php b/php/tests/php/content/impl/html.php
deleted file mode 100644
index 3567b2e..0000000
--- a/php/tests/php/content/impl/html.php
+++ /dev/null
@@ -1,14 +0,0 @@
- [null],
- "default" => null,
- "title" => null,
- "required" => false,
- "nullable" => true,
- "desc" => null,
- "analyzer_func" => null,
- "extractor_func" => null,
- "parser_func" => null,
- "normalizer_func" => null,
- "messages" => null,
- "formatter_func" => null,
- "format" => null,
- "" => ["scalar"],
- "name" => null,
- "pkey" => null,
- "header" => null,
- "composite" => null,
- ];
-
- static function schema(array $schema): array {
- return array_merge(self::NULL_SCHEMA, $schema);
- }
-
- function testNormalize() {
- self::assertSame(self::NULL_SCHEMA, ScalarSchema::normalize(null));
- self::assertSame(self::NULL_SCHEMA, ScalarSchema::normalize([]));
- self::assertSame(self::NULL_SCHEMA, ScalarSchema::normalize([null]));
- self::assertException(SchemaException::class, function () {
- ScalarSchema::normalize([[]]);
- });
- self::assertException(SchemaException::class, function () {
- ScalarSchema::normalize([[null]]);
- });
-
- $string = self::schema(["type" => ["string"], "nullable" => false]);
- self::assertSame($string, ScalarSchema::normalize("string"));
- self::assertSame($string, ScalarSchema::normalize(["string"]));
-
- $nstring = self::schema(["type" => ["string"]]);
- self::assertSame($nstring, ScalarSchema::normalize(["?string"]));
- self::assertSame($nstring, ScalarSchema::normalize(["?string|null"]));
- self::assertSame($nstring, ScalarSchema::normalize(["string|null"]));
- self::assertSame($nstring, ScalarSchema::normalize([["?string", "null"]]));
- self::assertSame($nstring, ScalarSchema::normalize([["string", "null"]]));
- self::assertSame($nstring, ScalarSchema::normalize([["string", null]]));
-
- $key = self::schema(["type" => ["string", "int"], "nullable" => false]);
- self::assertSame($key, ScalarSchema::normalize("string|int"));
-
- $nkey = self::schema(["type" => ["string", "int"], "nullable" => true]);
- self::assertSame($nkey, ScalarSchema::normalize("?string|int"));
- self::assertSame($nkey, ScalarSchema::normalize("string|?int"));
- }
-}
diff --git a/php/tests/schema/types/boolTest.php b/php/tests/schema/types/boolTest.php
deleted file mode 100644
index 8f990e3..0000000
--- a/php/tests/schema/types/boolTest.php
+++ /dev/null
@@ -1,111 +0,0 @@
-set(true);
- self::assertSame(true, $destv->get());
- self::assertSame(true, $dest);
- self::assertSame("Oui", $destv->format());
- self::assertSame("Oui", $destv->format("OuiNonNull"));
- self::assertSame("O", $destv->format("ON"));
- self::assertSame("O", $destv->format("ONN"));
-
- $destv->set(false);
- self::assertSame(false, $destv->get());
- self::assertSame(false, $dest);
- self::assertSame("Non", $destv->format());
- self::assertSame("Non", $destv->format("OuiNonNull"));
- self::assertSame("N", $destv->format("ON"));
- self::assertSame("N", $destv->format("ONN"));
-
- $destv->set("yes");
- self::assertSame(true, $destv->get());
-
- $destv->set(" yes ");
- self::assertSame(true, $destv->get());
-
- $destv->set("12");
- self::assertSame(true, $destv->get());
-
- $destv->set(12);
- self::assertSame(true, $destv->get());
-
- $destv->set("no");
- self::assertSame(false, $destv->get());
-
- $destv->set(" no ");
- self::assertSame(false, $destv->get());
-
- $destv->set("0");
- self::assertSame(false, $destv->get());
-
- $destv->set(0);
- self::assertSame(false, $destv->get());
-
- $destv->set(12.34);
- self::assertSame(true, $destv->get());
-
- self::assertException(Exception::class, $destvSetter("a"));
- self::assertException(Exception::class, $destvSetter([]));
- self::assertException(Exception::class, $destvSetter(["a"]));
-
- }
-
- function testBool() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "bool");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
- self::assertException(Exception::class, $destvSetter(""));
- self::assertException(Exception::class, $destvSetter(" "));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testNbool() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "?bool");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("Non", $destv->format());
- self::assertSame("", $destv->format("OuiNonNull"));
- self::assertSame("N", $destv->format("ON"));
- self::assertSame("", $destv->format("ONN"));
-
- $destv->set("");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("Non", $destv->format());
- self::assertSame("", $destv->format("OuiNonNull"));
- self::assertSame("N", $destv->format("ON"));
- self::assertSame("", $destv->format("ONN"));
-
- $destv->set(" ");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("Non", $destv->format());
- self::assertSame("", $destv->format("OuiNonNull"));
- self::assertSame("N", $destv->format("ON"));
- self::assertSame("", $destv->format("ONN"));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-}
diff --git a/php/tests/schema/types/floatTest.php b/php/tests/schema/types/floatTest.php
deleted file mode 100644
index 193d407..0000000
--- a/php/tests/schema/types/floatTest.php
+++ /dev/null
@@ -1,139 +0,0 @@
-set(12);
- self::assertSame(12.0, $destv->get());
- self::assertSame(12.0, $dest);
- self::assertSame("12", $destv->format());
- self::assertSame("0012", $destv->format("%04u"));
-
- $destv->set("12");
- self::assertSame(12.0, $destv->get());
-
- $destv->set(" 12 ");
- self::assertSame(12.0, $destv->get());
-
- $destv->set(12.34);
- self::assertSame(12.34, $destv->get());
-
- $destv->set(true);
- self::assertSame(1.0, $destv->get());
-
- self::assertException(Exception::class, $destvSetter("a"));
- self::assertException(Exception::class, $destvSetter([]));
- self::assertException(Exception::class, $destvSetter(["a"]));
- }
-
- function testFloat() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "float");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
- self::assertException(Exception::class, $destvSetter(""));
- self::assertException(Exception::class, $destvSetter(" "));
-
- // valeur non requise donc retourne null
- $destv->set(false);
- self::assertNull($destv->get());
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testRequiredFloat() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, [
- "float", null,
- "required" => true,
- ]);
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
- self::assertException(Exception::class, $destvSetter(""));
- self::assertException(Exception::class, $destvSetter(" "));
-
- // valeur requise donc lance une exception
- self::assertException(Exception::class, $destvSetter(false));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testNfloat() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "?float");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set("");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set(" ");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- // valeur non requise donc retourne null
- $destv->set(false);
- self::assertNull($destv->get());
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testRequiredNfloat() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, [
- "?float", null,
- "required" => true,
- ]);
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set("");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set(" ");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- // valeur requise donc lance une exception
- self::assertException(Exception::class, $destvSetter(false));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-}
diff --git a/php/tests/schema/types/intTest.php b/php/tests/schema/types/intTest.php
deleted file mode 100644
index 29de7ce..0000000
--- a/php/tests/schema/types/intTest.php
+++ /dev/null
@@ -1,139 +0,0 @@
-set(12);
- self::assertSame(12, $destv->get());
- self::assertSame(12, $dest);
- self::assertSame("12", $destv->format());
- self::assertSame("0012", $destv->format("%04u"));
-
- $destv->set("12");
- self::assertSame(12, $destv->get());
-
- $destv->set(" 12 ");
- self::assertSame(12, $destv->get());
-
- $destv->set(12.34);
- self::assertSame(12, $destv->get());
-
- $destv->set(true);
- self::assertSame(1, $destv->get());
-
- self::assertException(Exception::class, $destvSetter("a"));
- self::assertException(Exception::class, $destvSetter([]));
- self::assertException(Exception::class, $destvSetter(["a"]));
- }
-
- function testInt() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "int");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
- self::assertException(Exception::class, $destvSetter(""));
- self::assertException(Exception::class, $destvSetter(" "));
-
- // valeur non requise donc retourne null
- $destv->set(false);
- self::assertNull($destv->get());
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testRequiredInt() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, [
- "int", null,
- "required" => true,
- ]);
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
- self::assertException(Exception::class, $destvSetter(""));
- self::assertException(Exception::class, $destvSetter(" "));
-
- // valeur requise donc lance une exception
- self::assertException(Exception::class, $destvSetter(false));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testNint() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "?int");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set("");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set(" ");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- // valeur non requise donc retourne null
- $destv->set(false);
- self::assertNull($destv->get());
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testRequiredNint() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, [
- "?int", null,
- "required" => true,
- ]);
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set("");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- $destv->set(" ");
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- // valeur requise donc lance une exception
- self::assertException(Exception::class, $destvSetter(false));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-}
diff --git a/php/tests/schema/types/strTest.php b/php/tests/schema/types/strTest.php
deleted file mode 100644
index 45eda17..0000000
--- a/php/tests/schema/types/strTest.php
+++ /dev/null
@@ -1,123 +0,0 @@
-set("");
- self::assertSame("", $destv->get());
- self::assertSame("", $dest);
-
- $destv->set(" ");
- self::assertSame(" ", $destv->get());
- self::assertSame(" ", $dest);
-
- $destv->set("a");
- self::assertSame("a", $destv->get());
- self::assertSame("a", $dest);
-
- $destv->set("12");
- self::assertSame("12", $destv->get());
-
- $destv->set(" 12 ");
- self::assertSame(" 12 ", $destv->get());
-
- $destv->set(12);
- self::assertSame("12", $destv->get());
-
- $destv->set(12.34);
- self::assertSame("12.34", $destv->get());
-
- $destv->set(true);
- self::assertSame("1", $destv->get());
-
- self::assertException(Exception::class, $destvSetter([]));
- self::assertException(Exception::class, $destvSetter(["a"]));
- }
-
- function testStr() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "string");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
-
- // valeur non requise donc retourne null
- $destv->set(false);
- self::assertNull($destv->get());
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testRequiredStr() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, [
- "string", null,
- "required" => true,
- ]);
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- self::assertException(Exception::class, $destvSetter(null));
-
- // valeur requise donc lance une exception
- self::assertException(Exception::class, $destvSetter(false));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testNstr() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, "?string");
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- // valeur non requise donc retourne null
- $destv->set(false);
- self::assertNull($destv->get());
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-
- function testRequiredNstr() {
- /** @var ScalarValue $destv */
- Schema::nv($destv, $dest, null, $schema, [
- "?string", null,
- "required" => true,
- ]);
- $destvSetter = function($value) use($destv) {
- return function() use($destv, $value) {
- $destv->set($value);
- };
- };
-
- $destv->set(null);
- self::assertNull($destv->get());
- self::assertNull($dest);
- self::assertSame("", $destv->format());
-
- // valeur requise donc lance une exception
- self::assertException(Exception::class, $destvSetter(false));
-
- $this->commonTests($destv, $dest, $destvSetter);
- }
-}
diff --git a/php/tests/schema/types/unionTest.php b/php/tests/schema/types/unionTest.php
deleted file mode 100644
index c208087..0000000
--- a/php/tests/schema/types/unionTest.php
+++ /dev/null
@@ -1,29 +0,0 @@
-set("12");
- self::assertSame("12", $si);
- $siv->set(12);
- self::assertSame(12, $si);
-
- # int puis string
- Schema::nv($isv, $is, null, $iss, "int|string");
-
- $isv->set("12");
- self::assertSame("12", $is);
- $isv->set(12);
- self::assertSame(12, $is);
- }
-}
From d44537a9bb3170576f87b8be4a16fa80b0ce1f80 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Tue, 4 Mar 2025 12:25:04 +0400
Subject: [PATCH 15/23] prel/pdev: tracer les hooks
---
bin/pdev | 10 +++++-----
bin/prel | 12 ++++++------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/bin/pdev b/bin/pdev
index f6d00c7..368e38a 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -48,13 +48,13 @@ if [ -n "\$merge" ]; then
esection "Fusionner la branche"
EOF
hook="BEFORE_MERGE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <
Date: Tue, 4 Mar 2025 12:38:06 +0400
Subject: [PATCH 16/23] Revert "prel/pdev: tracer les hooks"
This reverts commit d44537a9bb3170576f87b8be4a16fa80b0ce1f80.
---
bin/pdev | 10 +++++-----
bin/prel | 12 ++++++------
2 files changed, 11 insertions(+), 11 deletions(-)
diff --git a/bin/pdev b/bin/pdev
index 368e38a..f6d00c7 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -48,13 +48,13 @@ if [ -n "\$merge" ]; then
esection "Fusionner la branche"
EOF
hook="BEFORE_MERGE_${SrcType^^}"; [ -n "${!hook}" ] && _scripta <
Date: Tue, 4 Mar 2025 12:46:44 +0400
Subject: [PATCH 17/23] pdev: ajout --after-merge
---
bin/_merge82 | 2 +-
bin/pdev | 12 +++++++++++-
2 files changed, 12 insertions(+), 2 deletions(-)
diff --git a/bin/_merge82 b/bin/_merge82
index 3c89e35..8a4c2bc 100755
--- a/bin/_merge82
+++ b/bin/_merge82
@@ -1,4 +1,4 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
-exec "$(dirname -- "$0")/pdev" --tech-merge -Bdev82 dev74 "$@"
+exec "$(dirname -- "$0")/pdev" --tech-merge -Bdev82 dev74 -a "git checkout dev74" "$@"
diff --git a/bin/pdev b/bin/pdev
index f6d00c7..b4ab89c 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -122,11 +122,18 @@ Sinon, veuillez consulter le script et/ou le relancer
die
elif [ -n "$Deleted" -a -n "$Push" ]; then
[ -n "$_KeepScript" ] || rm "$script"
+ [ -n "$AfterMerge" ] && eval "$AfterMerge"
else
- einfo "\
+ local msg="\
Le script $script a été lancé avec les arguments 'merge${Delete:+ delete}${Push:+ push}'
Vous pouvez consulter le script et/ou le relancer
./$script${ShouldDelete:+ delete}${ShouldPush:+ push}"
+ [ -n "$AfterMerge" ] && msg="$msg
+Il y a aussi les commandes supplémentaires suivantes:
+ ${AfterMerge//
+/
+ }"
+ einfo "$msg"
fi
}
@@ -145,6 +152,7 @@ TechMerge=
SquashMsg=
[ -z "$PMAN_NO_PUSH" ] && Push=1 || Push=
[ -z "$PMAN_NO_DELETE" ] && Delete=1 || Delete=
+AfterMerge=
args=(
"fusionner la branche source dans la branche destination correspondante"
" [source]
@@ -190,6 +198,8 @@ ne pas supprimer la branche après la fusion dans la destination"
--delete Delete=1 "++\
supprimer la branche après la fusion dans la destination.
c'est l'option par défaut"
+ -a:,--after-merge AfterMerge= "\
+évaluer le script spécifié après une fusion *réussie*"
)
parse_args "$@"; set -- "${args[@]}"
From 9723c146d5c657c96123ad4d1963788847a1e61e Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Thu, 6 Mar 2025 12:31:00 +0400
Subject: [PATCH 18/23] ajout cl::same_keys()
---
php/src/cl.php | 36 ++++++++++++++++++++++++++++++++++++
1 file changed, 36 insertions(+)
diff --git a/php/src/cl.php b/php/src/cl.php
index 8bb3b37..2397fe9 100644
--- a/php/src/cl.php
+++ b/php/src/cl.php
@@ -610,6 +610,42 @@ class cl {
#############################################################################
+ /**
+ * tester si $array a en début de tableau les mêmes clés que $ref, et dans le
+ * même ordre. $array peut avoir d'autres clés, ça n'influe pas sur le résultat
+ *
+ * $keys obtient la liste des clés de $ref trouvées, dans l'ordre de $array
+ * $remainKeys obtient la liste des clés de $array qui ne sont pas dans $ref
+ * $missingKeys obtient la liste des clés de $ref qui ne sont pas dans $array
+ */
+ static function same_keys(?array $array, ?array $ref, ?array &$keys=null, ?array &$remainKeys=null, ?array &$missingKeys=null): bool {
+ $keys = [];
+ $remainKeys = [];
+ $missingKeys = [];
+ if ($array === null || $array === []) {
+ if ($ref === null || $ref === []) return true;
+ $missingKeys = array_keys($ref);
+ return false;
+ } elseif ($ref === null || $ref === []) {
+ $remainKeys = array_keys($array);
+ return true;
+ }
+ $refKeys = array_keys($ref);
+ $refCount = count($ref);
+ $index = 0;
+ $sameKeys = true;
+ foreach (array_keys($array) as $key) {
+ if ($index < $refCount) {
+ if ($key !== $refKeys[$index]) $sameKeys = false;
+ $index++;
+ }
+ if (array_key_exists($key, $ref)) $keys[] = $key;
+ else $remainKeys[] = $key;
+ }
+ $missingKeys = array_values(array_diff($refKeys, $keys));
+ return $sameKeys && $index == $refCount;
+ }
+
/**
* retourner le tableau $array en "renommant" les clés selon le tableau
* $mappings qui contient des associations de la forme [$from => $to]
From 953f614caa3adaffc673ad3d777a5cd6cb639b34 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Thu, 6 Mar 2025 12:31:26 +0400
Subject: [PATCH 19/23] modifs.mineures sans commentaires
---
php/tests/clTest.php | 37 +++++++++++++++++++++++++++++++++++++
1 file changed, 37 insertions(+)
create mode 100644 php/tests/clTest.php
diff --git a/php/tests/clTest.php b/php/tests/clTest.php
new file mode 100644
index 0000000..d2b834f
--- /dev/null
+++ b/php/tests/clTest.php
@@ -0,0 +1,37 @@
+ 42, "b" => "tesxt"]; $arrayKeys = array_keys($array);
+ $xarray = ["parasite0", "a" => 42, "parasite1", "b" => "tesxt"]; $xarrayKeys = array_keys($array);
+ $ref = ["a" => "int", "b" => "text"]; $refKeys = array_keys($ref);
+ $missingArray = ["c" => true]; $missingKeys = array_keys($missingArray);
+ $missingRef = ["c" => "bool"]; $missingKeys = array_keys($missingRef);
+
+ $this->checkKeys(null, null, true, [], [], []);
+ $this->checkKeys(null, [], true, [], [], []);
+ $this->checkKeys([], null, true, [], [], []);
+ $this->checkKeys([], [], true, [], [], []);
+
+ $this->checkKeys(null, $ref, false, [], [], $refKeys);
+ $this->checkKeys([], $ref, false, [], [], $refKeys);
+
+ $this->checkKeys($array, null, true, [], $arrayKeys, []);
+ $this->checkKeys($array, [], true, [], $arrayKeys, []);
+
+ $this->checkKeys($array, $ref, true, $arrayKeys, [], []);
+ $this->checkKeys(cl::merge($array, $missingArray), $ref, true, $arrayKeys, $missingKeys, []);
+ $this->checkKeys($array, cl::merge($ref, $missingRef), false, $arrayKeys, [], $missingKeys);
+
+ $this->checkKeys($xarray, $ref, false, $arrayKeys, [0, 1], []);
+ }
+}
From 3def99b378f504791e9c419a939d833ece5d8fa8 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Fri, 7 Mar 2025 19:59:52 +0400
Subject: [PATCH 20/23] modifs.mineures sans commentaires
---
php/src/ref/schema/ref_types.php | 1 +
1 file changed, 1 insertion(+)
diff --git a/php/src/ref/schema/ref_types.php b/php/src/ref/schema/ref_types.php
index 24973d5..d7ce1d4 100644
--- a/php/src/ref/schema/ref_types.php
+++ b/php/src/ref/schema/ref_types.php
@@ -6,5 +6,6 @@ class ref_types {
"boolean" => "bool",
"integer" => "int",
"flt" => "float", "double" => "float", "dbl" => "float",
+ "func" => "callable", "function" => "callable",
];
}
From 5c5d8784a4185af45813a0985952487b53fec81f Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Wed, 12 Mar 2025 17:21:41 +0400
Subject: [PATCH 21/23] pdev: option --force-merge
---
bin/pdev | 20 +++++++++++---------
bin/prel | 2 +-
2 files changed, 12 insertions(+), 10 deletions(-)
diff --git a/bin/pdev b/bin/pdev
index b4ab89c..03e827c 100755
--- a/bin/pdev
+++ b/bin/pdev
@@ -198,6 +198,8 @@ ne pas supprimer la branche après la fusion dans la destination"
--delete Delete=1 "++\
supprimer la branche après la fusion dans la destination.
c'est l'option par défaut"
+ -f,--force-merge ForceMerge=1 "++\
+forcer la fusion pour une branche qui devrait être traitée par prel"
-a:,--after-merge AfterMerge= "\
évaluer le script spécifié après une fusion *réussie*"
)
@@ -220,15 +222,15 @@ show)
;;
merge)
ShouldDelete=1
- case "$SrcType" in
- develop|release|hotfix)
- die "$SrcBranch: cette branche doit être fusionnée dans $DestBranch avec prel"
- ;;
- *)
- # n'autoriser la suppression que pour feature
- [ "$SrcType" == feature ] || ShouldDelete=
- ;;
- esac
+ no_merge_msg="$SrcBranch: cette branche doit être fusionnée dans $DestBranch avec prel"
+ if [ "$SrcType" == develop ]; then
+ [ -z "$ForceMerge" ] && die "$no_merge_msg"
+ [ -n "$AfterMerge" ] || setx AfterMerge=qvals git checkout -q "$SrcBranch"
+ elif [ "$SrcType" == release -o "$SrcType" == hotfix ]; then
+ die "$no_merge_msg"
+ fi
+ # n'autoriser la suppression que pour feature
+ [ "$SrcType" == feature ] || ShouldDelete=
[ -z "$ShouldDelete" ] && Delete=
[ -z "$_Fake" ] && git_ensure_cleancheckout
if array_contains LocalBranches "$SrcBranch"; then
diff --git a/bin/prel b/bin/prel
index 5d2b5bf..e1af6eb 100755
--- a/bin/prel
+++ b/bin/prel
@@ -241,7 +241,7 @@ c'est l'option par défaut"
spécifier la version de la release à créer"
-C,--current-version CurrentVersion=1 "++\
si aucune version n'est spécifiée, prendre la version présente dans le fichier VERSION.txt"
- -f,--force-create ForceCreate= "\
+ -f,--force-create ForceCreate=1 "\
forcer la création de la release même si le tag correspond à la version existe déjà"
)
parse_args "$@"; set -- "${args[@]}"
From cf9fab52736c3a37fbf4a5620cb827931e9ef0ab Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Fri, 14 Mar 2025 14:55:39 +0400
Subject: [PATCH 22/23] maj src/php
---
dockerfiles/Dockerfile.php-apache | 2 +-
dockerfiles/Dockerfile.php-apache+ic | 2 +-
2 files changed, 2 insertions(+), 2 deletions(-)
diff --git a/dockerfiles/Dockerfile.php-apache b/dockerfiles/Dockerfile.php-apache
index 2a9e467..641de40 100644
--- a/dockerfiles/Dockerfile.php-apache
+++ b/dockerfiles/Dockerfile.php-apache
@@ -25,7 +25,7 @@ COPY --from=builder /src/su-exec/su-exec /g/
RUN /g/build
COPY --from=php /g/ /g/
-RUN /g/build -a @apache-php-cas php-utils
+RUN /g/build -a @php-apache-cas php-utils
EXPOSE 80 443
ENTRYPOINT ["/g/entrypoint"]
diff --git a/dockerfiles/Dockerfile.php-apache+ic b/dockerfiles/Dockerfile.php-apache+ic
index cfbbd61..8907e78 100644
--- a/dockerfiles/Dockerfile.php-apache+ic
+++ b/dockerfiles/Dockerfile.php-apache+ic
@@ -34,7 +34,7 @@ COPY --from=legacytools /g/ /g/
RUN /g/build nutools
COPY --from=php /g/ /g/
-RUN /g/build -a @apache-php-cas php-utils
+RUN /g/build -a @php-apache-cas php-utils
COPY --from=instantclient /g/ /g/
COPY --from=builder /opt/oracle/ /opt/oracle/
From cd16509af174e9618ef76f0583f10dca0af9ffe5 Mon Sep 17 00:00:00 2001
From: Jephte Clain
Date: Fri, 14 Mar 2025 15:23:41 +0400
Subject: [PATCH 23/23] Init changelog & version 0.4.0p74
---
CHANGES.md | 28 ++++++++++++++++++++++++++++
VERSION.txt | 2 +-
2 files changed, 29 insertions(+), 1 deletion(-)
diff --git a/CHANGES.md b/CHANGES.md
index e65c7a6..5332e13 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -1,3 +1,31 @@
+## Release 0.4.0p74 du 14/03/2025-15:23
+
+* `cf9fab5` maj src/php
+* `5c5d878` pdev: option --force-merge
+* `9723c14` ajout cl::same_keys()
+* `5ae3e8b` pdev: ajout --after-merge
+* `cfc386d` Revert "prel/pdev: tracer les hooks"
+* `d44537a` prel/pdev: tracer les hooks
+* `e8abaca` supprimer tests qui sont encore dans nur/ture
+* `a3116e5` ajout du schéma
+* `0d2ca20` prel/pdev: option --fake
+* `bd0da9c` prel/pdev: ajouter les hook BEFORE_*
+* `7e05caf` runphp: passer les arguments inchangés à composer
+* `9def939` p: support des projets dépendants composer
+* `01c65a6` tests verbosity et interaction
+* `8e3569a` ne plus utiliser tooenc par défaut. renommer tooenc en uecho
+* `ead5b5a` support automatique options verbosity et interaction
+* `8825493` pman: tenir compte des branches distantes
+* `e129e0a` ajout pwip
+* `9a2378b` pman: améliorer l'ergonomie
+* `8cfd803` gestion des profils composer
+* `d9989c6` supprimer composer.phar puisque c'est fourni par runphp
+* `7eb5efb` ajout config .pman.yml
+* `92363cd` pman: option --force-create
+* `3b379eb` maj doc
+* `bbb5559` pman: ajout init pman
+* `939f772` pman: support des config standard nommées
+
## Release 0.3.4p82 du 01/03/2025-06:23
## Release 0.3.4p74 du 01/03/2025-06:22
diff --git a/VERSION.txt b/VERSION.txt
index 42045ac..1d0ba9e 100644
--- a/VERSION.txt
+++ b/VERSION.txt
@@ -1 +1 @@
-0.3.4
+0.4.0