简体   繁体   English

Apache / Windows上的Mercurial Server

[英]Mercurial Server on Apache/Windows

I'm searching for info to setup a Mercurial Server for Windows (7 or XP) with an Apache (xampp if it is useful to know it) with the Push Model, just like in this question but my team is composed of 5 to 8 (unsolvent) guys who are each one working in separated places, so I don't think the bitbucket solution or anyother non-private repo out there. 我正在寻找信息来设置一个Mercurial Server for Windows(7或XP)与Apache(xampp,如果知道它有用)与推模型,就像在这个问题,但我的团队由5到8组成(不解决)那些在分散的地方工作的人,所以我不认为bitbucket解决方案或任何其他非私人回购。

I think this post would do the trick, but i haven't experienced anything with cgi before, 我认为这篇文章可以解决这个问题,但我之前没有经历任何关于cgi的事情,

Has anybody done this before? 有没有人这样做过? where can I find a more detailed explanation? 我在哪里可以找到更详细的解释? thanks in advance 提前致谢

[EDIT] [编辑]

I'm now getting this error: Premature end of script headers: hgwebdir.cgi 我现在收到此错误:脚本标头过早结束:hgwebdir.cgi

The log error says "no module named mercurial" 日志错误显示“没有名为mercurial的模块”

this is my hgwebdir.cgi file 这是我的hgwebdir.cgi文件

#!c:/python24/python.exe
#
# An example CGI script to export multiple hgweb repos, edit as necessary

# adjust python path if not a system-wide install:
import sys
sys.path.insert(0, "c:/mercurial_library")

# enable importing on demand to reduce startup time
from mercurial import demandimport; demandimport.enable()

# Uncomment to 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.hgwebdir_mod import hgwebdir
import mercurial.hgweb.wsgicgi as wsgicgi
application = hgwebdir('hgweb.config')
wsgicgi.launch(application)

I used the HgWebDir instructions : 我使用了HgWebDir指令

Here is my httpd.conf piece for the mercurial sites (slightly edited): 这是我的httpd.conf片段,用于mercurial网站(略有编辑):

<VirtualHost *:88>
    ServerName hg.example.com
    DocumentRoot c:/apache_sites/hg
    RewriteEngine on

    RewriteRule ^/$ /public [R]
    RewriteRule ^/public(.*) /public/hgwebdir.cgi$1 [L]
    RewriteRule ^/private(.*) /private/hgwebdir.cgi$1 [L]

    # mod_alias alternative (pretty url's)
    <Directory c:/apache_sites/hg >
        Order allow,deny
        Allow from all
        AllowOverride All
        Options ExecCGI
        AddHandler cgi-script .cgi
    </Directory>
    <Location /private/>
        AuthType Digest
        AuthName "hg.example.com"
        AuthDigestProvider file
        AuthUserFile c:/apache_sites/hg/hgusers
        AuthGroupFile c:/apache_sites/hg/hggroup
        AuthDigestDomain /private/
        Require group owner
    </Location>
    <Location /public/>
        AuthType Digest
        AuthName "hg.example.com"
        AuthDigestProvider file
        AuthUserFile c:/apache_sites/hg/hgusers
        AuthGroupFile c:/apache_sites/hg/hggroup
        AuthDigestDomain /public/
        <LimitExcept GET>
            Require group developer
        </LimitExcept>
    </Location>

    LogLevel debug
    ErrorLog "c:/apache/logs/hg-error.log"
    CustomLog "c:/apache/logs/hg-access.log" combined
    LogLevel debug
</VirtualHost>
# vim:se ft=apache:

I also had to turn on a few modules for Auth Digest, etc. 我还必须为Auth Digest等打开几个模块。

I put the hgwebdir.cgi in the root of the public and the private folders, and just put each of my hg repos in the repos subfolder under the appropriate folders. 我将hgwebdir.cgi放在public和private文件夹的根目录中,然后将每个hg repos放在repos子文件夹下的相应文件夹下。

Apache authentication took care of my authorization. Apache身份验证负责我的授权。

Then I just put a hgweb.config file in the same locations like this: 然后我只是将hgweb.config文件放在相同的位置,如下所示:

[collections]
repos = repos

[web]
allow_archive = bz2 gz zip
style = gitweb
baseurl = /public

Updated Question 更新的问题

The mercurial packages need to be on the PYTHON_PATH mercurial包需要在PYTHON_PATH上

This answer gives more detail. 这个答案提供了更多细节。

John Weldons answer is correct, I just wanted to provide a little detail on the wide array of possibilities you may also be interested in. John Weldons的回答是正确的,我只想提供一些您可能感兴趣的各种可能性的细节。

hgwebdir is just a wsgi application, so you can run it like any other wsgi application using mod_wsgi in apache2. hgwebdir只是一个wsgi应用程序,所以你可以像在apache2中使用mod_wsgi的任何其他wsgi应用程序一样运行它。 mod_wsgi will also perform better than cgi because the overhead of loading the python interpreter is done once rather than for each request. mod_wsgi也将比cgi执行得更好,因为加载python解释器的开销是一次完成而不是每个请求。

Also by virtue of being a wsgi application means you can also wrap it up in middleware , or hang it off another url of a bigger website etc... 另外,作为一个wsgi应用程序意味着你也可以将其包装在中间件中 ,或者将它挂在更大的网站等的另一个网址上......

For example, say you are using trac (another wsgi app) and you want to share the authorization scheme between trac and hgwebdir, this can be accomplished by putting them both behind authorization middleware like repoze.who for example. 例如,假设您正在使用trac (另一个wsgi应用程序)并且您想要在trac和hgwebdir之间共享授权方案,这可以通过将它们放在授权中间件(例如repoze.who)之后来实现。

Finally, since python paste makes building web apps out of smaller pieces, I wrote this code snippet to start hgwebdir via paste. 最后,由于python paste使得构建Web应用程序的篇幅较小,我编写了这段代码片段以通过粘贴启动hgwebdir。

"""
Wsgi wrapper of hgweb that is paste compatible
"""
import os
from mercurial import demandimport
demandimport.enable()
from mercurial.hgweb.hgwebdir_mod import hgwebdir

CONFIG_FILE_KEY = "hgwebdir.config"

def hgweb_paste(global_config, **local_conf):
    """
    looking for a config file setting in global or local
    """
    cfg = global_config
    cfg.update(local_conf)
    config_file = cfg.get(CONFIG_FILE_KEY)
    if config_file and os.path.exists(config_file):
        return hgwebdir(config_file)
    else:
        raise KeyError, "%s not set or %s does not exist" % (CONFIG_FILE_KEY,config_file)

And the corresponding config file part to load it... 和相应的配置文件部分加载它...

[server:main]
use = egg:Paste#http
host = 0.0.0.0
port = 6543

[app:main]
use = egg:hg.paste#hgweb
hgwebdir.config = %(here)s/hg.config

I found this blog post particularly helpful: http://blog.riverside-software.fr/2011/02/quick-and-easy-setup-of-mercurial.html . 我发现这篇博文特别有用: http//blog.riverside-software.fr/2011/02/quick-and-easy-setup-of-mercurial.html

It's simple, to the point, and got me up and working in less than 15 minutes. 这很简单,到了这一点,让我在不到15分钟的时间内完成工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM