Mercurial には、チェンジセット メッセージを投稿するフックと、チェンジセットをバグ追跡ソフトウェアにリンクするフックがあります。ブランチごとに個別のリポジトリを使用しています。ブランチが完成したら、それをアーカイブ リポジトリにプッシュし、元のリポジトリを削除して、リポジトリの Mercurial ページが古いリポジトリでごちゃごちゃにならないようにします。また、古いリポジトリが占めるスペースを再利用したいと考えています。変更セットが見つからない場合に既存の変更セットにリダイレクトするように Apache を構成したいと考えています。
たとえば、http://hg/hg/repo1/rev/c36b1c72fc6eが見つからない場合、以下を順番に試します。
http://hg/hg/repo1/rev/c36b1c72fc6e
http://hg/hg/repo2/rev/c36b1c72fc6e
http://hg/hg/repo3/rev/c36b1c72fc6e
http://hg/hg/archive/rev/c36b1c72fc6e
既存の変更セットが見つかるまで。
これを行うには mod_rewrite ルールを使用できるはずですが、うまくいきませんでした。これは私の最新の試みです:
RewriteEngine on
RewriteLog /var/log/httpd/rewrite.log
RewriteLogLevel 9
# Re-map URLs that aren't found
RewriteCond %{REQUEST_URI} !-U
RewriteRule ^/hg/repo1/(.*)$ http://hg/hg/archive/$1
上記の構成を使用した試みのログは次のとおりです。
(2) init rewrite engine with requested uri /hg/repo1/rev/c36b1c72fc6e
(3) applying pattern '^/hg/repo1/(.*)$' to uri '/hg/repo1/rev/c36b1c72fc6e'
(2) init rewrite engine with requested uri /hg/repo1/rev/c36b1c72fc6e
(3) applying pattern '^/hg/repo1/(.*)$' to uri '/hg/repo1/rev/c36b1c72fc6e'
(4) RewriteCond: input='/hg/repo1/rev/c36b1c72fc6e' pattern='!-U' => matched
(2) rewrite '/hg/repo1/rev/c36b1c72fc6e' -> 'http://hg/hg/archive/rev/c36b1c72fc6e'
(2) implicitly forcing redirect (rc=302) with http://hg/hg/archive/rev/c36b1c72fc6e
(1) escaping http://hg/hg/archive/rev/c36b1c72fc6e for redirect
(1) redirect to http://hg/hg/archive/rev/c36b1c72fc6e [REDIRECT/302]
(5) RewriteCond URI (-U) check: path=/hg/repo1/rev/c36b1c72fc6e -> status=302
(4) RewriteCond: input='/hg/repo1/rev/c36b1c72fc6e' pattern='!-U' => not-matched
(1) pass through /hg/repo1/rev/c36b1c72fc6e
(2) init rewrite engine with requested uri /repo1/rev/c36b1c72fc6e
(3) applying pattern '^/hg/repo1/(.*)$' to uri '/repo1/rev/c36b1c72fc6e'
(1) pass through /repo1/rev/c36b1c72fc6e
URL を適切に変更しているように見えますが、適切にリダイレクトされず、理由がわかりません。何か案は?
Apache で Mercurial リポジトリを提供するために hgwebdir を使用しています。