nutools/uproject

224 lines
6.7 KiB
Bash
Executable File

#!/bin/bash
# -*- coding: utf-8 mode: sh -*- vim:sw=4:sts=4:et:ai:si:sta:fenc=utf-8
function display_help() {
uecho "$scriptname: Outil pour gérer des projets
USAGE
$scriptname cmd [args]
COMMANDS
getvcs [dir]
Afficher le type de VCS pour dir.
getroot [dir]
Si dir est un répertoire versionné, retourner le répertoire racine du
projet versionné.
getrepos [dir]
Si dir est un répertoire versionné, retourner l'url du repository du
projet versionné.
geturl [dir]
Si dir est un répertoire versionné, retourner son url dans le
repository.
fold [dir]
unfold [dir]
Utiliser uinc pour défaire (resp. refaire) toutes les inclusions des
fichiers de dir. Cela ne fonctionne que si un fichier .uir est configuré
à la racine du projet avec inc=true (ou un fichier .uinst.conf avec
update_inc=true
vcs [args]
Appeler le gestionnaire de gestion approprié avec les arguments donnés.
add files...
Ajouter les fichiers files dans le gestionnaire de version.
remove files...
Supprimer les fichiers versionnés files.
copy from to
Copier le fichier versionné from vers le fichier to.
move from to
Renommer le fichier versionné from vers le fichier to.
mkdir dir
Créer un nouveau répertoire versionné.
commit message [files...]
Enregistrer les modifications (par défaut sur tous les fichiers
modifiés) avec le commentaire message.
status
Afficher l'état des fichiers versionnés et non versionnés.
update [-x]
Mettre à jour la copie locale avec la copie sur le serveur.
-x Ne pas mettre à jour les références externes (si appliquable)
diff [options]
Afficher les différences.
-l Afficher les différences non commitées (par défaut)
-c Afficher les différences en passe d'être commitées (si appliquable)
-r REV
Afficher les différences depuis la révision REV.
-R Afficher les modifications effectuées depuis la dernière release.
annex [args]
Lancer git annex avec les arguments spécifiés.
xadd
xunlock
xcopy
xdrop
xmove
xget
xsync
xwhereis
Chacune de ces commandes est un raccourci vers la commande
correspondante de git annex, sans le préfixe 'x'
crone git@host:path/to/repo
Créer puis cloner un dépôt distant sur gitolite
printml [-t TYPE]
Afficher le modeline pour un fichier du type spécifié
addml [-t TYPE] file
Ajouter un modele pour le fichier spécifié, s'il n'en a pas déjà un.
Si nécessaire, forcer le type du fichier au lieu de l'autodétecter
new [options] file [template options]
Créer un nouveau fichier à partir d'un modèle.
Avant le nom du fichier, les options suivantes sont valides:
-t TEMPLATE
Spécifier le modèle de fichier à utiliser. Par défaut, le modèle
à utiliser est déduit de l'extension ou du nom du fichier.
-e Editer le fichier après l'avoir créé.
Après le nom du fichier, toutes les options sont spécifiques au modèle
utilisé pour créer le nouveau fichier. Utiliser l'option --help pour
avoir une description des options disponibles."
}
SCRIPT_ALIASES=(
pv:vcs
pa:add prm:remove pcp:copy pmv:move pmd:mkdir
pci:commit pu:update pp:push pdiff:diff
pxx:annex
pxa:xadd pxu:unlock pxc:xcopy pxd:xdrop pxm:xmove
pxg:xget pxs:xsync pxw:xwhereis
pcrone:crone
pnew:new
pgr:grep
paddml:addml
)
CMD_ALIASES=(
getrepo:getrepos repo:getrepos repos:getrepos
url:geturl
a:add
rm:remove del:remove delete:remove
cp:copy
mv:move ren:move rename:move
md:mkdir
ci:commit
s:status st:status
u:update upd:update
p:push
xx:annex
xa:xadd
xu:xunlock
xc:xcopy
xd:xdrop
xm:xmove
xg:xget
xs:xsync
xw:xwhereis
gr:grep
)
DEFAULT_CMD=status
PY_CMDS=(new)
VCS_CMDS=(getvcs getroot getrepos geturl vcs add remove copy move mkdir commit status update push diff tag)
GITANNEX_CMDS=(annex xadd xunlock xcopy xdrop xmove xget xsync xwhereis)
ML_CMDS=(printml addml)
if [ "$#" -eq 1 -a "$1" == --nutools-makelinks ]; then
# créer les liens
scriptname="$(basename "$0")"
for alias in p "${SCRIPT_ALIASES[@]}"; do
alias="${alias%:*}"
ln -s "$scriptname" "$alias"
done
exit 0
fi
source "$(dirname "$0")/ulib/ulib" &&
urequire DEFAULTS modeline vcs ||
exit 1
# Traduire le nom du script
for script_alias in "${SCRIPT_ALIASES[@]}"; do
splitpair "$script_alias" src dest
if [ "$scriptname" == "$src" ]; then
eval "set -- $dest \"\$@\""
break
fi
done
# Parser les options de uproject
parse_opts + "${PRETTYOPTS[@]}" \
--help '$exit_with display_help' \
@ args -- "$@" && set -- "${args[@]}" || die "$args"
# Traduire la commande
[ -n "$*" ] || set -- "$DEFAULT_CMD"
CMD=
found_cmd=
while [ -z "$found_cmd" ]; do
CMD="$1"; shift; found_cmd=1
[ -n "$CMD" ] || break
for cmd_alias in "${CMD_ALIASES[@]}"; do
splitpair "$cmd_alias" src dest
if [ "$CMD" == "$src" ]; then
eval "set -- $dest \"\$@\""
found_cmd=
break
fi
done
done
################################################################################
# Traiter les commandes
if [ "$CMD" == "grep" ]; then
## grep
if [ $# -eq 1 -a "$1" == "--help" ]; then
uecho "uproject grep: Lancer une recherche récursive en ignorant les répertoire de controle de version
USAGE
uproject grep [grep options]"
exit 0
fi
EXCLUDES=(--exclude-dir .svn --exclude-dir CVS --exclude-dir .git --exclude "*.pyc")
exec grep -r "${EXCLUDES[@]}" "$@"
elif array_contains ML_CMDS "$CMD"; then
"$CMD" "$@"
elif array_contains VCS_CMDS "$CMD"; then
"vcs_$CMD" "$@"
elif array_contains GITANNEX_CMDS "$CMD"; then
if [ "$CMD" == "annex" ]; then
git annex "$@"
else
git annex "${CMD#x}" "$@"
fi
elif [ "$CMD" == crone ]; then
repourl="$1"
[ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git"
splitfsep "$repourl" : userhost path
splituserhost "$userhost" user host
[ -n "$user" ] || user=git
[ -n "$host" ] || die "Vous devez spécifier l'hôte"
userhost="$user@$host"
[ -n "$path" ] || die "Vous devez spécifier le chemin du dépôt git"
ssh "$userhost" create "$path" || die
git clone "$userhost:$path"
elif array_contains PY_CMDS "$CMD"; then
exec "$scriptdir/lib/pywrapper" uproject.py "$CMD" "$@"
else
die "$CMD: commande inconnue"
fi