Доступ к mercurial репозиторию через http
Ща я расскажу как раздавать mercurial репозиторий через тырнет.
Итак, мы имеем:
- nginx в роли веб-сервера, через который и будем раздавать репозиторий
- mercurial в роли mercurial
- flup в роли клея, с помощью которого мы замутим связь nginx и mercurial
- желание сделать всё с участием минимума скриптов и красиво, так чтобы веб-репозитории располагались на поддомене hg домена проекта.
Далее следовал бы увлекательный рассказ о том, как я читал маны, общался в конференциях, отлаживал бы скрипты, если б у меня тока было желание и время это всё писать ) А так как его нет, то описываю, что получилось в итоге.
Итак, для каждого проекта я добавил в конфиг nginx записи аналогичные следующей:
А вот и скрипт, который будет слушать с “другой” стороны сокета )
Тут надо бы какие-то умные поясняющие вещи написать, но тоже как-то язык не поворачивается ) Надеюсь, завтра повернётся ) Могу лишь заметить, что в переменной config задано соотвествие домена и пути к соотвествующему репозиторию. А hgmid - это middleware, которое настраивает wsgi-приложение на использование нужного репозитория.
Итак, мы имеем:
- nginx в роли веб-сервера, через который и будем раздавать репозиторий
- mercurial в роли mercurial
- flup в роли клея, с помощью которого мы замутим связь nginx и mercurial
- желание сделать всё с участием минимума скриптов и красиво, так чтобы веб-репозитории располагались на поддомене hg домена проекта.
Далее следовал бы увлекательный рассказ о том, как я читал маны, общался в конференциях, отлаживал бы скрипты, если б у меня тока было желание и время это всё писать ) А так как его нет, то описываю, что получилось в итоге.
Итак, для каждого проекта я добавил в конфиг nginx записи аналогичные следующей:
server {
# это поддомен репозитария
server_name .hg.pybb.zz;
# это обычные настройки для mod_fastcgi
include /etc/nginx/fastcgi.conf;
# а это сокет, на котором слушает наш скрипт-прослойка
location / {
fastcgi_pass unix:/var/run/www/hgweb.sock;
}
}
А вот и скрипт, который будет слушать с “другой” стороны сокета )
#!/usr/bin/env python
import cgitb
cgitb.enable()
from mercurial.hgweb.hgweb_mod import hgweb
from mercurial.hgweb.request import wsgiapplication
from flup.server.fcgi import WSGIServer
config = {'hg.dumpz.zz': '/web/dumpz.org/web_site',
'hg.pybb.zz': '/web/pybb.org/web_site'}
class hgmid(object):
def __init__(self, app):
self.app = app
def __call__(self, environ, start_response):
server_name = environ['SERVER_NAME']
if server_name in config:
self.app.destmaker = lambda: hgweb(config[server_name])
return self.app(environ, start_response)
else:
start_response('404 Not Found', [])
return ['Unknown domain']
WSGIServer(hgmid(wsgiapplication(lambda: None)),
bindAddress='/var/run/www/hgweb.sock', umask=0).run()
Тут надо бы какие-то умные поясняющие вещи написать, но тоже как-то язык не поворачивается ) Надеюсь, завтра повернётся ) Могу лишь заметить, что в переменной config задано соотвествие домена и пути к соотвествующему репозиторию. А hgmid - это middleware, которое настраивает wsgi-приложение на использование нужного репозитория.




















Comments
Просто офигетительно, давно искал как бы это правильно сделать. Сегодня попробую. :-)
Вопрос конечно не много не в тему, но как выкачать pybb ?
http://hg.pybb.org ) Ну и ещё есть http://trac.pybb.org ) Тока хочу предупредить что проект уже как месяц заморожен. Надеюсь через пару недель приступить к добиванию )
Это всё замечательно, но не уж-то ли надо тащить по одному файлу :), может всё таки svn :), я бы с удовольствием выступил в качестве тестера данного форума.
Пардон, я не заметил твой последний комментарий ) Про “тащить по одному файлу” не совсем понял )
Вот отсюда можно вытянуть все исходники http://hg.pybb.org. Это репозитарий mercurial. К сожалению, пока бетатестировать особо нечего т.к. не реализован ряд важных базовых вещей: - система разграничения прав и ещё несколько штук, про которые я забыл за давностью последнего копания в коде )