diff --git a/lib/default/pcrone b/lib/default/pcrone index d7e56a7..f64e5ae 100644 --- a/lib/default/pcrone +++ b/lib/default/pcrone @@ -1,15 +1,31 @@ # -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8 +# Liste de préfixes permettant de taper le nom d'un dépôt plus rapidement e.g +# pcrone g/ssi-php/myproj +# pcrone v:modules/myproj +# sont équivalents à +# pcrone https://git.univ-reunion.fr/ssi-php/myproj +# pcrone git@vcs.univ.run:modules/myproj +# Ces définitions fonctionnent aussi pour pclone +# Le format est ALIAS=ACTUAL +REPO_PREFIXES=( + s:=git@git.univ-reunion.fr: + g/=https://git.univ-reunion.fr/ + v:=git@vcs.univ.run: av/=https://vcs.univ-reunion.fr/anongit/ + p:=pgit@vcs.univ.run: ap/=https://pvcs.univ-reunion.fr/anongit/ +) + # Définitions des types de dépôt. Le format est NAME:TYPE:PREFIX # * NAME est utilisé pour définir des configurations supplémentaires -# * TYPE peut valoir gitolite ou gogs. Le type par défaut est 'gitolite' +# * TYPE peut valoir gitolite ou gogs (ou gitea qui est un alias de gogs). Le +# type par défaut est 'gitolite' REPO_TYPES=( - ur:gogs:https://gogs.univ-reunion.fr/ + ur:gitea:https://git.univ-reunion.fr/ ) # Configuration de l'accès à l'API gogs # un nom de dépôt est de la forme user/repo. Si user != $GOGS_USER alors on crée # dans une organisation -#ur_GOGS_URL=https://gogs.univ-reunion.fr +#ur_GOGS_URL=https://git.univ-reunion.fr #ur_GOGS_USER="$USER" #ur_GOGS_KEY= diff --git a/uproject b/uproject index 5b21760..1dcab3b 100755 --- a/uproject +++ b/uproject @@ -241,6 +241,78 @@ done ################################################################################ # Traiter les commandes +function cxone_init() { + repourl="${1%.git}" + [ -n "$repourl" ] || return + rname= + rtype=gitolite + rprefix= + + REPO_PREFIXES=() + REPO_TYPES=() + set_defaults pcrone + + # Traduire les aliases éventuels + local asrcdest asrc adest + for asrcdest in "${REPO_PREFIXES[@]}"; do + splitfsep "$asrcdest" = asrc adest + if [ "${repourl#$asrc}" != "$repourl" ]; then + newurl="$adest${repourl#$asrc}" + if [ "$newurl" != "$repourl" ]; then + enote "$repourl --> $newurl" + repourl="$newurl" + break + fi + fi + done + + local rnametypeprefix tmp found + for rnametypeprefix in "${REPO_TYPES[@]}"; do + splitfsep "$rnametypeprefix" : rname tmp + splitfsep "$tmp" : rtype rprefix + if [ "${repourl#$rprefix}" != "$repourl" ]; then + found=1 + break + fi + done + if [ -z "$found" ]; then + rname= + rtype=gitolite + rprefix= + fi +} +function curlto() { + local url="$1"; shift + local payload="$1"; shift + local outfile="$1"; shift + local tmpfile + if [ -z "$outfile" ]; then + ac_set_tmpfile tmpfile + outfile="$tmpfile" + fi + + local -a args + local r http_code + args=(-s -w '%{http_code}' -o "$outfile") + [ -n "$payload" ] && args+=(-d "$payload") + args+=("$@" "$url") + setx http_code=curl "${args[@]}" + + case "$http_code" in + 2*) r=0;; + 4*) r=1;; + 5*) r=3;; + *) r=11;; + esac + if [ -n "$tmpfile" ]; then + cat "$tmpfile" + ac_clean "$tmpfile" + fi + + upvar http_code "$http_code" + return "$r" +} + if [ "$CMD" == "grep" ]; then ## grep if [ $# -eq 1 -a "$1" == "--help" ]; then @@ -339,9 +411,14 @@ NR <= 2 { next } -r,--recursive recursive=1 \ @ args -- "$@" && set -- "${args[@]}" || die "$args" + cxone_init "$@" + [ -n "$repourl" ] && set -- "$repourl" "${@:2}" + if [ -n "$recursive" ]; then repobase="$1" [ -n "$repobase" ] || die "Vous devez spécifier l'url de base des dépôts à cloner" + [ "$rtype" == gitolite ] || die "Le clonage récursif n'est supporté que pour les dépôts de type gitolite" + if [ "${repobase#http://}" != "$repobase" -o "${repobase#https://}" != "$repobase" ]; then # accès par http mode=http @@ -417,27 +494,10 @@ NR <= 2 { next } fi elif [ "$CMD" == crone ]; then - REPO_TYPES=() - set_defaults pcrone - - repourl="${1%.git}" + cxone_init "$@" [ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git" - found= - for repo_ntp in "${REPO_TYPES[@]}"; do - splitfsep "$repo_ntp" : name tmp - splitfsep "$tmp" : type prefix - if [ "${repourl#$prefix}" != "$repourl" ]; then - found=1 - break - fi - done - if [ -z "$found" ]; then - name= - type=gitolite - prefix= - fi - if [ "$type" == "gitolite" ]; then + if [ "$rtype" == "gitolite" ]; then if [ "${repourl#http://}" != "$repourl" -o "${repourl#https://}" != "$repourl" ]; then # accès par http mode=gitolite_http @@ -455,15 +515,15 @@ elif [ "$CMD" == crone ]; then [ -n "$host" ] || die "Vous devez spécifier l'hôte" userhost="$user@$host" fi - elif [ "$type" == "gogs" ]; then + elif [ "$rtype" == gogs -o "$rtype" == gitea ]; then mode=gogs_http - gogs_url="${name}_GOGS_URL"; gogs_url="${!gogs_url}" - gogs_user="${name}_GOGS_USER"; gogs_user="${!gogs_user}" - gogs_key="${name}_GOGS_KEY"; gogs_key="${!gogs_key}" - userpath="${repourl#$prefix}" + gogs_url="${rname}_GOGS_URL"; gogs_url="${!gogs_url}" + gogs_user="${rname}_GOGS_USER"; gogs_user="${!gogs_user}" + gogs_key="${rname}_GOGS_KEY"; gogs_key="${!gogs_key}" + userpath="${repourl#$rprefix}" splitfsep "$userpath" / user path else - die "$type: type de dépôt non supporté" + die "$rtype: type de dépôt non supporté" fi [ -n "$path" ] || die "Vous devez spécifier le chemin du dépôt git" @@ -508,11 +568,13 @@ elif [ "$CMD" == crone ]; then else url="$gogs_url/api/v1/user/repos" fi - setx result=curl -fs \ + setx result=curlto "$url" "$payload" "" \ -H 'Content-Type: application/json' \ - -H "Authorization: token $gogs_key" \ - -d "$payload" \ - "$url" || die "Une erreur s'est produite lors de la tentative de création du dépôt" + -H "Authorization: token $gogs_key" || \ + die "Une erreur s'est produite lors de la tentative de création du dépôt +url: $url +payload: $payload +result: $result" echo "$result" if [ -n "$tmpdestdir" ]; then setxx destname=abspath "$destdir" // basename