mercurial/hgweb.py
changeset 2121 150cdd6c3c90
parent 2119 f62195054c5b
child 2122 9383ba6b069a
equal deleted inserted replaced
2120:c0994047c5ff 2121:150cdd6c3c90
     8 
     8 
     9 import os, cgi, sys
     9 import os, cgi, sys
    10 import mimetypes
    10 import mimetypes
    11 from demandload import demandload
    11 from demandload import demandload
    12 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser")
    12 demandload(globals(), "mdiff time re socket zlib errno ui hg ConfigParser")
    13 demandload(globals(), "tempfile StringIO BaseHTTPServer util")
    13 demandload(globals(), "tempfile StringIO BaseHTTPServer util SocketServer")
    14 demandload(globals(), "archival mimetypes templater")
    14 demandload(globals(), "archival mimetypes templater")
    15 from node import *
    15 from node import *
    16 from i18n import gettext as _
    16 from i18n import gettext as _
    17 
    17 
    18 def up(p):
    18 def up(p):
   876 
   876 
   877         else:
   877         else:
   878             req.write(self.t("error"))
   878             req.write(self.t("error"))
   879 
   879 
   880 def create_server(repo):
   880 def create_server(repo):
   881 
   881     use_threads = True
       
   882     
   882     def openlog(opt, default):
   883     def openlog(opt, default):
   883         if opt and opt != '-':
   884         if opt and opt != '-':
   884             return open(opt, 'w')
   885             return open(opt, 'w')
   885         return default
   886         return default
   886 
   887 
   887     address = repo.ui.config("web", "address", "")
   888     address = repo.ui.config("web", "address", "")
   888     port = int(repo.ui.config("web", "port", 8000))
   889     port = int(repo.ui.config("web", "port", 8000))
   889     use_ipv6 = repo.ui.configbool("web", "ipv6")
   890     use_ipv6 = repo.ui.configbool("web", "ipv6")
   890     accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
   891     accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
   891     errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
   892     errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
   892 
   893     
   893     class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
   894     if use_threads:
       
   895         try:
       
   896             from threading import activeCount
       
   897         except ImportError:
       
   898             use_threads = False
       
   899 
       
   900     if use_threads:
       
   901         _mixin = SocketServer.ThreadingMixIn
       
   902     else:
       
   903         if hasattr(os, "fork"):
       
   904             _mixin = SocketServer.ForkingMixIn
       
   905         else:
       
   906             class _mixin: pass
       
   907 
       
   908     class MercurialHTTPServer(_mixin, BaseHTTPServer.HTTPServer):
       
   909         pass
       
   910     
       
   911     class IPv6HTTPServer(MercurialHTTPServer):
   894         address_family = getattr(socket, 'AF_INET6', None)
   912         address_family = getattr(socket, 'AF_INET6', None)
   895 
   913 
   896         def __init__(self, *args, **kwargs):
   914         def __init__(self, *args, **kwargs):
   897             if self.address_family is None:
   915             if self.address_family is None:
   898                 raise hg.RepoError(_('IPv6 not available on this system'))
   916                 raise hg.RepoError(_('IPv6 not available on this system'))
   954                     accept = accept + line[7:].split(',')
   972                     accept = accept + line[7:].split(',')
   955             env['HTTP_ACCEPT'] = ','.join(accept)
   973             env['HTTP_ACCEPT'] = ','.join(accept)
   956 
   974 
   957             req = hgrequest(self.rfile, self.wfile, env)
   975             req = hgrequest(self.rfile, self.wfile, env)
   958             self.send_response(200, "Script output follows")
   976             self.send_response(200, "Script output follows")
   959             hg.run(req)
   977             hgweb(repo.__class__(repo.ui, repo.origroot)).run(req)
   960 
   978 
   961     hg = hgweb(repo)
       
   962     if use_ipv6:
   979     if use_ipv6:
   963         return IPv6HTTPServer((address, port), hgwebhandler)
   980         return IPv6HTTPServer((address, port), hgwebhandler)
   964     else:
   981     else:
   965         return BaseHTTPServer.HTTPServer((address, port), hgwebhandler)
   982         return MercurialHTTPServer((address, port), hgwebhandler)
   966 
   983 
   967 # This is a stopgap
   984 # This is a stopgap
   968 class hgwebdir(object):
   985 class hgwebdir(object):
   969     def __init__(self, config):
   986     def __init__(self, config):
   970         def cleannames(items):
   987         def cleannames(items):