第9章 フックとレシピ集

目次

フック
レシピ集
私の過去を返して!
プロジェクトツリーにいながらにして分岐したい
オフラインで分岐を作ってそちらにスイッチしたい
いまいるプロジェクトツリーの内容を tar ファイルに固めたい
いまいるプロジェクトツリーの中のソースファイルを grep し たい

この章ではフックスクリプトと、よく利用される GNU arch のレシ ピについて説明する。

フック

ある種の重要なできごとが起こった時に、それに連動する形であら かじめ登録しておいた処理が実行されると都合がよいことがよくある。こ のような処理をフックと言う。これは別に GNU arch に限った話ではない。 ソフトウェアに限った話ですらない。腰にぶら下げる万歩計を考えて見れ ばいい。足を一歩踏み出すたび、万歩計はカウントされる。これは足を一 歩踏み出すという行動に対するフックだと言える。フックには二つの要素 がある。ひとつはフックのトリガーとなる出来事、もう一つはフックの内 容だ。出来事のことをフックイベントと呼んだりする。

GNU arch でのフックイベントは以下のとおりである:

表 9.1. フックイベント一覧

フックイベントイベントの意味とタイミング
make-archive新しいアーカイブが作成された直後に発生
make-category新しいカテゴリが作成された直後に発生
make-branch新しいブランチが作成された直後に発生
make-version新しいバージョンが作成された直後に発生
precommitコミット直前に発生
commitコミット直後に発生
importインポート直後に発生
tag分岐作成の直後に発生

実際に呼び出されるフック用のプログラムは、 ~/.arch-params/hook である。どのイベントが起こった時でもこのプログ ラムが呼び出される。~/.arch-params/hook は実行可能ビットが設定され ている必要がある。

~/.arch-params/hook は唯一の引数をとり、これは上記で列挙した フックイベント文字列そのものである。たとえばコミット直後には:

~/.arch-params/hook commit

という形でフックが呼び出される。フックスクリプト中で引数の内 容によって分岐するようなシェルスクリプトにすることで各種フックイベ ント用の処理を切替えることができる。さらに必要に応じてフックは以下 の環境変数が設定された状態で呼び出される。

表 9.2. 設定される環境変数一覧

環境変数説明
ARCH_ARCHIVE 
ARCH_CATEGORY 
ARCH_BRANCH 
ARCH_VERSION 
ARCH_REVISION 
ARCH_LOCATION 
ARCH_TREE_ROOT 
ARCH_TAGGED_ARCHIVE 
ARCH_TAGGED_REVISION 

以下は hook ファイルの例である:

#!/bin/sh

if [ "$1" == "commit" ]; then
   echo
   "${ARCH_ARCHIVE}/${ARCH_CATEGORY}--${ARCH_BRANCH}--${ARCH_VERSION}--${ARCH_REVISION}
   created" \
   | mail octopus@bluegate.org
fi

より複雑な例は以下である:

#!/bin/sh

case "$1" in
    precommit)
        ;;
    commit)
        ;;
    …
esac