pcrone: possibilité de créer des dépôts gogs

This commit is contained in:
Jephté Clain 2018-10-09 11:14:05 +04:00
parent e3ba5800c0
commit 9d991e2d43
2 changed files with 94 additions and 19 deletions

15
lib/default/pcrone Normal file
View File

@ -0,0 +1,15 @@
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
# 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'
REPO_TYPES=(
ur:gogs:https://gogs.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_USER="$USER"
#ur_GOGS_KEY=

View File

@ -417,11 +417,30 @@ NR <= 2 { next }
fi fi
elif [ "$CMD" == crone ]; then elif [ "$CMD" == crone ]; then
REPO_TYPES=()
set_defaults pcrone
repourl="${1%.git}" repourl="${1%.git}"
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git" [ -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 [ "${repourl#http://}" != "$repourl" -o "${repourl#https://}" != "$repourl" ]; then if [ "${repourl#http://}" != "$repourl" -o "${repourl#https://}" != "$repourl" ]; then
# accès par http # accès par http
mode=http mode=gitolite_http
splitfsep "$repourl" :// scheme hostuserpath splitfsep "$repourl" :// scheme hostuserpath
splitfsep "$hostuserpath" / host userpath splitfsep "$hostuserpath" / host userpath
splitfsep "$userpath" / user path splitfsep "$userpath" / user path
@ -429,13 +448,23 @@ elif [ "$CMD" == crone ]; then
hostuser="$scheme://$host/$user" hostuser="$scheme://$host/$user"
else else
# accès par ssh # accès par ssh
mode=ssh mode=gitolite_ssh
splitfsep "$repourl" : userhost path splitfsep "$repourl" : userhost path
splituserhost "$userhost" user host splituserhost "$userhost" user host
[ -n "$user" ] || user=git [ -n "$user" ] || user=git
[ -n "$host" ] || die "Vous devez spécifier l'hôte" [ -n "$host" ] || die "Vous devez spécifier l'hôte"
userhost="$user@$host" userhost="$user@$host"
fi fi
elif [ "$type" == "gogs" ]; 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}"
splitfsep "$userpath" / user path
else
die "$type: type de dépôt non supporté"
fi
[ -n "$path" ] || die "Vous devez spécifier le chemin du dépôt git" [ -n "$path" ] || die "Vous devez spécifier le chemin du dépôt git"
destdir="$2" destdir="$2"
@ -449,7 +478,7 @@ elif [ "$CMD" == crone ]; then
ac_set_tmpdir tmpdestdir ac_set_tmpdir tmpdestdir
fi fi
if [ "$mode" == http ]; then if [ "$mode" == gitolite_http ]; then
setx result=curl -fs "$hostuser/create?$path" || die setx result=curl -fs "$hostuser/create?$path" || die
echo "$result" echo "$result"
[[ "$result" == FATAL:* ]] && die [[ "$result" == FATAL:* ]] && die
@ -461,7 +490,7 @@ elif [ "$CMD" == crone ]; then
else else
git clone "$hostuser/$path" "$destdir" || die git clone "$hostuser/$path" "$destdir" || die
fi fi
elif [ "$mode" == ssh ]; then elif [ "$mode" == gitolite_ssh ]; then
git_annex_use_ssh_wrapper git_annex_use_ssh_wrapper
ssh "$userhost" create "$path" || die ssh "$userhost" create "$path" || die
if [ -n "$tmpdestdir" ]; then if [ -n "$tmpdestdir" ]; then
@ -472,13 +501,42 @@ elif [ "$CMD" == crone ]; then
else else
git clone "$userhost:$path" "$destdir" || die git clone "$userhost:$path" "$destdir" || die
fi fi
elif [ "$mode" == gogs_http ]; then
payload='{"private":true,"name":"'"$path"'"}'
if [ "$gogs_user" != "$user" ]; then
url="$gogs_url/api/v1/org/$user/repos"
else
url="$gogs_url/api/v1/user/repos"
fi
setx result=curl -fs \
-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"
echo "$result"
if [ -n "$tmpdestdir" ]; then
setxx destname=abspath "$destdir" // basename
git clone "$repourl" "$tmpdestdir/$destname" || die
mv "$tmpdestdir/$destname/.git" "$destdir" || die
ac_clean "$tmpdestdir"
else
git clone "$repourl" "$destdir" || die
fi
else else
die "bug: mode non prévu" die "bug: mode non prévu"
fi fi
if ask_yesno "Voulez-vous créer des fichiers .gitignore et .gitattributes initiaux?" O; then if [ ! -f "$destdir/.gitignore" -o ! -f "$destdir/.gitattributes" ]; then
if ask_yesno "Voulez-vous créer les fichiers initiaux .gitignore et/ou .gitattributes?" O; then
if [ -f "$destdir/.gitignore" ]; then
einfo "Refus d'écraser le fichier .gitignore existant"
else
echo >"$destdir/.gitignore" "\ echo >"$destdir/.gitignore" "\
.~lock*# .~lock*#
.*.swp" .*.swp"
fi
if [ -f "$destdir/.gitattributes" ]; then
einfo "Refus d'écraser le fichier .gitattributes existant"
else
echo >"$destdir/.gitattributes" "\ echo >"$destdir/.gitattributes" "\
*.zip -delta *.zip -delta
*.gz -delta *.gz -delta
@ -486,6 +544,8 @@ elif [ "$CMD" == crone ]; then
*.whl -delta *.whl -delta
*.exe -delta" *.exe -delta"
fi fi
fi
fi
elif [ "$CMD" == xconfig-export ]; then elif [ "$CMD" == xconfig-export ]; then
unset GIT_DIR; unset GIT_WORK_TREE unset GIT_DIR; unset GIT_WORK_TREE