mercurial/hgweb.py
changeset 1213 db9639b8594c
parent 1210 27f2ec705332
child 1217 f1895785c79e
equal deleted inserted replaced
1212:ccb6201e3f28 1213:db9639b8594c
     4 # Copyright 2005 Matt Mackall <mpm@selenic.com>
     4 # Copyright 2005 Matt Mackall <mpm@selenic.com>
     5 #
     5 #
     6 # This software may be used and distributed according to the terms
     6 # This software may be used and distributed according to the terms
     7 # of the GNU General Public License, incorporated herein by reference.
     7 # of the GNU General Public License, incorporated herein by reference.
     8 
     8 
     9 import os, cgi, time, re, socket, sys, zlib, errno
     9 import os, cgi, sys
    10 import mdiff
    10 from demandload import demandload
    11 from hg import *
    11 demandload(globals(), "mdiff time re socket zlib errno ui hg")
    12 from ui import *
    12 demandload(globals(), "zipfile tempfile StringIO tarfile BaseHTTPServer")
    13 
    13 from node import *
    14 
    14 
    15 def templatepath():
    15 def templatepath():
    16     for f in "templates", "../templates":
    16     for f in "templates", "../templates":
    17         p = os.path.join(os.path.dirname(__file__), f)
    17         p = os.path.join(os.path.dirname(__file__), f)
    18         if os.path.isdir(p):
    18         if os.path.isdir(p):
   169 
   169 
   170 
   170 
   171 class hgweb:
   171 class hgweb:
   172     def __init__(self, repo, name=None):
   172     def __init__(self, repo, name=None):
   173         if type(repo) == type(""):
   173         if type(repo) == type(""):
   174             self.repo = repository(ui(), repo)
   174             self.repo = hg.repository(ui.ui(), repo)
   175         else:
   175         else:
   176             self.repo = repo
   176             self.repo = repo
   177 
   177 
   178         self.mtime = -1
   178         self.mtime = -1
   179         self.reponame = name
   179         self.reponame = name
   181 
   181 
   182     def refresh(self):
   182     def refresh(self):
   183         s = os.stat(os.path.join(self.repo.root, ".hg", "00changelog.i"))
   183         s = os.stat(os.path.join(self.repo.root, ".hg", "00changelog.i"))
   184         if s.st_mtime != self.mtime:
   184         if s.st_mtime != self.mtime:
   185             self.mtime = s.st_mtime
   185             self.mtime = s.st_mtime
   186             self.repo = repository(self.repo.ui, self.repo.root)
   186             self.repo = hg.repository(self.repo.ui, self.repo.root)
   187             self.maxchanges = self.repo.ui.config("web", "maxchanges", 10)
   187             self.maxchanges = self.repo.ui.config("web", "maxchanges", 10)
   188             self.maxfiles = self.repo.ui.config("web", "maxchanges", 10)
   188             self.maxfiles = self.repo.ui.config("web", "maxchanges", 10)
   189             self.allowpull = self.repo.ui.configbool("web", "allowpull", True)
   189             self.allowpull = self.repo.ui.configbool("web", "allowpull", True)
   190 
   190 
   191     def date(self, cs):
   191     def date(self, cs):
   658 
   658 
   659         files = mf.keys()
   659         files = mf.keys()
   660         files.sort()
   660         files.sort()
   661 
   661 
   662         if type == 'zip':
   662         if type == 'zip':
   663             import zipfile, tempfile
       
   664 
       
   665             tmp = tempfile.mkstemp()[1]
   663             tmp = tempfile.mkstemp()[1]
   666             try:
   664             try:
   667                 zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED)
   665                 zf = zipfile.ZipFile(tmp, "w", zipfile.ZIP_DEFLATED)
   668 
   666 
   669                 for f in files:
   667                 for f in files:
   677                 f.close()
   675                 f.close()
   678             finally:
   676             finally:
   679                 os.unlink(tmp)
   677                 os.unlink(tmp)
   680 
   678 
   681         else:
   679         else:
   682             import StringIO
       
   683             import time
       
   684             import tarfile
       
   685 
       
   686             tf = tarfile.TarFile.open(mode='w|' + type, fileobj=req.out)
   680             tf = tarfile.TarFile.open(mode='w|' + type, fileobj=req.out)
   687             mff = self.repo.manifest.readflags(mnode)
   681             mff = self.repo.manifest.readflags(mnode)
   688             mtime = int(time.time())
   682             mtime = int(time.time())
   689 
   683 
   690             if type == "gz":
   684             if type == "gz":
   847     port = int(repo.ui.config("web", "port", 8000))
   841     port = int(repo.ui.config("web", "port", 8000))
   848     use_ipv6 = repo.ui.configbool("web", "ipv6")
   842     use_ipv6 = repo.ui.configbool("web", "ipv6")
   849     accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
   843     accesslog = openlog(repo.ui.config("web", "accesslog", "-"), sys.stdout)
   850     errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
   844     errorlog = openlog(repo.ui.config("web", "errorlog", "-"), sys.stderr)
   851 
   845 
   852     import BaseHTTPServer
       
   853 
       
   854     class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
   846     class IPv6HTTPServer(BaseHTTPServer.HTTPServer):
   855         address_family = getattr(socket, 'AF_INET6', None)
   847         address_family = getattr(socket, 'AF_INET6', None)
   856 
   848 
   857         def __init__(self, *args, **kwargs):
   849         def __init__(self, *args, **kwargs):
   858             if self.address_family is None:
   850             if self.address_family is None:
   960                          {"header": header, "footer": footer})
   952                          {"header": header, "footer": footer})
   961 
   953 
   962         def entries(**map):
   954         def entries(**map):
   963             parity = 0
   955             parity = 0
   964             for name, path in self.repos:
   956             for name, path in self.repos:
   965                 u = ui()
   957                 u = ui.ui()
   966                 try:
   958                 try:
   967                     u.readconfig(file(os.path.join(path, '.hg', 'hgrc')))
   959                     u.readconfig(file(os.path.join(path, '.hg', 'hgrc')))
   968                 except IOError:
   960                 except IOError:
   969                     pass
   961                     pass
   970                 get = u.config
   962                 get = u.config