Compare commits
No commits in common. "de53bae54864da61472efc55333895275093e6b9" and "5a444a65b964feb36ac9b4de25b36a0c7dfb121e" have entirely different histories.
de53bae548
...
5a444a65b9
@ -1,21 +1,18 @@
|
|||||||
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
# -*- 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
|
# Liste de préfixes permettant de taper le nom d'un dépôt plus rapidement e.g
|
||||||
# repoctl create g/ssi-php/myproj
|
# pcrone g/ssi-php/myproj
|
||||||
# repoctl create v:modules/myproj
|
# pcrone v:modules/myproj
|
||||||
# sont équivalents à
|
# sont équivalents à
|
||||||
# repoctl create https://git.univ-reunion.fr/ssi-php/myproj
|
# pcrone https://git.univ-reunion.fr/ssi-php/myproj
|
||||||
# repoctl create git@vcs.univ.run:modules/myproj
|
# pcrone git@vcs.univ.run:modules/myproj
|
||||||
|
# Ces définitions fonctionnent aussi pour pclone
|
||||||
# Le format est ALIAS=ACTUAL
|
# Le format est ALIAS=ACTUAL
|
||||||
#
|
|
||||||
# Ces définitions fonctionnent aussi pour tous les scripts qui utilisent
|
|
||||||
# repoctl, dont notamment pclone et pcrone
|
|
||||||
REPO_PREFIXES=(
|
REPO_PREFIXES=(
|
||||||
s:=git@git.univ-reunion.fr:
|
s:=git@git.univ-reunion.fr:
|
||||||
g/=https://git.univ-reunion.fr/
|
g/=https://git.univ-reunion.fr/
|
||||||
v:=git@vcs.univ.run: av/=https://vcs.univ-reunion.fr/anongit/
|
v:=git@vcs.univ.run: av/=https://vcs.univ-reunion.fr/anongit/
|
||||||
p:=pgit@vcs.univ.run: ap/=https://pvcs.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
|
# Définitions des types de dépôt. Le format est NAME:TYPE:PREFIX
|
||||||
@ -24,7 +21,6 @@ REPO_PREFIXES=(
|
|||||||
# type par défaut est 'gitolite'
|
# type par défaut est 'gitolite'
|
||||||
REPO_TYPES=(
|
REPO_TYPES=(
|
||||||
ur:gitea:https://git.univ-reunion.fr/
|
ur:gitea:https://git.univ-reunion.fr/
|
||||||
jclain:gitea:https://git.jclain.fr/
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Configuration de l'accès à l'API gogs
|
# Configuration de l'accès à l'API gogs
|
@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/php
|
|
||||||
<?php # -*- coding: utf-8 mode: php -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
|
|
||||||
|
|
||||||
function fix_value($value) {
|
|
||||||
if ($value === "true") return true;
|
|
||||||
elseif ($value === "false") return false;
|
|
||||||
elseif ($value === "null") return null;
|
|
||||||
else return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
$data = array();
|
|
||||||
$empty = true;
|
|
||||||
for ($i = 1; $i < $argc; $i++) {
|
|
||||||
$namevalue = $argv[$i];
|
|
||||||
if (preg_match('/(.*?)=(.*)/', $namevalue, $ms)) {
|
|
||||||
$name = $ms[1];
|
|
||||||
$value = fix_value($ms[2]);
|
|
||||||
$data[$name] = $value;
|
|
||||||
} else {
|
|
||||||
$data[] = fix_value($namevalue);
|
|
||||||
}
|
|
||||||
$empty = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
$options = JSON_NUMERIC_CHECK;
|
|
||||||
if ($empty) $options += JSON_FORCE_OBJECT;
|
|
||||||
echo json_encode($data, $options);
|
|
@ -1,28 +0,0 @@
|
|||||||
#!/usr/bin/php
|
|
||||||
<?php # -*- coding: utf-8 mode: php -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
|
|
||||||
|
|
||||||
if ($argc <= 1) die("ERROR: Vous devez spécifier le nom de la clé\n");
|
|
||||||
|
|
||||||
$data = json_decode(stream_get_contents(STDIN), true);
|
|
||||||
foreach ($data as $datum) {
|
|
||||||
$first = true;
|
|
||||||
for ($i = 1; $i < $argc; $i++) {
|
|
||||||
$result = $datum;
|
|
||||||
$keys = explode(".", trim($argv[$i]));
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
if ($result === null) break;
|
|
||||||
if (!$key) continue;
|
|
||||||
if (isset($result[$key])) {
|
|
||||||
$result = $result[$key];
|
|
||||||
} else {
|
|
||||||
$result = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($first) $first = false;
|
|
||||||
else echo "\t";
|
|
||||||
if (is_array($result)) var_export($result);
|
|
||||||
else echo $result;
|
|
||||||
}
|
|
||||||
echo "\n";
|
|
||||||
}
|
|
@ -1,27 +0,0 @@
|
|||||||
#!/usr/bin/php
|
|
||||||
<?php # -*- coding: utf-8 mode: php -*- vim:sw=2:sts=2:et:ai:si:sta:fenc=utf-8
|
|
||||||
|
|
||||||
if ($argc <= 1) die("ERROR: Vous devez spécifier le nom de la clé\n");
|
|
||||||
|
|
||||||
$datum = json_decode(stream_get_contents(STDIN), true);
|
|
||||||
|
|
||||||
$first = true;
|
|
||||||
for ($i = 1; $i < $argc; $i++) {
|
|
||||||
$result = $datum;
|
|
||||||
$keys = explode(".", trim($argv[$i]));
|
|
||||||
foreach ($keys as $key) {
|
|
||||||
if ($result === null) break;
|
|
||||||
if (!$key) continue;
|
|
||||||
if (isset($result[$key])) {
|
|
||||||
$result = $result[$key];
|
|
||||||
} else {
|
|
||||||
$result = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if ($first) $first = false;
|
|
||||||
else echo "\t";
|
|
||||||
if (is_array($result)) var_export($result);
|
|
||||||
else echo $result;
|
|
||||||
}
|
|
||||||
echo "\n";
|
|
278
repoctl
278
repoctl
@ -1,278 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
|
|
||||||
source "$(dirname "$0")/lib/ulib/ulib" || exit 1
|
|
||||||
urequire DEFAULTS
|
|
||||||
|
|
||||||
function display_help() {
|
|
||||||
uecho "$scriptname: piloter un serveur git (gitolite, gogs, gitea, etc.)
|
|
||||||
|
|
||||||
USAGE
|
|
||||||
$scriptname ACTION URL [options]
|
|
||||||
|
|
||||||
ACTIONS
|
|
||||||
create URL [description]
|
|
||||||
Créer un nouveau dépôt avec la description spécifiée
|
|
||||||
|
|
||||||
list URL [VARs...]
|
|
||||||
Lister les dépôts dans l'organisation spécifiée. Si aucune organisation
|
|
||||||
n'est spécifiée dans l'url, lister les dépôts *accessibles* par
|
|
||||||
l'utilisateur (cela inclut les dépôts des organisations auxquelles
|
|
||||||
l'utilisateur a accès)
|
|
||||||
VARs est une liste de variables à afficher pour chaque dépôt, séparés
|
|
||||||
par le caractère tabulation. La valeur par défaut est full_name
|
|
||||||
|
|
||||||
delete URL
|
|
||||||
Supprimer le dépôt spécifié"
|
|
||||||
# pas encore possible d'implémenter pour le moment:
|
|
||||||
#move URL ORG[/NAME]
|
|
||||||
# Déplacer le dépôt spécifié dans l'organisation spécifiée. Le cas
|
|
||||||
# échéant, le dépôt est renommé
|
|
||||||
}
|
|
||||||
|
|
||||||
function json_build() {
|
|
||||||
"$scriptdir/lib/repoctl/json_build.php" "$@"
|
|
||||||
}
|
|
||||||
function json_get() {
|
|
||||||
"$scriptdir/lib/repoctl/json_get.php" "$@"
|
|
||||||
}
|
|
||||||
function json_each() {
|
|
||||||
"$scriptdir/lib/repoctl/json_each.php" "$@"
|
|
||||||
}
|
|
||||||
|
|
||||||
function repoctl_init() {
|
|
||||||
repourl="${1%.git}"
|
|
||||||
[ -n "$repourl" ] || return
|
|
||||||
rname=
|
|
||||||
rtype=gitolite
|
|
||||||
rprefix=
|
|
||||||
|
|
||||||
REPO_PREFIXES=()
|
|
||||||
REPO_TYPES=()
|
|
||||||
set_defaults repoctl
|
|
||||||
|
|
||||||
# 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")
|
|
||||||
[ -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
|
|
Loading…
Reference in New Issue
Block a user