diff --git a/lib/ulib/runsmod b/lib/ulib/runsmod index 961d5a2..57db3c7 100644 --- a/lib/ulib/runsmod +++ b/lib/ulib/runsmod @@ -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 diff --git a/lib/ulib/runsmod.defaults b/lib/ulib/runsmod.defaults index a1adc79..cdf6fb7 100644 --- a/lib/ulib/runsmod.defaults +++ b/lib/ulib/runsmod.defaults @@ -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[@]}") diff --git a/runsmod b/runsmod index d5a3a3f..f15e7bc 100755 --- a/runsmod +++ b/runsmod @@ -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"