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