Intégration de la branche release-9.9.0

This commit is contained in:
Jephté Clain 2020-09-21 18:08:31 +04:00
commit 246b9473aa
11 changed files with 419 additions and 45 deletions

View File

@ -1,3 +1,22 @@
## Version 9.9.0 du 21/09/2020-18:08
* `2ec6c21` support gros doigt de python2 sur les systèmes modernes
* `bc1a740` bug
* `ada594a` dm: support des aliases
* `856c948` repoctl: ajout de update-origin
* `cc1b45d` support de l'option -u
* `28ceb74` cosmetic
* `751e372` bug
* `c5e1536` support de la définition des aliases et des profils dans les répertoires de cluster
* `14beb13` dk: support minimal maven
* `f474657` dk: ajout de COMPOSER_ARGS
* `1097975` cosmetic
* `bb7a4fc` foreach: ajout de l'option -S
* `e0e6178` dk: support de la sélection d'un service et de la machine sur laquelle tourne un service
* `07bea2c` cx-conndev: support klean
* `7254661` dk: support du nommage du répertoire pour le checkout
* `fb285e0` ne vérifier conndev.php que si c'est nécessaire
## Version 9.8.0 du 28/04/2020-16:42
* `e2b2f49` dk: vérifier que le répertoire destination existe avant rsync

View File

@ -1 +1 @@
9.8.0
9.9.0

View File

@ -19,6 +19,9 @@ OPTIONS
-d, --mysqldump-cmd
Lancer 'mysqldump --databases --add-drop-database -hSERVICE_IP' avec
les arguments supplémentaires fournis sur la ligne de commande
-k, --klean
Lancer la commande 'klean' dans le container spécifié (supprime toutes
les données et relance le container)
-u, --user USER
-p, --password PASSWORD
Paramètres supplémentaires utilisés uniquement avec les options -c et -d"
@ -27,6 +30,7 @@ OPTIONS
service=db
mysql_cmd=
mysqldump_cmd=
klean=
user=
password=
args=(
@ -34,6 +38,7 @@ args=(
-h:,-s:,--service: service=
-c,--mysql-cmd mysql_cmd=1
-d,--mysqldump-cmd mysqldump_cmd=1
-k,--klean klean=1
-u:,--user: user=
-p:,--password: password=
)
@ -58,8 +63,6 @@ if [ -z "$first" ]; then
enote "Le répertoire du projet est $(ppath . ~)"
fi
[ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php"
###
function die_not_found() { die "$service: service introuvable. vérifiez que le projet est actuellement up"; }
@ -78,7 +81,17 @@ if [ -n "$mysql_cmd" ]; then
elif [ -n "$mysqldump_cmd" ]; then
mysqldump --databases --add-drop-database -h"$ip" ${user:+-u"$user"} ${password:+-p"$password"} "$@"
elif [ -n "$klean" ]; then
estep "klean"
docker exec "$cid" klean
estep "wait 10sec..."
sleep 10
estep "start"
docker-compose start "$service"
else
[ -f bin/conndev.php ] || die "Impossible de trouver le script compagnon conndev.php"
mysql_cmd="$(php bin/conndev.php "$ip" "$@")"
edebug "mysql_cmd: $mysql_cmd"

265
dk
View File

@ -55,7 +55,10 @@ COMMANDES
container après utilisation.
x|exec SERVICE COMMAND
Lancer une commande dans le container correspondant au service spécifié,
qui doit être en fonctionnement
qui doit être en fonctionnement. Si la commande n'est pas spécifiée, la
valeur par défaut est bash. Avec les options --select-service et
--select-machine, l'argument SERVICE vaut par défaut 'SS'
Un pseudo-tty est alloué pour la commande et STDIN est ouvert.
d|brd [NAME=VALUE...]
Construire les images (comme avec build), démarrer les services et
suivre les logs de façon interactive (comme avec up). Dès que l'on
@ -119,6 +122,12 @@ COMMANDES
systemd|systemd-unit
Générer une unité systemd qui démarre les services. A priori, ce n'est
nécessaire que si aucune politique de redémarrage n'a été définie.
cp|copy CONTAINER:SRC DEST
cp|copy SRC CONTAINER:DEST
Copier un fichier ou un répertoire depuis/vers un container. Avec les
options --select-service et --select-machine, il est possible d'utiliser
'SS' pour signifier le container sélectionné e.g
$scriptname -s X_Y -- cp file SS:path/to/dir
ps [filter|name=value]
Afficher les containers en cours d'exécution
Le filtre est une expression régulière de type awk qui est mise en
@ -239,6 +248,21 @@ OPTIONS générales
-m, --set-machine MACHINE
Choisir l'environnement docker-machine spécifié avant de lancer les
commandes. Utiliser -u pour desélectionner la machine en cours, e.g -m-u
-s, --select-service SERVICE[.N]
Sélectionner le service spécifié. Si le service a plusieurs instances,
il est possible de sélectionner une instance en particulier avec le
suffixe '.N' (par défaut, la première instance est sélectionnée)
Quand un service est sélectionné, dans les commandes 'cp' et 'exec', la
chaine 'SS' est remplacée par le nom du container correspondant e.g
$scriptname -s X_Y exec SS bash
$scriptname -s X_Y -- cp -L SS:path/to/file destdir
-t, --select-machine SERVICE[.N]
Sélectionner le service spécifié, puis choisir l'environnement
docker-machine correspondant. Cette option a la priorité sur l'option
--select-service
Cette option est traitée après l'option --set-machine, ce qui permet de
se connecter sur le manager d'un cluster puis de sélectionner le worker
sur lequel tourne un service
-n, --fake
Ne pas lancer les commandes, simplement les afficher
-e, --build-arg, --env VAR=VALUE
@ -276,6 +300,8 @@ OPTIONS build
app_SRC= # répertoire/fichier source (si URL='')
app_DEST= # répertoire dans lequel faire le checkout
# ou destination si synchro avec app_SRC
app_NAME= # nom du répertoire dest si checkout; par
# défaut prendre la valeur 'app'
app_RSYNC_OPTS= # options de rsync si synchro (avec app_SRC
# ou app_DEVEL_SRCDIR)
app_PROFILE_ORIGIN= # origine spécifique au profil 'PROFILE'
@ -285,6 +311,7 @@ OPTIONS build
app_TYPE= # type de projet (composer|none)
app_AFTER_UPDATE=() # liste de commandes à lancer après le checkout
app_COMPOSER_ACTION= # action projet composer (install|update|none)
app_COMPOSER_ARGS=() # arguments de composer install|update
-u, --uu, --update-apps-only
Ne faire que la mise à jour depuis les dépôts dépendants.
-w, --ww, --update-apps-devel
@ -330,6 +357,7 @@ VARIABLES de update-apps.conf
SRC= # répertoire/fichier source (si URL='')
DEST= # répertoire dans lequel faire le checkout
# ou destination si URL=''
NAME= # nom du répertoire dest si checkout
RSYNC_OPTS= # options de rsync si synchro avec SRC ou
# DEVEL_SRCDIR
ORIGIN= # origine de la branche
@ -339,6 +367,12 @@ VARIABLES de update-apps.conf
vaut 'install' par défaut. Indique ce qu'il faut faire pour un projet de
type 'composer' après avoir lancé les commandes de AFTER_UPDATE. Les
directives supportées sont 'install', 'update' et 'none'
COMPOSER_ARGS
options à utiliser avec composer install|update. La valeur par défaut
dépend du profil:
prod: --no-dev -o
test: --no-dev -o
autres: (pas d'options)
FONCTIONS de update-apps.conf
sqlmig [DESTDIR [SRCDIR [NOFIX]]]
@ -362,7 +396,9 @@ FONCTIONS de update-apps.conf
PTD est remplacé par prod:prod,test:test,devel:devel
PT " " " prod:prod,test:test
'"Si aucun profil de déploiement ne correspond, le comportement par défaut
est de forcer le premier profil défini dans le projet pff"
est de forcer le premier profil défini dans le projet pff
mvn [ARGS]
Lancer maven dans le répertoire destination avec les arguments spécifiés"
}
function echo_lines() { local IFS=$'\n'; echo "$*"; }
@ -665,6 +701,13 @@ function update_apps_func_pff() {
fi
}
function update_apps_func_mvn() {
local cwd="$(pwd)"
cd "$DEST"
mvn "$@" || die
cd "$cwd"
}
function build_update_apps() {
[ -n "$BUILD_UPDATE_APPS" ] || return 0
[ -f update-apps.conf ] || return 0
@ -690,9 +733,9 @@ function build_update_apps() {
local PRODUCTION DEVELOPMENT
case "$PROFILE" in
prod) PRODUCTION=1; DEVELOPMENT=;;
test) PRODUCTION=1; DEVELOPMENT=1;;
devel) PRODUCTION=; DEVELOPMENT=;;
prod) PRODUCTION=1; DEVELOPMENT=; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=(--no-dev -o);;
test) PRODUCTION=1; DEVELOPMENT=1; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=(--no-dev -o);;
devel) PRODUCTION=; DEVELOPMENT=1; is_defined DEFAULT_COMPOSER_ARGS || DEFAULT_COMPOSER_ARGS=();;
esac
local clean
@ -705,7 +748,8 @@ function build_update_apps() {
fi
etitle "Mise à jour des dépendances"
local app var URL SRC DEVEL_SRCDIR DEST have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE after_update after_updates composer_action
local app var URL SRC DEVEL_SRCDIR DEST NAME have_RSYNC_OPTS RSYNC_OPTS ORIGIN BRANCH TYPE after_update after_updates composer_action
local -a composer_args
for app in "${APPS[@]}"; do
etitle "$app"
@ -726,6 +770,9 @@ function build_update_apps() {
DEST="${var}_DEST"; DEST="${!DEST}"
[ -n "$DEST" ] || DEST="$app/b"
NAME="${var}_NAME"; NAME="${!NAME}"
[ -n "$NAME" ] || NAME="$app"
if is_defined "${var}_RSYNC_OPTS"; then
have_RSYNC_OPTS=1
RSYNC_OPTS="${var}_RSYNC_OPTS[@]"; RSYNC_OPTS=("${!RSYNC_OPTS}")
@ -747,7 +794,7 @@ function build_update_apps() {
if [ -n "$BUILD_UPDATE_DEVEL" ]; then
mkdir -p "$DEST" || { eend; return 1; }
DEST="$DEST/$app"
DEST="$DEST/$NAME"
# synchronisation en mode devel
[ -n "$have_RSYNC_OPTS" ] || RSYNC_OPTS=(--delete --delete-excluded)
@ -776,7 +823,7 @@ function build_update_apps() {
fi
elif [ -n "$URL" ]; then
mkdir -p "$DEST" || { eend; return 1; }
DEST="$DEST/$app"
DEST="$DEST/$NAME"
if [ -d "$DEST" -a -d "$DEST/.git" ]; then
# mise à jour
@ -872,6 +919,11 @@ function build_update_apps() {
[ -n "$composer_action" ] || { composer_action="${var}_COMPOSER_ACTION"; composer_action="${!composer_action}"; }
[ -n "$composer_action" ] || composer_action="$DEFAULT_COMPOSER_ACTION"
composer_args="${var}_${PROFILE}_COMPOSER_ARGS"
is_defined "$composer_args" || composer_args="${var}_COMPOSER_ARGS"
is_defined "$composer_args" || composer_args="DEFAULT_COMPOSER_ARGS"
composer_args="${composer_args}[@]"; composer_args=("${!composer_args}")
if [ -z "$BUILD_UPDATE_DEVEL" ]; then
case "${composer_action:-install}" in
i|install) composer_action=install;;
@ -883,7 +935,7 @@ function build_update_apps() {
setx cwd=pwd
cd "$DEST"
estep "Installation des dépendances composer"
auto_composer "$composer_action" ${PRODUCTION:+--no-dev -o} || { eend; return 1; }
auto_composer "$composer_action" "${composer_args[@]}" || { eend; return 1; }
cd "$cwd"
fi
fi
@ -1259,13 +1311,28 @@ function auto_exec() {
local project_name container_name
if [ -f docker-compose.yml ]; then
compose_set_env_args
compose_exec "$@"
local container="$1"; shift
if [ -n "$SELECT_CONTAINER" ]; then
[ -z "$container" -o "$container" == SS ] && container="$SELECT_CONTAINER"
fi
local command="$1"; shift
[ -n "$command" ] || command=bash
compose_exec "$container" "$command" "$@"
elif [ -f Dockerfile ]; then
docker_set_env_args
docker_check_name set_container_name
docker_exec "$@"
exec_args=(-it)
local command="$1"; shift
[ -n "$command" ] || command=bash
docker_exec "$command" "$@"
else
${FAKE:+qvals} "$DOCKER" exec "$@"
local container="$1"; shift
if [ -n "$SELECT_CONTAINER" ]; then
[ -z "$container" -o "$container" == SS ] && container="$SELECT_CONTAINER"
fi
local command="$1"; shift
[ -n "$command" ] || command=bash
${FAKE:+qvals} "$DOCKER" exec -it "$container" "$command" "$@"
fi
}
@ -1352,6 +1419,7 @@ function __format() {
function __status_query_task() {
setx taskData="$DOCKER" inspect "$taskID"
setx taskID=json_get 0.ID <<<"$taskData"
setx taskSlot=json_get 0.Slot <<<"$taskData"
setx taskStatus=json_get 0.Status.Err <<<"$taskData"
setx serviceID=json_get 0.ServiceID <<<"$taskData"
@ -1375,11 +1443,11 @@ $serviceName: $serviceUpdateStatus
fi
if [ "$num" -eq 0 ]; then
# afficher les en-têtes
__format 3:num 32:taskName 32:node 8:dState 20:cState :error
__format 3:num 48:taskName 32:node 8:dState 20:cState :error
fi
if [ -z "$fnum" -o "$num" == "$fnum" ]; then
taskName="$serviceName.$taskSlot"
__format 3:"$num" 32:"$taskName.$taskID" 32:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus"
__format 3:"$num" 48:"$taskName.$taskID" 32:"$node" 8:"$desiredState" 20:"$currentState" :"$taskStatus"
fi
if [ "$num" == "$fnum" ]; then
"$DOCKER" service logs -f "$taskID"
@ -1567,6 +1635,25 @@ EOF
local_run "$HOST" "$tmpscript"
}
function auto_copy() {
local src="$1"; shift
local dest="$1"; shift
if [ -n "$SELECT_CONTAINER" ]; then
if [ "${src#SS:}" != "$src" ]; then
src="$SELECT_CONTAINER${src#SS}"
elif [ "${src#:}" != "$src" ]; then
src="$SELECT_CONTAINER$src"
fi
if [ "${dest#SS:}" != "$dest" ]; then
dest="$SELECT_CONTAINER${dest#SS}"
elif [ "${dest#:}" != "$dest" ]; then
dest="$SELECT_CONTAINER$dest"
fi
fi
"$DOCKER" cp "$src" "$dest" "$@"
}
function default_local_composer() {
# lancement direct
case "$1" in
@ -1762,6 +1849,70 @@ exit((PHP_VERSION_ID < $version)? 0: 1);
################################################################################
function resolve_dm_alias() {
local alias_dm alias dm
# chercher d'abord dans les définitions par défaut
for alias_dm in "${DM_ALIASES[@]}"; do
alias="${alias_dm%%:*}"
dm="${alias_dm#*:}"
if [ "$1" == "$alias" ]; then
echo "$dm"
return 0
fi
done
# puis chercher dans les répertoires de cluster
local clusterdir DM_ALIASES
for clusterdir in "${CLUSTERDIRS[@]}"; do
DM_ALIASES=()
[ -f "$clusterdir/0config/configure.conf" ] || continue
source "$clusterdir/0config/configure.conf"
for alias_dm in "${DM_ALIASES[@]}"; do
alias="${alias_dm%%:*}"
dm="${alias_dm#*:}"
if [ "$1" == "$alias" ]; then
echo "$dm"
return 0
fi
done
done
# sinon, laisser en l'état
echo "$1"
return 1
}
function resolve_dm_profile() {
local dm_profile dm profile
# chercher d'abord dans les définitions par défaut
for dm_profile in "${DM_PROFILES[@]}"; do
dm="${dm_profile%%:*}"
profile="${dm_profile#*:}"
if [ "$1" == "$dm" ]; then
echo "$profile"
return 0
fi
done
# puis chercher dans les répertoires de cluster
local clusterdir DM_PROFILES
for clusterdir in "${CLUSTERDIRS[@]}"; do
DM_PROFILES=()
[ -f "$clusterdir/0config/configure.conf" ] || continue
source "$clusterdir/0config/configure.conf"
for dm_profile in "${DM_PROFILES[@]}"; do
dm="${dm_profile%%:*}"
profile="${dm_profile#*:}"
if [ "$1" == "$dm" ]; then
echo "$profile"
return 0
fi
done
done
# sinon, afficher le profil par défaut
echo "$DEFAULT_PROFILE"
return 1
}
################################################################################
# support limité docker / podman
if progexists docker; then DOCKER=docker
elif progexists podman; then DOCKER=podman
@ -1770,15 +1921,19 @@ fi
DEFAULT_PROFILE=devel
# pour le moment ne pas lancer composer dans un container par défaut
DEFAULT_COMPOSER_IMAGE=none #docker.univ-reunion.fr/image/apache-php-myiccas-utils:d9
DEFAULT_COMPOSER_IMAGE=none #docker.univ-reunion.fr/image/apache-php-myiccas-utils:d10
PROFILE=
DM_ALIASES=()
DM_PROFILES=()
CLUSTERDIRS=()
set_defaults dk
export PROFILE
chdir=
CONFIG=
DM_SET_MACHINE=
SELECT_CONTAINER=
SELECT_MACHINE=
USE_STACK=
FAKE=
VARS=()
@ -1798,6 +1953,8 @@ args=(
-P,--prod PROFILE=prod
-T,--test PROFILE=test
-m:,--set-machine: DM_SET_MACHINE=
-s:,--select-service: SELECT_CONTAINER=
-t:,--select-machine: SELECT_MACHINE=
--stack USE_STACK=1
-n,--fake FAKE=1
-e:,--build-arg:,--env: VARS
@ -1816,22 +1973,76 @@ parse_args "$@"; set -- "${args[@]}"
progexists docker-machine && DM_AVAILABLE=1 || DM_AVAILABLE=
if [ -n "$DM_SET_MACHINE" ]; then
[ -n "$DM_AVAILABLE" ] || die "docker-machine n'est pas disponible"
setx DM_SET_MACHINE=resolve_dm_alias "$DM_SET_MACHINE"
[ "$DM_SET_MACHINE" == - ] && DM_SET_MACHINE=-u
setx dm_env=docker-machine env "$DM_SET_MACHINE" || die
eval "$dm_env"
# pour warning ci-dessous
[ "$DM_SET_MACHINE" == -u ] && DM_SET_MACHINE=
fi
if [ -n "$DM_AVAILABLE" ]; then
found=
for dm_profile in "${DM_PROFILES[@]}"; do
splitpair "$dm_profile" dm profile
if [ "$dm" == "$DOCKER_MACHINE_NAME" ]; then
DEFAULT_PROFILE="$profile"
if [ -n "$SELECT_MACHINE" -o -n "$SELECT_CONTAINER" ]; then
function __ss_process_data() {
[ -n "$found" ] && return
__status_query_task
__status_query_service
if [ -n "$slot" ]; then
if [ "$taskSlot" == "$slot" ]; then
# ne prendre que le slot qui correspond
found=1
fi
else
# prendre le premier
found=1
break
fi
done
taskName="$serviceName.$taskSlot"
}
if [ -n "$SELECT_MACHINE" ]; then service="$SELECT_MACHINE"
elif [ -n "$SELECT_CONTAINER" ]; then service="$SELECT_CONTAINER"
fi
if [ -f docker-compose.yml -o -f docker-stack.yml ]; then
# si on est dans répertoire de projet, il est possible de spécifier
# le service sans préfixe
docker_set_deploy_args set_container_name
service="${container_name}_${service#${container_name}_}"
fi
if [[ "$service" == *.* ]]; then
slot="${service##*.}"
service="${service%.*}"
else
slot=
fi
psargs=(
--filter desired-state=running
--format "taskID={{.ID}};node={{.Node}};__ss_process_data"
)
found=
eval "$("$DOCKER" service ps "$service" "${psargs[@]}" 2>/dev/null)"
if [ -n "$found" ]; then
SELECT_CONTAINER="$serviceName.$taskSlot.$taskID"
if [ -n "$SELECT_MACHINE" ]; then
DM_SET_MACHINE="$node"
else
enote "Sélection du container $SELECT_CONTAINER"
fi
else
die "$service${slot:+.$slot}: service introuvable"
fi
fi
if [ -n "$SELECT_MACHINE" ]; then
enote "Sélection de la machine $DM_SET_MACHINE"
[ -n "$SELECT_CONTAINER" ] && enote "Sélection du container $SELECT_CONTAINER"
[ -n "$DM_AVAILABLE" ] || die "docker-machine n'est pas disponible"
setx dm_env=docker-machine env "$DM_SET_MACHINE" || die
eval "$dm_env"
fi
if [ -n "$DM_AVAILABLE" ]; then
setx DEFAULT_PROFILE=resolve_dm_profile "$DOCKER_MACHINE_NAME" && found=1 || found=
if [ -n "$DM_SET_MACHINE" -a -z "$PROFILE" -a -z "$found" ]; then
ewarn "\
Aucun profil n'a été défini pour $DM_SET_MACHINE dans ~/etc/default/dk
@ -2077,6 +2288,14 @@ while [ $# -gt 0 ]; do
enote "Profil $PROFILE"
auto_systemd_unit "${args[@]}" || die
;;
cp|copy)
args=()
while [ $# -gt 0 -a "$1" != -- ]; do
args+=("$1"); shift
done
enote "Profil $PROFILE"
auto_copy "${args[@]}" || die
;;
ps)
pscmd=(
"$DOCKER" container ps -a

10
foreach
View File

@ -81,6 +81,9 @@ OPTIONS
la commande. Par défaut, l'affichage est effectué.
Avec --parent-title, pour chaque correspondance afficher plutôt le
répertoire parent (valide uniquement avec l'option -p)
-S, --git-status
Equivalent à spécifier la commande 'git status --p'
Utiliser avec -G ou -C
-G, --git-projects
Equivalent à '--ptitle -p */.git --' e.g '$scriptname -G git pull' pour
mettre à jour les dépôts situés dans un répertoire
@ -96,6 +99,7 @@ changedir=
parentdir=
expand=1
title=auto
command=
shortcut=
args=(+
--help '$exit_with display_help'
@ -111,12 +115,18 @@ args=(+
--title title=1
--pt,--parent-title title=p
--nt,--no-title title=
-S,--git-status command=git-status-p
-G,--git-projects shortcut=git
-C,--composer-projects shortcut=composer
--cc,--composer-cmd shortcut=composer-cmd
)
parse_args "$@"; set -- "${args[@]}"
case "$command" in
git-status-p)
set -- git status --p "$@"
;;
esac
case "$shortcut" in
git)
set -- */.git -- "$@"

View File

@ -1,11 +1,47 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
if [ -n "$UTOOLS_DOCKER_ALIASES" ]; then
if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then
alias dm=__docker_machine_wrapper
else
alias dm=docker-machine
fi
#if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then
# alias dm=__docker_machine_wrapper
#else
# alias dm=docker-machine
#fi
function dm() {
if [ "$1" == use -a -n "$2" -a -f ~/etc/default/dk ]; then
# chercher les aliases éventuels
local machine="$2"; shift; shift
machine="$(
CLUSTERDIRS=()
DM_ALIASES=()
source ~/etc/default/dk
for alias_machine in "${DM_ALIASES[@]}"; do
if [ "${alias_machine%%:*}" == "$machine" ]; then
echo "${alias_machine#*:}"
exit
fi
done
for clusterdir in "${CLUSTERDIRS[@]}"; do
if [ -f "$clusterdir/0config/configure.conf" ]; then
DM_ALIASES=()
source "$clusterdir/0config/configure.conf"
for alias_machine in "${DM_ALIASES[@]}"; do
if [ "${alias_machine%%:*}" == "$machine" ]; then
echo "${alias_machine#*:}"
exit
fi
done
fi
done
echo "$machine"
)"
set -- use "$machine" "$@"
fi
if [ "$DOCKER_MACHINE_WRAPPED" == true ]; then
__docker_machine_wrapper "$@"
else
docker-machine "$@"
fi
}
if [ -n "$UTOOLS_BASH_COMPLETION" ]; then
complete -F _docker_machine dm

View File

@ -3,8 +3,16 @@
# Profil par défaut
#PROFILE=prod
# Aliases pour docker-machine
#DM_ALIASES=(alias:name)
# Profiles pour docker-machine
#DM_PROFILES=(name:profile...)
# Répertoires de gestion de cluster. Dans chacun de ces répertoires, le fichier
# 0config/configure.conf est sourcé à la recherche de définitions de profils et
# d'aliases
#CLUSTERDIRS=(~/wop/containers/*.univ.run)
# Image à utiliser pour lancer composer
#COMPOSER_IMAGE=docker.univ-reunion.fr/image/apache-php-myiccas-utils:d10

View File

@ -16,8 +16,9 @@ rm -rf lib/pyulib/{build,devel,migrate,test}
# compiler les modules python de support
estep "Compilation des modules python"
python -m compileall lib/ulib/support/python
python -m compileall lib/nulib/python
progexists python2 && PYTHON=python2 || PYTHON=python
"$PYTHON" -m compileall lib/ulib/support/python
"$PYTHON" -m compileall lib/nulib/python
# liens pour les scripts python
for i in plver plbck uencdetect urandomize umail uxpath wofixsql; do

View File

@ -934,8 +934,11 @@ function progexists() {
test -n "$1" -a -x "$(which "$1" 2>/dev/null)"
}
function has_python() {
# tester la présence de python
progexists python
# tester la présence de python2
# tester d'abord python2 pour compatibilité avec les systèmes modernes
progexists python2 && return 0
progexists python && return 0
return 1
}
function has_gawk() {
# tester la présence de gnuawk

View File

@ -508,7 +508,7 @@ Essayez avec 'uinst -C'"
has_gawk || need_gawk=1
if check_sysinfos -s linux; then
if [ -n "$need_python" -o -n "$need_gawk" ]; then
eimportant "Il FAUT installer Python et $(get_color y)*GNU*$(get_color z)awk pour que nutools fonctionne correctement."
eimportant "Il FAUT installer Python 2 et $(get_color y)*GNU*$(get_color z)awk pour que nutools fonctionne correctement."
if check_sysinfos -d debian; then
if ask_yesno "Voulez-vous que ce script essaye d'installer automatiquement ces dépendances (requière les droits root)?" O; then
urequire debian
@ -523,7 +523,7 @@ Essayez avec 'uinst -C'"
fi
fi
if [ -n "$need_python" ]; then
eerror "Python est requis. Veuillez faire l'installation avant de relancer ce script."
eerror "Python 2 est requis. Veuillez faire l'installation avant de relancer ce script."
return 1
fi
if [ -n "$need_gawk" ]; then
@ -1616,5 +1616,6 @@ function __uinst2s_root_scripts() {
function __uinst2s_python_setup() {
# Installer le package python
cd "$srcdir" && python setup.py install
local PYTHON; progexists python2 && PYTHON=python2 || PYTHON=python
cd "$srcdir" && "$PYTHON" setup.py install
}

78
repoctl
View File

@ -10,10 +10,17 @@ USAGE
$scriptname ACTION URL [options]
ACTIONS
create URL [description]
Créer un nouveau dépôt avec la description spécifiée
u|update-origin URL
Mettre à jour origin dans le dépôt courant avec l'url spécifié
list URL [VARs...]
c|create URL [description]
Créer un nouveau dépôt avec la description spécifiée
OPTIONS
-u, --update-origin
mettre à jour origin dans le dépôt courant avec l'url du dépôt
nouvellement créé, comme avec l'action update-origin
l|list URL [VARs...]
Lister les dépôts dans l'organisation spécifiée. Si aucune organisation
n'est spécifiée dans l'url, lister les dépôts *accessibles* par
l'utilisateur (cela inclut les dépôts des organisations auxquelles
@ -21,11 +28,11 @@ ACTIONS
VARs est une liste de variables à afficher pour chaque dépôt, séparés
par le caractère tabulation. La valeur par défaut est full_name
get URL [VARs...]
g|get URL [VARs...]
Afficher les propriétés du dépôt spécifié. VARs est une liste de
variables à afficher pour le dépôt, séparés par le caractère tabulation.
edit URL var=value...
e|edit URL var=value...
Modifier les propriétés du dépôt. Consulter l'API pour la liste exacte
des propriétés pouvant être modifiées. Avec gitea 1.9.3, il y a au moins
celles-là:
@ -35,7 +42,7 @@ ACTIONS
private
default_branch
delete URL
d|delete URL
Supprimer le dépôt spécifié"
}
@ -123,6 +130,50 @@ function gogs_setvars() {
################################################################################
function _update_origin() {
estep "Mise à jour de l'origine"
git remote set-url origin "$repourl"
}
function _update_origin_push() {
if ask_yesno "Faut-il faire git push?" O; then
git push --all && git push --tags
else
enote "Ne pas oublier de faire 'git push --all && git push --tags'"
fi
}
function _update_origin_pull() {
if ask_yesno "Faut-il faire git pull?" O; then
git pull
else
enote "Ne pas oublier de faire 'git pull'"
fi
}
function update_origin_action() {
case "$rtype" in
#gitolite) ;;
gogs|gitea)
gogs_setvars
gogs_update_origin_action "$@"
;;
*) die "$rtype: type de dépôt non supporté";;
esac
}
function gogs_update_origin_action() {
local repourl
if [ -n "$user" -a "$user" != "$gogs_user" ]; then
# dépôt d'une organisation
repourl="$gogs_url/$user/$path"
else
# dépôt d'un utilisateur
repourl="$gogs_url/$gogs_user/$path"
fi
_update_origin
_update_origin_pull
}
################################################################################
function create_action() {
case "$rtype" in
#gitolite) ;;
@ -134,6 +185,8 @@ function create_action() {
esac
}
function gogs_create_action() {
local update_origin="$1"; shift
local url repourl desc payload result
local -a vars
if [ -n "$user" -a "$user" != "$gogs_user" ]; then
@ -159,6 +212,11 @@ payload: $payload
result: $result"
isatty && estep "Création du dépôt $repourl"
echo "$result" | json_get "${vars[@]}"
if [ -n "$update_origin" ]; then
_update_origin
_update_origin_push
fi
}
################################################################################
@ -295,9 +353,11 @@ result: $result"
################################################################################
action=
update_origin=
args=(
--help '$exit_with display_help'
-c,--create action=create
-u,--update,--update-origin update_origin=1
-l,--list action=list
-g,--get action=get
-e,--edit action=edit
@ -305,6 +365,9 @@ args=(
)
parse_args "$@"; set -- "${args[@]}"
if [ -z "$action" -a -n "$update_origin" ]; then
action=update-origin
fi
if [ -z "$action" ]; then
action="$1"; shift
fi
@ -314,7 +377,8 @@ repoctl_init "$1"; shift
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt"
case "$action" in
c|create) create_action "$@";;
u|update|update-origin) update_origin_action "$@";;
c|create) create_action "$update_origin" "$@";;
l|list) list_action "$@";;
g|get|s|show) get_action "$@";;
e|edit) edit_action "$@";;