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}





トップ   差分 バックアップ リロード   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2013-12-16 (月) 10:35:39