pclone: implémenter le clonage récursif avec -r ainsi que les options -n et -u

This commit is contained in:
Jephté Clain 2017-04-27 17:35:34 +04:00
parent 262048fee5
commit a264b3e484
1 changed files with 131 additions and 20 deletions

151
uproject
View File

@ -61,10 +61,24 @@ COMMANDS
Cloner un dépôt distant. Basculer sur la branche develop si elle existe.
Initialiser git annex si le dépôt contient des fichiers annexés.
Récupérer aussi ces fichiers avec 'git annex get'
-n, --no-clone
Ne pas cloner, afficher simplement ce qui serait fait
-u, --update
Si le dépôt a déjà été cloné, le mettre à jour avec git pull
-r, --recursive
Cloner récursivement tous les dépôt à partir du chemin spécifié
depuis un serveur gitolite. La signature est alors sensiblement
différente:
clone -r git@host:basepath [destdir]
clone -r http://host/gituser/basepath [destdir]
L'arborescence en dessous de basepath est recréée à partir de
destdir, e.g le dépôt git@host:basepath/to/repo est cloné dans
destdir/to/repo
crone git@host:path/to/repo [destdir]
crone http://host/gituser/path/to/repo [destdir]
Créer un dépôt distant sur gitolite, puis le cloner
Créer un dépôt sur un serveur gitolite, puis le cloner. La commande
'create' doit avoir été activée sur ce serveur.
develop
release
@ -268,26 +282,123 @@ elif array_contains GITANNEX_CMDS "$CMD"; then
esac
elif [ "$CMD" == clone ]; then
repourl="${1%.git}"
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git"
splitfsep "$repourl" : userhost path
destdir="$2"
if [ -z "$destdir" ]; then
setx destdir=basename -- "$path"
destdir="${destdir%.git}"
fi
[ -d "$destdir" ] && die "$(ppath "$destdir"): répertoire existant"
git_annex_use_ssh_wrapper
git clone "$repourl" "$destdir" || die
(
cd "$destdir"
if git_have_rbranch develop; then
git checkout develop || exit 1
function pclone() {
estep "$1 --> $(ppath "$2")"
mkdirof "$2" || return 1
git clone "$1" "$2" || return 1
(
cd "$2"
if git_have_rbranch develop; then
git checkout develop || exit 1
fi
) || return 1
git_annex_initial "$2" || return 1
}
function gitolite_info() {
local mode="$1" urlbase="$2" pattern="$3"
case "$mode" in
http) curl -fs "$urlbase/info${pattern:+"?$pattern"}";;
ssh) ssh -q "$urlbase" info ${pattern:+"$pattern"} 2>/dev/null;;
esac
}
function filter_repos() {
awkrun prefix="$1" '
NR <= 2 { next }
{
if (substr($0, 5, 2) == " C") next
repo = substr($0, 6)
if (prefix != "" && substr(repo, 1, length(prefix)) != prefix) next
print repo
}
'
}
no_clone=
update=
recursive=
parse_opts "${PRETTYOPTS[@]}" \
-n,--no-clone no_clone=1 \
-u,--update update=1 \
-r,--recursive recursive=1 \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
if [ -n "$recursive" ]; then
repobase="$1"
[ -n "$repobase" ] || die "Vous devez spécifier l'url de base des dépôts à cloner"
if [ "${repobase#http://}" != "$repobase" -o "${repobase#https://}" != "$repobase" ]; then
# accès par http
mode=http
splitfsep "$repobase" :// scheme hostuserpath
splitfsep "$hostuserpath" / host userpath
splitfsep "$userpath" / user basepath
[ -n "$host" -a -n "$user" ] || die "Vous devez spécifier l'hôte e.g http://host/git/basepath"
urlbase="$scheme://$host/$user"
else
# accès par ssh
mode=ssh
splitfsep "$repobase" : userhost basepath
splituserhost "$userhost" user host
[ -n "$user" ] || user=git
[ -n "$host" ] || die "Vous devez spécifier l'hôte"
urlbase="$user@$host"
fi
) || die
git_annex_initial "$destdir" || die
basepath="${basepath%/}"
destbase="${2:-.}"
git_annex_use_ssh_wrapper
prefix="${basepath:+$basepath/}"
array_from_lines repos "$(set -o pipefail; gitolite_info "$mode" "$urlbase" "$prefix" | filter_repos "$prefix")" || die
for repo in "${repos[@]}"; do
case "$mode" in
http) repourl="$urlbase/$repo";;
ssh) repourl="$urlbase:$repo";;
esac
setx destdir=abspath "$destbase/${repo#$prefix}"
if [ -d "$destdir" ]; then
if [ -n "$update" ]; then
(
${no_clone:+qvals} cd "$destdir"
${no_clone:+qvals} git pull
) || die
else
estepe "$(ppath2 "$destdir"): répertoire existant"
fi
elif [ -n "$no_clone" ]; then
qvals git clone "$repourl" "$destdir"
else
pclone "$repourl" "$destdir"
fi
done
else
repourl="${1%.git}"
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git"
destdir="$2"
if [ -z "$destdir" ]; then
splitfsep "$repourl" : userhost path
setx destdir=basename -- "$path"
destdir="${destdir%.git}"
fi
setx destdir=abspath "$destdir"
git_annex_use_ssh_wrapper
if [ -d "$destdir" ]; then
if [ -n "$update" ]; then
(
${no_clone:+qvals} cd "$destdir"
${no_clone:+qvals} git pull
) || die
else
estepe "$(ppath2 "$destdir"): répertoire existant"
fi
elif [ -n "$no_clone" ]; then
qvals git clone "$repourl" "$destdir"
else
pclone "$repourl" "$destdir" || die
fi
fi
elif [ "$CMD" == crone ]; then
repourl="${1%.git}"
@ -318,7 +429,7 @@ elif [ "$CMD" == crone ]; then
fi
tmpdestdir=
if [ -d "$destdir" ]; then
[ -d "$destdir/.git" ] && die "$(ppath "$destdir"): répertoire existant"
[ -d "$destdir/.git" ] && die "$(ppath2 "$destdir"): un dépôt existe déjà"
ac_set_tmpdir tmpdestdir
fi