Chapter 10
Handling repository events with hooks

Mercurial リポジトリしたイベントじてするみをしていますつかのではイベントする Mercurial することもできます

Mercurial 利用するこれらのフックhookばれていますシステムによってはフックトリガこともありますがこれらはします

10.1 An overview of hooks in Mercurial

Mercurial するフックリストしますこれらのフックする10.8  します

changegroup
リポジトリからチェンジセットまれたされます
commit
カルリポジトリにおいてたなチェンジセットされたされます
incoming
リポジトリからまれたたなチェンジセットづつされますまれたチェンジセットのまとまりのされる changegroup とのいにしてください
outgoing
リポジトリチェンジセットされたされます
prechangegroup
リポジトリからチェンジセットまれるされます
precommit
カルリポジトリへのコミットされます
preoutgoing
リポジトリチェンジセットされるされます
pretag
タグ生成されます
pretxnchangegroup
からカルリポジトリへとチェンジセットまれたなものにするトランザクションするされます
pretxncommit
カルリポジトリにおいてたなチェンジセットされたなものにするランザクションするされます
preupdate
ディレクトリ実施されるされます
tag
タグ生成されたされます
update
ディレクトリしたされます

かれているフックするっていますフックしたフックするされますがフックしたするされないかしなかったことになりますどちらに なるかはフックじてまります)。

10.2 Hooks and security

10.2.1 Hooks are run with your privileges

リポジトリにおいて Mercurial コマンドそのコマンドフックすることになったコマンドシステム においてコマンドザアカウントによりコマンドレベルされますフックです からってがありますしてをするフックなのかをしているしにフックインスト しないでください

にはインストしたのではないフックされるかもしれませんみのシステムMercurial 使する にはMercurial システムhgrc  ファイルされたフックするかもしれません

するリポジトリするMercurial はそのリポジトリされたフックできますが れは あなたのされますえばあるリポジトリからhg pullしたそのリポジトリ.hg/hgrc ファイル outgoing フックしていたリモトリポジトリかったとしてもフックはあなたのアカウントされま

: このカルファイルシステムネットワクファイルシステムポジトリから pull したにのみされますhttp ssh pull した フックされるアカウントバプロセスするアカウン です

リポジトリにおけるフックるにはhg showconfig hooksコマンド利用できますあるリポジトリ していないリポジトリとの hg pullないしhg incomingになったリポジトリフック すべきです1

10.2.2 Hooks do not propagate

Mercurial ではフックわれないためリポジトリclone ないし pull フックしませんその フックだからですフックコマンドマシンにおいてコマンド アカウントによりコマンドレベルされます

フックシステム利用アカウントさせる方法してしまうた あらゆるシステムにとってめて無謀えます

Mercurial フックしないためプロジェクトでのメンバとのにはらがMercurial フック利用していることやらがフックしくしていることをしてはいけませんらにフック使するのであ ればそれをすべきです

イントラネットえば Mercurial インストNFS hgrc  ファイル ての使すべきフックするといったことがであるためフックになりますしかしそれでも するようなじます

10.2.3 Hooks can be overridden

Mercurial によるフック上書きをしていますフックすることでフックにすることもで きますしりにいをえることもできます

つかのフックしたマシンないしhgrc  ファイルしたとしても利用によるフック上書きが われるがあることをしておくがあります

10.2.4 Ensuring that critical hooks are run

メンバ実施してしくないについてめたしたいこともにはあるかもしれませんえばてのチェンジセットにはテストっていてしいうかもしれませんこの要望するために hgrc  ファイフックしたとしてもモバイル PC からアクセスするにはしませんしカルユにとってもフック上書きによってです

プロジェクトにおけるMercurial 利用としてメンバするにはたすように されたすることでフックによる利用代替することが

方法つとしてシャルエンジニアリングわせによるものがありますアクセスアカウント アカウントされたリポジトリメンバネットワpush できるようにしますがそのアカウン ログインしたりシェルコマンドしたりできないようにしますこのままではメンバゴミむようなチェ ンジセットコミットです

メンバpull するへとかがチェンジセットpush したそのチェンジセットされるテスト 実施2 テストらなければそのチェンジセットしますメンバがこのフィルタサからしかチェンジセット pull をしないのであればメンバpull するてのチェンジセットされていることがされま

10.3 Care with pretxn hooks in a shared-access repository

くのによりされているリポジトリしてフックによるする実施には

Mercurial リポジトリロックけるのはリポジトリみをだけでありロックしてうのは Mercurial 部分だけですロックみによるリポジトリぐこと いのします

Mercurial 順序っていますからリポジトリからのみのロックあり ませんMercurial リポジトリからにはロックしていませんロックとしないこの きくさせています

しかしながら、「ロックされないということはそれをらないときなえにトラブル っていますこのについてするにはリポジトリへのチェンジセットおよびそ れらチェンジセットしをMercurial がどういったうかについてとなりま

Mercurial メタデにはファイルメタデしますfilelog メタデ manifest これにはfilelog したしいへのポインタまれます)、そして changelog これにはmanifest したしいへのポインタまれますされますファイルへの Mercurial ファイルトランザクションログしますMercurial により ランザクションされるにはトランザクション始時サイズにまでファイルめられま

Mercurial メタデにはchangelog んだでそのファイルみをいます にはんだ changelog からmanifest filelog 部分にしかアクセスしないので むことはありません

つかのフックpretxncommit pretxnchangegroupトランザクションされますこの てのメタデみですがMercurial トランザクションすことでたにされたするこ とができます

トランザクションチェンジセットしておらずそのため するとみなすことができないことか トランザクションされるフックまでにするしていないチェンジセット タデしてしているによりされるしますフックくなるこの くなります

10.3.1 The problem illustrated

pretxnchangegroup フック約用リポジトリでのチェンジセットビルドテストするの していますこのビルドさせる約用リポジトリされないことをしますしか pretxnchangegroup フックによるテスト利用pull できてしまうようではテスト有用くなってしまいますリポジトリいをたない利用ビルドさせるテスト実施 リポジトリへとしてしまうからです

このようなへのリポジトリ利用してしまうことですリポジトリ からのチェンジセットpush してもpull はできないようにしますpreoutgoing フックでそのようなしま )。しいチェンジセットにおけるビルドないしテストしたならばそのチェンジセットリポジトリ push するようにchangegroup フック利用はそちらのリポジトリから pull できるようにしましょ

このようなされたボトルネックけることはあまりアイディアではなく (XXXX ?)In practice, putting a centralised bottleneck like this in place is not often a good idea トランザクション 3 になりませんチェンジセットよりもそれをテストするのにするではプロジェクトきさ および ルドテストするするほどにより素早りこめますXXXXX ???? As the size of a project—and the time it takes to build and test—grows, you rapidly run into a wall with this “try before you buy” approach, where you have more changesets to test than time in which to deal with them. けられないすべてが れた部分におけるフラストレションですXXXXXXX ???? The inevitable result is frustration on the part of all involved.

より化可push ビルドテスト実施してもらいpush ビルドテスト うことでてのチェンジセットであることをするというものですこのリポジトリにおけるチェンジセッ してされることがにあります

10.4 A short tutorial on using hooks

Mercurial フックけますhg commitしたされしたばかりのチェンジセットハッシュ するだけのフックいてみましょう


1  $ hg init hook-test
2  $ cd hook-test
3  $ echo ’[hooks]’ >> .hg/hgrc
4  $ echo ’commit = echo committed $HG_NODE’ >> .hg/hgrc
5  $ cat .hg/hgrc
6  [hooks]
7  commit = echo committed $HG_NODE
8  $ echo a > a
9  $ hg add a
10  $ hg commit -m ’testing commit hook’
11  committed aad7abef6e2d7e2c6d86cf554d5391d2d2efe3b2

Figure 10.1: A simple hook that runs when a changeset is committed

てのフック10.1 におけるしますhgrc  ファイル[hooks] セクションエントリしますになるイベントされるですてわかるようにフックにおいてはシェルコマンド きますにおけるHG_NODE してくださいいてMercurial フックしま

10.4.1 Performing multiple actions per event

10.4.1 すようなイベントしてフックしたいしばしばすることでしょう Mercurial ではフックすることでイベントへのフックになります フックピリオド.んだけることでいますえばcommit したMercurial commit.foo およびcommit.bar フックします


1  $ echo ’commit.when = echo -n "date of commit: "; date’ >> .hg/hgrc
2  $ echo a >> a
3  $ hg commit -m ’i have two hooks’
4  committed 8c33eeeac40ef9219a93dc3ea3da7bd3fa55896f
5  date of commit: Mon Jul 20 21:48:17 GMT 2009

Figure 10.2: Defining a second commit hook

あるイベントフックされているその順序するためにMercurial フックフックコマンドをこのされた順序しますでは commit.foocommit.bar これらのcommit します

しいフックするらかの使するのはアイディアですそうすることでそのフックをす るためのものかをしやすくなりますフックしたフックエラメッセされますか フックしたしてからヒントることができますしては10.4.2  してく ださい)。

10.4.2 Controlling whether an activity can proceed

ではコミットしたされるcommit フック使しましたこのフックした される Mercurial フックつですこれらのフックそのものにぼすことはありませ

Mercurial ではされるするまでのするイベントされていますこれらのイベント されるフック中断すべきかをすることができます

pretxncommit フックコミットしたコミットするされますえるならチェン ジセットメタデディスクまれてはいるもののトランザクションしていないされま pretxncommit フックトランザクションさせるのかあるいはすべきかをすることができま

pretxncommit フックとしてしたトランザクションコミットしますの commit フックされますpretxncommit フックとしてしたトランザクションされ チェンジセットメタデされcommit フックされません


1  $ cat check_bug_id
2  #!/bin/sh
3  # check that a commit comment mentions a numeric bug id
4  hg log -r $1 --template {desc} | grep -q "<bug *[0-9]"
5  $ echo ’pretxncommit.bug_id_required = ./check_bug_id $HG_NODE’ >> .hg/hgrc
6  $ echo a >> a
7  $ hg commit -m ’i am not mentioning a bug id’
8  transaction abort!
9  rollback completed
10  abort: pretxncommit.bug_id_required hook exited with status 1
11  $ hg commit -m ’i refer you to bug 666’
12  committed 940df882cbfe637969eb2c546c0de01f814b8849
13  date of commit: Mon Jul 20 21:48:18 GMT 2009

Figure 10.3: Using the pretxncommit hook to control commits

 10.4.2 フックコミットコメントバグ ID んでいることをしていますコメントバグ ID んでいるコミットしますそうでなければコミットされます

10.5 Writing your own hooks

-v オプションあるいはverbose “true” にして Mercurial するのがフックには有用であることに くかもしれませんこのようにして Mercurial することでそれぞれのフックするメッセしま

10.5.1 Choosing how your hook should run

フックするにはプログラム にはシェルスクリプト としてもできますがPython としても できそのMercurial プロセスされます

プログラムとしてフックするMercurial してにありますのため Mercurial コマンドすることもできますそのえにプログラムとしてのフックプロセスフック よりも4

Python によるプロセスフックての Mercurial API アクセスできプロセス生成するはありませんの フックよりもですフックとするくのMercurial コマンドからるよりもMercurial API からです

Python 利用にならないかされるPython でのフック選択すべきですしかしながら フックにするおそらくくのフックがそうですのであればシェルスクリプトでの

10.5.2 Hook parameters

Mercurial フックするにはされたパラメフックされますPython でのフックパラメ としてフックされますプログラムでのフックパラメとしてされま

フックPython シェルスクリプトのいずれであるかでフックパラメとそのまりま 5 パラメPython フックではとしてされますがフックしては “1” “true” としてないし “0” “false” としてされますフックパラメfoo というであるPython フック foo ですがフックHG_FOO となります

10.5.3 Hook return values and activity control

したフックフックプロセスフック“False” しなければなりませ 6 フッ フックプロセスフック“true” されますプロセスふっく したフックしたとされます

できるフック false true しま

10.5.4 Writing an external hook

hgrc  ファイルフックしたhgrc  ファイルしたフックシェルプロセスされそのシェルプロ セスによってされますこれはフックシェルコマンドラインいることができるというこ とをしています

フックリポジトリトディレクトリされます

フックパラメされますがにはされとして HG_された いられます

フックパラメとすればMercurial フックいませんそれぞれになるをし ているくのによってされる全体されるフックするにはこのつでしょう よりされるではフックされていたされていることをしてはいけませ

10.5.5 Telling Mercurial to use an in-process hook

プロセスフック hgrc  ファイルする文法フッ 7 のそれとはなりますフックpython:フックとして使するオブジェク 8 されたされていなければなりません

フックするモジュフックimport されますモジュPYTHONPATH しければきっと するです9

以下hgrc  ファイルしたする文法しています

1  [hooks]
2  commit.example = python:mymodule.submodule.myhook

Mercurial commit.example フックするにはmymodule.submodule import myhook という オブジェクトしてします

10.5.6 Writing an in-process hook

以下プロセスフックフックとしてはもしませんがフック API できま

1  def myhook(ui, repo, **kwargs):
2      pass

Python フック10 mercurial.ui.ui オブジェクトですリポジトリオブジェクトですが現在Mercurial では インスタンスmercurial.localrepo.localrepository ですこれらにくそのとしてされま されるされるフックしますがにおける **kwargs のようにとし 11 とですることができます

10.6 Some hook examples

10.6.1 Writing meaningful commit messages

有用コミットメッセという想像いものがあります 10.4 pretxncommit フック バイトよりもメッセでのチェンジセットコミットげます


1  $ cat .hg/hgrc
2  [hooks]
3  pretxncommit.msglen = test ‘hg tip --template {desc} | wc -c‘ -ge 10
4  $ echo a > a
5  $ hg add a
6  $ hg commit -A -m ’too short’
7  transaction abort!
8  rollback completed
9  abort: pretxncommit.msglen hook exited with status 1
10  $ hg commit -A -m ’long enough’

Figure 10.4: A hook that forbids overly short commit messages

10.6.2 Checking for trailing whitespace

コミットするフック利用でのするというものですとしては するしいには まれていてはならないというがありますとはおよびタブ tabにあることをしますくのみたいなものですがには むことからそれらがかれることをみます

precommit pretxncommit のいずれのフックでも通知することがですprecommit フック使した フックコミットファイルることができないのでリポジトリされたファイルてにしてしてし まいますそうするとファイル foo のみをコミットしたいでもbar ファイルんでいたな precommit フックでのチェックbar foo コミットげてしまいますこれではいけませ

pretxncommit フックするコミットトランザクションするまでチェックわれませんこのため コミットファイルだけにうことができますしかしコミットメッセしたであってもフック 12 トランザクションされてしまいますのでいたhg commitコマンドしたには コミットメッセするがあります


1  $ cat .hg/hgrc
2  [hooks]
3  pretxncommit.whitespace = hg export tip | (! egrep -q ’^+.*[ t]$’)
4  $ echo ’a ’ > a
5  $ hg commit -A -m ’test with trailing whitespace’
6  adding a
7  transaction abort!
8  rollback completed
9  abort: pretxncommit.whitespace hook exited with status 1
10  $ echo ’a’ > a
11  $ hg commit -A -m ’drop trailing whitespace and try again’

Figure 10.5: A simple hook that checks for trailing whitespace

 10.5 ではチェックするpretxncommit フックしていますこのフックいですが有用ですによりれかのファイルしてされた フックエラステタスしますがファイルするしませ 13 フックされていないにはわずにのみというれたっていま


1  $ cat .hg/hgrc
2  [hooks]
3  pretxncommit.whitespace = .hg/check_whitespace.py
4  $ echo ’a ’ >> a
5  $ hg commit -A -m ’add new line with trailing whitespace’
6  a, line 2: trailing whitespace added
7  commit message saved to .hg/commit.save
8  transaction abort!
9  rollback completed
10  abort: pretxncommit.whitespace hook exited with status 1
11  $ sed -i ’s, *$,,’ a
12  $ hg commit -A -m ’trimmed trailing whitespace’
13  a, line 2: trailing whitespace added
14  commit message saved to .hg/commit.save
15  transaction abort!
16  rollback completed
17  abort: pretxncommit.whitespace hook exited with status 1

Figure 10.6: A better trailing whitespace hook

 10.6 よりはですがより有用フックしていま 14 フックunified diff してする有無そのようなファイルします れにえてこのフックチェンジセットすることをしたして Mercurial トランザ クションしをえるコミットメッセしてそのファイルしますので したコミットにはhg commit -l filename 使ってコミットメッセ利用することができま

 10.6ファイルからperl しますこの方法はここにするにるだけのさと有用 っています15

1  perl -pi -e ’s,
s+$,,’ filename

10.7 Bundled hooks

Mercurial にはつかのフックされていますフックMercurial スツリhgext ディレクトリ れていますMercurial バイナリ使しているにはパッケインストMercurial インストした にあるhgext ディレクトリされています

10.7.1 acl—access control for parts of a repository

acl によりネットワしてチェンジセットpush することができますリポジトリ 全体することができますのでしてはされた部分ぼさないチェンジセットのみ push です

このpush チェンジセットコミットしたではなくpush 実施するアクセス いますするlock-downedするだけが へのチェンジセットpush されることをにしたいでなければこのフック使がありませ

Configuring the acl hook

まれるチェンジセットするためにacl フックpretxnchangegroup フックとしていますpretxnchangegroup フックとしていられることでチェンジセットによりされるファイルることができるためされているファイ へのチェンジセットしてはトランザクションしがわれます

1  [hooks]
2  pretxnchangegroup.acl = python:hgext.acl.hook

acl つのセクションされます

[acl] セクションにはフックうべきチェンジセットするsources エントリだけがされます はこのセクションするはありません

serve
リモトリポジトリからの http ないし ssh チェンジセットしていますこれはsources はこのしてです
pull
カルリポジトリからの pull チェンジセットしています
push
カルリポジトリからの push チェンジセットしています
bundle
リポジトリからの bundle チェンジセットしています

[acl.allow] セクションリポジトリへのチェンジセットされているしますこのセクション ないされていないでもチェンジセットをできますこのセクションする されていないチェンジセットができませんですのでこのセクションにしたてのチェン ジセットされます)。

[acl.deny] セクションリポジトリへのチェンジセットされている しますこのセクションされないてのチェンジセットされま 16

[acl.allow] および[acl.deny]セクション文法ですエントリリポジトリル相対でのファイルないし ディレクトリマッチングパタとなっています

以下ではdocwriter リポジトリdocs するpush のみがされている intern source/sensitiveディレクトリファイルするpush 17

1  [acl.allow]
2  docs/** = docwriter
3  
4  [acl.deny]
5  source/sensitive/** = intern
Testing and troubleshooting

acl フックしてみたいMercurial デバッグにしてしましょう--debug オプションあるい することもあるでしょうからhgrcファイルデバッグできることをおれな

1  [ui]
2  debug = true

これをにすることでによる push するするにすることでしょ

10.7.2 bugzilla—integration with Bugzilla

bugzilla コミットメッセバグ ID したBugzilla バグへのコメントいますこのフッ することでこのへのリモからのにはにこのフックされま

このフックBugzilla バグ以下のようなコメントします方法しますがコメントできま )。

1  Changeset aad8b264143a, made by Joe User <joe.user@domain.com> in
2  the frobnitz repository, refers to this bug.
3  
4  For complete details, see
5  http://hg.domain.com/frobnitz?cmd=changeset;node=aad8b264143a
6  
7  Changeset description:
8        Fix bug 10483 by guarding against some NULL pointers

このフックチェンジセットコミットメッセバグしているバグするする にありますフックうことでBugzilla バグからチェンジセットへとすることがになり ます

このフックりにしてよりBugzilla とのることもですえば:

Configuring the bugzilla hook

bugzilla フックhgrc  incoming フックとしてしなければなりません

1  [hooks]
2  incoming.bugzilla = python:hgext.bugzilla.hook

能特されたフックBugzilla この念頭いていないことからこのフックかとにな ります

フックってフックされるホストしてMySQL Python バインディングインス してくださいホストにおいてバイナリパッケたらない[Dus] からダウンロできま

フックhgrc  ファイル[bugzilla] セクションされます

version
インストされている Bugzilla ジョンBugzilla タベススキされますのでどのスキ使されているのかをっているがありますのところサポ 2.16 みです
host
Bugzilla されている MySQL しているホストMySQL bugzilla フック されるてのホストして接続しているがあります
user
MySQL への接続使するMySQL bugzilla フックされるてのホスト してこのでの接続しているがありますこのBugzilla 使するブルして ですこの定値MySQL における Bugzilla であるbugs です
password
MySQL におけるパスワこの平文されるためたないがこ かれたhgrcファイルくことがいようにしなければなりません
db
MySQL における Bugzilla タベこの定値MySQL における Bugzilla タベであるbugs です
notify
フックによるバグへのコメントBugzilla によるへの通知実施したい するコマンドさせるがありますするコマンドBugzilla インスト場所 しますが/var/www/html/bugzilla インストしたとすると以下のようになります

1  cd /var/www/html/bugzilla && ./processmail %s nobody@nowhere.com

Bugzilla processmail プログラムバグ ID フックにより %sバグ ID されますルアドレス としますこのプログラムディレクトリへのファイルしのとしますBugzilla フック インストされていないBugzilla インストされているprocessmail する方法 つけがあります

Mapping committer names to Bugzilla user names

bugzilla フックチェンジセットコミットしたルアドレスバグ Bugzilla として使することをみますこのさない[usermap] セクション使 してチェンジセットコミットしたルアドレスBugzilla することができま

[usermap] セクションルアドレスBugzilla します

1  [usermap]
2  jane.user@example.com = jane

hgrcファイル[usermap] することもできますがbugzilla フックusermap ファイルから むように指示することもできますえば usermap そのものを利用リポジトリ ることもできますそうすることで利用者自usermap することができますこのhgrc  ファイル 以下のようにされます

1   #  hgrc ファイル usermap ファイル
2  [bugzilla]
3  usermap = /home/hg/repos/userdata/bugzilla-usermap.conf

usermap するファイル以下のようになります

1  # bugzilla-usermap.conf  hg リポジトリ
2  [usermap]
3  stephanie@example.com = steph

Configuring the text that gets added to a bug

Mercurial テンプレすることでbugzilla フックするコメントすることがですつかの [bugzilla] セクションにおける hgrc  により、(テンプレ?)いをすることができま

strip
URL における部分パスa partial path for a URL生成するリポジトリにおけるパス パスしますえばにおけるリポジトリ/home/hg/repos にあ /home/hg/repos/app/tests リポジトリとするstrip 4 とすることでapp/tests という パスることができますbugzilla フックはこの部分パステンプレwebroot という 利用にします
template
使するテンプレトテキストしますチェンジセットえてこのテンプレでは hgwebにあるようにhgweb しますおよび webrootのようにstrip によって生成されるパス です使できます

これらにえてhgrc  ファイル[web] セクションbaseurl することができますBugzilla コメントからのチェ ンジセット使するリンクURL するとしてbugzilla フックテンプレにこの使 ますえば

1  [web]
2  baseurl = http://hg.domain.com/

bugzillaフック以下します18

1  [bugzilla]
2  host = bugzilla.example.com
3  password = mypassword
4  version = 2.16
5  #  リポジトリ /home/hg/repos にあるため
6  #   4 つのセパレ19
7  strip = 4
8  hgweb = http://hg.example.com/
9  usermap = /home/hg/repos/notify/bugzilla.conf
10  template = Changeset {node|short}, made by {author} in the {webroot}
11    repo, refers to this bug.
nFor complete details, see
12    {hgweb}{webroot}?cmd=changeset;node={node|short}
nChangeset
13    description:
n
t{desc|tabindent}
Testing and troubleshooting

bugzilla フックにおいてくあるBugzilla processmail スクリプトするものとコミットユ Bugzilla へのするものです

10.7.2  からのべたようにMercurial プロセスするprocessmail スクリプト でもありますprocessmail スクリプトBugzilla ディレクトリファイルらかの となるためBugzilla ファイルBugzilla するウェブサにありま

processmail にはsudo コマンド利用するなどしてしましょうsudoers フィル 以下します

1  hg_user = (httpd_user) NOPASSWD: /var/www/html/bugzilla/processmail-wrapper %s

このではhg_user processmail-wrapper プログラムhttpd_user することができま

processmail プログラムBugzilla インストしたディレクトリでのですがsudoers ファイルにはそのよう することができないのでこのようなのためのラッパスクリプトとなりますラッパスクリプト 以下のようになものです

1  #!/bin/sh
2  cd ‘dirname $0‘ && ./processmail "$1" nobody@example.com

processmailするルアドレスどのようなものでもいません

[usermap] しくされていないチェンジセットpush したbugzilla フックによりエラメッセ されますエラメッセ以下のようなものです

1  cannot find bugzilla user id for john.q.public@example.com

このメッセコミットしたルアドレスjohn.q.public@example.comBugzilla ではない john.q.public@example.comBugzilla するエントリrcsectionusermap されていないことを します

10.7.3 notify—send email notifications

Mercurial ウェブサによりてのリポジトリしてチェンジセットRSS されますが による通知選択されるいですnotify フックたなチェンジセットごとに アドレスてて通知います

notify テンプレフックですのでbugzilla フックされる通知カスタマイズすることがで きます

では notify フックチェンジセットごとのみますがしたりこのすることもできますによるレビュするされた URL クリックするよりもむほうが有用です

Configuring the notify hook

notify フックたなチェンジセットごとにすることもできれば、(hg pullないしhg pushによりリポジトリされるたなチェンジセットごとにすることもできます

1  [hooks]
2  #  チェンジセットごとに
3  changegroup.notify = python:hgext.notify.hook
4  #  チェンジセットごとに
5  incoming.notify = python:hgext.notify.hook

このフックhgrc  ファイル[notify] セクションされます

test
ではこのフックしませんそのわりするであろうメッセします false にすることでされるようになりますされている のはこの(/フックをきちんとするのにはかのなのでれた通知 してしまうためです
config
しているファイルへのパスこのhgrc  とはされているのでこのファイルそのも のをリポジトリすることもですこうすることでリポジトリした hg pushすことができます
strip
リポジトリする有無するリポジトリパスからパスりの20 えばリポジトリ/home/hg/repos にありnotify /home/hg/repos/shared/test という ポジトリしているstrip 4 することでnotify によるとのパタンマッチングパス shared/test したわれます
template
メッセ使されるテンプレトテキストこのテンプレメッセヘッダボディ します
maxdiff
メッセされるこのよりもきいめられま この定値300 されていますこの0 にした通知されま せん
sources
すべきチェンジセット由来このによりえばしてリポジト hg pushしたチェンジセットしてのみnotify 通知するといったをすることができま ここで由来10.8.3  してください

[web] セクションbaseurl しているテンプレwebroot として使することができま

notify 以下します

1   [notify]
2  #  るか
3  test = false
4  #  通知リポジトリかれている
5  config = /home/hg/repos/notify/notify.conf
6  #  リポジトリ /home/hg/repos にあるので "/" 4
7  strip = 4
8  template = X-Hg-Repo: {webroot}
n


9    Subject: {webroot}: {desc|firstline|strip}
n


10    From: {author}
n


11    
n


12    changeset {node|short} in {root}
n


13    details: {baseurl}{webroot}?cmd=changeset;node={node|short}
n


14    description:
n


15    
t{desc|tabindent|strip}
16  
17  [web]
18  baseurl = http://hg.example.com/

このにより以下のようなメッセ生成されます

1  X-Hg-Repo: tests/slave
2  Subject: tests/slave: Handle error case when slave has no buffers
3  Date: Wed,  2 Aug 2006 15:25:46 -0700 (PDT)
4  
5  changeset 3cba9bfe74b5 in /home/hg/repos/tests/slave
6  details: http://hg.example.com/tests/slave?cmd=changeset;node=3cba9bfe74b5
7  description:
8          Handle error case when slave has no buffers
9  diffs (54 lines):
10  
11  diff -r 9d95df7cf2ad -r 3cba9bfe74b5 include/tests.h
12  --- a/include/tests.h      Wed Aug 02 15:19:52 2006 -0700
13  +++ b/include/tests.h      Wed Aug 02 15:25:26 2006 -0700
14  @@ -212,6 +212,15 @@ static __inline__ void test_headers(void *h)
15  [...snip...]

Testing and troubleshooting

定値のままではnotify しませんのでtest false することをれないでくださ このうまではnotify するであろうメッセします

10.8 Information for writers of hooks

10.8.1 In-process hook execution

プロセスフック以下されます

1   def myhook(ui, repo, **kwargs):
2      pass

uimercurial.ui.ui オブジェクトrepo mercurial.localrepo.localrepository オブジェクト です**kwargs パラメされるフック以下っていま

プロセスフック、(フックリポジトリされるのとプロセスディレクトリせずにされま プロセスディレクトリさせるとMercurial API しがするりえますのでプロセスフック ディレクトリしてはいけません

プロセスフック“false” したフックしはしたものとみなされます“true” れるかされたフックしはしたものとみなされますするにはしたかかを通知 するえるのがいでしょう

チェンジセット ID Mercurial API しているバイナリハッシュではなくPython フック16 されるしてください16 ハッシュバイナリハッシュするにはmercurial.node.bin 使してく ださい

10.8.2 External hook execution

プロセスフックMercurial しているシェルされますそのためコマンドリダイ レクトといったシェル利用ですプロセスフック、(プロセスフックMercurial されたディレクトリ されるのとリポジトリルされます

フックしてされますHG_され されますえばnodeHG_NODEとなりま

“true” 1“false” 0されますHG_NODEHG_PARENT1 ないし HG_PARENT2 チェンジセット ID 16 しますチェンジセット ID” “0” ではなく としてされますHG_URL それがリポジトリURL しま

プロセスフック0 したフックしたものとみなされます0 フッ したものとみなされます

10.8.3 Finding out where changesets come from

カルリポジトリリポジトリチェンジセットわるフックこうることができるがあ りますMercurial チェンジセットがどのようにしてされたのかとくのどのリポジトリとのチェンジセット されるのかもっています

Sources of changesets

Mercurial リポジトリチェンジセットするフックしてないし通知しますこの Python によるプロセスフックsource というフックHG_SOURCE という Mercurial からフックされます

serve
リポジトリとのhttp ないし ssh チェンジセットされます
pull
あるリポジトリからリポジトリhg pullによりチェンジセットされます
push
あるリポジトリからリポジトリhg pushによりチェンジセットされます
bundle
あるリポジトリからリポジトリhg bundleによりチェンジセットされます

Where changes are going—remote repository URLs

Mercurial リポジトリでのチェンジセットにおける こうであればフックらせますこの Python によるプロセスフックurl というフックHG_URL という Mercurial からフックされます

このにわかるというわけではありませんhttp ないし ssh ビスしているリポジトリにお いてフックされたMercurial リポジトリすることはできませんがクライアントがどの ドレスから接続しているのかはすることができますこのようなURL 以下のいずれかのになりま

10.9 Hook reference

10.9.1 changegroup—after remote changesets added

このフックえばhg pullないしhg unbundleによってあらかじめしているチェンジセットリポジトリされたされますこれらのチェンジセットできますがこのフックづつされま このことはチェンジセットがまとまってされるかかにわらずincoming フックチェンジセットされるのとです

されたチェンジセットするされたビルドテストとしたりバグデタベリポジトリ たなチェンジセットんだことのへの通知といったものがこのフックされる

このフックされるパラメ:

node
チェンジセット IDされるチェンジセットIDこのチェンジセットからtip までtip てのチェンジセットhg pullhg pushないしhg unbundleによりされた ことになります
source
チェンジセット由来します10.8.3  してください
url
URLできるリポジトリ場所します10.8.3  してください

: incoming 10.9.3  )、prechangegroup 10.9.5  )、pretxnchangegroup 10.9.9 

10.9.2 commit—after a new changeset is created

このフックしいチェンジセットされたされます

このフックされるパラメ:

node
チェンジセット IDしくコミットされたチェンジセットID
parent1
チェンジセット IDしくコミットされたチェンジセットにとってとなるチェンジセットID
parent2
チェンジセット IDしくコミットされたチェンジセットにとってとなるチェンジセットID

: precommit 10.9.6  )、pretxncommit 10.9.10 

10.9.3 incoming—after one remote changeset is added

このフックえばhg pushによってあらかじめしているチェンジセットリポジトリされたされます チェンジセットされたでもこのフックされたチェンジセットされま

このフックchangegroup フック10.9.1  使することができますチェンジセットフック 便もありますがにはチェンジセットごとのフック便です

このフックされるパラメ:

node
チェンジセット IDしくされたチェンジセットID
source
チェンジセット由来します10.8.3  してください
url
URLできるリポジトリ場所します10.8.3  してください

: changegroup 10.9.1  )、prechangegroup 10.9.5  )、pretxnchangegroup 10.9.9 

10.9.4 outgoing—after changesets are propagated

このフックえばhg pushないしhg bundleによってリポジトリへとチェンジセットしたされ ます

チェンジセットしたことのへの通知などはこのフックされるつです

このフックされるパラメ:

node
チェンジセット IDリポジトリへとするチェンジセットID
source
由来します10.8.3  してください)。クライアントからのhg pull source serve となりますチェンジセットしようとするクライアントカルホスト クライアントじてsource bundlepull ないし push のいずれかになります
url
URLできるリポジトリ場所します10.8.3  してください

preoutgoing 10.9.7 

10.9.5 prechangegroup—before starting to add remote changesets

このフックリポジトリからのチェンジセットMercurial によりされるされま

このフックチェンジセットされるされるためフックされるチェンジ セットするることができませんこのフックしたチェンジセットされませ

このフックつにリポジトリするからのチェンジセットがありますえばカルホスト リポジトリできる利用hg pushできないようにないしするこ ともできます

このフックされるパラメ:

source
チェンジセット由来します10.8.3  してください
url
URLできるリポジトリ場所します10.8.3  してください

changegroup 10.9.1  )、incoming 10.9.3  )、pretxnchangegroup 10.9.9 

10.9.6 precommit—before starting to commit a changeset

このフックMercurial たなチェンジセットコミットするされますコミットされるファイルコミットメッセ ないしといったコミットするメタデMercurial えるされます

このフックつにチェンジセットれをでのたなチェンジセットコミットがあります ととしてはビルドテスト実施それらがしたにのみコミットするというものもありま

このフックされるパラメ:

parent1
チェンジセット IDディレクトリにとってとなるチェンジセットID
parent2
チェンジセット IDディレクトリにとってとなるチェンジセットID

コミットしたディレクトリたなチェンジセットとなります

commit 10.9.2  )、pretxncommit 10.9.10 

10.9.7 preoutgoing—before starting to propagate changesets

このフックMercurial されるチェンジセットするされます

チェンジセットリポジトリされるのをぐことはこのフックされるうです

このフックされるパラメ:

source
リポジトリするチェンジセット由来します10.8.3  してくださ )。このパラメしてはoutgoing source パラメする10.9.4  して ください
url
URLできるリポジトリ場所します10.8.3  してください

: outgoing 10.9.4 

10.9.8 pretag—before tagging a changeset

このフックタグ生成されるされますフックしたタグ生成されフック タグ生成されません

このフックされるパラメ:

local
タグリポジトリしてカルなもの.hg/localtags されるなのかMercurial されるもの.hgtags なのかをします
node
チェンジセット IDタグけされるチェンジセットID
tag
されるタグ

生成されるタグとなる precommit 10.9.2  およびpretxncommit 10.9.10  フックされま

tag 10.9.12 

10.9.9 pretxnchangegroup—before completing addition of remote changesets

このフックトランザクション このトランザクションリポジトリからのチェンジセットします するされますフックしたトランザクションてのチェンジセットリポジトリにおいて されますフックしたトランザクションされチェンジセットするされま

このフック、「ほぼされたチェンジセットするメタデアクセスできますがされるような 21 をこ れらのづいてうべきではありませんディレクトリすべきではありません

このフックMercurial プロセスリポジトリアクセスしてきたこのプロセスからは、「ほぼされ チェンジセットされたもののようにえますこのするまないとになりかねませ

このフックチェンジセットする利用ですフックしたトランザクションされ てのチェンジセットされます

このフックされるパラメ:

node
チェンジセット IDされるチェンジセットIDこのチェンジセットからtip までtip てのチェンジセットhg pullhg pushないしhg unbundleによりされた ことになります
source
チェンジセット由来します10.8.3  してください
url
URLできるリポジトリ場所します10.8.3  してください

changegroup 10.9.1)、incoming 10.9.3)、prechangegroup 10.9.5

10.9.10 pretxncommit—before completing commit of new changeset

このフックトランザクション このトランザクションたなチェンジセットコミットします する されますフックしたトランザクションチェンジセットリポジトリにおいて されますフックしたトランザクションされコミットするされま

このフック、「ほぼされたチェンジセットするメタデアクセスできますがされるようなをこれ らのづいてうべきではありませんディレクトリすべきではありません

このフックMercurial プロセスリポジトリアクセスしてきたこのプロセスからは、「ほぼ されたチェンジセットされたもののようにえますこのするまないとになりかねませ

このフックされるパラメ:

node
チェンジセット IDしくコミットされたチェンジセットID
parent1
チェンジセット IDしくコミットされたチェンジセットにとってとなるチェンジセットID
parent2
チェンジセット IDしくコミットされたチェンジセットにとってとなるチェンジセットID

precommit 10.9.6 

10.9.11 preupdate—before updating or merging working directory

このフックディレクトリにおけるhg updateないしhg merge実施されますこのフック Mercurial hg update実施hg updateないしhg mergeしたにしかされませんフック したhg updateないしhg mergeされますがフックしたhg update いし hg mergeされません

このフックされるパラメ:

parent1
チェンジセット IDディレクトリhg updateされるチェンジセットIDディレクト hg mergeされる現在チェンジセットじになります
parent2
チェンジセット IDディレクトリhg mergeされるにのみされますディレクト hg mergeとなるチェンジセットID

update 10.9.13 

10.9.12 tag—after tagging a changeset

このフックタグ生成されたされます

このフックされるパラメ:

local
タグリポジトリしてカルなもの.hg/localtags されるなのかMercurial されるもの.hgtags なのかをします
node
チェンジセット IDタグけされるチェンジセットID
tag
されるタグ

生成されるタグとなるこのフックってcommit フック10.9.2  されま

pretag 10.9.8 

10.9.13 update—after updating or merging working directory

このフックディレクトリにおけるhg updateないしhg mergeしたされますhg merge コマンドhgmergeファイルにおけるしたのでこのフックにはhg updateないしhg mergeえられます

error
hg updateないしhg mergeしたかかをします
parent1
チェンジセット IDしくコミットされたチェンジセットにとってとなるチェンジセットID
parent2
チェンジセット IDしくコミットされたチェンジセットにとってとなるチェンジセットID

preupdate 10.9.11