Intégration de la branche release-11.1.0

This commit is contained in:
Jephté Clain 2024-02-01 20:59:56 +04:00
commit 9d8e3c53d1
18 changed files with 429 additions and 154 deletions

View File

@ -1,3 +1,25 @@
## Version 11.1.0 du 01/02/2024-20:59
* `8570d12` pff: les répertoires liés peuvent contenir des fichiers
* `5d6c6b4` synchroniser pff et nulib/pff
* `90bda71` pff: support des répertoires liés
* `7d7b88a` autoriser les feature branches qui commencent par wip/
* `5cc1826` dk et dkbuild: support .composer.yaml et setup_image
* `0bf0f48` dk: support ~/.dkbuild.env
* `b818e11` dkbuild: ajout de --plain
* `ad14de3` dkbuild: configuration profil prod par défaut
* `54a5b54` Sscreen: support des cas où screen n'est pas dans le PATH
* `5a06851` dkbuild: support profil par défaut
* `a855b04` dkbuild: les versions de profil sont ordonnées comme les versions de distribution
* `e531553` dkbuild: sans --all-profiles, ne build que dans le profil par défaut
* `db1467b` bug
* `3123d8e` dkbuild: mappings par défaut
* `d9b1485` charnière entre java 8 et java 11
* `744a3fa` dkbuild: indiquer si la version de Java demandée n'est pas trouvée
* `2803868` dkbuild: marquer plus d'action comme étant du build
* `4f7bc3f` dkbuild: bug avec -u seul
* `8cdc3cb` modifs.mineures sans commentaires
## Version 11.0.0 du 05/09/2023-14:29
* `ddfbc00` maj des images par défaut dk et dkbuild

18
Sscreen
View File

@ -18,15 +18,25 @@ function __ask() {
}
function __auto_screen() {
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
# Si screen pas installé, ne rien faire
if [ -z "$(which screen 2>/dev/null)" ]; then
local dir screen="$(which screen 2>/dev/null)"
if [ -z "$screen" ]; then
for dir in /usr/local/bin /opt/bin /usr/bin /bin; do
if [ -x "$dir/screen" ]; then
screen="$dir/screen"
PATH="$PATH:$dir"
break
fi
done
fi
if [ -z "$screen" ]; then
echo "${COULEUR_JAUNE}WARNING${COULEUR_NORMALE} screen introuvable. une session bash classique sera lancée"
exec /bin/bash -l
fi
# Si on est déjà dans screen, ne rien faire
[ -z "$STY" ] || return
# corriger TERM pour les vieilles versions de Linux
case "$TERM" in
xterm*) TERM=xterm;;

View File

@ -1 +1 @@
11.0.0
11.1.0

125
dk
View File

@ -230,6 +230,7 @@ COMMANDES
spécifiées y sont lancées. Ce container est réutilisé à chaque fois.
Ce paramétrage est utilisé pour par exemple installer certains
packages nécessaire au projet.
* COMPOSER_SETUP_IMAGE -- nom final de l'image pour COMPOSER_SETUP
La commande 'rshell' est une extension qui lance un shell bash au lieu
de lancer la commande composer, ce qui permet de faire des opérations
plus complexes si le besoin s'en fait sentir. NB: le shell est lancé
@ -267,6 +268,7 @@ COMMANDES
spécifiées y sont lancées. Ce container est réutilisé à chaque fois.
Ce paramétrage est utilisé pour par exemple installer certains
packages nécessaire au projet.
* MAVEN_SETUP_IMAGE -- nom final de l'image pour MAVEN_SETUP
La commande 'rshell' est une extension qui lance un shell bash au lieu
de lancer la commande mvn, ce qui permet de faire des opérations
plus complexes si le besoin s'en fait sentir. NB: le shell est lancé
@ -1083,10 +1085,10 @@ function build_update_apps() {
estep "Type de dépôt: $TYPE"
if [ "$TYPE" == composer ]; then
local cvname cvvalue
local composer_php composer_php_max composer_image composer_cmd composer_setup composer_action
local composer_php composer_php_max composer_image composer_cmd composer_setup composer_setup_image composer_action
local -a composer_vars composer_args
for cvname in composer_php composer_php_max composer_image composer_cmd composer_setup; do
for cvname in composer_php composer_php_max composer_image composer_cmd composer_setup composer_setup_image; do
cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"
[ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; }
[ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; }
@ -1122,10 +1124,10 @@ function build_update_apps() {
fi
elif [ "$TYPE" == maven ]; then
local cvname cvvalue
local maven_java maven_image maven_cmd maven_setup maven_action
local maven_java maven_image maven_cmd maven_setup maven_setup_image maven_action
local -a maven_vars maven_args
for cvname in maven_java maven_image maven_cmd maven_setup; do
for cvname in maven_java maven_image maven_cmd maven_setup maven_setup_image; do
cvvalue="${var}_${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"
[ -n "$cvvalue" ] || { cvvalue="${var}_${cvname^^}"; cvvalue="${!cvvalue}"; }
[ -n "$cvvalue" ] || { cvvalue="${PROFILE}_${cvname^^}"; cvvalue="${!cvvalue}"; }
@ -1979,6 +1981,7 @@ function default_docker_composer() {
-e group="$group"
-e projdir="$projdir"
-e setup="$COMPOSER_SETUP"
-e setup_image="$COMPOSER_SETUP_IMAGE"
-e composer="$COMPOSER_CMD"
-e args="$args"
)
@ -2008,35 +2011,36 @@ fi
if [ -n "$COMPOSER_SETUP" ]; then
# lancement dans un container docker à préparer
local NAME project_name container_name dkid
local NAME setup_image project_name container_name dkid
if [ -f docker-compose.yml ]; then
compose_set_project_name set_container_name
else
NAME="$(basename -- "$(pwd)")"
docker_check_name set_container_name
fi
container_name="dk_composer_${container_name}"
setup_image="$COMPOSER_SETUP_IMAGE"
[ -n "$setup_image" ] || setup_image="dk_composer_${container_name}_image"
# vérifier l'existence de l'image
setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image"
setx dkid=docker image ls --format '{{.ID}}' "$setup_image"
# créer le container le cas échéant
if [ -z "$dkid" ]; then
estep "Création du container $container_name avec l'image $COMPOSER_IMAGE"
estep "Création de l'image $setup_image à partir de $COMPOSER_IMAGE"
cmd=(
"$DOCKER" create -it --name "${container_name}_ct"
"$DOCKER" create -it --name "${setup_image}_tmpct"
"${basecmd[@]}"
"$COMPOSER_IMAGE"
bash -c "$setupscript"
)
setx dkid="${cmd[@]}" || return 1
"$DOCKER" container start -ai "$dkid" || return 1
"$DOCKER" container commit "$dkid" "${container_name}_image" || return 1
"$DOCKER" container commit "$dkid" "$setup_image" || return 1
"$DOCKER" container rm "$dkid" || return 1
fi
# prendre comme image le container créé
COMPOSER_IMAGE="${container_name}_image"
COMPOSER_IMAGE="$setup_image"
fi
cmd=(
@ -2062,7 +2066,19 @@ function auto_composer() {
local COMPOSER_MACHINE=-u
local COMPOSER_CMD=
local COMPOSER_SETUP=
[ -f .composer.conf ] && source ./.composer.conf
local COMPOSER_SETUP_IMAGE=
if [ -f .composer.yaml ]; then
local registry
eval "$(<.composer.yaml grep ^composer_ |
sed 's/^composer_php_min: /COMPOSER_PHP=/
s/^composer_php_max: /COMPOSER_PHP_MAX=/
s/^composer_registry: /registry=/
s/^composer_image: \(.*\)/COMPOSER_IMAGE="${registry:-$REGISTRY}\/\1"/
s/^composer_setup: /COMPOSER_SETUP=/
s/^composer_setup_image: /COMPOSER_SETUP_IMAGE=/')"
elif [ -f .composer.conf ]; then
source ./.composer.conf
fi
# les premiers arguments peuvent servir à redéfinir les variables
while [ $# -gt 0 ]; do
case "$1" in
@ -2204,6 +2220,7 @@ function default_docker_maven() {
-e group="$group"
-e projdir="$projdir"
-e setup="$MAVEN_SETUP"
-e setup_image="$MAVEN_SETUP_IMAGE"
-e maven="$MAVEN_CMD"
-e args="$args"
${MAVEN_JAVA:+-e JAVA="$MAVEN_JAVA"}
@ -2228,35 +2245,36 @@ cd "$projdir"
if [ -n "$MAVEN_SETUP" ]; then
# lancement dans un container docker à préparer
local NAME project_name container_name dkid
local NAME setup_image project_name container_name dkid
if [ -f docker-compose.yml ]; then
compose_set_project_name set_container_name
else
NAME="$(basename -- "$(pwd)")"
docker_check_name set_container_name
fi
container_name="dk_maven_${container_name}"
setup_image="$MAVEN_SETUP_IMAGE"
[ -n "$setup_image" ] || setup_image="dk_maven_${container_name}_image"
# vérifier l'existence de l'image
setx dkid=docker image ls --format '{{.ID}}' "${container_name}_image"
setx dkid=docker image ls --format '{{.ID}}' "$setup_image"
# créer le container le cas échéant
if [ -z "$dkid" ]; then
estep "Création du container $container_name avec l'image $MAVEN_IMAGE"
estep "Création de l'image $setup_image à partir de $MAVEN_IMAGE"
cmd=(
"$DOCKER" create -it --name "${container_name}_ct"
"$DOCKER" create -it --name "${setup_image}_tmpct"
"${basecmd[@]}"
"$MAVEN_IMAGE"
bash -c "$setupscript"
)
setx dkid="${cmd[@]}" || return 1
"$DOCKER" container start -ai "$dkid" || return 1
"$DOCKER" container commit "$dkid" "${container_name}_image" || return 1
"$DOCKER" container commit "$dkid" "$setup_image" || return 1
"$DOCKER" container rm "$dkid" || return 1
fi
# prendre comme image le container créé
MAVEN_IMAGE="${container_name}_image"
MAVEN_IMAGE="$setup_image"
fi
cmd=(
@ -2281,6 +2299,7 @@ function auto_maven() {
local MAVEN_MACHINE=-u
local MAVEN_CMD=
local MAVEN_SETUP=
local MAVEN_SETUP_IMAGE=
[ -f .maven.conf ] && source ./.maven.conf
# les premiers arguments peuvent servir à redéfinir les variables
while [ $# -gt 0 ]; do
@ -2413,21 +2432,6 @@ fi
[ -n "$COMPOSE_V1" ] && DOCKER_COMPOSE=(docker-compose) || DOCKER_COMPOSE=(docker compose)
DEFAULT_PROFILE=devel
case "$PROFILE" in
jclain)
REGISTRY=docker.jclain.fr
PRIVAREG=docker.jclain.fr
;;
devel)
REGISTRY=docker.devel.self
PRIVAREG=docker.devel.self
;;
prod|test|*)
REGISTRY=pubdocker.univ-reunion.fr
PRIVAREG=pridocker.univ-reunion.fr
;;
esac
PROFILE=
DM_ALIASES=()
DM_PROFILES=()
@ -2435,20 +2439,55 @@ CLUSTERDIRS=()
DEFAULT_DEVEL_SRCDIR="$HOME/wop"
COMPOSER_DEVEL_SRCDIR="$HOME/wop/php"
MAVEN_DEVEL_SRCDIR="$HOME/wop/sn"
DEFAULT_COMPOSER_IMAGE="$REGISTRY/image/phpbuilder:d11"
DEFAULT_MAVEN_IMAGE="$REGISTRY/image/javabuilder:d11"
DEFAULT_COMPOSER_IMAGE=
DEFAULT_MAVEN_IMAGE=
DEFAULT_HOST_MAPPINGS=()
prod_HOST_MAPPINGS=(
pridocker.univ-reunion.fr:10.85.1.56
pubdocker.univ-reunion.fr:10.85.1.57
repos.univ-reunion.fr:10.85.1.57
git.univ-reunion.fr:10.85.1.55
)
test_HOST_MAPPINGS=("${prod_HOST_MAPPINGS[@]}")
set_defaults dk
export PROFILE
DEFAULT_PROFILE=devel
REGISTRY=
HOST_MAPPINGS=()
if [ -f ~/.dkbuild.env ]; then
function default_profile() {
DEFAULT_PROFILE="$1"
}
function profile() {
local profile
for profile in "$@"; do
[ "$profile" == "$DEFAULT_PROFILE" ] && return 0
done
return 1
}
function setenv() {
eval "export $1"
}
function default() {
local command="$1"; shift
local nv n v
case "$command" in
docker)
for nv in "$@"; do
[[ "$nv" == *=* ]] || continue
n="${nv%%=*}"
v="${nv#*=}"
case "$n" in
host-mappings)
read -a nv <<<"$v"
for v in "${ns[@]}"; do
HOST_MAPPINGS+=("$v")
done
;;
esac
done
;;
esac
}
source ~/.dkbuild.env
fi
[ -n "$REGISTRY" ] || REGISTRY=pubdocker.univ-reunion.fr
[ -n "$DEFAULT_COMPOSER_IMAGE" ] || DEFAULT_COMPOSER_IMAGE="$REGISTRY/image/php:d11"
[ -n "$DEFAULT_MAVEN_IMAGE" ] || DEFAULT_MAVEN_IMAGE="$REGISTRY/image/javabuilder:d11"
chdir=
CONFIG=

178
dkbuild
View File

@ -103,6 +103,8 @@ $scriptname build [OPTIONS] [BUILDVARS...]
-E, --dtest
--devel
Spécifier le profil dans lequel construire l'image
--all-profiles
Construire l'image dans tous les profils définis
-e, --env VAR=VALUE
Spécifier la valeur d'une variable d'environnement. Cette valeur
@ -142,6 +144,8 @@ $scriptname build [OPTIONS] [BUILDVARS...]
Construire les images
--no-cache
Ne pas utiliser le cache lors du build
--plain-output
Afficher la sortie complète des containers lors du build
-U, --pull-image
Essayer de récupérer une version plus récente de l'image source
-p, --push-image
@ -178,8 +182,9 @@ $scriptname mvn DESTDIR [ACTION [PARAMS] [ARGS]]
$scriptname dump [OPTIONS]
afficher les valeurs des variables
Les options --machine, --projdir, --config, --dist, --profile, --env et
--arg ont la même signification que pour l'action build"
Les options suivantes ont la même signification que pour l'action build:
--machine, --projdir, --config, --dist, --profile, --all-profiles, --env,
--arg"
}
function display_help_dkbuild() {
@ -257,6 +262,11 @@ Si le profil sélectionné par l'utilisateur n'est pas dans la liste fournie, le
script s'arrête avec une erreur. Le premier profil listé est spécial: c'est le
profil par défaut.
La commande 'default_profile' permet de spécifier un profil par défaut à
utiliser, exactement comme s'il avait été spécifié avec l'option --profile.
Cette commande est particulièrement appropriée pour le fichier ~/.dkbuild.env
s'il s'agit de définir le profil à utiliser sur un hôte.
La commande 'profile' permet de tester si le profil spécifié en argument a été
sélectionné par l'utilisateur. L'argument 'DEFAULT' permet de tester le profil
par défaut.
@ -286,8 +296,8 @@ la plus récente.
Si les distributions sont utilisées avec des versions, alors c'est une erreur de
spécifier une version dans le profil
Note: 'setprofiles' ne doit être utilisé qu'une seule fois. Les invocations
suivantes sont ignorées.
Note: 'setprofiles' et 'default_profile' ne peuvent être utilisés qu'une seule
fois. Les invocations suivantes sont ignorées.
## Versions ####################################################################
@ -507,6 +517,8 @@ USAGE:
## setprofiles -- spécifier les profils valides
## default_profile -- spécifier le profil à utiliser si aucun profil n'est sélectionné
## profile -- vérifier le profil courant
## setversion -- spécifier la version par défaut
@ -774,18 +786,29 @@ Les paramètres optionnels sont
commandes spécifiées y sont lancées. Ce container est réutilisé à chaque fois.
Ce paramétrage est utilisé par exemple pour installer certains packages
nécessaire au projet.
* setup-image=SETUP_IMAGE
forcer le nom de l'image pour setup= (la valeur de project-name= est ignorée)
* project-name=PROJECT_NAME
si setup= est défini, nommer l'image sur la base de ce nom. par défaut, le nom
est calculé automatiquement
Si un fichier .composer.conf existe dans le répertoire du projet, il est sourcé
pour obtenir les valeurs par défaut des paramètres:
Si un fichier .composer.yaml existe dans le répertoire du projet, il est analysé
pour obtenir les valeurs par défaut des paramètres suivants:
* composer_php_min: valeur par défaut de php=
* composer_php_max: valeur par défaut de php-max=
* composer_registry: ET composer_image: valeur par défaut de image=
* composer_setup: valeur par défaut de setup=
* composer_setup_image: valeur par défaut de setup-image=
Sinon, si un fichier .composer.conf existe dans le répertoire du projet, il est
sourcé pour obtenir les valeurs par défaut des paramètres:
* COMPOSER_PHP -- valeur par défaut de php=
* COMPOSER_PHP_MAX -- valeur par défaut de php-max=
* COMPOSER_IMAGE -- valeur par défaut de image=
* COMPOSER_MACHINE -- valeur par défaut de machine=
* COMPOSER_CMD -- valeur par défaut de composer=
* COMPOSER_SETUP -- valeur par défaut de setup=
* COMPOSER_SETUP_IMAGE -- valeur par défaut de setup-image=
## mvn -- construire projet maven
@ -847,6 +870,8 @@ Les paramètres optionnels sont
commandes spécifiées y sont lancées. Ce container est réutilisé à chaque fois.
Ce paramétrage est utilisé par exemple pour installer certains packages
nécessaire au projet.
* setup-image=SETUP_IMAGE
forcer le nom de l'image pour setup= (la valeur de project-name= est ignorée)
* project-name=PROJECT_NAME
si setup= est défini, nommer l'image sur la base de ce nom. par défaut, le nom
est calculé automatiquement
@ -858,6 +883,7 @@ pour obtenir les valeurs par défaut des paramètres:
* MAVEN_MACHINE -- valeur par défaut de machine=
* MAVEN_CMD -- valeur par défaut de mvn=
* MAVEN_SETUP -- valeur par défaut de setup=
* MAVEN_SETUP_IMAGE -- valeur par défaut de setup-image=
## run -- lancer des commandes
@ -889,6 +915,7 @@ declare -A PROTECTED_VARS=(
[SETDISTS]=1
[SETPROFILES_DONE]=1
[SETPROFILES]=1
[DEFAULT_PROFILE]=1
[SETVERSION_DONE]=1
[SETVERSION]=1
[AUTOBUILD]=1
@ -906,7 +933,7 @@ SHARED_ARGS1=(
-c:,--config: CONFIG=
)
SHARED_LOCALS2="local DIST PROFILE; local -a TMPENVIRON TMPARGS"
SHARED_LOCALS2="local DIST PROFILE ALL_PROFILES; local -a TMPENVIRON TMPARGS"
SHARED_ARGS2=(
-d:,--dist: DIST=
-9,--d9 DIST=d9
@ -923,6 +950,7 @@ SHARED_ARGS2=(
-E,--dtest PROFILE=dtest
-J,--jclain PROFILE=jclain
--devel PROFILE=devel
--all-profiles ALL_PROFILES=1
-e:,--env: '$TMPENVIRON+=("$value_")'
--arg: '$TMPARGS+=("$value_")'
@ -933,6 +961,7 @@ TFUNCTIONS=(
section note info debug
setdists dist
setprofiles profile
default_profile
setversion version
setenv resetenv
setarg resetarg
@ -1269,14 +1298,37 @@ function define_functions_env() {
return 1
}
function profile() {
local profile version
local profile version default
for profile in "$@"; do
[ "$profile" == DEFAULT ] && profile="${SETPROFILES[0]}"
if [ "$profile" == DEFAULT ]; then
default=1
continue
fi
parse_profile "$profile" profile version
[ "$profile" == "$PROFILE" ] || continue
[ -z "$version" -o "$version" == "$PVERSION" ] || continue
return 0
done
if [ -n "$default" ]; then
# trouver la dernière occurence du premier profil mentionné. en
# effet, les versions doivent être ordonnées de la plus ancienne à
# la plus récente.
local first_profile last_version
for profile in "${SETPROFILES[@]}"; do
parse_profile "$profile" profile version
if [ -z "$first_profile" ]; then
first_profile="$profile"
last_version="$version"
elif [ "$profile" == "$first_profile" ]; then
last_version="$version"
fi
done
if [ "$first_profile" == "$PROFILE" ]; then
if [ -z "$last_version" -o "$last_version" == "$PVERSION" ]; then
return 0
fi
fi
fi
return 1
}
declare -g -A ENVIRON
@ -1405,6 +1457,7 @@ function resolve_dists_profiles() {
SETDISTS=()
SETPROFILES_DONE=
SETPROFILES=()
DEFAULT_PROFILE=
SETVERSION_DONE=
SETVERSION=
AUTOBUILD=1
@ -1419,6 +1472,9 @@ function resolve_dists_profiles() {
SETPROFILES=("$@")
SETPROFILES_DONE=1
}
function default_profile() {
[ -n "$DEFAULT_PROFILE" ] || DEFAULT_PROFILE="$1"
}
function build() {
AUTOBUILD=
}
@ -1427,6 +1483,10 @@ function resolve_dists_profiles() {
}
load_dkbuild
if [ -z "$PROFILE" -a -z "$ALL_PROFILES" -a -n "$DEFAULT_PROFILE" ]; then
enote "Auto-sélection du profil $DEFAULT_PROFILE"
PROFILE="$DEFAULT_PROFILE"
fi
local MANUAL_SETPROFILES=
if [ -z "$SETPROFILES_DONE" -a -n "$PROFILE" ]; then
# Si l'utilisateur spécifie un profil mais qu'aucun profil n'a été
@ -1486,7 +1546,7 @@ function resolve_dists_profiles() {
fi
parse_profile "$profile"
if [ "$profile" == "$PROFILE" ]; then
# ou matcher uniquement la distribution
# ou matcher uniquement le profil
found=1
break
fi
@ -1495,8 +1555,16 @@ function resolve_dists_profiles() {
[ -n "$found" ] || die "$PROFILE: profil invalide"
# forcer à ne construire que cette distribution
PROFILES=("$PROFILE")
elif [ -n "$ALL_PROFILES" ]; then
# prendre tous les profils comme indiqué
for profile in "${SETPROFILES[@]}"; do
parse_profile "$profile"
PROFILES+=("$profile")
done
else
PROFILES=("${SETPROFILES[@]}")
# prendre le profil par défaut
parse_profile "${SETPROFILES[0]}"
PROFILES=("$profile")
fi
}
load_dkbuild
@ -1834,6 +1902,7 @@ function define_functions_cmd() {
shift
done
[ -n "${DEFAULTS[build_build]-1}" ] || return 0
[ -n "$output" ] || die "genfile: Vous devez spécifier le fichier en sortie"
if [ -n "$context" ]; then
mkdir -p "$context" || die
@ -1869,6 +1938,7 @@ function define_functions_cmd() {
shift
done
[ -n "${DEFAULTS[build_build]-1}" ] || return 0
[ -n "$DOCKERFILE" ] || DOCKERFILE=Dockerfile
DOCKERCONTEXT=.
if [ -n "$context" ]; then
@ -1892,6 +1962,7 @@ function define_functions_cmd() {
function add2dockerfile() {
edebug "$(qvals "$@")"
[ -n "${DEFAULTS[build_build]-1}" ] || return 0
[ -n "$DOCKERFILE" ] || return
echo "$*" >>"$DOCKERFILE"
}
@ -2002,6 +2073,7 @@ function define_functions_cmd() {
local avar
local -a args; args=(
${no_cache:+--no-cache}
${progress:+--progress "$progress"}
${pull:+--pull}
)
eval "host_mappings=($host_mappings)"
@ -2039,6 +2111,7 @@ function define_functions_cmd() {
function cbuild() {
edebug "cbuild $(qvals "$@")"
local build="${DEFAULTS[build_build]-1}"
local files="${DEFAULTS[cbuild_files]}"
local project_name="${DEFAULTS[cbuild_project-name]}"
local no_cache="${DEFAULTS[cbuild_no-cache]}"
@ -2057,6 +2130,7 @@ function define_functions_cmd() {
shift
done
[ -n "$build" ] || return
if [ -n "$files" ]; then
eval "files=($files)"
else
@ -2083,6 +2157,7 @@ function define_functions_cmd() {
local avar evar; local -a bargs
bargs=(
${no_cache:+--no-cache}
${progress:+--progress "$progress"}
${pull:+--pull}
)
for avar in "${!ARGS[@]}"; do
@ -2153,6 +2228,7 @@ function define_functions_cmd() {
-e group="$group"
-e projdir="$projdir"
-e setup="$setup"
-e setup_image="$setup_image"
-e composer="$composer"
-e args="$args"
)
@ -2182,32 +2258,33 @@ fi
if [ -n "$setup" ]; then
local project_name container_name ctid
local setup_image="$setup_image"
# lancement dans un container docker à préparer
[ -n "$project_name" ] || setx project_name=get_project_name
setx container_name=get_container_name "$project_name"
container_name="dkbuild_composer_${container_name}"
[ -n "$setup_image" ] || setup_image="dkbuild_composer_${container_name}_image"
# vérifier l'existence de l'image
setx ctid=docker image ls --format '{{.ID}}' "${container_name}_image"
setx ctid=docker image ls --format '{{.ID}}' "$setup_image"
# créer le container le cas échéant
if [ -z "$ctid" ]; then
estep "Création du container $container_name à partir de l'image $image"
estep "Création de l'image $setup_image à partir de $image"
cmd=(
docker create -it --name "${container_name}_ct"
docker create -it --name "${setup_image}_tmpct"
"${basecmd[@]}"
"$image"
bash -c "$setupscript"
)
setx ctid="${cmd[@]}" &&
docker container start -ai "$ctid" &&
docker container commit "$ctid" "${container_name}_image" &&
docker container commit "$ctid" "$setup_image" &&
docker container rm "$ctid" || die
fi
# prendre comme image le container créé
image="${container_name}_image"
image="$setup_image"
fi
case "$action" in
@ -2256,8 +2333,29 @@ fi
[ "$host_mappings" == __UNDEFINED__ ] && host_mappings="${DEFAULTS[docker_host-mappings]}"
local composer="${DEFAULTS[composer_composer]}"
local setup="${DEFAULTS[composer_setup]}"
local setup_image="${DEFAULTS[composer_setup-image]}"
local project_name="${DEFAULTS[composer_project-name]}"
if [ -f "$destdir/.composer.conf" ]; then
if [ -f "$destdir/.composer.yaml" ]; then
eval "$(
COMPOSER_PHP=
COMPOSER_PHP_MAX=
COMPOSER_IMAGE="$COMPOSER_IMAGE"
COMPOSER_SETUP=
COMPOSER_SETUP_IMAGE=
eval "$(<"$destdir/.composer.yaml" grep ^composer_ |
sed 's/^composer_php_min: /COMPOSER_PHP=/
s/^composer_php_max: /COMPOSER_PHP_MAX=/
s/^composer_registry: /registry=/
s/^composer_image: \(.*\)/COMPOSER_IMAGE="${registry:-$REGISTRY}\/\1"/
s/^composer_setup: /COMPOSER_SETUP=/
s/^composer_setup_image: /COMPOSER_SETUP_IMAGE=/')"
[ -z "$php" ] && echo_setv php="$COMPOSER_PHP"
[ -z "$php_max" ] && echo_setv php_max="$COMPOSER_PHP_MAX"
[ -z "$image" ] && echo_setv image="$COMPOSER_IMAGE"
[ -z "$setup" ] && echo_setv setup="$COMPOSER_SETUP"
[ -z "$setup_image" ] && echo_setv setup_image="$COMPOSER_SETUP_IMAGE"
)"
elif [ -f "$destdir/.composer.conf" ]; then
eval "$(
COMPOSER_PHP=
COMPOSER_PHP_MAX=
@ -2265,6 +2363,7 @@ fi
COMPOSER_MACHINE=-u
COMPOSER_CMD=
COMPOSER_SETUP=
COMPOSER_SETUP_IMAGE=
source "$destdir/.composer.conf"
[ -z "$php" ] && echo_setv php="$COMPOSER_PHP"
[ -z "$php_max" ] && echo_setv php_max="$COMPOSER_PHP_MAX"
@ -2272,6 +2371,7 @@ fi
[ -z "$machine" ] && echo_setv machine="$COMPOSER_MACHINE"
[ -z "$composer" ] && echo_setv composer="$COMPOSER_CMD"
[ -z "$setup" ] && echo_setv setup="$COMPOSER_SETUP"
[ -z "$setup_image" ] && echo_setv setup_image="$COMPOSER_SETUP_IMAGE"
)"
fi
@ -2287,6 +2387,7 @@ fi
host-mappings=*) host_mappings="${1#host-mappings=}";;
composer=*) composer="${1#composer=}";;
setup=*) setup="${1#setup=}";;
setup-image=*) setup_image="${1#setup-image=}";;
project-name=*) project_name="${1#project-name=}";;
*=*) ewarn "composer: $1: argument ignoré";;
*) break;;
@ -2375,7 +2476,7 @@ exit((PHP_VERSION_ID < $version)? 0: 1);
function _local_mvn() {
if [ -n "$java" ]; then
urequire java
select_java_exact "$java" || die
select_java_exact "$java" || die "mvn: Java $java introuvable"
export MVN_JAVA_VERSION="$java"
fi
@ -2452,6 +2553,7 @@ exit((PHP_VERSION_ID < $version)? 0: 1);
-e group="$group"
-e projdir="$projdir"
-e setup="$setup"
-e setup_image="$setup_image"
-e mvn="$mvn"
-e args="$args"
${java:+-e JAVA="$java"}
@ -2477,32 +2579,33 @@ cd "$projdir"
if [ -n "$setup" ]; then
local project_name container_name ctid
local setup_image="$setup_image"
# lancement dans un container docker à préparer
[ -n "$project_name" ] || setx project_name=get_project_name
setx container_name=get_container_name "$project_name"
container_name="dkbuild_maven_${container_name}"
[ -n "$setup_image" ] || setup_image="dkbuild_maven_${container_name}_image"
# vérifier l'existence de l'image
setx ctid=docker image ls --format '{{.ID}}' "${container_name}_image"
setx ctid=docker image ls --format '{{.ID}}' "$setup_image"
# créer le container le cas échéant
if [ -z "$ctid" ]; then
estep "Création du container $container_name à partir de l'image $image"
estep "Création de l'image $setup_image à partir de $image"
cmd=(
docker create -it --name "${container_name}_ct"
docker create -it --name "${setup_image}_tmpct"
"${basecmd[@]}"
"$image"
bash -c "$setupscript"
)
setx ctid="${cmd[@]}" &&
docker container start -ai "$ctid" &&
docker container commit "$ctid" "${container_name}_image" &&
docker container commit "$ctid" "$setup_image" &&
docker container rm "$ctid" || die
fi
# prendre comme image le container créé
image="${container_name}_image"
image="$setup_image"
fi
case "$action" in
@ -2547,6 +2650,7 @@ cd "$projdir"
[ "$host_mappings" == __UNDEFINED__ ] && host_mappings="${DEFAULTS[docker_host-mappings]}"
local mvn="${DEFAULTS[mvn_mvn]}"
local setup="${DEFAULTS[mvn_setup]}"
local setup_image="${DEFAULTS[mvn_setup-image]}"
local project_name="${DEFAULTS[mvn_project-name]}"
if [ -f "$destdir/.maven.conf" ]; then
eval "$(
@ -2555,12 +2659,14 @@ cd "$projdir"
MAVEN_MACHINE=-u
MAVEN_CMD=
MAVEN_SETUP=
MAVEN_SETUP_IMAGE=
source "$destdir/.maven.conf"
[ -z "$java" ] && echo_setv java="$MAVEN_JAVA"
[ -z "$image" ] && echo_setv image="$MAVEN_IMAGE"
[ -z "$machine" ] && echo_setv machine="$MAVEN_MACHINE"
[ -z "$mvn" ] && echo_setv mvn="$MAVEN_CMD"
[ -z "$setup" ] && echo_setv setup="$MAVEN_SETUP"
[ -z "$setup_image" ] && echo_setv setup_image="$MAVEN_SETUP_IMAGE"
)"
fi
@ -2575,6 +2681,7 @@ cd "$projdir"
host-mappings=*) host_mappings="${1#host-mappings=}";;
mvn=*) mvn="${1#mvn=}";;
setup=*) setup="${1#setup=}";;
setup-image=*) setup_image="${1#setup-image=}";;
project-name=*) project_name="${1#project-name=}";;
*=*) ewarn "mvn: $1: argument ignoré";;
*) break;;
@ -2656,9 +2763,10 @@ cd "$projdir"
}
function runb() {
local build="${DEFAULTS[build_build]-1}"
if [ -n "$build" ]; then
run "$@"
if [ -z "$build" ]; then
[ $# -eq 0 ] && return 1 || return 0
fi
run "$@"
}
function call() {
edebug "call $(qvals "$@")"
@ -2668,9 +2776,10 @@ cd "$projdir"
}
function callb() {
local build="${DEFAULTS[build_build]-1}"
if [ -n "$build" ]; then
call "$@"
if [ -z "$build" ]; then
[ $# -eq 0 ] && return 1 || return 0
fi
call "$@"
}
function dkbuild() {
edebug "dkbuild $(qvals "$@")"
@ -2788,7 +2897,7 @@ function build_action() {
local machine
local clean_update clean_opt=-X
local clone_src_only update_src_only update_src sync_src
local build no_cache pull_image
local build no_cache progress pull_image
local push_image
local -a args; args=(
"${SHARED_ARGS1[@]}" "${SHARED_ARGS2[@]}"
@ -2805,6 +2914,7 @@ function build_action() {
--no-sync-src sync_src=no
-b,--build build=1
--no-cache no_cache=1
--plain-output progress=plain
-U,--pull-image pull_image=1
-p,--push-image push_image=1
)
@ -2816,12 +2926,16 @@ function build_action() {
action=update_src
else
action=build
[ -n "$update_src" ] || update_src=1
[ "$update_src" == no ] && update_src=
if [ -z "$clean_update" -a -z "$sync_src" -a -z "$build" -a -z "$push_image" ]; then
sync_src=1
build=1
fi
if [ -n "$build" ]; then
[ -n "$update_src" ] || update_src=1
[ "$update_src" == no ] && update_src=
else
update_src=
fi
[ "$sync_src" == no ] && sync_src=
fi

View File

@ -20,27 +20,5 @@
#MAVEN_DEVEL_SRCDIR="$HOME/wop/sn"
# Image à utiliser pour les builds
#DEFAULT_COMPOSER_IMAGE=pubdocker.univ-reunion.fr/image/phpbuilder:d11
#DEFAULT_COMPOSER_IMAGE=pubdocker.univ-reunion.fr/image/php:d11
#DEFAULT_MAVEN_IMAGE=pubdocker.univ-reunion.fr/image/javabuilder:d11
# Mappings d'hôtes à activer pour les builds à base d'image
#DEFAULT_HOST_MAPPINGS=()
#prod_HOST_MAPPINGS=(pridocker.univ-reunion.fr:10.85.1.56 pubdocker.univ-reunion.fr:10.85.1.57 repos.univ-reunion.fr:10.85.1.57 git.univ-reunion.fr:10.85.1.55)
#test_HOST_MAPPINGS=("${prod_HOST_MAPPINGS}")
#case "$PROFILE" in
#jclain)
# REGISTRY=docker.jclain.fr
# PRIVAREG=docker.jclain.fr
# ;;
#devel)
# REGISTRY=docker.devel.self
# PRIVAREG=docker.devel.self
# ;;
#prod|test|*)
# REGISTRY=pubdocker.univ-reunion.fr
# PRIVAREG=pridocker.univ-reunion.fr
# ;;
#esac
#: ${DEFAULT_COMPOSER_IMAGE:=$REGISTRY/image/phpbuilder:d11}
#: ${DEFAULT_MAVEN_IMAGE:=$REGISTRY/image/javabuilder:d11}

View File

@ -1,11 +1,20 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
default_profile "${DKBUILD_PROFILE:-prod}"
if profile jclain; then
setenv REGISTRY=docker.jclain.fr
setenv PRIVAREG=docker.jclain.fr
elif profile prod test; then
setenv REGISTRY=pubdocker.univ-reunion.fr
setenv PRIVAREG=pridocker.univ-reunion.fr
else
host_mappings=(
pridocker.univ-reunion.fr:10.85.1.56
pubdocker.univ-reunion.fr:10.85.1.57
repos.univ-reunion.fr:10.85.1.57
git.univ-reunion.fr:10.85.1.55
)
default docker host-mappings="${host_mappings[*]}"
elif profile devel; then
setenv REGISTRY=docker.devel.self
setenv PRIVAREG=docker.devel.self
fi

View File

@ -0,0 +1,8 @@
# tests
Lancer un test de cette façon
~~~sh
../../../dkbuild -j test-xxx
~~~
-*- coding: utf-8 mode: markdown -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8:noeol:binary

View File

@ -1,2 +1,2 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setenv REGISTRY=jclain.fr
setenv REGISTRY=docker.jclain.fr

View File

@ -0,0 +1,10 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setdists v1-d11 v2-d11 v1-d10
if dist LATEST; then
info "$DIST est la distribution la plus récente"
fi
info "version=$VERSION"
# pas de build automatique
AUTOBUILD=

View File

@ -0,0 +1,10 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
setprofiles v1-prod v2-prod test
if profile DEFAULT; then
info "$PROFILE est le profil par défaut"
fi
info "version=$VERSION"
# pas de build automatique
AUTOBUILD=

View File

@ -68,6 +68,9 @@ if [ "$UINST_LOCAL_PROFILES" != auto ]; then
export UTOOLS_LOCAL_PROFILES=$(qvalr "$UINST_LOCAL_PROFILES")" ~/.nutoolsrc
fi
# copier .dkbuild.env
[ -f ~/.dkbuild.env ] || cp lib/dkbuild/dot-dkbuild.env ~/.dkbuild.env
# identification du système
echo "##@before *" >lib/profile.d/0nutools
echo_setv UNAME_SYSTEM "$UNAME_SYSTEM" >>lib/profile.d/0nutools

View File

@ -500,37 +500,37 @@ function select_java() {
case "$1" in
1.3|1.3+)
for v in 1_3 1_4 5 6 7 8 11; do
for v in 1_3 1_4 5 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
1.4|1.4+)
for v in 1_4 5 6 7 8 11; do
for v in 1_4 5 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
1.5|1.5+|5|5+)
for v in 5 6 7 8 11; do
for v in 5 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
1.6|1.6+|6|6+)
for v in 6 7 8 11; do
for v in 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
1.7|1.7+|7|7+)
for v in 7 8 11; do
for v in 7 8; do
__java_select "$v" "$2" && return 0
done
;;
1.8|1.8+|8|8+)
for v in 8 11; do
for v in 8; do
__java_select "$v" "$2" && return 0
done
;;
11|11+)
for v in 11; do
for v in 11 17; do
__java_select "$v" "$2" && return 0
done
;;
@ -556,7 +556,7 @@ function select_java_exact() {
__java_select 1_3 && return 0
;;
1.3+)
for v in 1_3 1_4 5 6 7 8 11; do
for v in 1_3 1_4 5 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
@ -564,7 +564,7 @@ function select_java_exact() {
__java_select 1_4 && return 0
;;
1.4+)
for v in 1_4 5 6 7 8 11; do
for v in 1_4 5 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
@ -572,7 +572,7 @@ function select_java_exact() {
__java_select 5 "$2" && return 0
;;
1.5+|5+)
for v in 5 6 7 8 11; do
for v in 5 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
@ -580,7 +580,7 @@ function select_java_exact() {
__java_select 6 "$2" && return 0
;;
1.6+|6+)
for v in 6 7 8 11; do
for v in 6 7 8; do
__java_select "$v" "$2" && return 0
done
;;
@ -588,7 +588,7 @@ function select_java_exact() {
__java_select 7 "$2" && return 0
;;
1.7+|7+)
for v in 7 8 11; do
for v in 7 8; do
__java_select "$v" "$2" && return 0
done
;;
@ -596,7 +596,7 @@ function select_java_exact() {
__java_select 8 "$2" && return 0
;;
1.8+|8+)
for v in 8 11; do
for v in 8; do
__java_select "$v" "$2" && return 0
done
;;
@ -604,7 +604,7 @@ function select_java_exact() {
__java_select 11 "$2" && return 0
;;
11+)
for v in 11; do
for v in 11 17; do
__java_select "$v" "$2" && return 0
done
;;

View File

@ -117,8 +117,21 @@ function pff_get_first_profile() {
function pff_get_local_files() {
# afficher tous les fichiers locaux exprimés relativement au répertoire du
# projet pff $1
local pffdir="$1"
find "$pffdir/pff/Base" -type f | sed "s|^$pffdir/pff/Base/||" | grep -v '__pv-.*__$'
local pffdir="$1" files file dirs dir isald
files="$(find "$pffdir/pff/Base" -type f | sed "s|^$pffdir/pff/Base/||" | grep -v '/__pv-[^/_]*__[^/]*$')"
dirs="$(echo "$files" | grep '/\.pffdir$' | sed 's/\.pffdir$//')"
setx -a files=echo "$files"
setx -a dirs=echo "$dirs"
for file in "${files[@]}"; do
isald=
for dir in "${dirs[@]}"; do
if [ "${file#$dir}" != "$file" ]; then
isald=1
break
fi
done
[ -z "$isald" -o "$file" == "${dir}.pffdir" ] && echo "$file"
done
}
function pff_get_rfile() {
@ -253,7 +266,18 @@ function pff_select_profile() {
setx -a lfiles=pff_get_local_files "$pffdir"
for lfile in "${lfiles[@]}"; do
src="$pffdir/pff/Current/$lfile"
if [ -f "$pffdir/pff/$profile/$lfile" ]; then
if [[ "$lfile" == */.pffdir ]]; then
# répertoires entiers
lfile="${lfile%/.pffdir}"
src="${src%/.pffdir}"
if [ -d "$pffdir/pff/$profile/$lfile" ]; then
dest="$profile/$lfile"
elif [ "$profile" != Common -a -d "$pffdir/pff/Common/$lfile" ]; then
dest="Common/$lfile"
else
dest="Base/$lfile"
fi
elif [ -f "$pffdir/pff/$profile/$lfile" ]; then
dest="$profile/$lfile"
elif [ "$profile" != Common -a -f "$pffdir/pff/Common/$lfile" ]; then
dest="Common/$lfile"

View File

@ -18,11 +18,11 @@ function is_any_branch() {
case "$spec" in
m|master)
[ -n "$r" ] || r=1
[ "$branch" == "master" ] && return 0
[ "$branch" == master ] && return 0
;;
d|develop)
[ -n "$r" ] || r=1
[ "$branch" == "develop" ] && return 0
[ "$branch" == develop ] && return 0
;;
r|release)
[ -n "$r" ] || r=1
@ -34,20 +34,21 @@ function is_any_branch() {
;;
f|feature|t|topic)
[ -n "$r" ] || r=1
[ "$branch" == "master" ] && continue
[ "$branch" == "develop" ] && continue
[ "$branch" == master ] && continue
[ "$branch" == develop ] && continue
[[ "$branch" == release-* ]] && continue
[[ "$branch" == hotfix-* ]] && continue
[ -n "$annex" -a "$branch" == "git-annex" ] && continue
[[ "$branch" == wip/* ]] && return 0
[[ "$branch" == */* ]] && continue
return 0
;;
-m|-master)
[ -n "$r" ] || r=0
[ "$branch" == "master" ] && return 1;;
[ "$branch" == master ] && return 1;;
-d|-develop)
[ -n "$r" ] || r=0
[ "$branch" == "develop" ] && return 1;;
[ "$branch" == develop ] && return 1;;
-r|-release)
[ -n "$r" ] || r=0
[[ "$branch" == release-* ]] && return 1;;
@ -56,11 +57,12 @@ function is_any_branch() {
[[ "$branch" == hotfix-* ]] && return 1;;
-f|-feature|-t|-topic)
[ -n "$r" ] || r=0
[ "$branch" == "master" ] && continue
[ "$branch" == "develop" ] && continue
[ "$branch" == master ] && continue
[ "$branch" == develop ] && continue
[[ "$branch" == release-* ]] && continue
[[ "$branch" == hotfix-* ]] && continue
[ -n "$annex" -a "$branch" == "git-annex" ] && continue
[[ "$branch" == wip/* ]] && return 1
[[ "$branch" == */* ]] && continue
return 1
;;
@ -89,7 +91,7 @@ function list_feature_branches() {
grep -vF develop |
grep -v '^release-' |
grep -v '^hotfix-' |
grep -v '/' |
grep -Pv '(?<!^wip)/' |
if git_have_annex; then
grep -vF git-annex
else

90
pff
View File

@ -197,9 +197,16 @@ pff:
NOUPSTREAM -- indiquer qu'il n'y a pas de distribution upstream ni de
fichiers origine. pff est alors uniquement utilisé pour gérer des
profils de fichier.
Pour le moment, la seule différence est que le mode des fichiers de
pff/Base n'est pas forcé à 0444. Ainsi, ces fichiers sont traités au
même titre que ceux du répertoire pff/Common
Pour le moment, la seule différence fonctionnelle est que le mode des
fichiers de pff/Base n'est pas forcé à 0444. Ainsi, ces fichiers sont
traités au même titre que ceux du répertoire pff/Common
Dans ce mode, on supporte aussi les liens vers des répertoires entiers:
il suffit de créer le répertoire dans pff/Base avec un unique fichier
.pffdir à l'intérieur. Lors du switch le répertoire correspondant est
lié s'il existe dans un profil.
NB: s'il existe d'autres fichiers dans le répertoire, ils sont ignorés.
Cela permet d'avoir un ensemble de fichiers par défaut, mais les liens
symboliques doivent être faits manuellement.
COMMANDES / OPTIONS
Les arguments du script dépendent de la commande utilisée. Les commandes
@ -347,6 +354,21 @@ function flexists() {
[ -e "$1" -o -L "$1" ]
}
function multiups() {
# afficher un chemin vers le haut e.g ../../.. avec autant d'éléments que
# les répertoires du chemin relatif $1.
# méthode: commencer avec la valeur de départ $2 et préfixer avec autant de
# ../ que nécessaire. puis afficher le résultat.
local tmp="$1" link="$2"
setx tmp=dirname -- "$tmp"
while [ "$tmp" != . ]; do
[ -n "$link" ] && link="/$link"
link="..$link"
setx tmp=dirname -- "$tmp"
done
echo "$link"
}
function find_pffdir() {
# trouver le répertoire du projet pff à partir du répertoire $2(=.) et
# mettre le chemin absolu dans la variable $1(=pffdir)
@ -413,23 +435,22 @@ function get_first_profile() {
function get_local_files() {
# afficher tous les fichiers locaux exprimés relativement au répertoire du
# projet pff $1
local pffdir="$1"
find "$pffdir/pff/Base" -type f | sed "s|^$pffdir/pff/Base/||" | grep -v '/__pv-[^/_]*__[^/]*$'
}
function multiups() {
# afficher un chemin vers le haut e.g ../../.. avec autant d'éléments que
# les répertoires du chemin relatif $1.
# méthode: commencer avec la valeur de départ $2 et préfixer avec autant de
# ../ que nécessaire. puis afficher le résultat.
local tmp="$1" link="$2"
setx tmp=dirname -- "$tmp"
while [ "$tmp" != . ]; do
[ -n "$link" ] && link="/$link"
link="..$link"
setx tmp=dirname -- "$tmp"
# pour les répertoires liés, ne lister que le fichier .pffdir
local pffdir="$1" files file dirs dir isald
files="$(find "$pffdir/pff/Base" -type f | sed "s|^$pffdir/pff/Base/||" | grep -v '/__pv-[^/_]*__[^/]*$')"
dirs="$(echo "$files" | grep '/\.pffdir$' | sed 's/\.pffdir$//')"
setx -a files=echo "$files"
setx -a dirs=echo "$dirs"
for file in "${files[@]}"; do
isald=
for dir in "${dirs[@]}"; do
if [ "${file#$dir}" != "$file" ]; then
isald=1
break
fi
done
[ -z "$isald" -o "$file" == "${dir}.pffdir" ] && echo "$file"
done
echo "$link"
}
function get_rfile() {
@ -595,7 +616,18 @@ function select_profile() {
setx -a lfiles=get_local_files "$pffdir"
for lfile in "${lfiles[@]}"; do
src="$pffdir/pff/Current/$lfile"
if [ -f "$pffdir/pff/$profile/$lfile" ]; then
if [[ "$lfile" == */.pffdir ]]; then
# répertoires entiers
lfile="${lfile%/.pffdir}"
src="${src%/.pffdir}"
if [ -d "$pffdir/pff/$profile/$lfile" ]; then
dest="$profile/$lfile"
elif [ "$profile" != Common -a -d "$pffdir/pff/Common/$lfile" ]; then
dest="Common/$lfile"
else
dest="Base/$lfile"
fi
elif [ -f "$pffdir/pff/$profile/$lfile" ]; then
dest="$profile/$lfile"
elif [ "$profile" != Common -a -f "$pffdir/pff/Common/$lfile" ]; then
dest="Common/$lfile"
@ -1456,7 +1488,7 @@ function list_locals_cmd() {
local pffdir="$1"
ensure_pffdir pffdir "$pffdir"
get_local_files "$pffdir"
get_local_files "$pffdir" | sed 's/\/.pffdir$/\//'
}
#===========================================================
@ -1739,7 +1771,21 @@ function infos_cmd() {
setx -a vlfiles=get_vlfiles "$pffdir" "$rfile" "$profile"
setx Pfile=get_pfile "$pffdir/$rfile" "$profile" "$pffdir"
setx Cfile=get_Cfile "$pffdir/$rfile" "$pffdir"
if [ ${#vlfiles[*]} -gt 0 ]; then
if [[ "$rfile" == */.pffdir ]]; then
# répertoires entiers
rfile="${rfile%.pffdir}"
Pfile="${Pfile%/.pffdir}"
Cfile="${Cfile%/.pffdir}"
if [ -d "$Pfile" ]; then
flag="${COULEUR_BLEUE}*${COULEUR_NORMALE} "
elif [ "$profile" != Common -a -d "$Cfile" ]; then
flag="$(get_color YELLOW)C${COULEUR_NORMALE} "
elif [ -z "$show_all" ]; then
continue
else
flag=" "
fi
elif [ ${#vlfiles[*]} -gt 0 ]; then
flag="${COULEUR_ROUGE}P${COULEUR_NORMALE} "
elif [ -f "$Pfile" ]; then
flag="${COULEUR_BLEUE}*${COULEUR_NORMALE} "

2
ufile
View File

@ -11,7 +11,7 @@ Les règles sont spécifiées dans le fichier ~/etc/default/ufile
Dans ce fichier, deux tableaux contiennent les règles applicables:
* le tableau RULES contient des règles de la forme pattern:destdir[:renamef] et
permet de classer des fichiers correspondant à des patterns
* le tableau NRULES contient des règles de fle forme name:destdir[:renamef] et
* le tableau NRULES contient des règles de la forme name:destdir[:renamef] et
permet de classer des fichiers quelconques en spécifiant la règle à utiliser
Les champs sont: