mercurial/hgweb/hgwebdir_mod.py
changeset 8529 a767998f0a78
parent 8389 4b798b100c32
child 8537 b48a1e081f23
equal deleted inserted replaced
8528:4ddffb793d18 8529:a767998f0a78
    17 import webutil
    17 import webutil
    18 
    18 
    19 def cleannames(items):
    19 def cleannames(items):
    20     return [(util.pconvert(name).strip('/'), path) for name, path in items]
    20     return [(util.pconvert(name).strip('/'), path) for name, path in items]
    21 
    21 
       
    22 def findrepos(paths):
       
    23     repos = {}
       
    24     for prefix, root in cleannames(paths):
       
    25         roothead, roottail = os.path.split(root)
       
    26         # "foo = /bar/*" makes every subrepo of /bar/ to be
       
    27         # mounted as foo/subrepo
       
    28         # and "foo = /bar/**" also recurses into the subdirectories,
       
    29         # remember to use it without working dir.
       
    30         try:
       
    31             recurse = {'*': False, '**': True}[roottail]
       
    32         except KeyError:
       
    33             repos[prefix] = root
       
    34             continue
       
    35         roothead = os.path.normpath(roothead)
       
    36         for path in util.walkrepos(roothead, followsym=True, recurse=recurse):
       
    37             path = os.path.normpath(path)
       
    38             name = util.pconvert(path[len(roothead):]).strip('/')
       
    39             if prefix:
       
    40                 name = prefix + '/' + name
       
    41             repos[name] = path
       
    42     return repos.items()
       
    43 
    22 class hgwebdir(object):
    44 class hgwebdir(object):
    23     refreshinterval = 20
    45     refreshinterval = 20
    24 
    46 
    25     def __init__(self, conf, baseui=None):
    47     def __init__(self, conf, baseui=None):
    26         self.conf = conf
    48         self.conf = conf
    37         else:
    59         else:
    38             self.ui = ui.ui()
    60             self.ui = ui.ui()
    39             self.ui.setconfig('ui', 'report_untrusted', 'off')
    61             self.ui.setconfig('ui', 'report_untrusted', 'off')
    40             self.ui.setconfig('ui', 'interactive', 'off')
    62             self.ui.setconfig('ui', 'interactive', 'off')
    41 
    63 
    42         if isinstance(self.conf, (list, tuple)):
       
    43             self.repos = cleannames(conf)
       
    44         elif isinstance(self.conf, dict):
       
    45             self.repos = sorted(cleannames(self.conf.items()))
       
    46         else:
       
    47             self.ui.readconfig(self.conf, remap={'paths': 'hgweb-paths'}, trust=True)
       
    48             self.repos = []
       
    49 
       
    50         self.motd = self.ui.config('web', 'motd')
    64         self.motd = self.ui.config('web', 'motd')
    51         self.style = self.ui.config('web', 'style', 'paper')
    65         self.style = self.ui.config('web', 'style', 'paper')
    52         self.stripecount = self.ui.config('web', 'stripes', 1)
    66         self.stripecount = self.ui.config('web', 'stripes', 1)
    53         if self.stripecount:
    67         if self.stripecount:
    54             self.stripecount = int(self.stripecount)
    68             self.stripecount = int(self.stripecount)
    55         self._baseurl = self.ui.config('web', 'baseurl')
    69         self._baseurl = self.ui.config('web', 'baseurl')
    56 
    70 
    57         if self.repos:
    71         if not isinstance(self.conf, (dict, list, tuple)):
    58             return
    72             map = {'paths': 'hgweb-paths'}
    59 
    73             self.ui.readconfig(self.conf, remap=map, trust=True)
    60         for prefix, root in cleannames(self.ui.configitems('hgweb-paths')):
    74             paths = self.ui.configitems('hgweb-paths')
    61             roothead, roottail = os.path.split(root)
    75         elif isinstance(self.conf, (list, tuple)):
    62             # "foo = /bar/*" makes every subrepo of /bar/ to be
    76             paths = self.conf
    63             # mounted as foo/subrepo
    77         elif isinstance(self.conf, dict):
    64             # and "foo = /bar/**" also recurses into the subdirectories,
    78             paths = self.conf.items()
    65             # remember to use it without working dir.
    79 
    66             try:
    80         self.repos = findrepos(paths)
    67                 recurse = {'*': False, '**': True}[roottail]
       
    68             except KeyError:
       
    69                 self.repos.append((prefix, root))
       
    70                 continue
       
    71             roothead = os.path.normpath(roothead)
       
    72             for path in util.walkrepos(roothead, followsym=True,
       
    73                                        recurse=recurse):
       
    74                 path = os.path.normpath(path)
       
    75                 name = util.pconvert(path[len(roothead):]).strip('/')
       
    76                 if prefix:
       
    77                     name = prefix + '/' + name
       
    78                 self.repos.append((name, path))
       
    79 
       
    80         for prefix, root in self.ui.configitems('collections'):
    81         for prefix, root in self.ui.configitems('collections'):
    81             for path in util.walkrepos(root, followsym=True):
    82             for path in util.walkrepos(root, followsym=True):
    82                 repo = os.path.normpath(path)
    83                 repo = os.path.normpath(path)
    83                 name = repo
    84                 name = repo
    84                 if name.startswith(prefix):
    85                 if name.startswith(prefix):