runsmod: Implémenter les fonctionnalités documentées

This commit is contained in:
Jephté Clain 2016-05-24 11:47:59 +04:00
parent 12c521cfb2
commit 50580856f0
3 changed files with 113 additions and 33 deletions

View File

@ -6,10 +6,10 @@ uprovide runsmod
urequire base
function __runsmod_loadconf() {
# Charger le fichier de configuration $1. Les paramètres RUNSMOD_MODE et
# RUNSMOD_UPDATE peuvent être modifiés par rapport à la configuration
# chargée avec les paramètres $2 et $3 respectivement.
local config="$1" mode="$2" update="$3"
# Charger le fichier de configuration $1. Les paramètres RUNSMOD_MODE,
# RUNSMOD_SHALLOW et RUNSMOD_UPDATE peuvent être modifiés par rapport à la
# configuration chargée avec les paramètres $2, $3 et $4 respectivement.
local config="$1" mode="$2" shallow="$3" update="$4"
urequire runsmod.defaults
set_defaults runsmod
@ -32,6 +32,15 @@ function __runsmod_loadconf() {
esac
RUNSMOD_MODE="$mode"
[ -n "$shallow" ] || shallow="$RUNSMOD_SHALLOW"
if [ "$shallow" == auto ]; then
case "$RUNSMOD_MODE" in
prod) shallow=1;;
devel) shallow=;;
esac
fi
RUNSMOD_SHALLOW="$shallow"
[ -n "$update" ] || update="$RUNSMOD_UPDATE"
if [ "$update" == auto ]; then
case "$RUNSMOD_MODE" in
@ -203,7 +212,7 @@ function __runsmod_get_repolistfile() {
# correspondant à l'url de base $1
local repopath
setx repopath=__runsmod_getpath_from_baseurl "$1"
echo "$RUNSMOD_BASEDIR/$repopath.lst"
echo "$RUNSMOD_BASEDIR/info-$repopath.lst"
}
function runsmod_should_update_repolists() {
@ -295,6 +304,24 @@ function __runsmod_replace2() {
[ -n "$3" ] && url="${url//%m/$3}"
echo "$url"
}
function __runsmod_match() {
# vérifier que $2 correspond au pattern $1
eval "[[ $(qval "$2") == $(qwc "$1") ]]"
}
function __runsmod_match_repo_add() {
# vérifier qu'un dépôt de pattern $2 se trouve dans la liste de dépôt $1
# si c'est le cas, rajouter le dépôt dans le tableau $3 le cas échéant
local __rs="$1[@]" __r __found
for __r in "${!__rs}"; do
if [[ "$__r" == *\** ]]; then
: # ignore les dépôts wildcard
elif __runsmod_match "$2" "$__r"; then
[ -n "$3" ] && array_add "$3" "$__r"
__found=1
fi
done
[ -n "$__found" ]
}
function __runsmod_clone_or_pull() {
local repourl="$1" repodir="$2"
@ -311,7 +338,7 @@ function __runsmod_clone_or_pull() {
else
if [ -n "$RUNSMOD_CLONE" ]; then
estepi "clone $(ppath "$repodir") [$repourl]"
git clone "$repourl" "$repodir"
git clone ${RUNSMOD_SHALLOW:+--depth 1} "$repourl" "$repodir"
return $?
else
estepe "noclone $(ppath "$repodir")"
@ -340,7 +367,7 @@ function runsmod_clone_or_pull() {
local -a repolist reponames repourls
local RUNSMOD_PROFILE baseurl repopath repolistfile
local vprefix repospec reponame repourl repodir module moduledir
local vprefix repospec reposuffix reponame repourl repodir module moduledir
local r=0
# Tout d'abord, traiter les dépôts sans variable %m
@ -360,13 +387,22 @@ function runsmod_clone_or_pull() {
for repospec in "${repourls[@]}"; do
edebug "...... repospec=$repospec"
__runsmod_has_vmodule "$repospec" && continue
if [[ "$repospec" == *//* ]]; then
reposuffix="${repospec#*//}"
[ -n "$reposuffix" ] && reposuffix="/$reposuffix"
repospec="${repospec%%//*}"
else
reposuffix=
fi
reponames=()
if __runsmod_has_vhost "$repospec"; then
if [ -n "$host" ]; then
if [ -n "$all_hosts" ]; then
setx repospec=__runsmod_replace1 "$repospec" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
elif [ -n "$host" ]; then
setx reponame=__runsmod_replace1 "$repospec" "$host"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx reponame=__runsmod_replace2 "$repospec" "$host"
array_contains repolist "$reponame" && array_add reponames "$reponame"
fi
@ -382,10 +418,11 @@ function runsmod_clone_or_pull() {
__runsmod_clone_or_pull "$repourl" "$repodir" || r=1
[ -d "$repodir" ] || continue
repodir="$repodir$reposuffix"
array_addu REPODIRS "$repodir"
case "$vprefix" in
SCRIPTS) array_addu SCRIPTSDIRS "$repodir";;
#MODULES) ;;
MODULES) array_addu MODULESDIRS "$repodir";;
HOSTS) array_addu HOSTSDIRS "$repodir";;
esac
done
@ -399,6 +436,7 @@ function runsmod_clone_or_pull() {
# lister en double s'ils existent dans plusieurs sources
edebug "Traitement des dépôts de modules"
local -a modules foundmodules
local all_modules
modules=("$@")
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
@ -410,7 +448,13 @@ function runsmod_clone_or_pull() {
edebug ".. baseurl=$baseurl, repopath=$repopath"
for module in "${modules[@]}"; do
array_contains foundmodules "$module" && continue
if [ "$module" == "*" ]; then
module=
all_modules=1
else
array_contains foundmodules "$module" && continue
all_modules=
fi
edebug ".... module=$module"
for vprefix in SCRIPTS MODULES HOSTS; do
@ -420,19 +464,42 @@ function runsmod_clone_or_pull() {
for repospec in "${repourls[@]}"; do
edebug "........ repospec=$repospec"
__runsmod_has_vmodule "$repospec" || continue
if [[ "$repospec" == *//* ]]; then
reposuffix="${repospec#*//}"
[ -n "$reposuffix" ] && reposuffix="/$reposuffix"
repospec="${repospec%%//*}"
else
reposuffix=
fi
reponames=()
if __runsmod_has_vhost "$repospec"; then
if [ -n "$host" ]; then
setx reponame=__runsmod_replace1 "$repospec" "$host" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx reponame=__runsmod_replace2 "$repospec" "$host" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
if [ -n "$all_modules" ]; then
if __runsmod_has_vhost "$repospec"; then
if [ -n "$all_hosts" ]; then
setx repospec=__runsmod_replace1 "$repospec" "*" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
elif [ -n "$host" ]; then
setx repospec=__runsmod_replace1 "$repospec" "$host" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
setx repospec=__runsmod_replace2 "$repospec" "$host" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
fi
else
setx repospec=__runsmod_replace1 "$repospec" "" "*"
__runsmod_match_repo_add repolist "$repospec" reponames
fi
else
setx reponame=__runsmod_replace1 "$repospec" "" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
if __runsmod_has_vhost "$repospec"; then
if [ -n "$host" ]; then
setx reponame=__runsmod_replace1 "$repospec" "$host" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
setx reponame=__runsmod_replace2 "$repospec" "$host" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
fi
else
setx reponame=__runsmod_replace1 "$repospec" "" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
fi
fi
edebug "........ reponames=(${reponames[*]})"
@ -443,9 +510,10 @@ function runsmod_clone_or_pull() {
__runsmod_clone_or_pull "$repourl" "$repodir" || r=1
[ -d "$repodir" ] || continue
array_addu foundmodules "$module"
[ -z "$all_modules" ] && array_addu foundmodules "$module"
array_addu REPODIRS "$repodir"
repodir="$repodir$reposuffix"
case "$vprefix" in
SCRIPTS) array_addu SCRIPTSDIRS "$repodir";;
MODULES)
@ -461,6 +529,7 @@ function runsmod_clone_or_pull() {
done
for module in "${modules[@]}"; do
[ "$module" == "*" ] && continue
array_contains foundmodules "$module" || ewarn "$module: module non trouvé"
done

View File

@ -7,21 +7,15 @@ uprovide runsmod.defaults
# Ne pas supprimer la ligne ci-dessous
##--runsmod.defaults--
RUNSMOD_MODE=prod
RUNSMOD_SHALLOW=auto
RUNSMOD_UPDATE=auto
RUNSMOD_IDENTITY=
RUNSMOD_BASEURL=
RUNSMOD_SCRIPTS_URLS=(hosts/%h/runs runss runs-scripts)
RUNSMOD_MODULES_URLS=(hosts/%h/modules/%m modules/%m)
RUNSMOD_HOSTS_URLS=(runsh runs-hosts)
RUNSMOD_SCRIPTS_URLS=(hosts/%h/runs hosts/%h/all//runs runss)
RUNSMOD_MODULES_URLS=(hosts/%h/modules/%m hosts/%h/all modules/%m)
RUNSMOD_HOSTS_URLS=(runsh)
RUNSMOD_BASEDIR="$HOME/runs"
RUNSMOD_PROFILES=(vcs pvcs jclain)
# vcs
RUNSMOD_vcs_BASEURL=(http://vcs.univ.run/anongit http://vcs.univ-reunion.fr/anongit)
RUNSMOD_vcs_devel_BASEURL=git@vcs.univ.run
RUNSMOD_vcs_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}")
RUNSMOD_vcs_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
RUNSMOD_vcs_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
RUNSMOD_PROFILES=(pvcs vcs jclain)
# pvcs
RUNSMOD_pvcs_BASEURL=(http://pvcs.univ.run/anongit http://pvcs.univ-reunion.fr/anongit)
@ -30,6 +24,13 @@ RUNSMOD_pvcs_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}" si/base-runs)
RUNSMOD_pvcs_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
RUNSMOD_pvcs_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
# vcs
RUNSMOD_vcs_BASEURL=(http://vcs.univ.run/anongit http://vcs.univ-reunion.fr/anongit)
RUNSMOD_vcs_devel_BASEURL=git@vcs.univ.run
RUNSMOD_vcs_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}")
RUNSMOD_vcs_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
RUNSMOD_vcs_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
# jclain
RUNSMOD_jclain_BASEURL=git@jclain.fr
RUNSMOD_jclain_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}")

12
runsmod
View File

@ -14,6 +14,9 @@ sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'op
-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en
plus.
Il est possible de spécifier le module '*' pour récupérer tous les modules
disponibles. C'est utile sur un poste de développement.
OPTIONS
-c, --config CONFIG
Spécifier un fichier de configuration à charger au lieu de la valeur par
@ -42,6 +45,9 @@ OPTIONS
--update-repolist
Forcer la mise à jour de la liste des dépôts. En principe, cette mise à
jour n'est pas faite plus d'une fois par période de 24 heures.
--shallow-clone
Faire un clone avec une profondeur de 1. C'est la valeur par défaut pour
le mode production.
-0, --offline
-n, --no-pull
-u, --pull
@ -72,6 +78,7 @@ fetch=1
host_mode=auto
host=
update_repolist=auto
shallow=auto
update=auto
identity=
output=
@ -88,6 +95,8 @@ parse_opts "${PRETTYOPTS[@]}" \
-T,--this-host host_mode=self \
--update-repolist update_repolist=1 \
--no-update-repolist update_repolist= \
--shallow-clone shallow=1 \
--no-shallow-clone shallow= \
-0,--offline update=offline \
-n,--no-pull update=clone \
-u,--pull update=pull \
@ -113,6 +122,7 @@ if [ -z "$config" ]; then
if [ ! -f "$userconfig" ]; then
ewarn "Les profils par défaut ne sont pas installés. Il est conseillé d'installer nutools puis de faire 'uenv -u' avant de continuer"
ask_yesno "Voulez-vous continuer?" N || die
mkdirof "$userconfig"
touch "$userconfig"
fi
setx lines=wc -l <"$userconfig"
@ -135,7 +145,7 @@ copy { print }
fi
fi
__runsmod_loadconf "$config" "$mode" "$update" || die
__runsmod_loadconf "$config" "$mode" "$shallow" "$update" || die
runsmod_checkenv || die
estepn "Opération dans le mode $RUNSMOD_MODE"