pclone: implémenter le clonage récursif avec -r ainsi que les options -n et -u
This commit is contained in:
parent
262048fee5
commit
a264b3e484
143
uproject
143
uproject
|
@ -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
|
||||
function pclone() {
|
||||
estep "$1 --> $(ppath "$2")"
|
||||
mkdirof "$2" || return 1
|
||||
git clone "$1" "$2" || return 1
|
||||
(
|
||||
cd "$destdir"
|
||||
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
|
||||
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
|
||||
git_annex_initial "$destdir" || 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
|
||||
|
||||
|
|
Loading…
Reference in New Issue