#!/bin/sh
##
## SVN: post-commit hook script
## Copyright (c) 2007 SATOH Fumiyasu @ OSS Technology Co., Japan
##                    <http://www.osstech.co.jp/>
##
## License: GNU General Public License version 3
## Date: 2007-07-12, since 2007-05-28
##

set -u

LC_ALL=ja_JP.UTF-8
export LC_ALL

## Options
## ======================================================================

svn="/usr/bin/svn"
svnlook="/usr/bin/svnlook"
sendmail="/usr/sbin/sendmail"

mail_from="ost-tech@osstech.co.jp"
mail_to="ost-tech@osstech.co.jp"
trac_env="/project/trac"
trac_uri="https://trac.osstech.co.jp/"
diff_maxlines="1000"

if [ $# -ne 2 ]; then
    echo "Usage: $0 REPOSITORY REVISION"
    exit 0
fi

commit_repos="$1"; shift
commit_rev="$1"; shift

## Main
## ======================================================================

## Retrieve commit info
## ----------------------------------------------------------------------

commit_date="`"$svnlook" date -r "$commit_rev" "$commit_repos" |sed 's/ (.*$//'`"
commit_author="`"$svnlook" author -r "$commit_rev" "$commit_repos"`"
commit_changed="`"$svnlook" changed -r "$commit_rev" "$commit_repos"`"
commit_log="`"$svnlook" log -r "$commit_rev" "$commit_repos"`"
commit_dir="`
    echo "$commit_changed" \
    |awk 'NR==1{p=$2} END{print p} {while(index($2,p)!=1){gsub(/[^\/]*\/*$/,"",p)}}'
`"

## Update hooks directory in repository
## ----------------------------------------------------------------------

if echo "$commit_changed" |egrep '^[A-Z][A-Z]? +hooks/' >/dev/null; then
    (cd "$commit_repos/hooks" && "$svn" update)
fi

## Trac
## ----------------------------------------------------------------------

"$commit_repos/hooks/trac-post-commit-hook" \
    -p "$trac_env" \
    -s "$trac_uri" \
    -r "$commit_rev" \
    -u "$commit_author" \
    -m "$commit_log"

## Mail
## ----------------------------------------------------------------------

cat <<EOF_MAIL |"$sendmail" -i -t -f "$mail_from"
From: $mail_from
To: $mail_to
Subject: SVN: r$commit_rev $commit_dir
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

Revision: $commit_rev
Author: $commit_author
Date: $commit_date
Log: ${trac_uri}changeset/$commit_rev
$commit_log

Changed:
$commit_changed

Changeset:
`
    "$svnlook" diff -r "$commit_rev" --no-diff-deleted "$commit_repos" \
    2>/dev/null \
    |head -n "$diff_maxlines"
`
EOF_MAIL

exit 0

