262 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			262 lines
		
	
	
		
			8.1 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 nécessite qu'un fichier .udir soit configuré à la
 | 
						|
        racine du projet avec uinc=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.
 | 
						|
 | 
						|
    clone git@host:path/to/repo [destdir]
 | 
						|
        Cloner un dépôt distant. Initialiser git annex si le dépôt contient des
 | 
						|
        fichiers annexés. Récupérer aussi ces fichiers avec 'git annex get'
 | 
						|
 | 
						|
    crone git@host:path/to/repo [destdir]
 | 
						|
        Créer un dépôt distant sur gitolite, puis le cloner
 | 
						|
 | 
						|
    annex [args]
 | 
						|
        Lancer git annex avec les arguments spécifiés.
 | 
						|
    xadd
 | 
						|
    xunlock
 | 
						|
    xdrop
 | 
						|
    xsync
 | 
						|
    xwhereis
 | 
						|
        Chacune de ces commandes est un raccourci vers la commande
 | 
						|
        correspondante de git annex, sans le préfixe 'x'
 | 
						|
    xcopy
 | 
						|
    xmove
 | 
						|
    xget
 | 
						|
        Comme ci-dessus, mais si la commande s'exécute sans erreur, lancer
 | 
						|
        aussi 'git annex sync'
 | 
						|
    xinitial
 | 
						|
        Sur un dépôt fraichement cloné, initialiser le dépôt avec 'annex init'
 | 
						|
        s'il contient des fichiers annexés. Récupérer aussi ces fichiers avec
 | 
						|
        'annex get'
 | 
						|
 | 
						|
    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:xunlock pxc:xcopy pxd:xdrop pxm:xmove
 | 
						|
    pxg:xget pxs:xsync pxw:xwhereis
 | 
						|
    pxinitial:xinitial
 | 
						|
    pclone:clone
 | 
						|
    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 xinitial)
 | 
						|
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")/lib/ulib/ulib" || exit 1
 | 
						|
urequire DEFAULTS modeline vcs
 | 
						|
 | 
						|
# 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
 | 
						|
 | 
						|
function use_ssh_wrapper() {
 | 
						|
    __UTOOLS_FORCE_PATH="$PATH"
 | 
						|
    __UTOOLS_FORCE_SSH="${GIT_SSH:-ssh}"
 | 
						|
    export __UTOOLS_FORCE_PATH __UTOOLS_FORCE_SSH
 | 
						|
    udelpath "$scriptdir/lib/ssh-wrapper" __UTOOLS_FORCE_PATH
 | 
						|
    uinspath "$scriptdir/lib/ssh-wrapper" PATH
 | 
						|
}
 | 
						|
 | 
						|
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
 | 
						|
    use_ssh_wrapper
 | 
						|
    case "$CMD" in
 | 
						|
    annex) git annex "$@";;
 | 
						|
    xcopy|xmove|xget) git annex "${CMD#x}" "$@" && git annex sync;;
 | 
						|
    xinitial) git_annex_initial "$@";;
 | 
						|
    *) git annex "${CMD#x}" "$@";;
 | 
						|
    esac
 | 
						|
 | 
						|
elif [ "$CMD" == clone ]; then
 | 
						|
    repourl="${1%.git}"
 | 
						|
    [ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git"
 | 
						|
 | 
						|
    destdir="$2"
 | 
						|
    [ -n "$destdir" ] || setx destdir=basename -- "$repourl"
 | 
						|
    [ -d "$destdir" ] && die "$(ppath "$destdir"): répertoire existant"
 | 
						|
 | 
						|
    use_ssh_wrapper
 | 
						|
    git clone "$repourl" "$destdir" || die
 | 
						|
    git_annex_initial "$destdir" || die
 | 
						|
 | 
						|
elif [ "$CMD" == crone ]; then
 | 
						|
    repourl="${1%.git}"
 | 
						|
    [ -n "$repourl" ] || die "Vous devez spécifier l'url du dépôt git"
 | 
						|
 | 
						|
    destdir="$2"
 | 
						|
    [ -n "$destdir" ] || setx destdir=basename -- "$repourl"
 | 
						|
    [ -d "$destdir" ] && die "$(ppath "$destdir"): répertoire existant"
 | 
						|
 | 
						|
    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"
 | 
						|
 | 
						|
    use_ssh_wrapper
 | 
						|
    ssh "$userhost" create "$path" || die
 | 
						|
    git clone "$userhost:$path" "$destdir" || die
 | 
						|
    git_annex_initial "$destdir" || die
 | 
						|
 | 
						|
elif array_contains PY_CMDS "$CMD"; then
 | 
						|
    exec "$scriptdir/lib/pywrapper" uproject.py "$CMD" "$@"
 | 
						|
 | 
						|
else
 | 
						|
    die "$CMD: commande inconnue"
 | 
						|
fi
 |