diff --git a/cx-updatedev b/cx-updatedev index 1b14ba8..ed5b3b1 100755 --- a/cx-updatedev +++ b/cx-updatedev @@ -16,15 +16,22 @@ OPTIONS -n, --fake Afficher simplement ce qui serait fait -q, --quiet - Ne pas lancer rsync en mode verbose" + Ne pas lancer rsync en mode verbose + -l, --link + Transformer les clones de dépôts en liens directs vers les projets + -c, --copy + Transformer les liens directs vers les projets en copies des projets" } fake= verbose=1 +action= args=( --help '$exit_with display_help' -n,--fake fake=1 -q,--quiet verbose= + -l,--link action=link + -c,--copy action=copy ) parse_args "$@"; set -- "${args[@]}" @@ -52,18 +59,11 @@ if [ $# -eq 0 ]; then set -- "${ms[@]}" fi -for m in "$@"; do - m="${m//\//-}" - case "$m" in - ur-*|lib-*) ;; - *) m="ur-$m";; - esac - p="${m//-/\/}" - - [ -L "vendor/$p" ] && continue - - etitle "$m" +function check_module() { [ -d "../$m" ] || die "$m: module introuvable" +} +function update_with_rsync() { + local -a rsync_args rsync_args=( -a ${fake:+-n} ${verbose:+-v} --delete @@ -72,5 +72,56 @@ for m in "$@"; do "../$m/" "vendor/$p" ) rsync "${rsync_args[@]}" - eend +} + +for m in "$@"; do + m="${m#vendor/}" # pour permettre de spécifier le chemin directement + m="${m//\//-}" + case "$m" in + ur-*|lib-*) ;; + *) m="ur-$m";; + esac + p="${m//-/\/}" + + check_module + case "$action" in + link) + # Ignorer les liens et transformer les copies en liens + if [ ! -L "vendor/$p" ]; then + link="$m" + path="/project/vendor/$p" + path="${path%/*}" + while [ -n "$path" ]; do + link="../$link" + path="${path%/*}" + done + + etitle "$m" + estep "suppr. vendor/$p" + rm -rf "vendor/$p" + mkdirof "vendor/$p" + + estep "vendor/$p --> $link" + ln -s "$link" "vendor/$p" + eend + fi + ;; + copy) + # Transformer les liens en copie et les synchroniser + etitle "$m" + if [ -L "vendor/$p" ]; then + rm -f "vendor/$p" + fi + update_with_rsync + eend + ;; + *) + # Action par défaut: ignorer les liens et synchroniser les copies + if [ ! -L "vendor/$p" ]; then + etitle "$m" + update_with_rsync + eend + fi + ;; + esac done