Git リポジトリも保持しているサーバーに Trac 1.0.1 をインストールしました。Git コミット メッセージに「修正 #3」などを含めて、Trac チケットをクローズできるようにしたいと考えています。これは非常に簡単なはずです。リポジトリにpost-receive
フックgit push
を含めることで、コードの一部 (Python スクリプトなど) をサーバーに対して実行することができます。しかし、どのコードを使用するのでしょうか?
1 に答える
しばらく走り回り、いくつかの行き止まりをたどった後 (このトピックについては漠然とした Trac Git ページや、バグ #7301が修正されるまで実際には動作しない (?!) Git プラグインを含む)、解決策を見つけました。
「Trac 環境のセットアップ」</a>の手順に従って、Git リポジトリを Trac に接続します。
Trac の「Admin」セクションから、または編集して、 Commit Ticket Updaterプラグインを有効にし
trac.ini
ます。post-receive
Git リポジトリのhooks
ディレクトリに、次の内容のファイルを作成します。#!/usr/bin/ruby ARGF.lines do |line| fields = line.split oldrev = fields[0] newrev = fields[1] refname = fields[2].chomp if oldrev =~ /^0+$/ revspec = newrev else revspec = oldrev + '..' + newrev end other_branches = `git for-each-ref --format='%(refname)' refs/heads/ | grep -F -v "#{refname}"` other_branches = other_branches.chomp.gsub /[\r\n]+/, ' ' commits = `git rev-parse --not #{other_branches} | git rev-list --stdin #{revspec}` commits.each_line do |commit| system "trac-admin .../trac changeset added '(default)' #{commit.chomp}" end end
もちろん、「.../trac」を Trac インストールへの絶対パスに置き換えます。
私は実際にVirtualenvを通じて Trac を使用しています。あなたもそうである場合は、これをファイルの先頭に追加します。
require 'tempfile' def virtualenv_system(cmd) script = Tempfile.new('post_receive') script.write 'source .../virtualenvs/trac/bin/activate' script.write "\n" script.write cmd script.close system "bash #{script.path}" script.unlink end
system
呼び出しをに置き換えますvirtualenv_system
。この
post-receive
ファイルを実行可能にします。
これは、Repository Administration pageで提供されているアプローチに触発されており、受信後スクリプトですべての新しいコミットを取得することに関するこの SO の回答と組み合わされています。このスクリプトは長いですが、複数のコミットをプッシュしたり、現在チェックアウトされているブランチ以外のブランチにコミットをプッシュしたりするときに、正しく動作すると思います。(リポジトリ管理ページにあるスクリプトは、このような状況では正しく動作しません。HEAD からの最新のコミット メッセージのみを参照します。)
このセットアップ プロセスの後、「fixes #7」のような文字列を含む Git コミットは、Trac 内の対応するチケットを閉じます。Commit Ticket Updater ページにリストされているオプションを使用して、これを少し構成できます。commit_ticket_update_envelope
具体的には、 ;の値を変更したい場合があります。完全に明確ではありませんが、「Refactored MyAwesomeClass [fixes #42]」のように、コマンドを角括弧で囲む必要があるようにデフォルトが設定されていると思います。