2009-07-10 6 views
1

J'ai un référentiel Mercurial configuré sur un serveur Linux, et certains utilisateurs (mais pas tous) ont l'autorisation d'y accéder. Ils se connectent au référentiel via ssh.Configuration de Mercurial pour les membres d'un groupe unix

Ces utilisateurs sont membres d'un groupe unix. Ci-dessous, le script que j'utilise pour modifier un référentiel afin qu'il puisse recevoir des poussées de leur part.

Est-ce que cela peut être amélioré? Y a-t-il des opérations inutiles ici? Quelque chose de mauvais style pour un script bash?

#!/bin/bash                  

if [[ $# -lt 2 ]]; then 
    echo Usage: $0 directory groupname 
    exit 1 
fi 

if ! chown -R :$2 $1; then 
    echo chown failure 
    exit 2 
fi 

if ! find $1/.hg -type d -exec chmod g+s {} \;; then 
    echo chmod failure 
    exit 3 
fi 

if ! find $1 -perm -u+r -exec chmod g+r {} \;; then 
    echo chmod failure 2 
    exit 4 
fi 

if ! find $1 -perm -u+w -exec chmod g+w {} \;; then 
    echo chmod failure 3 
    exit 5 
fi 

if ! find $1 -perm -u+x -exec chmod g+x {} \;; then 
    echo chmod failure 4 
    exit 6 
fi 

Répondre

1

La recherche avec -exec lance un processus de chown séparé pour chaque fichier. Vous aurez beaucoup moins processus thrash (et plus rapide) si vous le faites:

find "$1"/.hg -type d -print0 | xargs chmod g+s 
find "$1" -perm -u+r -print0 | xargs chmod g+r 
find "$1" -perm -u+w -print0 | xargs chmod g+w 
find "$1" -perm -u+x -print0 | xargs chmod g+x 

En aparté, avez-vous regardé ACL Extension de Mercurial en combinaison avec hg-ssh? Tant que le seul accès est ssh, il fait le même genre de chose.

+1

Les nouvelles découvertes de GNU (elles l'ont implémenté relativement tard, c'est dans POSIX depuis des lustres ...) connaissent "-exec .... {} +", qui engendrera le processus en utilisant autant d'arguments que possible dans l'environnement. , faisant effectivement ce que xargs ferait. – TheBonsai

+0

Merci d'avoir signalé l'extension ACL. Une autre option que j'ai trouvée de vos liens était mercurial-server (http://mercurial.selenic.com/wiki/SharedSSH). Je pense que je vais m'en tenir à mon script pour le moment, avec John, TheBonsai, et vos changements. –

1

Couple choses mineures: Il est une bonne idée de l'écho des messages d'erreur à stderr en redirigeant avec >&2. Et vous devez ajouter des guillemets autour des variables afin que votre script fonctionne avec les noms de fichiers qui ont des espaces.

Vous pouvez modifier la ligne initiale à #!/bin/bash -e pour que le script se ferme immédiatement en cas d'erreur. Cela vous permettrait de supprimer toutes les instructions if. Ou si vous voulez plus de contrôle, vous pouvez utiliser la commande trap ERR appeler personnalisée code de gestion d'erreur:

#!/bin/bash 

function uhoh() { 
    echo "error in script!" >&2 
    exit 1 
} 

trap uhoh ERR 

if [[ $# -lt 2 ]]; then 
    echo "Usage: $0 directory groupname" >&2 
    exit 1 
fi 

chown -R :"$2" "$1" 
find "$1"/.hg -type d -exec chmod g+s {} \; 
find "$1" -perm -u+r -exec chmod g+r {} \; 
find "$1" -perm -u+w -exec chmod g+w {} \; 
find "$1" -perm -u+x -exec chmod g+x {} \; 

Personnellement, je viens d'aller avec l'option /bin/bash -e si vous voulez arrêter le script dès que échoue quelque chose. Je pense que vérifier le résultat de chaque commande et avoir un code de sortie différent pour chacun est exagéré. Vous n'avez pas besoin d'être aussi robuste, et personne ne va faire autre chose pour le code de sortie 3 par rapport au code de sortie 4 ...

Questions connexes