The Hackerlab at regexps.com

arch のフックによるプロセス自動運転

up: arch Meets hello-world
next: アーカイブ内のリビジョンのキャシングによる arch の速度向上
prev: リビジョンライブラリの進んだ利用

ある状況では, アーカイブへの変更を検知したときに何か動作させるのは大変有用です. 例えば、新しいリビジョンがチェックインされる場合にいつも、メールの通知を送りたいかもしれません.

arch でこれを引き起こすにはフック (hook) を使います. arch がアーカイブを修正するコマンドを実行するたびに、 arch は ~/.arch-params/hook の実行を試みます. ~/.arch-params/hook は実行可能 (executable) なものとして 設定せねばなりません.

フックに与えられた引数 $1 は実行された動作です。(例えば commit )

フックに与える引数

arch がアーカイブに影響するコマンドを実行する場合は常に、 実行された動作を第一の引数としてフックを走らせます. もし利用者が(make-archive のような)コマンドを走らせると, フックは複数回, 複数の引数 (make-archive, make-category, make branch と make-version 等) で呼び出されます.

引数として使われる可能性のあるものは次のとおりです:

import, commit, tag, make-archive, make-category, make-branch と make-version.

フックに渡される環境変数

適切な場合に, tla はさらにある変数をフックへ渡します。 tla に渡される変数の頭には ARCH_ が付きます. 渡される可能性のある変数は次のものを含みます:

変数名 : ARCH_ARCHIVE
説明 : 動作に関係するアーカイブ
使われる場所 : 全動作
例 : lord@emf.net--2003-example

変数名 : ARCH_CATEGORY
説明 : 作成されたカテゴリ名
使われる場所 : make-category
例 : hello-world

変数名 : ARCH_BRANCH
説明 : 作成されたブランチ名
使われる場所 : make-branch
例 : mainline

変数名 : ARCH_VERSION
説明 : 作成されたバージョン名
使われる場所 : make-version
例 : 0.1

変数名 : ARCH_REVISION
説明 : 係わるリビジョン名
使われる場所 : import, tag, commit
例 : patch-6

変数名 : ARCH_LOCATION
説明 : アーカイブが作成された位置
使われる場所 : make-archive
例 : /usr/lord/archives/2003-example

変数名 : ARCH_TREE_ROOT
説明 :
使われる場所 : commit, import
例 : /home/lord/wd

変数名 : ARCH_TAGGED_ARCHIVE
説明 :
使われる場所 : tag
例 :

変数名 : ARCH_TAGGED_REVISION
説明 :
使われる場所 :
例 :

フックの使用例

     #!/bin/sh

     if [ "$1" == "commit" ]; then
        tla push-mirror lord@emf.net--2003-example \
           lord@emf.net--2003-example-MIRROR;
        fi

さらに複雑なフックの使用例

     #!/bin/sh

     case "$1" in
        commit)
           case "$ARCH_CATEGORY" in
              hello-world)
                 case "$ARCH_BRANCH" in
                   mainline)
                        RELEASETYPE="stable"
                   ;;
                   devel)
                      RELEASETYPE="unstable"
                   ;;
                   *)

                 echo "The $RELEASETYPE version of Hello, World been upgraded. \
                    New versions are available at ftp.hello.com" |\
                    mailto hello-users@hello.com -s "Hello upgraded"
              ;;
              goodbye-world)
                 case "$ARCH_BRANCH" in
                   mainline)
                        RELEASETYPE="stable"
                   ;;
                   devel)
                      RELEASETYPE="unstable"
                   ;;
                      RELEASETYPE="[unknown]"
                   *)
                 esac;
                 echo "The stable version of Goodbye, Cruel World been upgraded. \
                    New versions are available at ftp.hello.com" |\
                    mailto hello-users@hello.com -s "Hello upgraded"
              ;;
            esac
        ;;
     esac

フックの堅牢性の問題

残念なことに, 宇宙の基本的な物理的性質のために, 新しいカテゴリ, ブランチ, バージョン, もしくはリビジョンに対して 一回だけフックが動作することを保証するのは不可能です. (多分稀ですが)うまく割り込みがあったり, システム障害があると, アーカイブへのある変更に対して, 動作を誘発するための通知が 複数回起こり得ます.

従って、不測の事態に対して堅牢であるように動作させるべきです.

さらに、arch が共同作業的に実行されてる場合、 フックは同時多発的に動作するかもしれません. つまりフックを使うプロジェクトはフックが同時に存在するコピーで走れるように注意すべきです.

arch Meets hello-world: A Tutorial Introduction to The arch Revision Control System
The Hackerlab at regexps.com