maj prefixe et meilleur affichage des erreurs

This commit is contained in:
Jephté Clain 2018-11-16 20:53:33 +04:00
parent 307fa4827a
commit 764dd53bf8
2 changed files with 110 additions and 32 deletions

View File

@ -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=

120
uproject
View File

@ -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