When it’s ready.

出来るまで出来ない

Trac + hg 使用時に80ポートでclone push pullしたい!

Tracで、mercurialプラグインを動かす事が出来たけど、意外なところに落とし穴があった。標準のhgweb.cgiは、ヒストリーのWeb画面の提供と共にリポジトリーとのやりとりを仲介してくれている。Tracmercurialの組み合わせの時に、どうやってリポジトリにリーチするのか判らない。
id:pateo氏にアドバイスをもらい、にTracとhgwebの両運用をやってみる。

やりたい事

  • trac.hoge.com/プロジェクト名
  • hg.hoge.com/プロジェクト名

でアクセス出来るようにする
hgコマンド走らせるときには2のurlを使う

tracのインストール先は、/var/trac/HogeProject
mercurialリポジトリは、/var/trac/HogeProject

tracをapache2で公開する為に、mod_wsgiを使う。tracのインストールパスに、trac.wsgiを作成する。この設定は、tokibito氏に教わった。
>trac.wsgi

import os
os.environ['TRAC_ENV'] = '/var/trac/HogeProject/'
import trac
import trac.util
import trac.util.compat as compat
from trac.util import compat
from trac.web.main import dispatch_request as application

これをVirtualHostでtrac.hoge.comにアサインする。
>/etc/apache2/sites-available/001-trac_hoge

NameVirtualHost *
<VirtualHost *>
        ServerAdmin webmaster@localhost
        ServerName trac.hoge.com

        <Directory />
                Options FollowSymLinks
                AllowOverride None
        </Directory>
        Alias /static /var/trac/HogeProject/htdocs
        WSGIScriptAlias / /var/trac/HogeProject/trac.wsgi

        <LocationMatch ^/login$>
                AuthType Basic
                AuthName "Trac"
                AuthUserFile /var/trac/users.htpasswd
                Require valid-user
        </LocationMatch>
        ErrorLog /var/log/apache2/trac_error.log
        # Possible values include: debug, info, notice, warn, error, crit,
        # alert, emerg.
        LogLevel warn
        CustomLog /var/log/apache2/trac_access.log combined
        ServerSignature On

</VirtualHost>

sites-enabledにリンクを張っておく。認証はとりあえづBasicで/var/trac直下にpasswdファイルを置いてみた。

問題は、ここからhgのwebcgiを、別サブドメインでサービスさせる。
/var/www/hg/HogeProjectディレクトリを作成し、中に適当なcgiを置いてみてもちゃんと動作してくれない。たぶん、バーチャルホストの書き方が悪いんだろうけどどう書いて良いのかが判らない。

<VirtualHost *>
	ServerAdmin webmaster@localhost
	ServerName hg.memogeek.com

	<Directory />
		Options FollowSymLinks ExecCGI
		AllowOverride None
    Allow from all
    AddHandler cgi-script .cgi
	</Directory>
	Alias /static /var/www/hg
	WSGIScriptAlias / /var/www/hg

	<LocationMatch ^/login$>
		AuthType Basic
		AuthName "Trac"
		AuthUserFile /var/trac/users.htpasswd
		Require valid-user
	</LocationMatch>
	ErrorLog /var/log/apache2/hg_error.log
	# Possible values include: debug, info, notice, warn, error, crit,
	# alert, emerg.
	LogLevel warn
	CustomLog /var/log/apache2/hg_access.log combined
	ServerSignature On

</VirtualHost>

適当に、AddHandler cgi-script .cgiを追加してみた。呼びたいファイルは以下の通り

#!/usr/bin/env python
#
# An example CGI script to use hgweb, edit as necessary

# adjust python path if not a system-wide install:
import sys
sys.path.insert(0, "/usr/bin/python2.5")
import os

os.environ["HGENCODING"] = "UTF-8"
os.environ["SERVER_PORT"] = "80"
os.environ["SERVER_NAME"] = "hoge.com"
# enable importing on demand to reduce startup time
from mercurial import demandimport; demandimport.enable()

# send python tracebacks to the browser if an error occurs:
import cgitb
cgitb.enable()

# If you'd like to serve pages with UTF-8 instead of your default
# locale charset, you can do so by uncommenting the following lines.
# Note that this will cause your .hgrc files to be interpreted in
# UTF-8 and all your repo files to be displayed using UTF-8.
#
#import os
#os.environ["HGENCODING"] = "UTF-8"

from mercurial.hgweb.hgweb_mod import hgweb
from mercurial.hgweb.request import wsgiapplication
import mercurial.hgweb.wsgicgi as wsgicgi

def make_web_app():
    return hgweb("/var/hg/PotetoProject", "PotetoProject")

wsgicgi.launch(wsgiapplication(make_web_app))

こんな感じ。このファイルを直にpython2.5に食わすときちんとhtmlが出てくるので、やっぱり問題はapacheからこのファイルへのハンドリングがうまくいってないと思うけど、これ以上はお預けにする。