Size: 3757
Comment: one more page about hgwebdir.cgi
|
Size: 8541
Comment: Edited in the style info for hg.kublai.com--simply a style config
|
Deletions are marked like this. | Additions are marked like this. |
Line 2: | Line 2: |
= Publishing Repositories with `hgwebdir.cgi` = | = Publishing Repositories with hgwebdir.cgi = |
Line 10: | Line 10: |
I run all this on an Ubuntu system. Edgy one. :) |
|
Line 13: | Line 11: |
* apache2 (apache2, apache2-common, apache2-mpm-prefork, apache2-utils) | * A webserver that can run CGI scripts such as apache2 (apache2, apache2-common, apache2-mpm-prefork, apache2-utils) or lighttpd * But it is not necessary (see below) |
Line 23: | Line 22: |
a real newbie for hg, so please bear me :)): | a real newbie for hg, so please bear with me :)): |
Line 28: | Line 27: |
$ hg pull http://hg.intevation.org/mercurial/crew $ wget http://www.selenic.com/pipermail/mercurial/attachments/20060615/2893c03e/push-http.bin -O push-http.patch $ hg import -p1 push-http.patch |
|
Line 35: | Line 31: |
This should work for every linux with python. But for rpm based systems it is better for administrative reasons to use it. You can find some via [BinaryPackages]. I got mine like this: {{{ $ cd download-directory $ wget http://repos.opensuse.org/devel:/tools:/scm/openSUSE_10.2/x86_64/mercurial-0.9.3-3.1.x86_64.rpm $ sudo rpm -ihv mercurial-0.9.3-3.1.x86_64.rpm }}} == RHEL4 Specific Instructions == ["RHEL4HgWebDirSetup"] |
|
Line 40: | Line 48: |
$ sudo chown www-data:www-data -R /var/hg }}} It's usually a good idea to keep special directories out of the tree served by apache. == Putting the right stuff in place == Put the script in place (remember, we are still in that `working-directory/hg` :)): {{{ $ sudo -u www-data cp hgwebdir.cgi /var/hg $ sudo -u www-data chmod +x /var/hg/hgwebdir.cgi }}} Prepare the config: |
$ sudo chown -R www-data:www-data /var/hg }}} It's usually a good idea to keep special directories out of the tree served by apache, but for security reasons on openSUSE the cgi scripts only work within the document root. So for openSUSE, which uses user/group wwwrun/www instead of www-data/www-data and does not allow write acces to cgi directories for anyone but the apache user it is {{{ $ sudo mkdir -p /srv/www/htdocs/hg/repos $ sudo chown -R wwwrun:www /srv/www/htdocs/hg/repos $ sudo chmod 755 /srv/www/htdocs/hg }}} == Preparing the config == |
Line 63: | Line 69: |
== Making it accessible == Ok, now it's time for apache. |
For openSUSE, replace the sudo line above with {{{ $ sudo -u wwwrun cp /tmp/hgweb.config /srv/www/htdocs/hg }}} To get a look like on http://hg.kublai.com/ with subdirecoties? Just create subdirectories with hg repositories in it. To get a look of the toplevel like on kublai, add the following to hgweb.config: {{{ [web] style = gitweb }}} This also works in repository hgrc's, which are mentioned below. == Two possibilities == You can either use a separate webserver such as Apache or lighttpd, or use the webserver built into hg. === Using Apache or lighttpd with the hgwebdir.cgi script === ==== Putting the right stuff in place ==== Put the script in place (remember, we are still in that `working-directory/hg` :)): {{{ $ sudo -u www-data cp hgwebdir.cgi /var/hg $ sudo -u www-data chmod +x /var/hg/hgwebdir.cgi }}} And again, some changes for openSUSE {{{ $ sudo -u wwwrun cp /usr/share/doc/packages/mercurial/hgwebdir.cgi /srv/www/htdocs/hg $ sudo -u wwwrun chmod +x /srv/www/htdocs/hg/hgwebdir.cgi }}} ==== Configuring apache ==== Ok, now it's time for apache (see at the end of this paragraph for the openSUSE way of doing this). |
Line 107: | Line 144: |
For openSUSE, just put this in /etc/apache2/conf.d/hg.conf {{{ ScriptAliasMatch ^/hg(.*) /srv/www/htdocs/hg/hgwebdir.cgi$1 <Directory /srv/www/htdocs/hg> Options ExecCGI FollowSymLinks AllowOverride None </Directory> }}} and run {{{ sudo rcapache2 reload }}} if this does not complain about config errors you should be done. ==== Configuring lighttpd ==== Ok, now it's time for lighttpd (no openSUSE specifics, because I dont use it). You can either update the existing /etc/lighttpd/lighttpd.conf file, or create /etc/lighttpd.conf/hg.conf and include that file from lighttpd.conf. First, you need to check if mod_rewrite and mod_cgi are enabled in the config file, and add them to server.modules if they haven't already been added: {{{ server.modules += ( "mod_cgi" ) server.modules += ( "mod_rewrite" ) }}} Next, configure rewrite rules that map URLs to the hgwebdir.cgi script. With the following added to your config file, URLs starting with either hg or mercurial will map to hgwebdir.cgi: {{{ url.rewrite-once = ( "^/hg([/?].*)?$" => "/hgwebdir.cgi$1", "^/mercurial([/?].*)?$" => "/hgwebdir.cgi$1" ) }}} Then, configure a URL match that invokes hgwebdir.cgi: {{{ $HTTP["url"] =~ "^/hgwebdir.cgi([/?].*)?$" { server.document-root = "/var/hg/" cgi.assign = ( ".cgi" => "/usr/bin/python" ) } }}} Make sure that everything is OK: {{{ $ sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf Syntax OK }}} Restart the web server: {{{ $ sudo /etc/init.d/lighttpd restart }}} Check if it works by directing your browser to `<yourhost>/hg/` or `<yourhost>/mercurial/` === Standalone === Simply run {{{ sudo -u www-data hg serve --webdir-conf /var/hg/hgweb.config }}} and enjoy this speedy method of serving multiple repos. It should be faster than using Apache. |
|
Line 113: | Line 221: |
No openSUSE specifics here. You should know the differences by now (apache user and doc path). |
|
Line 124: | Line 234: |
contact = Bilbo Baggins # Whom to contact, plain text, no fancy stuff description = My precious! # Nice description what this is about, you can # include HTML (like <a>) |
contact = Bilbo Baggins # Whom to contact, plain text, # no fancy stuff description = My precious! # Nice description what this is about, # you can include HTML (like <a>) }}} === Allow pushing to the repository === By default, nobody is allowed pushing. To allow pushing to everybody, add the following line to the `/var/hg/repos/<repository-name>/.hg/hgrc` file: {{{ [web] allow_push = * }}} To allow only selected users to push changes, add the following line to the `/var/hg/repos/<repository-name>/.hg/hgrc` file: {{{ [web] allow_push = frodo, sam }}} These are virtual users (for instance, as defined using a .htpasswd file), and not real system users. === Deny pushing to the repository === Most likely you will want to use it together with `allow_push = *`. If you want allow pushing to everybody, but a selected list of people, add the following line to the `/var/hg/repos/<repository-name>/.hg/hgrc` file: {{{ [web] deny_push = saruman }}} === Allow pushing only over a non-secure channel === (I still need to check how it works :) ) By default, pushes are allowed only over https. If you are certain and do not want to enforce https for pushes, add the following line to the `/var/hg/repos/<repository-name>/.hg/hgrc` file: {{{ [web] push_ssl = false |
Line 134: | Line 281: |
style = gitweb # looks cleaner from my point of view :) allow_archive = gz, zip, bz2 # If you think people should be able to download # snapshots as .tar.gz, .zip, .tar.bz2 respectively |
style = gitweb # looks cleaner from my point of # view :) allow_archive = gz zip bz2 # If you think people should be able # to download snapshots as .tar.gz, # .zip, .tar.bz2 respectively |
Publishing Repositories with hgwebdir.cgi
1. Introduction
Well, we have a certain setup with subversion. I'd like to reproduce it using Mercurial.
2. Pre-requisites
The installed software is:
- A webserver that can run CGI scripts such as apache2 (apache2, apache2-common, apache2-mpm-prefork, apache2-utils) or lighttpd
- But it is not necessary (see below)
- some version of mercurial (mine was 0.9 taken from Debian/unstable)
- python:
- Ubuntu/Edgy comes with python 2.4
- you will need python2.4-dev package as well
- sudo (in general, I prefer sudo to su)
3. Getting proper Mercurial
The whole point was to try pull/push over http. So the following was done (I'm a real newbie for hg, so please bear with me :)):
$ cd working-directory $ hg clone http://selenic.com/hg/ $ cd hg $ python setup.py build $ sudo python setup.py install
This should work for every linux with python. But for rpm based systems it is better for administrative reasons to use it. You can find some via [BinaryPackages]. I got mine like this:
$ cd download-directory $ wget http://repos.opensuse.org/devel:/tools:/scm/openSUSE_10.2/x86_64/mercurial-0.9.3-3.1.x86_64.rpm $ sudo rpm -ihv mercurial-0.9.3-3.1.x86_64.rpm
4. RHEL4 Specific Instructions
["RHEL4HgWebDirSetup"]
5. Directory Structure
Create the necessary directories:
$ sudo mkdir -p /var/hg/repos $ sudo chown -R www-data:www-data /var/hg
It's usually a good idea to keep special directories out of the tree served by apache, but for security reasons on openSUSE the cgi scripts only work within the document root. So for openSUSE, which uses user/group wwwrun/www instead of www-data/www-data and does not allow write acces to cgi directories for anyone but the apache user it is
$ sudo mkdir -p /srv/www/htdocs/hg/repos $ sudo chown -R wwwrun:www /srv/www/htdocs/hg/repos $ sudo chmod 755 /srv/www/htdocs/hg
6. Preparing the config
$ cat > /tmp/hgweb.config [collections] repos/ = repos/ ^D $ sudo -u www-data cp /tmp/hgweb.config /var/hg $ rm /tmp/hgweb.config
For openSUSE, replace the sudo line above with
$ sudo -u wwwrun cp /tmp/hgweb.config /srv/www/htdocs/hg
To get a look like on http://hg.kublai.com/ with subdirecoties? Just create subdirectories with hg repositories in it. To get a look of the toplevel like on kublai, add the following to hgweb.config:
[web] style = gitweb
This also works in repository hgrc's, which are mentioned below.
7. Two possibilities
You can either use a separate webserver such as Apache or lighttpd, or use the webserver built into hg.
7.1. Using Apache or lighttpd with the hgwebdir.cgi script
7.1.1. Putting the right stuff in place
Put the script in place (remember, we are still in that working-directory/hg :)):
$ sudo -u www-data cp hgwebdir.cgi /var/hg $ sudo -u www-data chmod +x /var/hg/hgwebdir.cgi
And again, some changes for openSUSE
$ sudo -u wwwrun cp /usr/share/doc/packages/mercurial/hgwebdir.cgi /srv/www/htdocs/hg $ sudo -u wwwrun chmod +x /srv/www/htdocs/hg/hgwebdir.cgi
7.1.2. Configuring apache
Ok, now it's time for apache (see at the end of this paragraph for the openSUSE way of doing this).
First of all, do not really change the config of apache directly:
$ sudo mkdir /etc/apache2/hg
Create the config with the following contents (e.g by using sudo vim /etc/apache2/hg/main.conf):
ScriptAliasMatch ^/hg(.*) /var/hg/hgwebdir.cgi$1 <Directory /var/hg> Options ExecCGI FollowSymLinks AllowOverride None </Directory>
This config says that we are going to serve our repositories through '<yourhost>/hg/'.
Now make it really available, by changing your favourite site in /etc/apache2/sites-enabled. For this experiment I used /etc/apache2/sites-enabled/default:
... Include /etc/apache2/hg/main.conf </VirtualHost>
Make sure that everything is OK:
$ sudo apache2ctl configtest Syntax is OK
Restart your web server:
$ sudo apache2ctl stop $ sudo apache2ctl start
Check if it works by directing your browser to <yourhost>/hg/
For openSUSE, just put this in /etc/apache2/conf.d/hg.conf
ScriptAliasMatch ^/hg(.*) /srv/www/htdocs/hg/hgwebdir.cgi$1 <Directory /srv/www/htdocs/hg> Options ExecCGI FollowSymLinks AllowOverride None </Directory>
and run
sudo rcapache2 reload
if this does not complain about config errors you should be done.
7.1.3. Configuring lighttpd
Ok, now it's time for lighttpd (no openSUSE specifics, because I dont use it).
You can either update the existing /etc/lighttpd/lighttpd.conf file, or create /etc/lighttpd.conf/hg.conf and include that file from lighttpd.conf.
First, you need to check if mod_rewrite and mod_cgi are enabled in the config file, and add them to server.modules if they haven't already been added:
server.modules += ( "mod_cgi" ) server.modules += ( "mod_rewrite" )
Next, configure rewrite rules that map URLs to the hgwebdir.cgi script. With the following added to your config file, URLs starting with either hg or mercurial will map to hgwebdir.cgi:
url.rewrite-once = ( "^/hg([/?].*)?$" => "/hgwebdir.cgi$1", "^/mercurial([/?].*)?$" => "/hgwebdir.cgi$1" )
Then, configure a URL match that invokes hgwebdir.cgi:
$HTTP["url"] =~ "^/hgwebdir.cgi([/?].*)?$" { server.document-root = "/var/hg/" cgi.assign = ( ".cgi" => "/usr/bin/python" ) }
Make sure that everything is OK:
$ sudo lighttpd -t -f /etc/lighttpd/lighttpd.conf Syntax OK
Restart the web server:
$ sudo /etc/init.d/lighttpd restart
Check if it works by directing your browser to <yourhost>/hg/ or <yourhost>/mercurial/
7.2. Standalone
Simply run
sudo -u www-data hg serve --webdir-conf /var/hg/hgweb.config
and enjoy this speedy method of serving multiple repos. It should be faster than using Apache.
8. You are done
Hooray!
9. Final Bits
No openSUSE specifics here. You should know the differences by now (apache user and doc path).
9.1. Create a new repository
$ sudo -u www-data hg init /var/hg/repos/<repository-name>
9.2. Provide more information about it
Add the following to the /var/hg/repos/<repository-name>/.hg/hgrc file:
[web] contact = Bilbo Baggins # Whom to contact, plain text, # no fancy stuff description = My precious! # Nice description what this is about, # you can include HTML (like <a>)
9.3. Allow pushing to the repository
By default, nobody is allowed pushing.
To allow pushing to everybody, add the following line to the /var/hg/repos/<repository-name>/.hg/hgrc file:
[web] allow_push = *
To allow only selected users to push changes, add the following line to the /var/hg/repos/<repository-name>/.hg/hgrc file:
[web] allow_push = frodo, sam
These are virtual users (for instance, as defined using a .htpasswd file), and not real system users.
9.4. Deny pushing to the repository
Most likely you will want to use it together with allow_push = *. If you want allow pushing to everybody, but a selected list of people, add the following line to the /var/hg/repos/<repository-name>/.hg/hgrc file:
[web] deny_push = saruman
9.5. Allow pushing only over a non-secure channel
(I still need to check how it works )
By default, pushes are allowed only over https. If you are certain and do not want to enforce https for pushes, add the following line to the /var/hg/repos/<repository-name>/.hg/hgrc file:
[web] push_ssl = false
9.6. Customize the look
Add the following to the /var/hg/repos/<repository-name>/.hg/hgrc file:
[web] style = gitweb # looks cleaner from my point of # view :) allow_archive = gz zip bz2 # If you think people should be able # to download snapshots as .tar.gz, # .zip, .tar.bz2 respectively
10. Disclaimer
Well, it works (worked) for me. Please do not hesitate to update this page to include small bits I've forgotten or just plainly am not aware of.