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.
|
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.
|
Initialiser git annex si le dépôt contient des fichiers annexés.
|
||||||
Récupérer aussi ces fichiers avec 'git annex get'
|
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 git@host:path/to/repo [destdir]
|
||||||
crone http://host/gituser/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
|
develop
|
||||||
release
|
release
|
||||||
|
@ -268,26 +282,123 @@ elif array_contains GITANNEX_CMDS "$CMD"; then
|
||||||
esac
|
esac
|
||||||
|
|
||||||
elif [ "$CMD" == clone ]; then
|
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_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
|
if git_have_rbranch develop; then
|
||||||
git checkout develop || exit 1
|
git checkout develop || exit 1
|
||||||
fi
|
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
|
) || 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
|
elif [ "$CMD" == crone ]; then
|
||||||
repourl="${1%.git}"
|
repourl="${1%.git}"
|
||||||
|
@ -318,7 +429,7 @@ elif [ "$CMD" == crone ]; then
|
||||||
fi
|
fi
|
||||||
tmpdestdir=
|
tmpdestdir=
|
||||||
if [ -d "$destdir" ]; then
|
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
|
ac_set_tmpdir tmpdestdir
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue