Overview

svn precommit フックのサンプル

サンプルです。 日本語のものを見かけなかったんで日本語で掲載してみました。

#!/bin/sh
# このサンプルでは、pre-commit hookを利用して、リポジトリに新規追加されるファイルに
# needs-look属性が設定されているかを確認します。
# 対象ファイルの取得は svnlookを使用し、追加ステータスかどうかと、パスや拡張子による絞り込みは grepコマンドでおこないます。

REPO="$1"
TXN="$2"

LANG=ja_JP.UTF-8
export LANG
SVNLOOK=/usr/bin/svnlook

# PTNは環境に合わせてパスを変更してください
# また、希望に合わせてファイルフィルタリングしている正規表現も変更します。
# ここでは、リポジトリ配下にある、hooktarget/ ディレクトリ配下(サブディレクトリ含む)で、doc,docm,docx,xls,xlsx,xlsmで終わるファイルが対象になります。
# hooktargetはリポジトリURLの一部ではなく、ディレクトリです。
PTN="hooktarget/.*\.("
PTN=$PTN"doc[xm]?|xls[xm]?"
PTN=$PTN")$"
# 全ファイルを対象にしたいのであれば次のようにします。
# PTN=".*"
# そして拡張子だけを指定したい場合は次のようにします。
# PTN=".*\.txt"


logfile=/tmp/svnprecommit.log
## フック中の出力を標準出力に出してもクライアントから見ることはできません。
## ( エラー時は標準エラー出力に出力した内容がクライアントに送られます )
## デバッグ用に確認したいのであれば、なにかファイルなどにリダイレクトしておけばいいでしょう。
# echo " hook start "$REPO >> $logfile
# echo $PTN >> $logfile

## svnlookの確認の例

# echo "" >> $logfile
# echo " svnlook: " >> $logfile
# "$SVNLOOK" changed -t "$TXN" "$REPO" >> $logfile

## PTNに設定したフィルタがどう動いているか確認する例
# echo " filter :" >> $logfile
# "$SVNLOOK" changed -t "$TXN" "$REPO" | \
#   grep -E "^A.*[^/]$" | \
#   grep -E -i "$PTN" >> $logfile

## SVNLOOKが何を出力しているのか見る例 (ステータス Aで絞り込んでいます)
# while read line
# do
#  echo $line >> $logfile
# done <<END_
# `"$SVNLOOK" changed -t "$TXN" "$REPO" | grep -E "^A.*[^/]$" | awk '{print $2}'`
# END_


EX_CODE=0

while read line
do 
  # echo "target file is ${line} " >> $logfile
  # echo " check svn:needs-lock prop " >> $logfile

  if [ "${line}" != "" ]; then
     "$SVNLOOK" propget -t "$TXN" "$REPO" svn:needs-lock "${line}" 2> dev/null 1> /dev/null
     result=$?
     # echo "result: $result" >> $logfile

     if [ "$result" -ne "0" ]; then
        let EX_CODE=1
        # print error message
        echo "${line} に svn:needs-lock 属性が設定されていません。" >&2
     fi
  fi
done <<END_
`"$SVNLOOK" changed -t "$TXN" "$REPO" | grep -E "^A.*[^/]$" | grep -E -i "$PTN" | awk '{print $2}'`
END_

## readに流す場合、whileの前にしこむのが一般的ですが、パイプを利用してそれをおこなうと、
## プロセス的に whileの中での変更が外にでてきません。このため、後ろからのリダイレクトをおこなっています。
## 見栄えが気に入らないと前に持っていけば、EX_CODEの値は正しく返されません。

# echo "-- hook end --" >> $logfile
# echo $EX_CODE >> $logfile
if [ "$EX_CODE" --ne "0" ]; then
   exit $EX_CODE
fi

exit 0
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.