これを行う方法はいくつかありますが、始める前に、これを実行しますか? フックで変更をブロックする、おそらく遅い、プッシュを拒否することは、人々を悩ませ、リポジトリの書き込みロックを常に保持するため、検証スクリプトの実行中に他の誰もプッシュすることはできません。少し制御しようとして、DVCS の生産性の利点の半分を簡単に捨てることができます。
2 層リポジトリのセットアップを使用すると、これらの欠点のほとんどを回避できます。project-push
検証に合格せずに人々がプッシュでき、project-pull
いくつかの検証に合格したチェンジセットしかないようなもの。次に、検証が確認された後project-push
にのみ変更セットを から に移動する帯域外 (cron またはフックがトリガーされる) スクリプトがあります。project-pull
そのテストは帯域外で行われるため、プッシュはブロックされませんが、検証されていないチェンジセットがproject-pull
. プッシュがproject-pull
非検証状態になったときに作成者に電子メールを送信するように設定できます。このように構成されたユーザーは、.hg/hgrc
2 つのリポジトリであることをまったく考える必要はありません。
[paths]
default=http://host//path/to/project-pull
default-push=http://host//path/to/project-push
彼らはhg push
andを使用するだけでhg pull
、物事は「うまくいく」でしょう。
つまり、検証で更新されたすべてのファイルに同時にアクセスする必要がない場合は、外部pretxnchangegroup
フックで次のようなものを使用してテストを実行できます。
for thefile in $(hg manifest -r tip) ; do
if ! hg cat -r tip $thefile | ./validate_on_file.sh ; then
exit
fi
done
一度にすべてのファイルを操作する必要があり (コンパイルなど)、人々がすばやくプッシュできるようにする 2 つのリポジトリ構造を使用したくない場合は、テスト用に別のリポジトリが必要ですが、毎回クローン/作成する必要はありません。pretxnchangegroup
フックで次のようなことを行う必要があります。
hg push /scratch/long-lived-testrepo ## Warning: may not work,
## if pretxnchangegroup locks the repo and
## blocks this push to testrepo
hg -R /scratch/long-lived-testrepo update
cd /scratch/long-lived-testrepo
./validation.sh