2009-07-10 6 views
1

私はLinuxサーバにMercurialリポジトリを設定しましたが、一部のユーザ(すべてではない)がプッシュする権限を持っています。彼らはsshを介してリポジトリに接続します。UnixグループのメンバにMercurialを設定する

これらのユーザーは、一緒にUNIXグループのメンバーです。以下は私がリポジトリからプッシュを受け取れるようにリポジトリを変更するために使用しているスクリプトです。

これを改善できますか?ここに不必要な操作はありますか? 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 

答えて

1

find -execを実行すると、ファイルごとに別々のchownプロセスが起動されます。 、余談として

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 

あなたはhg-sshとMercurialのACL Extensionの組み合わせで見てきました:あなたは、あなたがしなければはるかに少ないプロセスがスラッシュ(およびそれ以上の速度)を得るでしょうか?唯一のアクセスがsshである限り、それは同じ種類のことをします。

+1

もっと新しいGNUが見つけました(これは比較的遅く実装されていますが、これは古くからPOSIXにあります)... "-exec .... {} +"を知っています。 xargsが行うことを効果的に実行します。 – TheBonsai

+0

ACL拡張を指摘してくれてありがとう。私があなたのリンクから見つけた別のオプションは、mercurial-server(http://mercurial.selenic.com/wiki/SharedSSH)でした。私は今、私の脚本を、ジョン、TheBonsai、そしてあなたの変更と一緒に固執すると思います。 –

1

カップルマイナーなもの:それは>&2にリダイレクトすることによって、標準エラー出力にエラーメッセージをエコーすることをお勧めします。また、変数を二重引用符で囲むことで、スクリプトがスペースを含むファイル名で動作するようにする必要があります。

エラーがある場合は、最初の行を#!/bin/bash -eに変更して、スクリプトをすぐに終了させることができます。それでif文がすべて削除されます。あなたはより多くの制御をしたい場合や、カスタムエラー処理コードを呼び出すためにtrap ERRコマンドを使用することができます。

#!/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 {} \; 

は個人的に私はちょうど /bin/bash -eオプションでいいと思うあなたは、すぐに何かが失敗したとして、スクリプトを停止する場合。私は、すべてのコマンドの結果を確認し、それぞれのために異なる終了コードを持つことは過度のことだと思います。あなたは堅牢である必要はありません。終了コード3と終了コード4の違いは誰にも違いありません。

関連する問題