2

Git リポジトリも保持しているサーバーに Trac 1.0.1 をインストールしました。Git コミット メッセージに「修正 #3」などを含めて、Trac チケットをクローズできるようにしたいと考えています。これは非常に簡単なはずです。リポジトリにpost-receiveフックgit pushを含めることで、コードの一部 (Python スクリプトなど) をサーバーに対して実行することができます。しかし、どのコードを使用するのでしょうか?

4

1 に答える 1

5

しばらく走り回り、いくつかの行き止まりをたどった後 (このトピックについては漠然とした Trac Git ページや、バグ #7301が修正されるまで実際には動作しない (?!) Git プラグインを含む)、解決策を見つけました。

  1. 「Trac 環境のセットアップ」</a>の手順に従って、Git リポジトリを Trac に接続します。

  2. Trac の「Admin」セクションから、または編集して、 Commit Ticket Updaterプラグインを有効にしtrac.iniます。

  3. post-receiveGit リポジトリの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

  4. このpost-receiveファイルを実行可能にします。

これは、Repository Administration pageで提供されているアプローチに触発されており、受信後スクリプトですべての新しいコミットを取得することに関するこの SO の回答と組み合わされています。このスクリプトは長いですが、複数のコミットをプッシュしたり、現在チェックアウトされているブランチ以外のブランチにコミットをプッシュしたりするときに、正しく動作すると思います。(リポジトリ管理ページにあるスクリプトは、このような状況では正しく動作しませ。HEAD からの最新のコミット メッセージのみを参照します。)

このセットアップ プロセスの後、「fixes #7」のような文字列を含む Git コミットは、Trac 内の対応するチケットを閉じます。Commit Ticket Updater ページにリストされているオプションを使用して、これを少し構成できます。commit_ticket_update_envelope具体的には、 ;の値を変更したい場合があります。完全に明確ではありませんが、「Refactored MyAwesomeClass [fixes #42]」のように、コマンドを角括弧で囲む必要があるようにデフォルトが設定されていると思います。

于 2013-04-07T16:16:18.873 に答える