May 26, 2007

[Subversion] Subversion と Trac の連携にチャレンジ (2)

Subversion の Issue Tracker 連携機能は便利なのだけれど、ディレクトリ毎にいくつものプロパティを設定しなければいけないという面倒さがある。 auto-props を使用できれば良いのだが、auto-props は残念なことにファイル専用でディレクトリには適用されない。 ディレクトリを作成する度にプロパティを手動で設定するのは馬鹿らしいので、自動化を考えてみた。

自動化の方法

auto-props
ディレクトリには auto-props は適用されない。不可能。
svn propset を CRON で実行。
ディレクトリ作成直後に連携機能が使用できない。さすがに /etc/cron.minutely というのは無いし。
pre-commit hook を利用
pre-commit で svn co、svn propset、svn commit を実施するとコンフリクトが発生して元の svn commit が失敗してしまう。NG。ちなみに、svn propset は working copy が無いと動作しないので、面倒でも一度 svn co しないと propset できない(Subversion subversion Issue 2238 で議論されている)。ちなみに、proplist や propget は working copy 無しでも実行できる。
post-commit hook を利用
これが唯一の方法?? post-commit で svn co、svn propset、svn commit を行う。パフォーマンス的には問題だが、所詮個人用途のサーバだから大丈夫だろう。

post-commit で bugtraq プロパティ追加の自動化

/var/svn/hooks/post-commit

というわけで、post-commit 用のスクリプトを作成してみた。 善し悪しは別として、bugtraq:url プロパティが設定されていないディレクトリ(もしくはその直下のファイル)が commit された際に自動的に bugtraq 関連のプロパティをセットする。 ユーザ情報を埋め込まないと行けないのが難と言えば難だが、他に方法が無かったので必要悪ということで諦めた。 ちょっとややこしくなってしまったが、結果的に期待通りの動作が得られたので良しとする。

# cat /var/svn/hooks/post-commit
#!/bin/sh
# POST-COMMIT HOOK

BUGTRAQ_PROPS=/var/svn/bugtraq_props.conf
TMP_DIR=/var/tmp/svn
SVN_REPOSITORY=file:///var/svn/
SVN_USER=me
SVN_PASSWORD=mypassword
SVNLOOK=/usr/bin/svnlook
SVN=/usr/bin/svn
REPOS="$1"
REV="$2"

#-----------------------------------------------------------------
# propset bugtraq conrigurations to directories
#-----------------------------------------------------------------
configureBugtraqProps() {

  #---------------------------------------------------------------
  # load configuration for bugtraq.
  # if configuration file does not exist, do nothing.
  #---------------------------------------------------------------
  test -x $BUGTRAQ_PROPS || return
  . $BUGTRAQ_PROPS
  CHANGED_DIRS="$1"
  for i in $CHANGED_DIRS;
  do

    #-------------------------------------------------------------
    # if "bugtraq:url" prop is not set, assume that this directory
    # has no bagtraq configuration
    #-------------------------------------------------------------
    BUGTRAQ_URL=`$SVNLOOK propget -r "$REV" "$REPOS" "bugtraq:url" "$i"`
    if [ "$BUGTRAQ_URL" == "" ]
    then

      #-----------------------------------------------------------
      # unfortunately, svn propset command needs working copy of repository.
      # so, checkout target directory to temporary working copy
      #-----------------------------------------------------------
      rm -rf $TMP_DIR
      mkdir $TMP_DIR
      cd $TMP_DIR
      $SVN checkout "$SVN_REPOSITORY$i" --non-recursive -r HEAD --username "$SVN_USER" --password "$SVN_PASSWORD" --non-interactive

      #-----------------------------------------------------------
      # propset to target directory
      #-----------------------------------------------------------
      $SVN propset "bugtraq:url" "$bugtraq_url" `ls $TMP_DIR`
      $SVN propset "bugtraq:label" "$bugtraq_label" `ls $TMP_DIR`
      $SVN propset "bugtraq:message" "$bugtraq_message" `ls $TMP_DIR`
      $SVN propset "bugtraq:warnifnoissue" "$bugtraq_warnifnoissue" `ls $TMP_DIR`
      $SVN propset "bugtraq:number" "$bugtraq_number" `ls $TMP_DIR`
      $SVN propset "bugtraq:append" "$bugtraq_append" `ls $TMP_DIR`
      $SVN propset "bugtraq:logregex" "$bugtraq_logregex" `ls $TMP_DIR`

      #-----------------------------------------------------------
      # commit prop changes
      #-----------------------------------------------------------
      $SVN commit `ls $TMP_DIR` --username "$SVN_USER" --password "$SVN_PASSWORD" --message "set bugtraq props"

      #-----------------------------------------------------------
      # clean up temporary working copy
      #-----------------------------------------------------------
      rm -rf $TMP_DIR
    fi
  done
}

CHANGED_DIRS=`$SVNLOOK dirs-changed -r "$REV" "$REPOS"`
configureBugtraqProps "$CHANGED_DIRS"
exit 0

/var/svn/bugtraq_props.conf

この設定は環境に併せて適宜変更する必要がある。

# cat /var/svn/bugtraq_props.conf
bugtraq_url=https://www.example.com/trac/ticket/%BUGID%
bugtraq_label="Ticket ID"
bugtraq_message="#%BUGID%"
bugtraq_warnifnoissue=false
bugtraq_number=true
bugtraq_append=false
bugtraq_logregex="#?(\d+)"

Posted in Subversion | このエントリーをはてなブックマークに追加 | この記事をクリップ! livedoor クリップ |