Commits

Takahiro KITAHARA committed 8e13224

first commit

  • Participants

Comments (0)

Files changed (2)

+# 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

File samples/sh/pre-commit

+#!/bin/sh
+
+REPO="$1"
+TXN="$2"
+
+LANG=ja_JP.UTF-8
+export LANG
+SVNLOOK=/usr/bin/svnlook
+
+# you need change following lines with your environment and 
+# change PTN value for filtering you want hook.
+PTN="hooktarget/.*\.("
+PTN=$PTN"doc[xm]?|xls[xm]?"
+PTN=$PTN")$"
+# If you want to hook whole files you set PTN like following
+# PTN=".*"
+# and if you want to specify extension
+# PTN=".*\.txt"
+
+
+logfile=/tmp/svnprecommit.log
+## you can't see standout from hook, so if you want to see debug-print, 
+## you should redirect values to file.
+# echo " hook start "$REPO >> $logfile
+# echo $PTN >> $logfile
+
+## for check svnlook
+
+# echo "" >> $logfile
+# echo " svnlook: " >> $logfile
+# "$SVNLOOK" changed -t "$TXN" "$REPO" >> $logfile
+
+## for check your filter
+## The first grep check a file status is append. Second one filtering files with pattern you set to $PTN
+# echo " filter :" >> $logfile
+# "$SVNLOOK" changed -t "$TXN" "$REPO" | \
+#   grep -E "^A.*[^/]$" | \
+#   grep -E -i "$PTN" >> $logfile
+
+## for check to see SVNLOOK returns
+# 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_
+
+## !! caution !! Don't move this $SVNLOOK command to top of the 'do' statement, or you can't recieve EX_CODE value correctly. Because we use pipe. Command which piped will run on the other process.
+
+# echo "-- hook end --" >> $logfile
+# echo $EX_CODE >> $logfile
+if [ "$EX_CODE" --ne "0" ]; then
+   exit $EX_CODE
+fi 
+
+exit 0