views:

1453

answers:

2

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.

I think this post would do the trick, but i haven't experienced anything with cgi before,

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

The log error says "no module named mercurial"

this is my hgwebdir.cgi file

#!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)
+3  A: 

I used the HgWebDir instructions from the selenic site:

Here is my httpd.conf piece for the mercurial sites (slightly edited):

<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.

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.

Apache authentication took care of my authorization.

Then I just put a hgweb.config file in the same locations like this:

[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

This answer gives more detail.

John Weldon
my dirs would be then:d:/hg_repos/public/hgwebdir.cgid:/hg_repos/public/hgweb.configd:/hg_repos/public/repos/and same for private?
Jhonny D. Cano -Leftware-
Correct. That looks about right.
John Weldon
Sorry to bother, I'm getting this error: Premature end of script headers: hgwebdir.cgi... what else can I check? I downloaded Python2.4.4. maybe this? i'm kinda confused, lol
Jhonny D. Cano -Leftware-
Ey John many thanks... I got it running now... I dont' see my repos though... but i think it is question of setting up the hgweb.config, I've accepted your answer already, txs... do u know where can I find more info about the hgweb.config structure?
Jhonny D. Cano -Leftware-
I found it... [Paths] section on hgweb.config ! with a name=path syntax
Jhonny D. Cano -Leftware-
Nice... way to go. Have fun :)
John Weldon
+6  A: 

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.

hgwebdir is just a wsgi application, so you can run it like any other wsgi application using mod_wsgi in apache2. mod_wsgi will also perform better than cgi because the overhead of loading the python interpreter is done once rather than for each request.

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...

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.

Finally, since python paste makes building web apps out of smaller pieces, I wrote this code snippet to start hgwebdir via paste.

"""
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
Tom Willis
Nice additional info :)
John Weldon
I will check it out... gotta get more expertise, i'm too novice for this though.
Jhonny D. Cano -Leftware-