Redmineのプロジェクト設定のタイミングでリポジトリの自動生成というのがかっこいいのですが、そのような機能はありません。仕方ないので、Redmineの設定をcronで監視し、内容が変更されたら、自動生成するという方法にします。
また、Redmine.pmにはプロジェクトの略称とリポジトリ名が同じでなければならないという制限がありました。これをとっぱらいます。自動生成の機能もこれに合わせたものになります。
Redmineにはコメントなしのコミットはできないようにします。
Redmineの更新確認は5分毎におこないます。
自動生成のスクリプトを登録します。 †
- スクリプト用のディレクトリの作成
sudo mkdir /opt/bin
- スクリプト ファイルの作成
cat <<EEOOFF | sudo tee /opt/bin/mkrepo
#!/bin/sh
# リポジトリの元ディレクトリ
_SVNADMIN="/opt/redmine/subversion/bin/svnadmin"
_SVNCOMMAND="/opt/redmine/subversion/bin/svn"
_PRECOMMIT="hooks/pre-commit"
_SVNLOOK="/opt/redmine/subversion/bin/svnlook"
_HTTPCONF="/opt/redmine/apache2/conf/httpd.conf"
BASE_=/opt/redmine
MYSQL_=\${BASE_}/mysql/bin/mysql
USER_=root
PASS_=bitnami
DB_=bitnami_redmine
func_regist()
{
# (1) 引数チェック
if [ \$# != 1 ]; then
echo \$_USAGE 1>&2
exit 0
fi
# (3) 同名リポジトリのチェック
if [ -d "\$1" ]; then
echo "error: Repository \$1 is exist." 1>&2
exit 0
fi
# (4) コマンド存在チェック
if [ ! -x "\$_SVNADMIN" -o ! -x "\$_SVNCOMMAND" ]; then
echo "Fatal error: Subversion command \$_SVNADMIN or \$_SVNCOMMAND are not exist!" 1>&2
exit 0
fi
# (5) ファイル存在チェック
if [ ! -f "\$_HTTPCONF" ]; then
echo "error:Apache conffile \$_HTTPCONF is not exist." 1>&2
exit 0
fi
# (5-1) ユーザ名とグループ名を取得
_USER=\`grep -i "^User.*" "\$_HTTPCONF" | awk '{print \$2}'\`
_GROUP=\`grep -i "^Group.*" "\$_HTTPCONF" | awk '{print \$2}'\`
# (6) リポジトリ用のディレクトリを作成
if ! mkdir -p "\$1" ; then
echo "error: Cannot create directory \$1." 1>&2
exit 0
fi
# (7) リポジトリの初期化
if ! \$_SVNADMIN create "\$1" ; then
echo "error: svnadmin create failed1." 1>&2
exit 0
fi
# (8) リポジトリのデフォルト構成をコミット
# (8-1) インポート用ディレクトリの作成
tmpdir=\`mktemp -d\`
trap "rm -rfv \${tmpdir}" EXIT
# (8-2) インポート
if ! mkdir -p "\${tmpdir}/trunk" ; then
echo "error: Cannot create directory \${tmpdir}/trunk." 1>&2
exit 0
fi
if ! mkdir -p "\${tmpdir}/branches" ; then
echo "error: Cannot create directory \${tmpdir}/branches." 1>&2
exit 0
fi
if ! mkdir -p "\${tmpdir}/tags" ; then
echo "error: Cannot create directory \${tmpdir}/tags." 1>&2
exit 0
fi
if ! \$_SVNCOMMAND import "\${tmpdir}" file://\$1 -m "Initial import." ; then
echo "error: svn import failed." 1>&2
exit 0
fi
# (9) pre-commit
cat > \$1/\$_PRECOMMIT <<EOF
#!/usr/bin/python
"""
Subversion pre-commit hook which currently checks that the commit contains
a commit message to avoid commiting empty changesets which tortoisesvn seems
to have a habbit of committing.
Based on http://svn.collab.net/repos/svn/branches/1.2.x/contrib/hook-scripts/commit-block-joke.py and hooks/pre-commit.tmpl
Hacked together by Jacques Marneweck <jacques@php.net>
\\\$Id\\\$
"""
import sys, os, string
SVNLOOK='\$_SVNLOOK'
def main(repos, txn):
log_cmd = '%s log -t "%s" "%s"' % (SVNLOOK, txn, repos)
log_msg = os.popen(log_cmd, 'r').readline().rstrip('\n')
if len(log_msg) < 10:
sys.stderr.write ("Please enter a commit message which details what has changed during this commit.\n")
sys.exit(1)
else:
sys.exit(0)
if __name__ == '__main__':
if len(sys.argv) < 3:
sys.stderr.write("Usage: %s REPOS TXN\n" % (sys.argv[0]))
else:
main(sys.argv[1], sys.argv[2])
EOF
chmod +x "\$1/\$_PRECOMMIT"
# リポジトリのディレクトリ所有権を変更
chown -R \$_USER:\$_GROUP "\$1"
}
for file in \$( \${MYSQL_} --user=\${USER_} --password=\${PASS_} --database=\${DB_} --skip-column-names --silent -e 'select url from repositories where type="Repository::Subversion"' )
do
dir=
case \$file in
file://*) dir=\${file#file://};;
esac
if [ ! -z "\${dir}" ]; then
if [ ! -e "\$dir" ]; then
func_regist \${dir}
fi
fi
done
EEOOFF
- 実行権限の変更
sudo chmod +x /opt/bin/mkrepo
- cronへの登録
tmpfile=`mktemp`
cat << EEOOFF > ${tmpfile}
*/5 * * * * /opt/bin/mkrepo
EEOOFF
sudo crontab ${tmpfile}
rm ${tmpfile}