diff --git a/lib/default/pcrone b/lib/default/repoctl similarity index 71% rename from lib/default/pcrone rename to lib/default/repoctl index f64e5ae..cea1682 100644 --- a/lib/default/pcrone +++ b/lib/default/repoctl @@ -1,18 +1,21 @@ # -*- 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 +# repoctl create g/ssi-php/myproj +# repoctl create 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 +# repoctl create https://git.univ-reunion.fr/ssi-php/myproj +# repoctl create git@vcs.univ.run:modules/myproj # Le format est ALIAS=ACTUAL +# +# Ces définitions fonctionnent aussi pour tous les scripts qui utilisent +# repoctl, dont notamment pclone et pcrone 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/ + j/=https://git.jclain.fr/ ) # Définitions des types de dépôt. Le format est NAME:TYPE:PREFIX @@ -21,6 +24,7 @@ REPO_PREFIXES=( # type par défaut est 'gitolite' REPO_TYPES=( ur:gitea:https://git.univ-reunion.fr/ + jclain:gitea:https://git.jclain.fr/ ) # Configuration de l'accès à l'API gogs diff --git a/lib/repoctl/json_build.php b/lib/repoctl/json_build.php new file mode 100755 index 0000000..0106b58 --- /dev/null +++ b/lib/repoctl/json_build.php @@ -0,0 +1,27 @@ +#!/usr/bin/php + $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") + [ -n "$HTTP_METHOD" ] && args+=(-X "$HTTP_METHOD") + 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" +} + +function gogs_setvars() { + 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 +} + +################################################################################ + +function create_action() { + case "$rtype" in + #gitolite) ;; + gogs|gitea) + gogs_setvars + gogs_create_action "$@" + ;; + *) die "$rtype: type de dépôt non supporté";; + esac +} +function gogs_create_action() { + local url desc payload result + local -a vars + if [ -n "$user" -a "$user" != "$gogs_user" ]; then + # lister les dépôts d'une organisation + url="$gogs_url/api/v1/orgs/$user/repos" + else + # lister les dépôts accessibles par l'utilisateur + url="$gogs_url/api/v1/user/repos" + fi + vars=(name="$path" private=true) + [ -n "$1" ] && vars+=(description="$1"); shift + setx payload=json_build "${vars[@]}" + + [ $# -gt 0 ] && vars=("$@") || vars=("") + setx result=curlto "$url" "$payload" "" \ + -H 'Content-Type: application/json' \ + -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" | json_get "${vars[@]}" +} + +################################################################################ + +function list_action() { + case "$rtype" in + #gitolite) ;; + gogs|gitea) + gogs_setvars + gogs_list_action "$@" + ;; + *) die "$rtype: type de dépôt non supporté";; + esac +} +function gogs_list_action() { + local url result + local -a vars + if [ -n "$user" -a "$user" != "$gogs_user" ]; then + # lister les dépôts d'une organisation + url="$gogs_url/api/v1/orgs/$user/repos" + else + # lister les dépôts accessibles par l'utilisateur + url="$gogs_url/api/v1/user/repos" + fi + [ $# -gt 0 ] && vars=("$@") || vars=(full_name) + setx result=curlto "$url" "" "" \ + -H 'Content-Type: application/json' \ + -H "Authorization: token $gogs_key" || \ + die "Une erreur s'est produite lors de la tentative de listage des dépôts +url: $url +result: $result" + echo "$result" | json_each "${vars[@]}" +} + +################################################################################ +#XXX à implémenter. ça ne semble pas encore possible pour le moment. peut-être +# uniquement le renommage?! + +function move_action() { + case "$rtype" in + #gitolite) ;; + gogs|gitea) + gogs_setvars + gogs_move_action "$@" + ;; + *) die "$rtype: type de dépôt non supporté";; + esac +} +function gogs_move_action() { + local url payload result + local -a vars + setx payload=json_build name="$new_name" + url="$gogs_url/api/v1/repos/$user/$path" + local HTTP_METHOD=PATCH + [ $# -gt 0 ] && vars=("$@") || vars=("") + setx result=curlto "$url" "$payload" "" \ + -H 'Content-Type: application/json' \ + -H "Authorization: token $gogs_key" || \ + die "Une erreur s'est produite lors de la tentative de déplacement du dépôt +url: $url +payload: $payload +result: $result" + echo "$result" | json_get "${vars[@]}" +} + +################################################################################ + +function delete_action() { + case "$rtype" in + #gitolite) ;; + gogs|gitea) + gogs_setvars + gogs_delete_action "$@" + ;; + *) die "$rtype: type de dépôt non supporté";; + esac +} +function gogs_delete_action() { + local url payload result + setx payload=json_build owner="$user" repo="$path" + url="$gogs_url/api/v1/repos/$user/$path" + local HTTP_METHOD=DELETE + setx result=curlto "$url" "$payload" "" \ + -H 'Content-Type: application/json' \ + -H "Authorization: token $gogs_key" || \ + die "Une erreur s'est produite lors de la tentative de suppression du dépôt +url: $url +payload: $payload +result: $result" + if [ -n "$result" ]; then + echo "$result" + fi +} + +################################################################################ + +action= +args=( + --help '$exit_with display_help' + -c,--create action=create + -l,--list action=list + #-m,--move action=move + -d,--delete action=delete +) +parse_args "$@"; set -- "${args[@]}" + +if [ -z "$action" ]; then + action="$1"; shift +fi +[ -n "$action" ] || action=list + +repoctl_init "$1"; shift +[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt" + +case "$action" in +c|create) create_action "$@";; +l|list) list_action "$@";; +#m|move) move_action "$@";; +d|del|delete|rm|remove) delete_action "$@";; +esac diff --git a/uproject b/uproject index 8e81620..40f8764 100755 --- a/uproject +++ b/uproject @@ -250,7 +250,7 @@ function cxone_init() { REPO_PREFIXES=() REPO_TYPES=() - set_defaults pcrone + set_defaults repoctl # Traduire les aliases éventuels local asrcdest asrc adest