freehg / howto.markdown

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: http://freehg.org/u/certik/freehg/. a try to update to django-1.0.2 is here.

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())
     web.refresh()
@@ -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)
             else:
                 # FIXME I have a feeling that this isn't correct.
                 content.append(str(thing).decode('utf8'))
-    write(web.summary())
+    write(web.summary(tmpl))

     return render_to_response('repos/summary.html',
         dict(

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
+
 MANAGERS = ADMINS

-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"
+
 TEMPLATE_DIRS = (
     # 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'),
 )

 INSTALLED_APPS = (

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
        </Location>
        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
        </LimitExcept>
      </Directory>
</VirtualHost>

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:

[web]
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)

to:

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

to:

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

download Django 0.95 from http://www.djangoproject.com/download/0.95.4/tarball/ extract the "django" directory from the tar ball copy the "django" directory below your freehg folder apply the changes above to "repos/model.py"

(copied from http://mercurial.selenic.com/wiki/HowToSetupFreeHg)

Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.