2010-02-09 4 views
5

Je suis à la recherche d'informations pour configurer un serveur Mercurial pour Windows (7 ou XP) avec un Apache (xampp s'il est utile de le connaître) avec le modèle Push, comme dans this question mais mon équipe est composée de 5 à 8 (unsolvent) gars qui travaillent chacun dans des endroits séparés, donc je ne pense pas que la solution bitbucket ou tout autre repo non-privé là-bas.Mercurial Server sous Apache/Windows

Je pense que this post ferait l'affaire, mais je ne l'ai pas vécu quelque chose avec cgi avant,

Quelqu'un at-il fait cela avant? Où puis-je trouver une explication plus détaillée? merci à l'avance

[EDIT]

Je suis maintenant obtenir cette erreur: Fin prématurée des en-têtes de script: hgwebdir.cgi

L'erreur journal dit "aucun module nommé mercurial"

cette est mon fichier 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) 
+0

J'ai battu mon record d'heures sans obtenir de réponse ... 8 heures en ce moment! –

+0

Une autre marche à suivre utile sur ce sujet est ici: http://blog.riverside-software.fr/2011/02/quick-and-easy-setup-of-mercurial.html –

+0

Pour plus de référence, j'ai eu l'erreur "Prématuré fin des en-têtes de script: hgweb.cgi "(le point d'entrée pour les nouvelles versions au lieu de hgwebdir.cgi) aussi. Il s'avère que c'était un problème de permission. Le répertoire contenant le fichier hgweb.cgi et son contenu doivent être 755. Ce message m'a finalement aidé: http://www.selenic.com/pipermail/mercurial/2007-July/013926.html –

Répondre

9

J'ai utilisé le HgWebDir instructions:

Voici ma pièce httpd.conf pour les sites mercuriels (légèrement modifiés):

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

Je devais aussi allumer quelques modules pour Auth Digest, etc.

Je mets le hgwebdir.cgi dans la racine du public et les dossiers privés, et juste mettre chacun de mes repos hg dans le sous-dossier de repos sous les dossiers appropriés.

L'authentification Apache a pris en charge mon autorisation.

Ensuite, je viens de mettre un fichier hgweb.config dans les mêmes endroits comme celui-ci:

[collections] 
repos = repos 

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

Mise à jour Question

Les paquets mercuriels ont besoin d'être sur le PYTHON_PATH

This answer donne plus de détails.

+0

mes dirs seraient alors: d: /hg_repos/public/hgwebdir.cgi d: /hg_repos/public/hgweb.config d:/hg_repos/public/repos/ et même pour privé? –

+0

Correct. Cela semble à peu près juste. –

+0

Désolé de déranger, je reçois cette erreur: Fin prématurée des en-têtes de script: hgwebdir.cgi ... quoi d'autre puis-je vérifier? J'ai téléchargé Python2.4.4. Peut être ça? Je suis un peu confus, lol –

8

réponse John Weldon est correct, je voulais juste donner un peu de détails sur le large éventail de possibilités, vous pouvez également être intéressé par.

hgwebdir est juste une application wsgi, vous pouvez l'exécuter comme tout autre application wsgi en utilisant mod_wsgi dans Apache2. mod_wsgi sera aussi plus performant que cgi car le temps de chargement de l'interpréteur python est fait une fois plutôt que pour chaque requête.

également en vertu d'être une application wsgi signifie que vous pouvez également l'envelopper dans middleware ou hang it off another url d'un plus grand site etc ...

Par exemple, supposons que vous utilisez trac (une autre application wsgi) et vous voulez partager le schéma d'autorisation entre trac et hgwebdir, cela peut être accompli en les mettant à la fois derrière un middleware d'autorisation comme repoze.who par exemple.

Enfin, depuis python paste permet de construire des applications web à partir de petites pièces, j'ai écrit cet extrait de code pour démarrer hgwebdir via le collage.

""" 
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) 

Et la partie du fichier de configuration correspondant pour le charger ...

[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 
+0

Nice informations supplémentaires :) –

+0

Je vais vérifier ... dois obtenir plus d'expertise, je suis trop novice pour cela cependant. –

Questions connexes