implémentation initiale de runsmod

This commit is contained in:
Jephté Clain 2016-04-24 18:50:20 +04:00
parent 42b959010c
commit f04e862bc0
4 changed files with 713 additions and 0 deletions

63
lib/default/runsmod Normal file
View File

@ -0,0 +1,63 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# Type d'url à préférer pour le clonage des dépôts récupérés automatiquement.
# Cette valeur détermine le mode de fonctionnement: mode production ou mode
# développement.
# En mode production, les dépôts doivent être accessibles sans authentification
# et sont en lecture seule. En mode développement, les dépôts sont typiquement
# accédés par ssh et sont à priori modifiables.
#RUNSMOD_MODE=prod
# Mode opératoire pour la récupération des dépôts. Avec la valeur 'offline', ni
# clone ni pull ne sont autorisés: le module doit avoir déjà été cloné si on
# veut l'utiliser. Avec la valeur 'clone' seul le clonage est autorisé, e.g. le
# dépôt est cloné si ce n'est pas déjà le cas. Avec la valeur 'pull', cloner le
# dépôt si ce n'est pas déjà le cas, ou le mettre à jour le dépôt avant de
# l'utiliser s'il avait déjà été cloné. Avec la valeur 'auto', utiliser 'pull'
# en mode production et 'clone' en mode développement.
#RUNSMOD_UPDATE=auto
# Fichier d'identité par défaut pour la connexion par ssh en mode développement
#RUNSMOD_IDENTITY="$HOME/.ssh/id_rsa"
# URL de base par défaut pour les définitions de dépôts. Toutes les définitions
# de dépôt sont relatives à cet url de base i.e. si RUNSMOD_BASEURL="git@host"
# alors la définition de dépôt "runs" est résolue en "git@host:runs"
#RUNSMOD_BASEURL=
# Définitions par défaut des dépôts pour les scripts génériques. Ces URLs sont
# relatifs à RUNSMOD_BASEURL et peuvent contenir %h pour l'hôte, et %m pour le
# nom du module. Si aucune de ces variables n'apparait, on considère que c'est
# un dépôt unique.
#RUNSMOD_SCRIPTS_URLS=(hosts/%h/runs runs-scripts)
# Définitions par défaut des dépôts pour les modules. Ces URLs sont relatifs à
# RUNSMOD_BASEURL et peuvent contenir %h pour l'hôte, et %m pour le nom du
# module. Si aucune de ces variables n'apparait, on considère que c'est un
# dépôt unique.
#RUNSMOD_MODULES_URLS=(hosts/%h/modules/%m modules/%m)
# Définitions par défaut des dépôts dans lesquels rechercher des répertoires
# d'hôtes qui contiennent scripts et modules spécifiques aux hôtes. Ces URLs
# sont relatifs à RUNSMOD_BASEURL et ne *doivent pas* contenir de variable comme
# %h ou %m.
#RUNSMOD_HOSTS_URLS=(runs-hosts)
# Répertoire de base dans lequel sont clonés les dépôts.
#RUNSMOD_BASEDIR="$HOME/runs"
# Liste de profils à utiliser pour la récupération automatique. Lors de la
# recherche d'un module, ces serveurs sont testés dans l'ordre mentionné
# ici. Pour chacun de ces serveurs, il est possible de définir des variables qui
# remplacent les valeurs par défaut définies ci-dessus.
#RUNSMOD_PROFILES=(vcs)
### Exemples de définitions pour le profil vcs
#RUNSMOD_vcs_IDENTITY=...
#RUNSMOD_vcs_BASEURL=http://vcs.tld/anongit/
#RUNSMOD_vcs_prod_BASEURL=http://vcs.tld/anongit/
#RUNSMOD_vcs_devel_BASEURL=git@vcs.tld:
#RUNSMOD_vcs_SCRIPTS_URLS=(...)
#RUNSMOD_vcs_MODULES_URLS=(...)
#RUNSMOD_vcs_HOSTS_URLS=(...)
#RUNSMOD_vcs_BASEDIR=...

472
lib/ulib/runsmod Normal file
View File

@ -0,0 +1,472 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Gestion des modules pour runs
##@cooked nocomments
##@require base
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"
urequire runs.defaults
set_defaults runs
if [ -n "$config" ]; then
[ -f "$config" ] || {
eerror "$config: fichier introuvable"
return 1
}
source "$config" || {
eerror "Erreur de configuration"
return 1
}
fi
[ -n "$mode" ] || mode="$RUNSMOD_MODE"
case "$mode" in
production|prod|p) mode=prod;;
development|devel|dev|d) mode=devel;;
*) die "$mode: mode invalide. Ce doit être prod ou devel";;
esac
RUNSMOD_MODE="$mode"
[ -n "$update" ] || update="$RUNSMOD_UPDATE"
if [ "$update" == auto ]; then
case "$RUNSMOD_MODE" in
prod) update=pull;;
devel) update=clone;;
esac
fi
RUNSMOD_UPDATE="$update"
case "$RUNSMOD_UPDATE" in
offline) RUNSMOD_CLONE=; RUNSMOD_PULL=;;
clone) RUNSMOD_CLONE=1; RUNSMOD_PULL=;;
pull) RUNSMOD_CLONE=1; RUNSMOD_PULL=1;;
esac
return 0
}
function __runsmod_get() {
# obtenir la valeur de la première variable définie dans une liste
# construite à partir des arguments de cette fonction.
# $1 étant le suffixe, pour chacun des préfixes $2..@, tester l'existence de
# la variable "RUNSMOD_${prefix}_${suffix}". Le cas particulier prefix==""
# teste l'existence de la variable RUNSMOD_${suffix}
# Si la liste des préfixes n'est pas spécifiée, prendre par défaut la liste
# suivante: ("${RUNSMOD_PROFILE}_${RUNSMOD_MODE}" "$RUNSMOD_PROFILE" "")
# Si $1=-a, alors copier un tableau plutôt qu'afficher une valeur
# scalaire. dans ce cas, $2 est le nom du tableau destination, et toutes les
# autres valeurs indiquées ci-dessus sont décalées de 2 vers la droite
local _array
if [ "$1" == -a ]; then
_array="$2"
shift; shift
fi
local _suffix="$1"; shift
[ -n "$_suffix" ] || return 1
if [ $# -eq 0 ]; then
# préfixes par défaut
local -a _args
if [ -n "$RUNSMOD_PROFILE" ]; then
if [ -n "$RUNSMOD_MODE" ]; then
_args=("${_args[@]}" "${RUNSMOD_PROFILE}_${RUNSMOD_MODE}")
fi
_args=("${_args[@]}" "$RUNSMOD_PROFILE")
fi
_args=("${_args[@]}" "")
set -- "${_args[@]}"
fi
local _prefix _var
local -a _values
for _prefix in "$@"; do
if [ -n "$_prefix" ]; then
_var="RUNSMOD_${_prefix}_${_suffix}"
else
_var="RUNSMOD_${_suffix}"
fi
if [ -n "$_array" ]; then
array_copy _values "$_var"
if [ ${#_values[*]} -gt 0 -a -n "${_values[0]}" ]; then
array_copy "$_array" "$_var"
return 0
fi
else
_var="${!_var}"
if [ -n "$_var" ]; then
echo "$_var"
return 0
fi
fi
done
return 1
}
function __runsmod_fixurl() {
# Ajouter la définition de dépôt $1 à l'url de base $2 pour en faire un url
# de dépot.
local url="$2"
case "$url" in
http:*|https:*)
[ "${url%/}" != "$url" ] || url="$url/"
;;
*)
if [[ "$url" == *: ]]; then
:
elif [[ "$url" == *:* ]]; then
[ "${url%/}" != "$url" ] || url="$url/"
else
url="$url:"
fi
;;
esac
echo "$url$1"
}
function __runsmod_getpath_from_baseurl() {
# obtenir le nom correspond à un url de base, utilisable dans un chemin
local url="$1" path userhost user host dummy
case "$url" in
http:*|https:*)
path="${url%/}"
path="${path/:\/\//_}"
path="${path//\//_}"
echo "$path"
return
;;
*)
splitpair "$url" userhost dummy
splituserhost "$userhost" user host
echo "ssh_${user}_${host}"
;;
esac
}
__RUNSMOD_CONNECT_TIMEOUT=3
function __runsmod_dumpurl() {
if progexists curl; then
curl -fs --connect-timeout "$__RUNSMOD_CONNECT_TIMEOUT" "$@"
elif progexists wget; then
wget -q --connect-timeout "$__RUNSMOD_CONNECT_TIMEOUT" -O - "$@"
else
eerror "Nécessite curl ou wget"
return 1
fi
}
function __runsmod_getinfo() {
# interroger le serveur gitolite à l'url de base $1 avec la commande info
local url="$1"
case "$url" in
http:*|https:*)
__runsmod_dumpurl "${url%/}/info"
;;
*)
local userhost dummy
splitpair "$url" userhost dummy
local -a options
options=(
-o StrictHostKeyChecking=no
-o BatchMode=yes
-o ConnectTimeout="$__RUNSMOD_CONNECT_TIMEOUT"
)
"${GIT_SSH:-ssh}" -q "${options[@]}" "$userhost" info
;;
esac
}
function __runsmod_fixinfo() {
# traiter le résultat de __runsmod_getinfo() pour avoir la liste des dépôts
sed -n '3,$p' | sed 's/^.*\t//g'
}
function runsmod_checkenv() {
# vérifier l'environement. créer les répertoires nécessaires.
if [ -z "$RUNSMOD_BASEDIR" ]; then
eerror "Vous devez définir RUNSMOD_BASEDIR"
return 1
fi
if [ ! -d "$RUNSMOD_BASEDIR" ]; then
estep "Création de $(ppath "$RUNSMOD_BASEDIR")"
mkdir -p "$RUNSMOD_BASEDIR" || return 1
fi
}
function __runsmod_get_repolistfile() {
# obtenir le chemin absolu vers le fichier contenant la liste des dépôts
# correspondant à l'url de base $1
local repopath
setx repopath=__runsmod_getpath_from_baseurl "$1"
echo "$RUNSMOD_BASEDIR/$repopath.lst"
}
function runsmod_should_update_repolists() {
# tester s'il faut mettre à jour au moins un des fichiers contenant les
# listes des dépôts
local RUNSMOD_PROFILE
local now baseurl repobase repopath repolistfile mtime
local -a urls
setx now=date +%s
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
setx baseurl=__runsmod_get BASEURL || continue
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
# si le fichier n'existe pas, il faut mettre à jour
[ -f "$repolistfile" ] || return 0
# si le fichier a été modifié depuis plus de 24 heures, mettre à jour
setx mtime=stat -c %Y "$repolistfile"
[ $(($now - $mtime)) -lt 86400 ] || return 0
done
return 1
}
function runsmod_update_repolists() {
# mettre à jour si nécessaire les fichiers contenant les listes des dépôts.
# Si $1 n'est pas vide, forcer la mise à jour de tous les fichiers
local force="$1"; shift
local RUNSMOD_PROFILE
local now baseurl repobase repopath repo mtime update
local -a urls
setx now=date +%s
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
setx baseurl=__runsmod_get BASEURL || continue
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
update="$force"
if [ -z "$update" ]; then
# si le fichier n'existe pas, il faut mettre à jour
[ -f "$repolistfile" ] || update=1
fi
if [ -z "$update" ]; then
# si le fichier a été modifié depuis plus de 24 heures, mettre à jour
setx mtime=stat -c %Y "$repolistfile"
[ $(($now - $mtime)) -lt 86400 ] || update=1
fi
if [ -n "$update" ]; then
local list
ebegin "$baseurl"
if setx list=__runsmod_getinfo "$baseurl"; then
echo "$list" | __runsmod_fixinfo >"$repolistfile"
edot 0
else
edot 1
fi
eend
fi
done
}
function runsmod_setup_vars() {
# récupérer configuration statique pour la mettre à jour
array_new REPODIRS
array_split SCRIPTSDIRS "$RUNSSCRIPTSPATH" :
array_split MODULESDIRS "$RUNSMODULESPATH" :
array_split HOSTSDIRS "$RUNSHOSTSPATH" :
}
function __runsmod_has_vmodule() {
# tester si l'url $1 contient une variable de module %m
[ "${1//%m/}" != "$1" ]
}
function __runsmod_has_vhost() {
# tester si l'url $1 contient une variable d'hôte %h
[ "${1//%h/}" != "$1" ]
}
function __runsmod_replace1() {
# remplacer dans l'url $1 la variable %h par l'hôte complet $2 et
# éventuellement la variable %m par le module $3
local url="$1"
[ -n "$2" ] && url="${url//%h/$2}"
[ -n "$3" ] && url="${url//%m/$3}"
echo "$url"
}
function __runsmod_replace2() {
# remplacer dans l'url $1 la variable %h par le nom d'hôte correspondant à
# au nom d'hôte complet $2 et éventuellement la variable %m par le module $3
local url="$1"
local host="${2%%.*}"
[ -n "$host" ] && url="${url//%h/$host}"
[ -n "$3" ] && url="${url//%m/$3}"
echo "$url"
}
function __runsmod_clone_or_pull() {
local repourl="$1" repodir="$2"
mkdirof "$repodir"
if [ -d "$repodir" ]; then
if [ -n "$RUNSMOD_PULL" ]; then
estepi "pull $(ppath "$repodir") [$repourl]"
(cd "$repodir"; git pull)
return $?
else
estep "nopull $(ppath "$repodir")"
return 0
fi
else
if [ -n "$RUNSMOD_CLONE" ]; then
estepi "clone $(ppath "$repodir") [$repourl]"
git clone "$repourl" "$repodir"
return $?
else
estepe "noclone $(ppath "$repodir")"
return 1
fi
fi
}
function runsmod_clone_or_pull() {
# Chercher les modules $3..@, pour l'hôte $1 qui est le mode d'hôte: none,
# all, self ou one pour un hôte spécifique $2. Ajouter les chemins dans le
# tableau REPO_DIRS. Mettre à jour les tableaux SCRIPTS_DIRS, MODULES_DIRS
# et HOSTS_DIRS
local all_hosts host_mode="$1" host="$2"; shift; shift
case "$host_mode" in
none) host=;;
all) host=; all_hosts=1;;
self) host="${RUNSHOST:-$MYHOST}";;
esac
if [ -n "$host" -a "${host%%.*}" == "$host" -a -n "$RUNSDOMAIN" ]; then
# le nom d'hôte doit être avec un domaine
host="$host.$RUNSDOMAIN"
enote "Autocorrection du nom d'hôte en $host"
fi
#XXX implémenter all_hosts=1
local -a repolist reponames repourls
local RUNSMOD_PROFILE baseurl repopath repolistfile
local vprefix repospec reponame repourl repodir module moduledir
local r=0
# Tout d'abord, traiter les dépôts sans variable %m
edebug "Traitement des dépôts sans vmodule"
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
setx baseurl=__runsmod_get BASEURL || continue
setx repopath=__runsmod_getpath_from_baseurl "$baseurl"
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
[ -f "$repolistfile" ] || continue
array_from_lines repolist "$(<"$repolistfile")"
edebug ".. baseurl=$baseurl, repopath=$repopath"
for vprefix in SCRIPTS MODULES HOSTS; do
__runsmod_get -a repourls "${vprefix}_URLS"
edebug ".... vprefix=$vprefix, repourls=(${repourls[*]})"
for repospec in "${repourls[@]}"; do
edebug "...... repospec=$repospec"
__runsmod_has_vmodule "$repospec" && continue
reponames=()
if __runsmod_has_vhost "$repospec"; then
if [ -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
else
array_contains repolist "$repospec" && array_add reponames "$repospec"
fi
edebug "...... reponames=(${reponames[*]})"
for reponame in "${reponames[@]}"; do
repodir="$RUNSMOD_BASEDIR/$repopath/$reponame"
setx repourl=__runsmod_fixurl "$reponame" "$baseurl"
__runsmod_clone_or_pull "$repourl" "$repodir" || r=1
[ -d "$repodir" ] || continue
array_addu REPODIRS "$repodir"
case "$vprefix" in
SCRIPTS) array_addu SCRIPTSDIRS "$repodir";;
#MODULES) ;;
HOSTS) array_addu HOSTSDIRS "$repodir";;
esac
done
done
done
done
## Ensuite, traiter les dépôts de module
# modules contient la liste des modules qui ont été trouvés, pour ne pas les
# lister en double s'ils existent dans plusieurs sources
edebug "Traitement des dépôts de modules"
local -a modules foundmodules
modules=("$@")
for RUNSMOD_PROFILE in "${RUNSMOD_PROFILES[@]}"; do
setx baseurl=__runsmod_get BASEURL || continue
setx repopath=__runsmod_getpath_from_baseurl "$baseurl"
setx repolistfile=__runsmod_get_repolistfile "$baseurl"
[ -f "$repolistfile" ] || continue
array_from_lines repolist "$(<"$repolistfile")"
edebug ".. baseurl=$baseurl, repopath=$repopath"
for module in "${modules[@]}"; do
array_contains foundmodules "$module" && continue
edebug ".... module=$module"
for vprefix in SCRIPTS MODULES HOSTS; do
__runsmod_get -a repourls "${vprefix}_URLS"
edebug "...... vprefix=$vprefix, repourls=(${repourls[*]})"
for repospec in "${repourls[@]}"; do
edebug "........ repospec=$repospec"
__runsmod_has_vmodule "$repospec" || continue
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"
fi
else
setx reponame=__runsmod_replace1 "$repospec" "" "$module"
array_contains repolist "$reponame" && array_add reponames "$reponame"
fi
edebug "........ reponames=(${reponames[*]})"
for reponame in "${reponames[@]}"; do
repodir="$RUNSMOD_BASEDIR/$repopath/$reponame"
setx repourl=__runsmod_fixurl "$reponame" "$baseurl"
__runsmod_clone_or_pull "$repourl" "$repodir" || r=1
[ -d "$repodir" ] || continue
array_addu foundmodules "$module"
array_addu REPODIRS "$repodir"
case "$vprefix" in
SCRIPTS) array_addu SCRIPTSDIRS "$repodir";;
MODULES)
setx moduledir=dirname -- "$repodir"
array_addu MODULESDIRS "$moduledir"
;;
HOSTS) array_addu HOSTSDIRS "$repodir";;
esac
done
done
done
done
done
for module in "${modules[@]}"; do
array_contains foundmodules "$module" || ewarn "$module: module non trouvé"
done
return $r
}
function runsmod_teardown_vars() {
setx RUNSSCRIPTSPATH=array_join SCRIPTSDIRS :
setx RUNSMODULESPATH=array_join MODULESDIRS :
setx RUNSHOSTSPATH=array_join HOSTSDIRS :
}

37
lib/ulib/runsmod.defaults Normal file
View File

@ -0,0 +1,37 @@
##@cooked comments # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
## Valeurs par défaut pour runs.modules
##@cooked nocomments
##@require base
uprovide runsmod.defaults
# Ne pas supprimer la ligne ci-dessous
##--runsmod.defaults--
RUNSMOD_MODE=prod
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_BASEDIR="$HOME/runs"
RUNSMOD_PROFILES=(vcs pvcs jclain)
# vcs
RUNSMOD_vcs_BASEURL=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[@]}")
# pvcs
RUNSMOD_pvcs_BASEURL=http://pvcs.univ-reunion.fr/anongit
RUNSMOD_pvcs_devel_BASEURL=pgit@vcs.univ.run
RUNSMOD_pvcs_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}" si/base-runs)
RUNSMOD_pvcs_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
RUNSMOD_pvcs_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")
# jclain
RUNSMOD_jclain_BASEURL=git@jclain.fr
RUNSMOD_jclain_SCRIPTS_URLS=("${RUNSMOD_SCRIPTS_URLS[@]}")
RUNSMOD_jclain_MODULES_URLS=("${RUNSMOD_MODULES_URLS[@]}")
RUNSMOD_jclain_HOSTS_URLS=("${RUNSMOD_HOSTS_URLS[@]}")

141
runsmod Normal file
View File

@ -0,0 +1,141 @@
#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
urequire DEFAULTS runsmod
function display_help() {
uecho "$scriptname: récupérer des dépôts git à usage de runs
USAGE
$scriptname [options] [-h host] [modules...]
Tous les dépôts spécifiés dans la configuration sont récupérés. Si des modules
sont spécifiés, les dépôts correspondants sont récupérés aussi. Avec l'option
-h, des dépôts spécifiques à l'hôte peuvent éventuellement être récupérés en
plus.
OPTIONS
-c, --config CONFIG
Spécifier un fichier de configuration à charger au lieu de la valeur par
défaut ~/etc/default/runs
--prod
--devel
Forcer un mode de sélection des urls. En mode production, préférer pour
le clonage les urls de production, qui sont en principe accessibles sans
authentification et en lecture seule. En mode développement, préférer
pour le clonage les urls de développement, qui sont en principe
accessibles par clé ssh et en lecture/écriture
--no-fetch
Ne rien récupérer. Utile avec --update-repolist
-N, --no-host
-A, --all-hosts
-H, -h, --host HOST
-T, --this-host
Options permettant de spécifier l'hôte pour la récupération de dépôts
spécifiques.
--no-host demande explicitement à ce qu'aucun hôte ne soit spécifié
--all-hosts sélectionne tous les dépôts spécifiques
--host récupère uniquement les dépôts pour l'hôte spécifié
--this-host équivaut à --host $MYHOST
L'option par défaut est --this-host en mode production et --all-hosts en
mode développement
--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.
-0, --offline
-n, --no-pull
-u, --pull
Spécifier le mode opératoire pour la récupération des dépôts.
En mode --offline, ni clone ni pull ne sont autorisés. Le module doit
avoir déjà été cloné.
En mode --no-pull, seul le clonage est autorisé, e.g. le dépôt est
cloné si ce n'est pas déjà le cas.
En mode --pull, cloner le dépôt si ce n'est pas déjà le cas, ou le
mettre à jour le dépôt avant de l'utiliser s'il avait déjà été cloné.
Par défaut, utiliser --pull en mode production et --no-pull en mode
développement.
-i, --identity IDENTITY_FILE
Spécifier le fichier depuis lequel lire la clé privée pour les
connexions par ssh.
-o, --output OUTPUT
Spécifier un fichier dans lequel écrire des définitions de variables,
notamment REPODIRS qui reçoit la liste des chemins des dépôts qui ont
été récupérés. De plus, les variables RUNSSCRIPTSPATH, RUNSMODULESPATH
et RUNSHOSTSPATH sont définies.
-a, --append-output
Ajouter au fichier OUTPUT au lieu de l'écraser"
}
config=
mode=
fetch=1
host_mode=auto
host=
update_repolist=auto
update=auto
identity=
output=
append_output=
parse_opts "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
-c:,--config: config= \
--prod mode=prod \
--devel mode=devel \
--no-fetch fetch= \
-N,--no-host host_mode=none \
-A,--all-hosts host_mode=all \
-h:,-H:,--host: '$set@ host; host_mode=one' \
-T,--this-host host_mode=self \
--update-repolist update_repolist=1 \
--no-update-repolist update_repolist= \
-0,--offline update=offline \
-n,--no-pull update=clone \
-u,--pull update=pull \
-i:,--identity: identity= \
-o:,--output: output= \
-a,--append-output append_output=1 \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
__runsmod_loadconf "$config" "$mode" "$update" || die
runsmod_checkenv || die
estepn "Opération dans le mode $RUNSMOD_MODE"
if [ "$host_mode" == auto ]; then
case "$RUNSMOD_MODE" in
prod) host_mode=self;;
devel) host_mode=all;;
*) host_mode=none;;
esac
fi
if [ "$update_repolist" == auto ]; then
if runsmod_should_update_repolists; then
etitle "Vérification de la liste des dépôts"
runsmod_update_repolists
eend
fi
elif [ -n "$update_repolist" ]; then
etitle "Mise à jour de la liste des dépôts"
runsmod_update_repolists 1
eend
fi
r=0
if [ -n "$fetch" ]; then
etitle "Clonage/mise à jour des dépôts"
runsmod_setup_vars
runsmod_clone_or_pull "$host_mode" "$host" "$@" || r=1
runsmod_teardown_vars
eend
fi
if [ -n "$output" ]; then
[ "$output" == "-" ] && output=/dev/stdout
[ -n "$append_output" ] || >"$output"
set_array_cmd REPODIRS >>"$output"
echo_setv RUNSSCRIPTSPATH="$RUNSSCRIPTSPATH" >>"$output"
echo_setv RUNSMODULESPATH="$RUNSMODULESPATH" >>"$output"
echo_setv RUNSHOSTSPATH="$RUNSHOSTSPATH" >>"$output"
fi
exit $r