{i} This page does not meet our wiki style guidelines. Please help improve this page by cleaning up its formatting.

{i} This page appears to contain material that is no longer relevant. Please help improve this page by updating its content.

How to setup FreeHg on your own server

Assuming you are using Debian unstable (it should be similar on other distributions).

sudo apt-get install -t experimental python-django
hg clone http://freehg.org/u/mmarshall/freehg/
cd freehg
cp default_settings.py settings.py

Note: the below patches (and some other convenient things) are in this repo: https://bitbucket.org/jpellerin/freehg.

Apply the following patch:

# HG changeset patch
# User Ondrej Certik <ondrej@certik.cz>
# Date 1215091794 -7200
# Node ID e2055dc9678e37e8ec0e140ee76dfcefd0245ffe
# Parent  9de77539abe2c32a2a1bdc35cc87fa872b96b3af
summary view adapted to the latest mercurial

diff --git a/repos/views.py b/repos/views.py
--- a/repos/views.py
+++ b/repos/views.py
@@ -78,6 +78,7 @@ def summary(request, username, reponame)
     from mercurial.hgweb.hgweb_mod import hgweb
     from mercurial.hgweb.common import style_map
     from mercurial import templater
+    from mercurial.templatefilters import filters as common_filters
     from django.conf import settings
     web = hgweb(hgrepo, name=repo.get_long_name())
@@ -85,7 +86,7 @@ def summary(request, username, reponame)
         yield web.config("web", "motd", "")
     templatepath = settings.HG_TEMPLATE_PATH
     mapfile = mapfile = style_map(templatepath, "freehg")
-    web.t = templater.templater(mapfile, templater.common_filters,
+    tmpl = templater.templater(mapfile, common_filters,
                                      defaults={"url": request.build_absolute_uri(),
                                                "staticurl": "/static/",
                                                "urlbase": "/",
@@ -106,7 +107,7 @@ def summary(request, username, reponame)
                 # FIXME I have a feeling that this isn't correct.
-    write(web.summary())
+    write(web.summary(tmpl))
     return render_to_response('repos/summary.html',

And also this patch:

--- default_settings.py 2008-06-15 11:41:43.658803990 +0200
+++ settings.py 2008-07-03 15:18:54.245187159 +0200
@@ -7,10 +7,13 @@
     # ('Your Name', 'your_email@domain.com'),
+import os
-DATABASE_ENGINE = ''           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
-DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_ENGINE = 'sqlite3'           # 'postgresql_psycopg2', 'postgresql', 'mysql', 'sqlite3' or 'oracle'.
+#DATABASE_NAME = ''             # Or path to database file if using sqlite3.
+DATABASE_NAME = os.path.join(os.path.dirname(__file__), 'database.dat')
 DATABASE_USER = ''             # Not used with sqlite3.
 DATABASE_PASSWORD = ''         # Not used with sqlite3.
 DATABASE_HOST = ''             # Set to empty string for localhost. Not used with sqlite3.
@@ -63,10 +66,15 @@
 ROOT_URLCONF = 'freehg.urls'
+HTPASSWD_FILE = os.path.join(os.path.dirname(__file__), 'htpasswd')
+HG_TEMPLATE_PATH = os.path.join(os.path.dirname(__file__), 'hgtemplates')
+REPO_PATH = "/tmp/po"
     # Put strings here, like "/home/html/django_templates" or "C:/www/django/templates".
     # Always use forward slashes, even on Windows.
     # Don't forget to use absolute paths, not relative paths.
+    os.path.join(os.path.dirname(__file__), 'templates'),

Create database tables:

./manage.py syncdb

(You can answer "no" to create superuser now.) Test it locally

./manage.py runserver

Installing in apache

Apache config:

<VirtualHost *>
    ServerName freehg.org
    ServerAdmin your@email.com
    SetHandler python-program
    PythonHandler django.core.handlers.modpython
    SetEnv DJANGO_SETTINGS_MODULE freehg.settings
    PythonPath "['/home/ondra/repos/'] + sys.path"
        <Location "/static">
            SetHandler None
        Alias /static /home/ondra/repos/freehg/htdocs/static
    RewriteEngine on

    RewriteCond %{QUERY_STRING} .+
    RewriteRule /u(/.*) /home/ondra/repos/freehg/web/hgwebdir.cgi$1

    RewriteCond %{REQUEST_URI} !u/([^/]+)/([^/?]+)/?$
    RewriteCond %{REQUEST_URI} !u/([^/]+)/([^/?]+)/edit/?$
    RewriteCond %{REQUEST_URI} !u/([^/]+)/([^/?]+)/delete/?$
    RewriteRule /u(/.*) /home/ondra/repos/freehg/web/hgwebdir.cgi$1
      <Directory "/home/ondra/repos/freehg/web/">
        Order allow,deny
        Allow from all
        AllowOverride All
        SetHandler None
        Options ExecCGI
        AddHandler cgi-script .cgi
        AuthUserFile /home/ondra/repos/freehg/htpasswd
        AuthGroupFile /dev/null
        AuthName "freehg.org"
        AuthType Basic
        <LimitExcept GET>
        Require valid-user

Then setup permissions

$ chmod o+x freehg
$ cd freehg
$ chmod o+x database.dat

so that Apache can write to the database and create files in the freehg dir. Put this into your /etc/mercurial/hgrc:

style = /home/ondra/repos/freehg/hgtemplates/freehg
allow_archive = bz2 gz zip
push_ssl = false
allow_push = *

not working ,any details?

Problems and fixes

The Author recommends (http://matthewmarshall.org/blog/2008/03/freehg.org/#comment-4238781) revision 7350 from the Django repository

svn co -r 7350 http://code.djangoproject.com/svn/django/trunk/

Django 0.95

FreeHG doesn't work with Django 0.95 or above. Here is how you need to change the source code to get it working with 0.95: The parameter name for "max_length" was changed to "maxlength" (without the underscore). To get "manage.py syncdb" runnig you need to change "repos/model.py" line 51 - 54 from

name = models.CharField(max_length=30)
long_name = models.CharField(max_length=50, blank=True)
description = models.TextField(max_length=5000, blank=True)


name = models.CharField(maxlength=30)
long_name = models.CharField(maxlength=50, blank=True)
description = models.TextField(maxlength=5000, blank=True)

Additionaly: In "accountviews.py", "repos/forms.py" and "views.py"change the line:

from django import newforms as forms


from django import forms

Ubuntu 8.10 (and probably other distros shiping with Django above 1.0)

If you want to install FreeHG on Ubuntu 8.10

HowToSetupFreeHg (last edited 2013-09-02 01:53:25 by KevinBot)