パスワードを忘れた? アカウント作成
467223 journal

Ab.の日記: Trac/SVN いじり

日記 by Ab.
Subversion は commit log を後から書き換えることが出来るので、書き換えたらメールが飛ぶようにしてみました。
そういう処理は post-revprop-change のフックで行うもので、実際サンプルのテンプレートには propchange-email.pl なるスクリプトの呼び出しが書かれてるのですが、その propchange-email.pl は何故か現在の配布セットの中には入ってません!
で、まぁ適当にググって出てきた http://svn.collab.net/repos/svn/tags/1.3.2/tools/hook-scripts/propchange-email.pl.in を拾ってきて、@~~@ のパターンを探して手 configure。
まぁ2箇所しかなかったので FreeBSD だとこんな感じです。

--- propchange-email.pl.in Tue Jun 15 05:29:22 2004
+++ propchange-email.pl    Tue May 27 14:25:42 2008
@@ -46,10 +46,10 @@
my $sendmail = "/usr/sbin/sendmail";

# Svnlook path.
-my $svnlook = "@SVN_BINDIR@/svnlook";
+my $svnlook = "/usr/local/bin/svnlook";

# Svn path.
-my $svn = "@SVN_BINDIR@/svn";
+my $svn = "/usr/local/bin/svn";

# Since the path to svn depends upon the local installation
# preferences, check that the required programs exist to insure that

で、その propchange-email.pl を適当に配置して実行パーミッション立ててから post-revprop-change フックの作成。
あ、これをやるときは pre-revprop-change の方も有効にして svn:log の書き換えを許可してやることを忘れずに。

Index: trunk/root/root-svn/hooks/post-revprop-change
===================================================================
--- trunk/root/root-svn/hooks/post-revprop-change.tmpl (リビジョン 27)
+++ trunk/root/root-svn/hooks/post-revprop-change (リビジョン 91)
@@ -54,3 +54,6 @@
ACTION="$5"

-propchange-email.pl "$REPOS" "$REV" "$USER" "$PROPNAME" watchers@example.org
+export LANG=ja_JP.UTF-8
+export LC_TIME=C
+/root/root-svn/hooks/propchange-email.pl --from rootsvn@localhost -s "rootsvn:" "$REPOS" "$REV" "$USER" "$PROPNAME" foo@bar.baz.jp
+/root/bin/trac-resyncher /www/trac "$REV"

で、実は revprop を書き換えても Trac には書き換えられた事が分からないので resync してあげないと timeline とか changeset view に反映されません。
手で毎回 trac-admin resync してもいいんですが、commit log に関連するチケットを入れ忘れたときとか、やっぱり後から changeset 見てチケットに飛びたいから ticket:20 close とか入れておきたい訳ですよ。
そんな感じで何度か svn:log の revprop をいじっているうちにこれは自動化しよう、と。
というわけで、post-revprop-change から trac-admin を呼び出してあげるんですが、そのままだと local では svn を実行したユーザー、remote からだと svnserv の権限で trac-admin を起動することになり、まぁパーミッション的に問題なければいいんですが、うちの場合は問題があったのでちょっと一発プログラムを間に挟んでます。それが trac-resyncher。

#include <stdio.h> /*
set -x
cc -Wall -o bin/trac-resyncher trac-resyncher.c    \
&& chown www:www bin/trac-resyncher        \
&& chmod ug+s bin/trac-resyncher        \
&& exit 0
exit 1
*/
#include <unistd.h>
#include <stdlib.h>

int
main(int argc, char **argv)
{
  if (argc != 3) {
    fprintf(stderr, "%s: 2 arguments are required.\n", argv[0]);
    return 1;
  }

  setuid(geteuid());
  setgid(getegid());
  execl("/usr/local/bin/trac-admin", "trac-admin", argv[1], "resync", argv[2], NULL);
  perror("execl(trac-admin) failed: ");
  return 1;
}

こんな感じでまぁ適当に suid/sgid してあげた実行ファイルを挟んで Trac を動かしてるユーザーの権限で trac-admin resync をかましてめでたしめでたし。

この議論は賞味期限が切れたので、アーカイブ化されています。 新たにコメントを付けることはできません。
typodupeerror

最初のバージョンは常に打ち捨てられる。

読み込み中...