##// END OF EJS Templates
hgwebdir: don't allow the hidden parent of a subrepo to show as a directory...
Matt Harbison -
r25426:5f3666da stable
parent child Browse files
Show More
@@ -1,464 +1,470 b''
1 # hgweb/hgwebdir_mod.py - Web interface for a directory of repositories.
1 # hgweb/hgwebdir_mod.py - Web interface for a directory of repositories.
2 #
2 #
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
4 # Copyright 2005, 2006 Matt Mackall <mpm@selenic.com>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 import os, re, time
9 import os, re, time
10 from mercurial.i18n import _
10 from mercurial.i18n import _
11 from mercurial import ui, hg, scmutil, util, templater
11 from mercurial import ui, hg, scmutil, util, templater
12 from mercurial import error, encoding
12 from mercurial import error, encoding
13 from common import ErrorResponse, get_mtime, staticfile, paritygen, ismember, \
13 from common import ErrorResponse, get_mtime, staticfile, paritygen, ismember, \
14 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
14 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
15 from hgweb_mod import hgweb, makebreadcrumb
15 from hgweb_mod import hgweb, makebreadcrumb
16 from request import wsgirequest
16 from request import wsgirequest
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):
22 def findrepos(paths):
23 repos = []
23 repos = []
24 for prefix, root in cleannames(paths):
24 for prefix, root in cleannames(paths):
25 roothead, roottail = os.path.split(root)
25 roothead, roottail = os.path.split(root)
26 # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below
26 # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below
27 # /bar/ be served as as foo/N .
27 # /bar/ be served as as foo/N .
28 # '*' will not search inside dirs with .hg (except .hg/patches),
28 # '*' will not search inside dirs with .hg (except .hg/patches),
29 # '**' will search inside dirs with .hg (and thus also find subrepos).
29 # '**' will search inside dirs with .hg (and thus also find subrepos).
30 try:
30 try:
31 recurse = {'*': False, '**': True}[roottail]
31 recurse = {'*': False, '**': True}[roottail]
32 except KeyError:
32 except KeyError:
33 repos.append((prefix, root))
33 repos.append((prefix, root))
34 continue
34 continue
35 roothead = os.path.normpath(os.path.abspath(roothead))
35 roothead = os.path.normpath(os.path.abspath(roothead))
36 paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse)
36 paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse)
37 repos.extend(urlrepos(prefix, roothead, paths))
37 repos.extend(urlrepos(prefix, roothead, paths))
38 return repos
38 return repos
39
39
40 def urlrepos(prefix, roothead, paths):
40 def urlrepos(prefix, roothead, paths):
41 """yield url paths and filesystem paths from a list of repo paths
41 """yield url paths and filesystem paths from a list of repo paths
42
42
43 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
43 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
44 >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
44 >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
45 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
45 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
46 >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
46 >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
47 [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
47 [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
48 """
48 """
49 for path in paths:
49 for path in paths:
50 path = os.path.normpath(path)
50 path = os.path.normpath(path)
51 yield (prefix + '/' +
51 yield (prefix + '/' +
52 util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path
52 util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path
53
53
54 def geturlcgivars(baseurl, port):
54 def geturlcgivars(baseurl, port):
55 """
55 """
56 Extract CGI variables from baseurl
56 Extract CGI variables from baseurl
57
57
58 >>> geturlcgivars("http://host.org/base", "80")
58 >>> geturlcgivars("http://host.org/base", "80")
59 ('host.org', '80', '/base')
59 ('host.org', '80', '/base')
60 >>> geturlcgivars("http://host.org:8000/base", "80")
60 >>> geturlcgivars("http://host.org:8000/base", "80")
61 ('host.org', '8000', '/base')
61 ('host.org', '8000', '/base')
62 >>> geturlcgivars('/base', 8000)
62 >>> geturlcgivars('/base', 8000)
63 ('', '8000', '/base')
63 ('', '8000', '/base')
64 >>> geturlcgivars("base", '8000')
64 >>> geturlcgivars("base", '8000')
65 ('', '8000', '/base')
65 ('', '8000', '/base')
66 >>> geturlcgivars("http://host", '8000')
66 >>> geturlcgivars("http://host", '8000')
67 ('host', '8000', '/')
67 ('host', '8000', '/')
68 >>> geturlcgivars("http://host/", '8000')
68 >>> geturlcgivars("http://host/", '8000')
69 ('host', '8000', '/')
69 ('host', '8000', '/')
70 """
70 """
71 u = util.url(baseurl)
71 u = util.url(baseurl)
72 name = u.host or ''
72 name = u.host or ''
73 if u.port:
73 if u.port:
74 port = u.port
74 port = u.port
75 path = u.path or ""
75 path = u.path or ""
76 if not path.startswith('/'):
76 if not path.startswith('/'):
77 path = '/' + path
77 path = '/' + path
78
78
79 return name, str(port), path
79 return name, str(port), path
80
80
81 class hgwebdir(object):
81 class hgwebdir(object):
82 refreshinterval = 20
82 refreshinterval = 20
83
83
84 def __init__(self, conf, baseui=None):
84 def __init__(self, conf, baseui=None):
85 self.conf = conf
85 self.conf = conf
86 self.baseui = baseui
86 self.baseui = baseui
87 self.lastrefresh = 0
87 self.lastrefresh = 0
88 self.motd = None
88 self.motd = None
89 self.refresh()
89 self.refresh()
90
90
91 def refresh(self):
91 def refresh(self):
92 if self.lastrefresh + self.refreshinterval > time.time():
92 if self.lastrefresh + self.refreshinterval > time.time():
93 return
93 return
94
94
95 if self.baseui:
95 if self.baseui:
96 u = self.baseui.copy()
96 u = self.baseui.copy()
97 else:
97 else:
98 u = ui.ui()
98 u = ui.ui()
99 u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
99 u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
100 u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
100 u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
101
101
102 if not isinstance(self.conf, (dict, list, tuple)):
102 if not isinstance(self.conf, (dict, list, tuple)):
103 map = {'paths': 'hgweb-paths'}
103 map = {'paths': 'hgweb-paths'}
104 if not os.path.exists(self.conf):
104 if not os.path.exists(self.conf):
105 raise util.Abort(_('config file %s not found!') % self.conf)
105 raise util.Abort(_('config file %s not found!') % self.conf)
106 u.readconfig(self.conf, remap=map, trust=True)
106 u.readconfig(self.conf, remap=map, trust=True)
107 paths = []
107 paths = []
108 for name, ignored in u.configitems('hgweb-paths'):
108 for name, ignored in u.configitems('hgweb-paths'):
109 for path in u.configlist('hgweb-paths', name):
109 for path in u.configlist('hgweb-paths', name):
110 paths.append((name, path))
110 paths.append((name, path))
111 elif isinstance(self.conf, (list, tuple)):
111 elif isinstance(self.conf, (list, tuple)):
112 paths = self.conf
112 paths = self.conf
113 elif isinstance(self.conf, dict):
113 elif isinstance(self.conf, dict):
114 paths = self.conf.items()
114 paths = self.conf.items()
115
115
116 repos = findrepos(paths)
116 repos = findrepos(paths)
117 for prefix, root in u.configitems('collections'):
117 for prefix, root in u.configitems('collections'):
118 prefix = util.pconvert(prefix)
118 prefix = util.pconvert(prefix)
119 for path in scmutil.walkrepos(root, followsym=True):
119 for path in scmutil.walkrepos(root, followsym=True):
120 repo = os.path.normpath(path)
120 repo = os.path.normpath(path)
121 name = util.pconvert(repo)
121 name = util.pconvert(repo)
122 if name.startswith(prefix):
122 if name.startswith(prefix):
123 name = name[len(prefix):]
123 name = name[len(prefix):]
124 repos.append((name.lstrip('/'), repo))
124 repos.append((name.lstrip('/'), repo))
125
125
126 self.repos = repos
126 self.repos = repos
127 self.ui = u
127 self.ui = u
128 encoding.encoding = self.ui.config('web', 'encoding',
128 encoding.encoding = self.ui.config('web', 'encoding',
129 encoding.encoding)
129 encoding.encoding)
130 self.style = self.ui.config('web', 'style', 'paper')
130 self.style = self.ui.config('web', 'style', 'paper')
131 self.templatepath = self.ui.config('web', 'templates', None)
131 self.templatepath = self.ui.config('web', 'templates', None)
132 self.stripecount = self.ui.config('web', 'stripes', 1)
132 self.stripecount = self.ui.config('web', 'stripes', 1)
133 if self.stripecount:
133 if self.stripecount:
134 self.stripecount = int(self.stripecount)
134 self.stripecount = int(self.stripecount)
135 self._baseurl = self.ui.config('web', 'baseurl')
135 self._baseurl = self.ui.config('web', 'baseurl')
136 prefix = self.ui.config('web', 'prefix', '')
136 prefix = self.ui.config('web', 'prefix', '')
137 if prefix.startswith('/'):
137 if prefix.startswith('/'):
138 prefix = prefix[1:]
138 prefix = prefix[1:]
139 if prefix.endswith('/'):
139 if prefix.endswith('/'):
140 prefix = prefix[:-1]
140 prefix = prefix[:-1]
141 self.prefix = prefix
141 self.prefix = prefix
142 self.lastrefresh = time.time()
142 self.lastrefresh = time.time()
143
143
144 def run(self):
144 def run(self):
145 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
145 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
146 raise RuntimeError("This function is only intended to be "
146 raise RuntimeError("This function is only intended to be "
147 "called while running as a CGI script.")
147 "called while running as a CGI script.")
148 import mercurial.hgweb.wsgicgi as wsgicgi
148 import mercurial.hgweb.wsgicgi as wsgicgi
149 wsgicgi.launch(self)
149 wsgicgi.launch(self)
150
150
151 def __call__(self, env, respond):
151 def __call__(self, env, respond):
152 req = wsgirequest(env, respond)
152 req = wsgirequest(env, respond)
153 return self.run_wsgi(req)
153 return self.run_wsgi(req)
154
154
155 def read_allowed(self, ui, req):
155 def read_allowed(self, ui, req):
156 """Check allow_read and deny_read config options of a repo's ui object
156 """Check allow_read and deny_read config options of a repo's ui object
157 to determine user permissions. By default, with neither option set (or
157 to determine user permissions. By default, with neither option set (or
158 both empty), allow all users to read the repo. There are two ways a
158 both empty), allow all users to read the repo. There are two ways a
159 user can be denied read access: (1) deny_read is not empty, and the
159 user can be denied read access: (1) deny_read is not empty, and the
160 user is unauthenticated or deny_read contains user (or *), and (2)
160 user is unauthenticated or deny_read contains user (or *), and (2)
161 allow_read is not empty and the user is not in allow_read. Return True
161 allow_read is not empty and the user is not in allow_read. Return True
162 if user is allowed to read the repo, else return False."""
162 if user is allowed to read the repo, else return False."""
163
163
164 user = req.env.get('REMOTE_USER')
164 user = req.env.get('REMOTE_USER')
165
165
166 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
166 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
167 if deny_read and (not user or ismember(ui, user, deny_read)):
167 if deny_read and (not user or ismember(ui, user, deny_read)):
168 return False
168 return False
169
169
170 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
170 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
171 # by default, allow reading if no allow_read option has been set
171 # by default, allow reading if no allow_read option has been set
172 if (not allow_read) or ismember(ui, user, allow_read):
172 if (not allow_read) or ismember(ui, user, allow_read):
173 return True
173 return True
174
174
175 return False
175 return False
176
176
177 def run_wsgi(self, req):
177 def run_wsgi(self, req):
178 try:
178 try:
179 try:
179 try:
180 self.refresh()
180 self.refresh()
181
181
182 virtual = req.env.get("PATH_INFO", "").strip('/')
182 virtual = req.env.get("PATH_INFO", "").strip('/')
183 tmpl = self.templater(req)
183 tmpl = self.templater(req)
184 ctype = tmpl('mimetype', encoding=encoding.encoding)
184 ctype = tmpl('mimetype', encoding=encoding.encoding)
185 ctype = templater.stringify(ctype)
185 ctype = templater.stringify(ctype)
186
186
187 # a static file
187 # a static file
188 if virtual.startswith('static/') or 'static' in req.form:
188 if virtual.startswith('static/') or 'static' in req.form:
189 if virtual.startswith('static/'):
189 if virtual.startswith('static/'):
190 fname = virtual[7:]
190 fname = virtual[7:]
191 else:
191 else:
192 fname = req.form['static'][0]
192 fname = req.form['static'][0]
193 static = self.ui.config("web", "static", None,
193 static = self.ui.config("web", "static", None,
194 untrusted=False)
194 untrusted=False)
195 if not static:
195 if not static:
196 tp = self.templatepath or templater.templatepaths()
196 tp = self.templatepath or templater.templatepaths()
197 if isinstance(tp, str):
197 if isinstance(tp, str):
198 tp = [tp]
198 tp = [tp]
199 static = [os.path.join(p, 'static') for p in tp]
199 static = [os.path.join(p, 'static') for p in tp]
200 staticfile(static, fname, req)
200 staticfile(static, fname, req)
201 return []
201 return []
202
202
203 # top-level index
203 # top-level index
204 elif not virtual:
204 elif not virtual:
205 req.respond(HTTP_OK, ctype)
205 req.respond(HTTP_OK, ctype)
206 return self.makeindex(req, tmpl)
206 return self.makeindex(req, tmpl)
207
207
208 # nested indexes and hgwebs
208 # nested indexes and hgwebs
209
209
210 repos = dict(self.repos)
210 repos = dict(self.repos)
211 virtualrepo = virtual
211 virtualrepo = virtual
212 while virtualrepo:
212 while virtualrepo:
213 real = repos.get(virtualrepo)
213 real = repos.get(virtualrepo)
214 if real:
214 if real:
215 req.env['REPO_NAME'] = virtualrepo
215 req.env['REPO_NAME'] = virtualrepo
216 try:
216 try:
217 # ensure caller gets private copy of ui
217 # ensure caller gets private copy of ui
218 repo = hg.repository(self.ui.copy(), real)
218 repo = hg.repository(self.ui.copy(), real)
219 return hgweb(repo).run_wsgi(req)
219 return hgweb(repo).run_wsgi(req)
220 except IOError, inst:
220 except IOError, inst:
221 msg = inst.strerror
221 msg = inst.strerror
222 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
222 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
223 except error.RepoError, inst:
223 except error.RepoError, inst:
224 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
224 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
225
225
226 up = virtualrepo.rfind('/')
226 up = virtualrepo.rfind('/')
227 if up < 0:
227 if up < 0:
228 break
228 break
229 virtualrepo = virtualrepo[:up]
229 virtualrepo = virtualrepo[:up]
230
230
231 # browse subdirectories
231 # browse subdirectories
232 subdir = virtual + '/'
232 subdir = virtual + '/'
233 if [r for r in repos if r.startswith(subdir)]:
233 if [r for r in repos if r.startswith(subdir)]:
234 req.respond(HTTP_OK, ctype)
234 req.respond(HTTP_OK, ctype)
235 return self.makeindex(req, tmpl, subdir)
235 return self.makeindex(req, tmpl, subdir)
236
236
237 # prefixes not found
237 # prefixes not found
238 req.respond(HTTP_NOT_FOUND, ctype)
238 req.respond(HTTP_NOT_FOUND, ctype)
239 return tmpl("notfound", repo=virtual)
239 return tmpl("notfound", repo=virtual)
240
240
241 except ErrorResponse, err:
241 except ErrorResponse, err:
242 req.respond(err, ctype)
242 req.respond(err, ctype)
243 return tmpl('error', error=err.message or '')
243 return tmpl('error', error=err.message or '')
244 finally:
244 finally:
245 tmpl = None
245 tmpl = None
246
246
247 def makeindex(self, req, tmpl, subdir=""):
247 def makeindex(self, req, tmpl, subdir=""):
248
248
249 def archivelist(ui, nodeid, url):
249 def archivelist(ui, nodeid, url):
250 allowed = ui.configlist("web", "allow_archive", untrusted=True)
250 allowed = ui.configlist("web", "allow_archive", untrusted=True)
251 archives = []
251 archives = []
252 for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]:
252 for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]:
253 if i[0] in allowed or ui.configbool("web", "allow" + i[0],
253 if i[0] in allowed or ui.configbool("web", "allow" + i[0],
254 untrusted=True):
254 untrusted=True):
255 archives.append({"type" : i[0], "extension": i[1],
255 archives.append({"type" : i[0], "extension": i[1],
256 "node": nodeid, "url": url})
256 "node": nodeid, "url": url})
257 return archives
257 return archives
258
258
259 def rawentries(subdir="", **map):
259 def rawentries(subdir="", **map):
260
260
261 descend = self.ui.configbool('web', 'descend', True)
261 descend = self.ui.configbool('web', 'descend', True)
262 collapse = self.ui.configbool('web', 'collapse', False)
262 collapse = self.ui.configbool('web', 'collapse', False)
263 seenrepos = set()
263 seenrepos = set()
264 seendirs = set()
264 seendirs = set()
265 for name, path in self.repos:
265 for name, path in self.repos:
266
266
267 if not name.startswith(subdir):
267 if not name.startswith(subdir):
268 continue
268 continue
269 name = name[len(subdir):]
269 name = name[len(subdir):]
270 directory = False
270 directory = False
271
271
272 if '/' in name:
272 if '/' in name:
273 if not descend:
273 if not descend:
274 continue
274 continue
275
275
276 nameparts = name.split('/')
276 nameparts = name.split('/')
277 rootname = nameparts[0]
277 rootname = nameparts[0]
278
278
279 if not collapse:
279 if not collapse:
280 pass
280 pass
281 elif rootname in seendirs:
281 elif rootname in seendirs:
282 continue
282 continue
283 elif rootname in seenrepos:
283 elif rootname in seenrepos:
284 pass
284 pass
285 else:
285 else:
286 directory = True
286 directory = True
287 name = rootname
287 name = rootname
288
288
289 # redefine the path to refer to the directory
289 # redefine the path to refer to the directory
290 discarded = '/'.join(nameparts[1:])
290 discarded = '/'.join(nameparts[1:])
291
291
292 # remove name parts plus accompanying slash
292 # remove name parts plus accompanying slash
293 path = path[:-len(discarded) - 1]
293 path = path[:-len(discarded) - 1]
294
294
295 try:
296 r = hg.repository(self.ui, path)
297 directory = False
298 except (IOError, error.RepoError):
299 pass
300
295 parts = [name]
301 parts = [name]
296 if 'PATH_INFO' in req.env:
302 if 'PATH_INFO' in req.env:
297 parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
303 parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
298 if req.env['SCRIPT_NAME']:
304 if req.env['SCRIPT_NAME']:
299 parts.insert(0, req.env['SCRIPT_NAME'])
305 parts.insert(0, req.env['SCRIPT_NAME'])
300 url = re.sub(r'/+', '/', '/'.join(parts) + '/')
306 url = re.sub(r'/+', '/', '/'.join(parts) + '/')
301
307
302 # show either a directory entry or a repository
308 # show either a directory entry or a repository
303 if directory:
309 if directory:
304 # get the directory's time information
310 # get the directory's time information
305 try:
311 try:
306 d = (get_mtime(path), util.makedate()[1])
312 d = (get_mtime(path), util.makedate()[1])
307 except OSError:
313 except OSError:
308 continue
314 continue
309
315
310 # add '/' to the name to make it obvious that
316 # add '/' to the name to make it obvious that
311 # the entry is a directory, not a regular repository
317 # the entry is a directory, not a regular repository
312 row = {'contact': "",
318 row = {'contact': "",
313 'contact_sort': "",
319 'contact_sort': "",
314 'name': name + '/',
320 'name': name + '/',
315 'name_sort': name,
321 'name_sort': name,
316 'url': url,
322 'url': url,
317 'description': "",
323 'description': "",
318 'description_sort': "",
324 'description_sort': "",
319 'lastchange': d,
325 'lastchange': d,
320 'lastchange_sort': d[1]-d[0],
326 'lastchange_sort': d[1]-d[0],
321 'archives': [],
327 'archives': [],
322 'isdirectory': True}
328 'isdirectory': True}
323
329
324 seendirs.add(name)
330 seendirs.add(name)
325 yield row
331 yield row
326 continue
332 continue
327
333
328 u = self.ui.copy()
334 u = self.ui.copy()
329 try:
335 try:
330 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
336 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
331 except Exception, e:
337 except Exception, e:
332 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
338 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
333 continue
339 continue
334 def get(section, name, default=None):
340 def get(section, name, default=None):
335 return u.config(section, name, default, untrusted=True)
341 return u.config(section, name, default, untrusted=True)
336
342
337 if u.configbool("web", "hidden", untrusted=True):
343 if u.configbool("web", "hidden", untrusted=True):
338 continue
344 continue
339
345
340 if not self.read_allowed(u, req):
346 if not self.read_allowed(u, req):
341 continue
347 continue
342
348
343 # update time with local timezone
349 # update time with local timezone
344 try:
350 try:
345 r = hg.repository(self.ui, path)
351 r = hg.repository(self.ui, path)
346 except IOError:
352 except IOError:
347 u.warn(_('error accessing repository at %s\n') % path)
353 u.warn(_('error accessing repository at %s\n') % path)
348 continue
354 continue
349 except error.RepoError:
355 except error.RepoError:
350 u.warn(_('error accessing repository at %s\n') % path)
356 u.warn(_('error accessing repository at %s\n') % path)
351 continue
357 continue
352 try:
358 try:
353 d = (get_mtime(r.spath), util.makedate()[1])
359 d = (get_mtime(r.spath), util.makedate()[1])
354 except OSError:
360 except OSError:
355 continue
361 continue
356
362
357 contact = get_contact(get)
363 contact = get_contact(get)
358 description = get("web", "description", "")
364 description = get("web", "description", "")
359 seenrepos.add(name)
365 seenrepos.add(name)
360 name = get("web", "name", name)
366 name = get("web", "name", name)
361 row = {'contact': contact or "unknown",
367 row = {'contact': contact or "unknown",
362 'contact_sort': contact.upper() or "unknown",
368 'contact_sort': contact.upper() or "unknown",
363 'name': name,
369 'name': name,
364 'name_sort': name,
370 'name_sort': name,
365 'url': url,
371 'url': url,
366 'description': description or "unknown",
372 'description': description or "unknown",
367 'description_sort': description.upper() or "unknown",
373 'description_sort': description.upper() or "unknown",
368 'lastchange': d,
374 'lastchange': d,
369 'lastchange_sort': d[1]-d[0],
375 'lastchange_sort': d[1]-d[0],
370 'archives': archivelist(u, "tip", url),
376 'archives': archivelist(u, "tip", url),
371 'isdirectory': None,
377 'isdirectory': None,
372 }
378 }
373
379
374 yield row
380 yield row
375
381
376 sortdefault = None, False
382 sortdefault = None, False
377 def entries(sortcolumn="", descending=False, subdir="", **map):
383 def entries(sortcolumn="", descending=False, subdir="", **map):
378 rows = rawentries(subdir=subdir, **map)
384 rows = rawentries(subdir=subdir, **map)
379
385
380 if sortcolumn and sortdefault != (sortcolumn, descending):
386 if sortcolumn and sortdefault != (sortcolumn, descending):
381 sortkey = '%s_sort' % sortcolumn
387 sortkey = '%s_sort' % sortcolumn
382 rows = sorted(rows, key=lambda x: x[sortkey],
388 rows = sorted(rows, key=lambda x: x[sortkey],
383 reverse=descending)
389 reverse=descending)
384 for row, parity in zip(rows, paritygen(self.stripecount)):
390 for row, parity in zip(rows, paritygen(self.stripecount)):
385 row['parity'] = parity
391 row['parity'] = parity
386 yield row
392 yield row
387
393
388 self.refresh()
394 self.refresh()
389 sortable = ["name", "description", "contact", "lastchange"]
395 sortable = ["name", "description", "contact", "lastchange"]
390 sortcolumn, descending = sortdefault
396 sortcolumn, descending = sortdefault
391 if 'sort' in req.form:
397 if 'sort' in req.form:
392 sortcolumn = req.form['sort'][0]
398 sortcolumn = req.form['sort'][0]
393 descending = sortcolumn.startswith('-')
399 descending = sortcolumn.startswith('-')
394 if descending:
400 if descending:
395 sortcolumn = sortcolumn[1:]
401 sortcolumn = sortcolumn[1:]
396 if sortcolumn not in sortable:
402 if sortcolumn not in sortable:
397 sortcolumn = ""
403 sortcolumn = ""
398
404
399 sort = [("sort_%s" % column,
405 sort = [("sort_%s" % column,
400 "%s%s" % ((not descending and column == sortcolumn)
406 "%s%s" % ((not descending and column == sortcolumn)
401 and "-" or "", column))
407 and "-" or "", column))
402 for column in sortable]
408 for column in sortable]
403
409
404 self.refresh()
410 self.refresh()
405 self.updatereqenv(req.env)
411 self.updatereqenv(req.env)
406
412
407 return tmpl("index", entries=entries, subdir=subdir,
413 return tmpl("index", entries=entries, subdir=subdir,
408 pathdef=makebreadcrumb('/' + subdir, self.prefix),
414 pathdef=makebreadcrumb('/' + subdir, self.prefix),
409 sortcolumn=sortcolumn, descending=descending,
415 sortcolumn=sortcolumn, descending=descending,
410 **dict(sort))
416 **dict(sort))
411
417
412 def templater(self, req):
418 def templater(self, req):
413
419
414 def motd(**map):
420 def motd(**map):
415 if self.motd is not None:
421 if self.motd is not None:
416 yield self.motd
422 yield self.motd
417 else:
423 else:
418 yield config('web', 'motd', '')
424 yield config('web', 'motd', '')
419
425
420 def config(section, name, default=None, untrusted=True):
426 def config(section, name, default=None, untrusted=True):
421 return self.ui.config(section, name, default, untrusted)
427 return self.ui.config(section, name, default, untrusted)
422
428
423 self.updatereqenv(req.env)
429 self.updatereqenv(req.env)
424
430
425 url = req.env.get('SCRIPT_NAME', '')
431 url = req.env.get('SCRIPT_NAME', '')
426 if not url.endswith('/'):
432 if not url.endswith('/'):
427 url += '/'
433 url += '/'
428
434
429 vars = {}
435 vars = {}
430 styles = (
436 styles = (
431 req.form.get('style', [None])[0],
437 req.form.get('style', [None])[0],
432 config('web', 'style'),
438 config('web', 'style'),
433 'paper'
439 'paper'
434 )
440 )
435 style, mapfile = templater.stylemap(styles, self.templatepath)
441 style, mapfile = templater.stylemap(styles, self.templatepath)
436 if style == styles[0]:
442 if style == styles[0]:
437 vars['style'] = style
443 vars['style'] = style
438
444
439 start = url[-1] == '?' and '&' or '?'
445 start = url[-1] == '?' and '&' or '?'
440 sessionvars = webutil.sessionvars(vars, start)
446 sessionvars = webutil.sessionvars(vars, start)
441 logourl = config('web', 'logourl', 'http://mercurial.selenic.com/')
447 logourl = config('web', 'logourl', 'http://mercurial.selenic.com/')
442 logoimg = config('web', 'logoimg', 'hglogo.png')
448 logoimg = config('web', 'logoimg', 'hglogo.png')
443 staticurl = config('web', 'staticurl') or url + 'static/'
449 staticurl = config('web', 'staticurl') or url + 'static/'
444 if not staticurl.endswith('/'):
450 if not staticurl.endswith('/'):
445 staticurl += '/'
451 staticurl += '/'
446
452
447 tmpl = templater.templater(mapfile,
453 tmpl = templater.templater(mapfile,
448 defaults={"encoding": encoding.encoding,
454 defaults={"encoding": encoding.encoding,
449 "motd": motd,
455 "motd": motd,
450 "url": url,
456 "url": url,
451 "logourl": logourl,
457 "logourl": logourl,
452 "logoimg": logoimg,
458 "logoimg": logoimg,
453 "staticurl": staticurl,
459 "staticurl": staticurl,
454 "sessionvars": sessionvars,
460 "sessionvars": sessionvars,
455 "style": style,
461 "style": style,
456 })
462 })
457 return tmpl
463 return tmpl
458
464
459 def updatereqenv(self, env):
465 def updatereqenv(self, env):
460 if self._baseurl is not None:
466 if self._baseurl is not None:
461 name, port, path = geturlcgivars(self._baseurl, env['SERVER_PORT'])
467 name, port, path = geturlcgivars(self._baseurl, env['SERVER_PORT'])
462 env['SERVER_NAME'] = name
468 env['SERVER_NAME'] = name
463 env['SERVER_PORT'] = port
469 env['SERVER_PORT'] = port
464 env['SCRIPT_NAME'] = path
470 env['SCRIPT_NAME'] = path
@@ -1,1267 +1,1286 b''
1 #require serve
1 #require serve
2
2
3 hide outer repo and work in dir without '.hg'
3 hide outer repo and work in dir without '.hg'
4 $ hg init
4 $ hg init
5 $ mkdir dir
5 $ mkdir dir
6 $ cd dir
6 $ cd dir
7
7
8 Tests some basic hgwebdir functionality. Tests setting up paths and
8 Tests some basic hgwebdir functionality. Tests setting up paths and
9 collection, different forms of 404s and the subdirectory support.
9 collection, different forms of 404s and the subdirectory support.
10
10
11 $ mkdir webdir
11 $ mkdir webdir
12 $ cd webdir
12 $ cd webdir
13 $ hg init a
13 $ hg init a
14 $ echo a > a/a
14 $ echo a > a/a
15 $ hg --cwd a ci -Ama -d'1 0'
15 $ hg --cwd a ci -Ama -d'1 0'
16 adding a
16 adding a
17
17
18 create a mercurial queue repository
18 create a mercurial queue repository
19
19
20 $ hg --cwd a qinit --config extensions.hgext.mq= -c
20 $ hg --cwd a qinit --config extensions.hgext.mq= -c
21 $ hg init b
21 $ hg init b
22 $ echo b > b/b
22 $ echo b > b/b
23 $ hg --cwd b ci -Amb -d'2 0'
23 $ hg --cwd b ci -Amb -d'2 0'
24 adding b
24 adding b
25
25
26 create a nested repository
26 create a nested repository
27
27
28 $ cd b
28 $ cd b
29 $ hg init d
29 $ hg init d
30 $ echo d > d/d
30 $ echo d > d/d
31 $ hg --cwd d ci -Amd -d'3 0'
31 $ hg --cwd d ci -Amd -d'3 0'
32 adding d
32 adding d
33 $ cd ..
33 $ cd ..
34 $ hg init c
34 $ hg init c
35 $ echo c > c/c
35 $ echo c > c/c
36 $ hg --cwd c ci -Amc -d'3 0'
36 $ hg --cwd c ci -Amc -d'3 0'
37 adding c
37 adding c
38
38
39 create a subdirectory containing repositories and subrepositories
39 create a subdirectory containing repositories and subrepositories
40
40
41 $ mkdir notrepo
41 $ mkdir notrepo
42 $ cd notrepo
42 $ cd notrepo
43 $ hg init e
43 $ hg init e
44 $ echo e > e/e
44 $ echo e > e/e
45 $ hg --cwd e ci -Ame -d'4 0'
45 $ hg --cwd e ci -Ame -d'4 0'
46 adding e
46 adding e
47 $ hg init e/e2
47 $ hg init e/e2
48 $ echo e2 > e/e2/e2
48 $ echo e2 > e/e2/e2
49 $ hg --cwd e/e2 ci -Ame2 -d '4 0'
49 $ hg --cwd e/e2 ci -Ame2 -d '4 0'
50 adding e2
50 adding e2
51 $ hg init f
51 $ hg init f
52 $ echo f > f/f
52 $ echo f > f/f
53 $ hg --cwd f ci -Amf -d'4 0'
53 $ hg --cwd f ci -Amf -d'4 0'
54 adding f
54 adding f
55 $ hg init f/f2
55 $ hg init f/f2
56 $ echo f2 > f/f2/f2
56 $ echo f2 > f/f2/f2
57 $ hg --cwd f/f2 ci -Amf2 -d '4 0'
57 $ hg --cwd f/f2 ci -Amf2 -d '4 0'
58 adding f2
58 adding f2
59 $ echo 'f2 = f2' > f/.hgsub
59 $ echo 'f2 = f2' > f/.hgsub
60 $ hg -R f ci -Am 'add subrepo' -d'4 0'
60 $ hg -R f ci -Am 'add subrepo' -d'4 0'
61 adding .hgsub
61 adding .hgsub
62 $ cat >> f/.hg/hgrc << EOF
62 $ cat >> f/.hg/hgrc << EOF
63 > [web]
63 > [web]
64 > name = fancy name for repo f
64 > name = fancy name for repo f
65 > EOF
65 > EOF
66 $ cd ..
66 $ cd ..
67
67
68 create repository without .hg/store
68 create repository without .hg/store
69
69
70 $ hg init nostore
70 $ hg init nostore
71 $ rm -R nostore/.hg/store
71 $ rm -R nostore/.hg/store
72 $ root=`pwd`
72 $ root=`pwd`
73 $ cd ..
73 $ cd ..
74
74
75 serve
75 serve
76 $ cat > paths.conf <<EOF
76 $ cat > paths.conf <<EOF
77 > [paths]
77 > [paths]
78 > a=$root/a
78 > a=$root/a
79 > b=$root/b
79 > b=$root/b
80 > EOF
80 > EOF
81 $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
81 $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
82 > -A access-paths.log -E error-paths-1.log
82 > -A access-paths.log -E error-paths-1.log
83 $ cat hg.pid >> $DAEMON_PIDS
83 $ cat hg.pid >> $DAEMON_PIDS
84
84
85 should give a 404 - file does not exist
85 should give a 404 - file does not exist
86
86
87 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/file/tip/bork?style=raw'
87 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/file/tip/bork?style=raw'
88 404 Not Found
88 404 Not Found
89
89
90
90
91 error: bork@8580ff50825a: not found in manifest
91 error: bork@8580ff50825a: not found in manifest
92 [1]
92 [1]
93
93
94 should succeed
94 should succeed
95
95
96 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '?style=raw'
96 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT '?style=raw'
97 200 Script output follows
97 200 Script output follows
98
98
99
99
100 /a/
100 /a/
101 /b/
101 /b/
102
102
103 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/file/tip/a?style=raw'
103 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/file/tip/a?style=raw'
104 200 Script output follows
104 200 Script output follows
105
105
106 a
106 a
107 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'b/file/tip/b?style=raw'
107 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'b/file/tip/b?style=raw'
108 200 Script output follows
108 200 Script output follows
109
109
110 b
110 b
111
111
112 should give a 404 - repo is not published
112 should give a 404 - repo is not published
113
113
114 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'c/file/tip/c?style=raw'
114 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'c/file/tip/c?style=raw'
115 404 Not Found
115 404 Not Found
116
116
117
117
118 error: repository c/file/tip/c not found
118 error: repository c/file/tip/c not found
119 [1]
119 [1]
120
120
121 atom-log without basedir
121 atom-log without basedir
122
122
123 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/atom-log' | grep '<link'
123 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/atom-log' | grep '<link'
124 <link rel="self" href="http://*:$HGPORT/a/atom-log"/> (glob)
124 <link rel="self" href="http://*:$HGPORT/a/atom-log"/> (glob)
125 <link rel="alternate" href="http://*:$HGPORT/a/"/> (glob)
125 <link rel="alternate" href="http://*:$HGPORT/a/"/> (glob)
126 <link href="http://*:$HGPORT/a/rev/8580ff50825a"/> (glob)
126 <link href="http://*:$HGPORT/a/rev/8580ff50825a"/> (glob)
127
127
128 rss-log without basedir
128 rss-log without basedir
129
129
130 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/rss-log' | grep '<guid'
130 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT 'a/rss-log' | grep '<guid'
131 <guid isPermaLink="true">http://*:$HGPORT/a/rev/8580ff50825a</guid> (glob)
131 <guid isPermaLink="true">http://*:$HGPORT/a/rev/8580ff50825a</guid> (glob)
132 $ cat > paths.conf <<EOF
132 $ cat > paths.conf <<EOF
133 > [paths]
133 > [paths]
134 > t/a/=$root/a
134 > t/a/=$root/a
135 > b=$root/b
135 > b=$root/b
136 > coll=$root/*
136 > coll=$root/*
137 > rcoll=$root/**
137 > rcoll=$root/**
138 > star=*
138 > star=*
139 > starstar=**
139 > starstar=**
140 > astar=webdir/a/*
140 > astar=webdir/a/*
141 > EOF
141 > EOF
142 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
142 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
143 > -A access-paths.log -E error-paths-2.log
143 > -A access-paths.log -E error-paths-2.log
144 $ cat hg.pid >> $DAEMON_PIDS
144 $ cat hg.pid >> $DAEMON_PIDS
145
145
146 should succeed, slashy names
146 should succeed, slashy names
147
147
148 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
148 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
149 200 Script output follows
149 200 Script output follows
150
150
151
151
152 /t/a/
152 /t/a/
153 /b/
153 /b/
154 /coll/a/
154 /coll/a/
155 /coll/a/.hg/patches/
155 /coll/a/.hg/patches/
156 /coll/b/
156 /coll/b/
157 /coll/c/
157 /coll/c/
158 /coll/notrepo/e/
158 /coll/notrepo/e/
159 /coll/notrepo/f/
159 /coll/notrepo/f/
160 /rcoll/a/
160 /rcoll/a/
161 /rcoll/a/.hg/patches/
161 /rcoll/a/.hg/patches/
162 /rcoll/b/
162 /rcoll/b/
163 /rcoll/b/d/
163 /rcoll/b/d/
164 /rcoll/c/
164 /rcoll/c/
165 /rcoll/notrepo/e/
165 /rcoll/notrepo/e/
166 /rcoll/notrepo/e/e2/
166 /rcoll/notrepo/e/e2/
167 /rcoll/notrepo/f/
167 /rcoll/notrepo/f/
168 /rcoll/notrepo/f/f2/
168 /rcoll/notrepo/f/f2/
169 /star/webdir/a/
169 /star/webdir/a/
170 /star/webdir/a/.hg/patches/
170 /star/webdir/a/.hg/patches/
171 /star/webdir/b/
171 /star/webdir/b/
172 /star/webdir/c/
172 /star/webdir/c/
173 /star/webdir/notrepo/e/
173 /star/webdir/notrepo/e/
174 /star/webdir/notrepo/f/
174 /star/webdir/notrepo/f/
175 /starstar/webdir/a/
175 /starstar/webdir/a/
176 /starstar/webdir/a/.hg/patches/
176 /starstar/webdir/a/.hg/patches/
177 /starstar/webdir/b/
177 /starstar/webdir/b/
178 /starstar/webdir/b/d/
178 /starstar/webdir/b/d/
179 /starstar/webdir/c/
179 /starstar/webdir/c/
180 /starstar/webdir/notrepo/e/
180 /starstar/webdir/notrepo/e/
181 /starstar/webdir/notrepo/e/e2/
181 /starstar/webdir/notrepo/e/e2/
182 /starstar/webdir/notrepo/f/
182 /starstar/webdir/notrepo/f/
183 /starstar/webdir/notrepo/f/f2/
183 /starstar/webdir/notrepo/f/f2/
184 /astar/
184 /astar/
185 /astar/.hg/patches/
185 /astar/.hg/patches/
186
186
187 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=paper'
187 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=paper'
188 200 Script output follows
188 200 Script output follows
189
189
190 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
190 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
191 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
191 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
192 <head>
192 <head>
193 <link rel="icon" href="/static/hgicon.png" type="image/png" />
193 <link rel="icon" href="/static/hgicon.png" type="image/png" />
194 <meta name="robots" content="index, nofollow" />
194 <meta name="robots" content="index, nofollow" />
195 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
195 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
196 <script type="text/javascript" src="/static/mercurial.js"></script>
196 <script type="text/javascript" src="/static/mercurial.js"></script>
197
197
198 <title>Mercurial repositories index</title>
198 <title>Mercurial repositories index</title>
199 </head>
199 </head>
200 <body>
200 <body>
201
201
202 <div class="container">
202 <div class="container">
203 <div class="menu">
203 <div class="menu">
204 <a href="http://mercurial.selenic.com/">
204 <a href="http://mercurial.selenic.com/">
205 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
205 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
206 </div>
206 </div>
207 <div class="main">
207 <div class="main">
208 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
208 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
209
209
210 <table class="bigtable">
210 <table class="bigtable">
211 <thead>
211 <thead>
212 <tr>
212 <tr>
213 <th><a href="?sort=name">Name</a></th>
213 <th><a href="?sort=name">Name</a></th>
214 <th><a href="?sort=description">Description</a></th>
214 <th><a href="?sort=description">Description</a></th>
215 <th><a href="?sort=contact">Contact</a></th>
215 <th><a href="?sort=contact">Contact</a></th>
216 <th><a href="?sort=lastchange">Last modified</a></th>
216 <th><a href="?sort=lastchange">Last modified</a></th>
217 <th>&nbsp;</th>
217 <th>&nbsp;</th>
218 <th>&nbsp;</th>
218 <th>&nbsp;</th>
219 </tr>
219 </tr>
220 </thead>
220 </thead>
221 <tbody class="stripes2">
221 <tbody class="stripes2">
222
222
223 <tr>
223 <tr>
224 <td><a href="/t/a/?style=paper">t/a</a></td>
224 <td><a href="/t/a/?style=paper">t/a</a></td>
225 <td>unknown</td>
225 <td>unknown</td>
226 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
226 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
227 <td class="age">*</td> (glob)
227 <td class="age">*</td> (glob)
228 <td class="indexlinks"></td>
228 <td class="indexlinks"></td>
229 <td>
229 <td>
230 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
230 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
231 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
231 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
232 </a>
232 </a>
233 </td>
233 </td>
234 </tr>
234 </tr>
235
235
236 <tr>
236 <tr>
237 <td><a href="/b/?style=paper">b</a></td>
237 <td><a href="/b/?style=paper">b</a></td>
238 <td>unknown</td>
238 <td>unknown</td>
239 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
239 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
240 <td class="age">*</td> (glob)
240 <td class="age">*</td> (glob)
241 <td class="indexlinks"></td>
241 <td class="indexlinks"></td>
242 <td>
242 <td>
243 <a href="/b/atom-log" title="subscribe to repository atom feed">
243 <a href="/b/atom-log" title="subscribe to repository atom feed">
244 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
244 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
245 </a>
245 </a>
246 </td>
246 </td>
247 </tr>
247 </tr>
248
248
249 <tr>
249 <tr>
250 <td><a href="/coll/a/?style=paper">coll/a</a></td>
250 <td><a href="/coll/a/?style=paper">coll/a</a></td>
251 <td>unknown</td>
251 <td>unknown</td>
252 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
252 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
253 <td class="age">*</td> (glob)
253 <td class="age">*</td> (glob)
254 <td class="indexlinks"></td>
254 <td class="indexlinks"></td>
255 <td>
255 <td>
256 <a href="/coll/a/atom-log" title="subscribe to repository atom feed">
256 <a href="/coll/a/atom-log" title="subscribe to repository atom feed">
257 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
257 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
258 </a>
258 </a>
259 </td>
259 </td>
260 </tr>
260 </tr>
261
261
262 <tr>
262 <tr>
263 <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
263 <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
264 <td>unknown</td>
264 <td>unknown</td>
265 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
265 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
266 <td class="age">*</td> (glob)
266 <td class="age">*</td> (glob)
267 <td class="indexlinks"></td>
267 <td class="indexlinks"></td>
268 <td>
268 <td>
269 <a href="/coll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
269 <a href="/coll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
270 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
270 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
271 </a>
271 </a>
272 </td>
272 </td>
273 </tr>
273 </tr>
274
274
275 <tr>
275 <tr>
276 <td><a href="/coll/b/?style=paper">coll/b</a></td>
276 <td><a href="/coll/b/?style=paper">coll/b</a></td>
277 <td>unknown</td>
277 <td>unknown</td>
278 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
278 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
279 <td class="age">*</td> (glob)
279 <td class="age">*</td> (glob)
280 <td class="indexlinks"></td>
280 <td class="indexlinks"></td>
281 <td>
281 <td>
282 <a href="/coll/b/atom-log" title="subscribe to repository atom feed">
282 <a href="/coll/b/atom-log" title="subscribe to repository atom feed">
283 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
283 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
284 </a>
284 </a>
285 </td>
285 </td>
286 </tr>
286 </tr>
287
287
288 <tr>
288 <tr>
289 <td><a href="/coll/c/?style=paper">coll/c</a></td>
289 <td><a href="/coll/c/?style=paper">coll/c</a></td>
290 <td>unknown</td>
290 <td>unknown</td>
291 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
291 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
292 <td class="age">*</td> (glob)
292 <td class="age">*</td> (glob)
293 <td class="indexlinks"></td>
293 <td class="indexlinks"></td>
294 <td>
294 <td>
295 <a href="/coll/c/atom-log" title="subscribe to repository atom feed">
295 <a href="/coll/c/atom-log" title="subscribe to repository atom feed">
296 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
296 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
297 </a>
297 </a>
298 </td>
298 </td>
299 </tr>
299 </tr>
300
300
301 <tr>
301 <tr>
302 <td><a href="/coll/notrepo/e/?style=paper">coll/notrepo/e</a></td>
302 <td><a href="/coll/notrepo/e/?style=paper">coll/notrepo/e</a></td>
303 <td>unknown</td>
303 <td>unknown</td>
304 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
304 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
305 <td class="age">*</td> (glob)
305 <td class="age">*</td> (glob)
306 <td class="indexlinks"></td>
306 <td class="indexlinks"></td>
307 <td>
307 <td>
308 <a href="/coll/notrepo/e/atom-log" title="subscribe to repository atom feed">
308 <a href="/coll/notrepo/e/atom-log" title="subscribe to repository atom feed">
309 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
309 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
310 </a>
310 </a>
311 </td>
311 </td>
312 </tr>
312 </tr>
313
313
314 <tr>
314 <tr>
315 <td><a href="/coll/notrepo/f/?style=paper">fancy name for repo f</a></td>
315 <td><a href="/coll/notrepo/f/?style=paper">fancy name for repo f</a></td>
316 <td>unknown</td>
316 <td>unknown</td>
317 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
317 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
318 <td class="age">*</td> (glob)
318 <td class="age">*</td> (glob)
319 <td class="indexlinks"></td>
319 <td class="indexlinks"></td>
320 <td>
320 <td>
321 <a href="/coll/notrepo/f/atom-log" title="subscribe to repository atom feed">
321 <a href="/coll/notrepo/f/atom-log" title="subscribe to repository atom feed">
322 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
322 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
323 </a>
323 </a>
324 </td>
324 </td>
325 </tr>
325 </tr>
326
326
327 <tr>
327 <tr>
328 <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
328 <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
329 <td>unknown</td>
329 <td>unknown</td>
330 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
330 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
331 <td class="age">*</td> (glob)
331 <td class="age">*</td> (glob)
332 <td class="indexlinks"></td>
332 <td class="indexlinks"></td>
333 <td>
333 <td>
334 <a href="/rcoll/a/atom-log" title="subscribe to repository atom feed">
334 <a href="/rcoll/a/atom-log" title="subscribe to repository atom feed">
335 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
335 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
336 </a>
336 </a>
337 </td>
337 </td>
338 </tr>
338 </tr>
339
339
340 <tr>
340 <tr>
341 <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
341 <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
342 <td>unknown</td>
342 <td>unknown</td>
343 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
343 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
344 <td class="age">*</td> (glob)
344 <td class="age">*</td> (glob)
345 <td class="indexlinks"></td>
345 <td class="indexlinks"></td>
346 <td>
346 <td>
347 <a href="/rcoll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
347 <a href="/rcoll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
348 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
348 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
349 </a>
349 </a>
350 </td>
350 </td>
351 </tr>
351 </tr>
352
352
353 <tr>
353 <tr>
354 <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
354 <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
355 <td>unknown</td>
355 <td>unknown</td>
356 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
356 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
357 <td class="age">*</td> (glob)
357 <td class="age">*</td> (glob)
358 <td class="indexlinks"></td>
358 <td class="indexlinks"></td>
359 <td>
359 <td>
360 <a href="/rcoll/b/atom-log" title="subscribe to repository atom feed">
360 <a href="/rcoll/b/atom-log" title="subscribe to repository atom feed">
361 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
361 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
362 </a>
362 </a>
363 </td>
363 </td>
364 </tr>
364 </tr>
365
365
366 <tr>
366 <tr>
367 <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
367 <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
368 <td>unknown</td>
368 <td>unknown</td>
369 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
369 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
370 <td class="age">*</td> (glob)
370 <td class="age">*</td> (glob)
371 <td class="indexlinks"></td>
371 <td class="indexlinks"></td>
372 <td>
372 <td>
373 <a href="/rcoll/b/d/atom-log" title="subscribe to repository atom feed">
373 <a href="/rcoll/b/d/atom-log" title="subscribe to repository atom feed">
374 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
374 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
375 </a>
375 </a>
376 </td>
376 </td>
377 </tr>
377 </tr>
378
378
379 <tr>
379 <tr>
380 <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
380 <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
381 <td>unknown</td>
381 <td>unknown</td>
382 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
382 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
383 <td class="age">*</td> (glob)
383 <td class="age">*</td> (glob)
384 <td class="indexlinks"></td>
384 <td class="indexlinks"></td>
385 <td>
385 <td>
386 <a href="/rcoll/c/atom-log" title="subscribe to repository atom feed">
386 <a href="/rcoll/c/atom-log" title="subscribe to repository atom feed">
387 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
387 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
388 </a>
388 </a>
389 </td>
389 </td>
390 </tr>
390 </tr>
391
391
392 <tr>
392 <tr>
393 <td><a href="/rcoll/notrepo/e/?style=paper">rcoll/notrepo/e</a></td>
393 <td><a href="/rcoll/notrepo/e/?style=paper">rcoll/notrepo/e</a></td>
394 <td>unknown</td>
394 <td>unknown</td>
395 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
395 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
396 <td class="age">*</td> (glob)
396 <td class="age">*</td> (glob)
397 <td class="indexlinks"></td>
397 <td class="indexlinks"></td>
398 <td>
398 <td>
399 <a href="/rcoll/notrepo/e/atom-log" title="subscribe to repository atom feed">
399 <a href="/rcoll/notrepo/e/atom-log" title="subscribe to repository atom feed">
400 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
400 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
401 </a>
401 </a>
402 </td>
402 </td>
403 </tr>
403 </tr>
404
404
405 <tr>
405 <tr>
406 <td><a href="/rcoll/notrepo/e/e2/?style=paper">rcoll/notrepo/e/e2</a></td>
406 <td><a href="/rcoll/notrepo/e/e2/?style=paper">rcoll/notrepo/e/e2</a></td>
407 <td>unknown</td>
407 <td>unknown</td>
408 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
408 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
409 <td class="age">*</td> (glob)
409 <td class="age">*</td> (glob)
410 <td class="indexlinks"></td>
410 <td class="indexlinks"></td>
411 <td>
411 <td>
412 <a href="/rcoll/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
412 <a href="/rcoll/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
413 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
413 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
414 </a>
414 </a>
415 </td>
415 </td>
416 </tr>
416 </tr>
417
417
418 <tr>
418 <tr>
419 <td><a href="/rcoll/notrepo/f/?style=paper">fancy name for repo f</a></td>
419 <td><a href="/rcoll/notrepo/f/?style=paper">fancy name for repo f</a></td>
420 <td>unknown</td>
420 <td>unknown</td>
421 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
421 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
422 <td class="age">*</td> (glob)
422 <td class="age">*</td> (glob)
423 <td class="indexlinks"></td>
423 <td class="indexlinks"></td>
424 <td>
424 <td>
425 <a href="/rcoll/notrepo/f/atom-log" title="subscribe to repository atom feed">
425 <a href="/rcoll/notrepo/f/atom-log" title="subscribe to repository atom feed">
426 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
426 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
427 </a>
427 </a>
428 </td>
428 </td>
429 </tr>
429 </tr>
430
430
431 <tr>
431 <tr>
432 <td><a href="/rcoll/notrepo/f/f2/?style=paper">rcoll/notrepo/f/f2</a></td>
432 <td><a href="/rcoll/notrepo/f/f2/?style=paper">rcoll/notrepo/f/f2</a></td>
433 <td>unknown</td>
433 <td>unknown</td>
434 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
434 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
435 <td class="age">*</td> (glob)
435 <td class="age">*</td> (glob)
436 <td class="indexlinks"></td>
436 <td class="indexlinks"></td>
437 <td>
437 <td>
438 <a href="/rcoll/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
438 <a href="/rcoll/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
439 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
439 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
440 </a>
440 </a>
441 </td>
441 </td>
442 </tr>
442 </tr>
443
443
444 <tr>
444 <tr>
445 <td><a href="/star/webdir/a/?style=paper">star/webdir/a</a></td>
445 <td><a href="/star/webdir/a/?style=paper">star/webdir/a</a></td>
446 <td>unknown</td>
446 <td>unknown</td>
447 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
447 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
448 <td class="age">*</td> (glob)
448 <td class="age">*</td> (glob)
449 <td class="indexlinks"></td>
449 <td class="indexlinks"></td>
450 <td>
450 <td>
451 <a href="/star/webdir/a/atom-log" title="subscribe to repository atom feed">
451 <a href="/star/webdir/a/atom-log" title="subscribe to repository atom feed">
452 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
452 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
453 </a>
453 </a>
454 </td>
454 </td>
455 </tr>
455 </tr>
456
456
457 <tr>
457 <tr>
458 <td><a href="/star/webdir/a/.hg/patches/?style=paper">star/webdir/a/.hg/patches</a></td>
458 <td><a href="/star/webdir/a/.hg/patches/?style=paper">star/webdir/a/.hg/patches</a></td>
459 <td>unknown</td>
459 <td>unknown</td>
460 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
460 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
461 <td class="age">*</td> (glob)
461 <td class="age">*</td> (glob)
462 <td class="indexlinks"></td>
462 <td class="indexlinks"></td>
463 <td>
463 <td>
464 <a href="/star/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
464 <a href="/star/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
465 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
465 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
466 </a>
466 </a>
467 </td>
467 </td>
468 </tr>
468 </tr>
469
469
470 <tr>
470 <tr>
471 <td><a href="/star/webdir/b/?style=paper">star/webdir/b</a></td>
471 <td><a href="/star/webdir/b/?style=paper">star/webdir/b</a></td>
472 <td>unknown</td>
472 <td>unknown</td>
473 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
473 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
474 <td class="age">*</td> (glob)
474 <td class="age">*</td> (glob)
475 <td class="indexlinks"></td>
475 <td class="indexlinks"></td>
476 <td>
476 <td>
477 <a href="/star/webdir/b/atom-log" title="subscribe to repository atom feed">
477 <a href="/star/webdir/b/atom-log" title="subscribe to repository atom feed">
478 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
478 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
479 </a>
479 </a>
480 </td>
480 </td>
481 </tr>
481 </tr>
482
482
483 <tr>
483 <tr>
484 <td><a href="/star/webdir/c/?style=paper">star/webdir/c</a></td>
484 <td><a href="/star/webdir/c/?style=paper">star/webdir/c</a></td>
485 <td>unknown</td>
485 <td>unknown</td>
486 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
486 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
487 <td class="age">*</td> (glob)
487 <td class="age">*</td> (glob)
488 <td class="indexlinks"></td>
488 <td class="indexlinks"></td>
489 <td>
489 <td>
490 <a href="/star/webdir/c/atom-log" title="subscribe to repository atom feed">
490 <a href="/star/webdir/c/atom-log" title="subscribe to repository atom feed">
491 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
491 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
492 </a>
492 </a>
493 </td>
493 </td>
494 </tr>
494 </tr>
495
495
496 <tr>
496 <tr>
497 <td><a href="/star/webdir/notrepo/e/?style=paper">star/webdir/notrepo/e</a></td>
497 <td><a href="/star/webdir/notrepo/e/?style=paper">star/webdir/notrepo/e</a></td>
498 <td>unknown</td>
498 <td>unknown</td>
499 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
499 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
500 <td class="age">*</td> (glob)
500 <td class="age">*</td> (glob)
501 <td class="indexlinks"></td>
501 <td class="indexlinks"></td>
502 <td>
502 <td>
503 <a href="/star/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
503 <a href="/star/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
504 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
504 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
505 </a>
505 </a>
506 </td>
506 </td>
507 </tr>
507 </tr>
508
508
509 <tr>
509 <tr>
510 <td><a href="/star/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
510 <td><a href="/star/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
511 <td>unknown</td>
511 <td>unknown</td>
512 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
512 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
513 <td class="age">*</td> (glob)
513 <td class="age">*</td> (glob)
514 <td class="indexlinks"></td>
514 <td class="indexlinks"></td>
515 <td>
515 <td>
516 <a href="/star/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
516 <a href="/star/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
517 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
517 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
518 </a>
518 </a>
519 </td>
519 </td>
520 </tr>
520 </tr>
521
521
522 <tr>
522 <tr>
523 <td><a href="/starstar/webdir/a/?style=paper">starstar/webdir/a</a></td>
523 <td><a href="/starstar/webdir/a/?style=paper">starstar/webdir/a</a></td>
524 <td>unknown</td>
524 <td>unknown</td>
525 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
525 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
526 <td class="age">*</td> (glob)
526 <td class="age">*</td> (glob)
527 <td class="indexlinks"></td>
527 <td class="indexlinks"></td>
528 <td>
528 <td>
529 <a href="/starstar/webdir/a/atom-log" title="subscribe to repository atom feed">
529 <a href="/starstar/webdir/a/atom-log" title="subscribe to repository atom feed">
530 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
530 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
531 </a>
531 </a>
532 </td>
532 </td>
533 </tr>
533 </tr>
534
534
535 <tr>
535 <tr>
536 <td><a href="/starstar/webdir/a/.hg/patches/?style=paper">starstar/webdir/a/.hg/patches</a></td>
536 <td><a href="/starstar/webdir/a/.hg/patches/?style=paper">starstar/webdir/a/.hg/patches</a></td>
537 <td>unknown</td>
537 <td>unknown</td>
538 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
538 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
539 <td class="age">*</td> (glob)
539 <td class="age">*</td> (glob)
540 <td class="indexlinks"></td>
540 <td class="indexlinks"></td>
541 <td>
541 <td>
542 <a href="/starstar/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
542 <a href="/starstar/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
543 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
543 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
544 </a>
544 </a>
545 </td>
545 </td>
546 </tr>
546 </tr>
547
547
548 <tr>
548 <tr>
549 <td><a href="/starstar/webdir/b/?style=paper">starstar/webdir/b</a></td>
549 <td><a href="/starstar/webdir/b/?style=paper">starstar/webdir/b</a></td>
550 <td>unknown</td>
550 <td>unknown</td>
551 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
551 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
552 <td class="age">*</td> (glob)
552 <td class="age">*</td> (glob)
553 <td class="indexlinks"></td>
553 <td class="indexlinks"></td>
554 <td>
554 <td>
555 <a href="/starstar/webdir/b/atom-log" title="subscribe to repository atom feed">
555 <a href="/starstar/webdir/b/atom-log" title="subscribe to repository atom feed">
556 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
556 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
557 </a>
557 </a>
558 </td>
558 </td>
559 </tr>
559 </tr>
560
560
561 <tr>
561 <tr>
562 <td><a href="/starstar/webdir/b/d/?style=paper">starstar/webdir/b/d</a></td>
562 <td><a href="/starstar/webdir/b/d/?style=paper">starstar/webdir/b/d</a></td>
563 <td>unknown</td>
563 <td>unknown</td>
564 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
564 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
565 <td class="age">*</td> (glob)
565 <td class="age">*</td> (glob)
566 <td class="indexlinks"></td>
566 <td class="indexlinks"></td>
567 <td>
567 <td>
568 <a href="/starstar/webdir/b/d/atom-log" title="subscribe to repository atom feed">
568 <a href="/starstar/webdir/b/d/atom-log" title="subscribe to repository atom feed">
569 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
569 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
570 </a>
570 </a>
571 </td>
571 </td>
572 </tr>
572 </tr>
573
573
574 <tr>
574 <tr>
575 <td><a href="/starstar/webdir/c/?style=paper">starstar/webdir/c</a></td>
575 <td><a href="/starstar/webdir/c/?style=paper">starstar/webdir/c</a></td>
576 <td>unknown</td>
576 <td>unknown</td>
577 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
577 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
578 <td class="age">*</td> (glob)
578 <td class="age">*</td> (glob)
579 <td class="indexlinks"></td>
579 <td class="indexlinks"></td>
580 <td>
580 <td>
581 <a href="/starstar/webdir/c/atom-log" title="subscribe to repository atom feed">
581 <a href="/starstar/webdir/c/atom-log" title="subscribe to repository atom feed">
582 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
582 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
583 </a>
583 </a>
584 </td>
584 </td>
585 </tr>
585 </tr>
586
586
587 <tr>
587 <tr>
588 <td><a href="/starstar/webdir/notrepo/e/?style=paper">starstar/webdir/notrepo/e</a></td>
588 <td><a href="/starstar/webdir/notrepo/e/?style=paper">starstar/webdir/notrepo/e</a></td>
589 <td>unknown</td>
589 <td>unknown</td>
590 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
590 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
591 <td class="age">*</td> (glob)
591 <td class="age">*</td> (glob)
592 <td class="indexlinks"></td>
592 <td class="indexlinks"></td>
593 <td>
593 <td>
594 <a href="/starstar/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
594 <a href="/starstar/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
595 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
595 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
596 </a>
596 </a>
597 </td>
597 </td>
598 </tr>
598 </tr>
599
599
600 <tr>
600 <tr>
601 <td><a href="/starstar/webdir/notrepo/e/e2/?style=paper">starstar/webdir/notrepo/e/e2</a></td>
601 <td><a href="/starstar/webdir/notrepo/e/e2/?style=paper">starstar/webdir/notrepo/e/e2</a></td>
602 <td>unknown</td>
602 <td>unknown</td>
603 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
603 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
604 <td class="age">*</td> (glob)
604 <td class="age">*</td> (glob)
605 <td class="indexlinks"></td>
605 <td class="indexlinks"></td>
606 <td>
606 <td>
607 <a href="/starstar/webdir/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
607 <a href="/starstar/webdir/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
608 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
608 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
609 </a>
609 </a>
610 </td>
610 </td>
611 </tr>
611 </tr>
612
612
613 <tr>
613 <tr>
614 <td><a href="/starstar/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
614 <td><a href="/starstar/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
615 <td>unknown</td>
615 <td>unknown</td>
616 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
616 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
617 <td class="age">*</td> (glob)
617 <td class="age">*</td> (glob)
618 <td class="indexlinks"></td>
618 <td class="indexlinks"></td>
619 <td>
619 <td>
620 <a href="/starstar/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
620 <a href="/starstar/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
621 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
621 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
622 </a>
622 </a>
623 </td>
623 </td>
624 </tr>
624 </tr>
625
625
626 <tr>
626 <tr>
627 <td><a href="/starstar/webdir/notrepo/f/f2/?style=paper">starstar/webdir/notrepo/f/f2</a></td>
627 <td><a href="/starstar/webdir/notrepo/f/f2/?style=paper">starstar/webdir/notrepo/f/f2</a></td>
628 <td>unknown</td>
628 <td>unknown</td>
629 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
629 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
630 <td class="age">*</td> (glob)
630 <td class="age">*</td> (glob)
631 <td class="indexlinks"></td>
631 <td class="indexlinks"></td>
632 <td>
632 <td>
633 <a href="/starstar/webdir/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
633 <a href="/starstar/webdir/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
634 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
634 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
635 </a>
635 </a>
636 </td>
636 </td>
637 </tr>
637 </tr>
638
638
639 <tr>
639 <tr>
640 <td><a href="/astar/?style=paper">astar</a></td>
640 <td><a href="/astar/?style=paper">astar</a></td>
641 <td>unknown</td>
641 <td>unknown</td>
642 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
642 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
643 <td class="age">*</td> (glob)
643 <td class="age">*</td> (glob)
644 <td class="indexlinks"></td>
644 <td class="indexlinks"></td>
645 <td>
645 <td>
646 <a href="/astar/atom-log" title="subscribe to repository atom feed">
646 <a href="/astar/atom-log" title="subscribe to repository atom feed">
647 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
647 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
648 </a>
648 </a>
649 </td>
649 </td>
650 </tr>
650 </tr>
651
651
652 <tr>
652 <tr>
653 <td><a href="/astar/.hg/patches/?style=paper">astar/.hg/patches</a></td>
653 <td><a href="/astar/.hg/patches/?style=paper">astar/.hg/patches</a></td>
654 <td>unknown</td>
654 <td>unknown</td>
655 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
655 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
656 <td class="age">*</td> (glob)
656 <td class="age">*</td> (glob)
657 <td class="indexlinks"></td>
657 <td class="indexlinks"></td>
658 <td>
658 <td>
659 <a href="/astar/.hg/patches/atom-log" title="subscribe to repository atom feed">
659 <a href="/astar/.hg/patches/atom-log" title="subscribe to repository atom feed">
660 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
660 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
661 </a>
661 </a>
662 </td>
662 </td>
663 </tr>
663 </tr>
664
664
665 </tbody>
665 </tbody>
666 </table>
666 </table>
667 </div>
667 </div>
668 </div>
668 </div>
669 <script type="text/javascript">process_dates()</script>
669 <script type="text/javascript">process_dates()</script>
670
670
671
671
672 </body>
672 </body>
673 </html>
673 </html>
674
674
675 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't?style=raw'
675 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't?style=raw'
676 200 Script output follows
676 200 Script output follows
677
677
678
678
679 /t/a/
679 /t/a/
680
680
681 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
681 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
682 200 Script output follows
682 200 Script output follows
683
683
684
684
685 /t/a/
685 /t/a/
686
686
687 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=paper'
687 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=paper'
688 200 Script output follows
688 200 Script output follows
689
689
690 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
690 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
691 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
691 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
692 <head>
692 <head>
693 <link rel="icon" href="/static/hgicon.png" type="image/png" />
693 <link rel="icon" href="/static/hgicon.png" type="image/png" />
694 <meta name="robots" content="index, nofollow" />
694 <meta name="robots" content="index, nofollow" />
695 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
695 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
696 <script type="text/javascript" src="/static/mercurial.js"></script>
696 <script type="text/javascript" src="/static/mercurial.js"></script>
697
697
698 <title>Mercurial repositories index</title>
698 <title>Mercurial repositories index</title>
699 </head>
699 </head>
700 <body>
700 <body>
701
701
702 <div class="container">
702 <div class="container">
703 <div class="menu">
703 <div class="menu">
704 <a href="http://mercurial.selenic.com/">
704 <a href="http://mercurial.selenic.com/">
705 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
705 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
706 </div>
706 </div>
707 <div class="main">
707 <div class="main">
708 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/t">t</a> </h2>
708 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/t">t</a> </h2>
709
709
710 <table class="bigtable">
710 <table class="bigtable">
711 <thead>
711 <thead>
712 <tr>
712 <tr>
713 <th><a href="?sort=name">Name</a></th>
713 <th><a href="?sort=name">Name</a></th>
714 <th><a href="?sort=description">Description</a></th>
714 <th><a href="?sort=description">Description</a></th>
715 <th><a href="?sort=contact">Contact</a></th>
715 <th><a href="?sort=contact">Contact</a></th>
716 <th><a href="?sort=lastchange">Last modified</a></th>
716 <th><a href="?sort=lastchange">Last modified</a></th>
717 <th>&nbsp;</th>
717 <th>&nbsp;</th>
718 <th>&nbsp;</th>
718 <th>&nbsp;</th>
719 </tr>
719 </tr>
720 </thead>
720 </thead>
721 <tbody class="stripes2">
721 <tbody class="stripes2">
722
722
723 <tr>
723 <tr>
724 <td><a href="/t/a/?style=paper">a</a></td>
724 <td><a href="/t/a/?style=paper">a</a></td>
725 <td>unknown</td>
725 <td>unknown</td>
726 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
726 <td>&#70;&#111;&#111;&#32;&#66;&#97;&#114;&#32;&#60;&#102;&#111;&#111;&#46;&#98;&#97;&#114;&#64;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#46;&#99;&#111;&#109;&#62;</td>
727 <td class="age">*</td> (glob)
727 <td class="age">*</td> (glob)
728 <td class="indexlinks"></td>
728 <td class="indexlinks"></td>
729 <td>
729 <td>
730 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
730 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
731 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
731 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
732 </a>
732 </a>
733 </td>
733 </td>
734 </tr>
734 </tr>
735
735
736 </tbody>
736 </tbody>
737 </table>
737 </table>
738 </div>
738 </div>
739 </div>
739 </div>
740 <script type="text/javascript">process_dates()</script>
740 <script type="text/javascript">process_dates()</script>
741
741
742
742
743 </body>
743 </body>
744 </html>
744 </html>
745
745
746 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a?style=atom'
746 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a?style=atom'
747 200 Script output follows
747 200 Script output follows
748
748
749 <?xml version="1.0" encoding="ascii"?>
749 <?xml version="1.0" encoding="ascii"?>
750 <feed xmlns="http://www.w3.org/2005/Atom">
750 <feed xmlns="http://www.w3.org/2005/Atom">
751 <!-- Changelog -->
751 <!-- Changelog -->
752 <id>http://*:$HGPORT1/t/a/</id> (glob)
752 <id>http://*:$HGPORT1/t/a/</id> (glob)
753 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
753 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
754 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
754 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
755 <title>t/a Changelog</title>
755 <title>t/a Changelog</title>
756 <updated>1970-01-01T00:00:01+00:00</updated>
756 <updated>1970-01-01T00:00:01+00:00</updated>
757
757
758 <entry>
758 <entry>
759 <title>[default] a</title>
759 <title>[default] a</title>
760 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
760 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
761 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
761 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
762 <author>
762 <author>
763 <name>test</name>
763 <name>test</name>
764 <email>&#116;&#101;&#115;&#116;</email>
764 <email>&#116;&#101;&#115;&#116;</email>
765 </author>
765 </author>
766 <updated>1970-01-01T00:00:01+00:00</updated>
766 <updated>1970-01-01T00:00:01+00:00</updated>
767 <published>1970-01-01T00:00:01+00:00</published>
767 <published>1970-01-01T00:00:01+00:00</published>
768 <content type="xhtml">
768 <content type="xhtml">
769 <table xmlns="http://www.w3.org/1999/xhtml">
769 <table xmlns="http://www.w3.org/1999/xhtml">
770 <tr>
770 <tr>
771 <th style="text-align:left;">changeset</th>
771 <th style="text-align:left;">changeset</th>
772 <td>8580ff50825a</td>
772 <td>8580ff50825a</td>
773 </tr>
773 </tr>
774 <tr>
774 <tr>
775 <th style="text-align:left;">branch</th>
775 <th style="text-align:left;">branch</th>
776 <td>default</td>
776 <td>default</td>
777 </tr>
777 </tr>
778 <tr>
778 <tr>
779 <th style="text-align:left;">bookmark</th>
779 <th style="text-align:left;">bookmark</th>
780 <td></td>
780 <td></td>
781 </tr>
781 </tr>
782 <tr>
782 <tr>
783 <th style="text-align:left;">tag</th>
783 <th style="text-align:left;">tag</th>
784 <td>tip</td>
784 <td>tip</td>
785 </tr>
785 </tr>
786 <tr>
786 <tr>
787 <th style="text-align:left;">user</th>
787 <th style="text-align:left;">user</th>
788 <td>&#116;&#101;&#115;&#116;</td>
788 <td>&#116;&#101;&#115;&#116;</td>
789 </tr>
789 </tr>
790 <tr>
790 <tr>
791 <th style="text-align:left;vertical-align:top;">description</th>
791 <th style="text-align:left;vertical-align:top;">description</th>
792 <td>a</td>
792 <td>a</td>
793 </tr>
793 </tr>
794 <tr>
794 <tr>
795 <th style="text-align:left;vertical-align:top;">files</th>
795 <th style="text-align:left;vertical-align:top;">files</th>
796 <td>a<br /></td>
796 <td>a<br /></td>
797 </tr>
797 </tr>
798 </table>
798 </table>
799 </content>
799 </content>
800 </entry>
800 </entry>
801
801
802 </feed>
802 </feed>
803 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a/?style=atom'
803 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a/?style=atom'
804 200 Script output follows
804 200 Script output follows
805
805
806 <?xml version="1.0" encoding="ascii"?>
806 <?xml version="1.0" encoding="ascii"?>
807 <feed xmlns="http://www.w3.org/2005/Atom">
807 <feed xmlns="http://www.w3.org/2005/Atom">
808 <!-- Changelog -->
808 <!-- Changelog -->
809 <id>http://*:$HGPORT1/t/a/</id> (glob)
809 <id>http://*:$HGPORT1/t/a/</id> (glob)
810 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
810 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
811 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
811 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
812 <title>t/a Changelog</title>
812 <title>t/a Changelog</title>
813 <updated>1970-01-01T00:00:01+00:00</updated>
813 <updated>1970-01-01T00:00:01+00:00</updated>
814
814
815 <entry>
815 <entry>
816 <title>[default] a</title>
816 <title>[default] a</title>
817 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
817 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
818 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
818 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
819 <author>
819 <author>
820 <name>test</name>
820 <name>test</name>
821 <email>&#116;&#101;&#115;&#116;</email>
821 <email>&#116;&#101;&#115;&#116;</email>
822 </author>
822 </author>
823 <updated>1970-01-01T00:00:01+00:00</updated>
823 <updated>1970-01-01T00:00:01+00:00</updated>
824 <published>1970-01-01T00:00:01+00:00</published>
824 <published>1970-01-01T00:00:01+00:00</published>
825 <content type="xhtml">
825 <content type="xhtml">
826 <table xmlns="http://www.w3.org/1999/xhtml">
826 <table xmlns="http://www.w3.org/1999/xhtml">
827 <tr>
827 <tr>
828 <th style="text-align:left;">changeset</th>
828 <th style="text-align:left;">changeset</th>
829 <td>8580ff50825a</td>
829 <td>8580ff50825a</td>
830 </tr>
830 </tr>
831 <tr>
831 <tr>
832 <th style="text-align:left;">branch</th>
832 <th style="text-align:left;">branch</th>
833 <td>default</td>
833 <td>default</td>
834 </tr>
834 </tr>
835 <tr>
835 <tr>
836 <th style="text-align:left;">bookmark</th>
836 <th style="text-align:left;">bookmark</th>
837 <td></td>
837 <td></td>
838 </tr>
838 </tr>
839 <tr>
839 <tr>
840 <th style="text-align:left;">tag</th>
840 <th style="text-align:left;">tag</th>
841 <td>tip</td>
841 <td>tip</td>
842 </tr>
842 </tr>
843 <tr>
843 <tr>
844 <th style="text-align:left;">user</th>
844 <th style="text-align:left;">user</th>
845 <td>&#116;&#101;&#115;&#116;</td>
845 <td>&#116;&#101;&#115;&#116;</td>
846 </tr>
846 </tr>
847 <tr>
847 <tr>
848 <th style="text-align:left;vertical-align:top;">description</th>
848 <th style="text-align:left;vertical-align:top;">description</th>
849 <td>a</td>
849 <td>a</td>
850 </tr>
850 </tr>
851 <tr>
851 <tr>
852 <th style="text-align:left;vertical-align:top;">files</th>
852 <th style="text-align:left;vertical-align:top;">files</th>
853 <td>a<br /></td>
853 <td>a<br /></td>
854 </tr>
854 </tr>
855 </table>
855 </table>
856 </content>
856 </content>
857 </entry>
857 </entry>
858
858
859 </feed>
859 </feed>
860 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a/file/tip/a?style=raw'
860 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/a/file/tip/a?style=raw'
861 200 Script output follows
861 200 Script output follows
862
862
863 a
863 a
864
864
865 Test [paths] '*' extension
865 Test [paths] '*' extension
866
866
867 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
867 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
868 200 Script output follows
868 200 Script output follows
869
869
870
870
871 /coll/a/
871 /coll/a/
872 /coll/a/.hg/patches/
872 /coll/a/.hg/patches/
873 /coll/b/
873 /coll/b/
874 /coll/c/
874 /coll/c/
875 /coll/notrepo/e/
875 /coll/notrepo/e/
876 /coll/notrepo/f/
876 /coll/notrepo/f/
877
877
878 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
878 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
879 200 Script output follows
879 200 Script output follows
880
880
881 a
881 a
882
882
883 Test [paths] '**' extension
883 Test [paths] '**' extension
884
884
885 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
885 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
886 200 Script output follows
886 200 Script output follows
887
887
888
888
889 /rcoll/a/
889 /rcoll/a/
890 /rcoll/a/.hg/patches/
890 /rcoll/a/.hg/patches/
891 /rcoll/b/
891 /rcoll/b/
892 /rcoll/b/d/
892 /rcoll/b/d/
893 /rcoll/c/
893 /rcoll/c/
894 /rcoll/notrepo/e/
894 /rcoll/notrepo/e/
895 /rcoll/notrepo/e/e2/
895 /rcoll/notrepo/e/e2/
896 /rcoll/notrepo/f/
896 /rcoll/notrepo/f/
897 /rcoll/notrepo/f/f2/
897 /rcoll/notrepo/f/f2/
898
898
899 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
899 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
900 200 Script output follows
900 200 Script output follows
901
901
902 d
902 d
903
903
904 Test collapse = True
904 Test collapse = True
905
905
906 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
906 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
907 $ cat >> paths.conf <<EOF
907 $ cat >> paths.conf <<EOF
908 > [web]
908 > [web]
909 > collapse=true
909 > collapse=true
910 > descend = true
910 > descend = true
911 > EOF
911 > EOF
912 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
912 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
913 > -A access-paths.log -E error-paths-3.log
913 > -A access-paths.log -E error-paths-3.log
914 $ cat hg.pid >> $DAEMON_PIDS
914 $ cat hg.pid >> $DAEMON_PIDS
915 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
915 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
916 200 Script output follows
916 200 Script output follows
917
917
918
918
919 /coll/a/
919 /coll/a/
920 /coll/a/.hg/patches/
920 /coll/a/.hg/patches/
921 /coll/b/
921 /coll/b/
922 /coll/c/
922 /coll/c/
923 /coll/notrepo/
923 /coll/notrepo/
924
924
925 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
925 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
926 200 Script output follows
926 200 Script output follows
927
927
928 a
928 a
929 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
929 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
930 200 Script output follows
930 200 Script output follows
931
931
932
932
933 /rcoll/a/
933 /rcoll/a/
934 /rcoll/a/.hg/patches/
934 /rcoll/a/.hg/patches/
935 /rcoll/b/
935 /rcoll/b/
936 /rcoll/b/d/
936 /rcoll/b/d/
937 /rcoll/c/
937 /rcoll/c/
938 /rcoll/notrepo/
938 /rcoll/notrepo/
939
939
940 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
940 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
941 200 Script output follows
941 200 Script output follows
942
942
943 d
943 d
944
944
945 Test intermediate directories
945 Test intermediate directories
946
946
947 Hide the subrepo parent
948
949 $ cp $root/notrepo/f/.hg/hgrc $root/notrepo/f/.hg/hgrc.bak
950 $ cat >> $root/notrepo/f/.hg/hgrc << EOF
951 > [web]
952 > hidden = True
953 > EOF
954
955 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
956 200 Script output follows
957
958
959 /rcoll/notrepo/e/
960 /rcoll/notrepo/e/e2/
961
962
963 Subrepo parent not hidden
964 $ mv $root/notrepo/f/.hg/hgrc.bak $root/notrepo/f/.hg/hgrc
965
947 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
966 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
948 200 Script output follows
967 200 Script output follows
949
968
950
969
951 /rcoll/notrepo/e/
970 /rcoll/notrepo/e/
952 /rcoll/notrepo/e/e2/
971 /rcoll/notrepo/e/e2/
953 /rcoll/notrepo/f/
972 /rcoll/notrepo/f/
954 /rcoll/notrepo/f/f2/
973 /rcoll/notrepo/f/f2/
955
974
956
975
957 Test repositories inside intermediate directories
976 Test repositories inside intermediate directories
958
977
959 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
978 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
960 200 Script output follows
979 200 Script output follows
961
980
962 e
981 e
963
982
964 Test subrepositories inside intermediate directories
983 Test subrepositories inside intermediate directories
965
984
966 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
985 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
967 200 Script output follows
986 200 Script output follows
968
987
969 f2
988 f2
970
989
971 Test descend = False
990 Test descend = False
972
991
973 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
992 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
974 $ cat >> paths.conf <<EOF
993 $ cat >> paths.conf <<EOF
975 > descend=false
994 > descend=false
976 > EOF
995 > EOF
977 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
996 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
978 > -A access-paths.log -E error-paths-4.log
997 > -A access-paths.log -E error-paths-4.log
979 $ cat hg.pid >> $DAEMON_PIDS
998 $ cat hg.pid >> $DAEMON_PIDS
980 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
999 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/?style=raw'
981 200 Script output follows
1000 200 Script output follows
982
1001
983
1002
984 /coll/a/
1003 /coll/a/
985 /coll/b/
1004 /coll/b/
986 /coll/c/
1005 /coll/c/
987
1006
988 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1007 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
989 200 Script output follows
1008 200 Script output follows
990
1009
991 a
1010 a
992 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
1011 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/?style=raw'
993 200 Script output follows
1012 200 Script output follows
994
1013
995
1014
996 /rcoll/a/
1015 /rcoll/a/
997 /rcoll/b/
1016 /rcoll/b/
998 /rcoll/c/
1017 /rcoll/c/
999
1018
1000 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1019 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1001 200 Script output follows
1020 200 Script output follows
1002
1021
1003 d
1022 d
1004
1023
1005 Test intermediate directories
1024 Test intermediate directories
1006
1025
1007 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1026 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1008 200 Script output follows
1027 200 Script output follows
1009
1028
1010
1029
1011 /rcoll/notrepo/e/
1030 /rcoll/notrepo/e/
1012 /rcoll/notrepo/f/
1031 /rcoll/notrepo/f/
1013
1032
1014
1033
1015 Test repositories inside intermediate directories
1034 Test repositories inside intermediate directories
1016
1035
1017 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
1036 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
1018 200 Script output follows
1037 200 Script output follows
1019
1038
1020 e
1039 e
1021
1040
1022 Test subrepositories inside intermediate directories
1041 Test subrepositories inside intermediate directories
1023
1042
1024 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
1043 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
1025 200 Script output follows
1044 200 Script output follows
1026
1045
1027 f2
1046 f2
1028
1047
1029 Test [paths] '*' in a repo root
1048 Test [paths] '*' in a repo root
1030
1049
1031 $ hg id http://localhost:$HGPORT1/astar
1050 $ hg id http://localhost:$HGPORT1/astar
1032 8580ff50825a
1051 8580ff50825a
1033
1052
1034 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1053 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1035 $ cat > paths.conf <<EOF
1054 $ cat > paths.conf <<EOF
1036 > [paths]
1055 > [paths]
1037 > t/a = $root/a
1056 > t/a = $root/a
1038 > t/b = $root/b
1057 > t/b = $root/b
1039 > c = $root/c
1058 > c = $root/c
1040 > EOF
1059 > EOF
1041 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1060 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1042 > -A access-paths.log -E error-paths-5.log
1061 > -A access-paths.log -E error-paths-5.log
1043 $ cat hg.pid >> $DAEMON_PIDS
1062 $ cat hg.pid >> $DAEMON_PIDS
1044 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
1063 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
1045 200 Script output follows
1064 200 Script output follows
1046
1065
1047
1066
1048 /t/a/
1067 /t/a/
1049 /t/b/
1068 /t/b/
1050 /c/
1069 /c/
1051
1070
1052 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
1071 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
1053 200 Script output follows
1072 200 Script output follows
1054
1073
1055
1074
1056 /t/a/
1075 /t/a/
1057 /t/b/
1076 /t/b/
1058
1077
1059
1078
1060 Test collapse = True
1079 Test collapse = True
1061
1080
1062 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1081 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1063 $ cat >> paths.conf <<EOF
1082 $ cat >> paths.conf <<EOF
1064 > [web]
1083 > [web]
1065 > collapse=true
1084 > collapse=true
1066 > EOF
1085 > EOF
1067 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1086 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1068 > -A access-paths.log -E error-paths-6.log
1087 > -A access-paths.log -E error-paths-6.log
1069 $ cat hg.pid >> $DAEMON_PIDS
1088 $ cat hg.pid >> $DAEMON_PIDS
1070 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
1089 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
1071 200 Script output follows
1090 200 Script output follows
1072
1091
1073
1092
1074 /t/
1093 /t/
1075 /c/
1094 /c/
1076
1095
1077 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
1096 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
1078 200 Script output follows
1097 200 Script output follows
1079
1098
1080
1099
1081 /t/a/
1100 /t/a/
1082 /t/b/
1101 /t/b/
1083
1102
1084
1103
1085 test descend = False
1104 test descend = False
1086
1105
1087 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1106 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1088 $ cat >> paths.conf <<EOF
1107 $ cat >> paths.conf <<EOF
1089 > descend=false
1108 > descend=false
1090 > EOF
1109 > EOF
1091 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1110 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1092 > -A access-paths.log -E error-paths-7.log
1111 > -A access-paths.log -E error-paths-7.log
1093 $ cat hg.pid >> $DAEMON_PIDS
1112 $ cat hg.pid >> $DAEMON_PIDS
1094 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
1113 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 '?style=raw'
1095 200 Script output follows
1114 200 Script output follows
1096
1115
1097
1116
1098 /c/
1117 /c/
1099
1118
1100 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
1119 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 't/?style=raw'
1101 200 Script output follows
1120 200 Script output follows
1102
1121
1103
1122
1104 /t/a/
1123 /t/a/
1105 /t/b/
1124 /t/b/
1106
1125
1107 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1126 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1108 $ cat > paths.conf <<EOF
1127 $ cat > paths.conf <<EOF
1109 > [paths]
1128 > [paths]
1110 > nostore = $root/nostore
1129 > nostore = $root/nostore
1111 > inexistent = $root/inexistent
1130 > inexistent = $root/inexistent
1112 > EOF
1131 > EOF
1113 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1132 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1114 > -A access-paths.log -E error-paths-8.log
1133 > -A access-paths.log -E error-paths-8.log
1115 $ cat hg.pid >> $DAEMON_PIDS
1134 $ cat hg.pid >> $DAEMON_PIDS
1116
1135
1117 test inexistent and inaccessible repo should be ignored silently
1136 test inexistent and inaccessible repo should be ignored silently
1118
1137
1119 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 ''
1138 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT1 ''
1120 200 Script output follows
1139 200 Script output follows
1121
1140
1122 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1141 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1123 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1142 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1124 <head>
1143 <head>
1125 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1144 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1126 <meta name="robots" content="index, nofollow" />
1145 <meta name="robots" content="index, nofollow" />
1127 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1146 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1128 <script type="text/javascript" src="/static/mercurial.js"></script>
1147 <script type="text/javascript" src="/static/mercurial.js"></script>
1129
1148
1130 <title>Mercurial repositories index</title>
1149 <title>Mercurial repositories index</title>
1131 </head>
1150 </head>
1132 <body>
1151 <body>
1133
1152
1134 <div class="container">
1153 <div class="container">
1135 <div class="menu">
1154 <div class="menu">
1136 <a href="http://mercurial.selenic.com/">
1155 <a href="http://mercurial.selenic.com/">
1137 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
1156 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
1138 </div>
1157 </div>
1139 <div class="main">
1158 <div class="main">
1140 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1159 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1141
1160
1142 <table class="bigtable">
1161 <table class="bigtable">
1143 <thead>
1162 <thead>
1144 <tr>
1163 <tr>
1145 <th><a href="?sort=name">Name</a></th>
1164 <th><a href="?sort=name">Name</a></th>
1146 <th><a href="?sort=description">Description</a></th>
1165 <th><a href="?sort=description">Description</a></th>
1147 <th><a href="?sort=contact">Contact</a></th>
1166 <th><a href="?sort=contact">Contact</a></th>
1148 <th><a href="?sort=lastchange">Last modified</a></th>
1167 <th><a href="?sort=lastchange">Last modified</a></th>
1149 <th>&nbsp;</th>
1168 <th>&nbsp;</th>
1150 <th>&nbsp;</th>
1169 <th>&nbsp;</th>
1151 </tr>
1170 </tr>
1152 </thead>
1171 </thead>
1153 <tbody class="stripes2">
1172 <tbody class="stripes2">
1154
1173
1155 </tbody>
1174 </tbody>
1156 </table>
1175 </table>
1157 </div>
1176 </div>
1158 </div>
1177 </div>
1159 <script type="text/javascript">process_dates()</script>
1178 <script type="text/javascript">process_dates()</script>
1160
1179
1161
1180
1162 </body>
1181 </body>
1163 </html>
1182 </html>
1164
1183
1165 $ cat > collections.conf <<EOF
1184 $ cat > collections.conf <<EOF
1166 > [collections]
1185 > [collections]
1167 > $root=$root
1186 > $root=$root
1168 > EOF
1187 > EOF
1169 $ hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
1188 $ hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
1170 > --pid-file=hg.pid --webdir-conf collections.conf \
1189 > --pid-file=hg.pid --webdir-conf collections.conf \
1171 > -A access-collections.log -E error-collections.log
1190 > -A access-collections.log -E error-collections.log
1172 $ cat hg.pid >> $DAEMON_PIDS
1191 $ cat hg.pid >> $DAEMON_PIDS
1173
1192
1174 collections: should succeed
1193 collections: should succeed
1175
1194
1176 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '?style=raw'
1195 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 '?style=raw'
1177 200 Script output follows
1196 200 Script output follows
1178
1197
1179
1198
1180 /a/
1199 /a/
1181 /a/.hg/patches/
1200 /a/.hg/patches/
1182 /b/
1201 /b/
1183 /c/
1202 /c/
1184 /notrepo/e/
1203 /notrepo/e/
1185 /notrepo/f/
1204 /notrepo/f/
1186
1205
1187 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/file/tip/a?style=raw'
1206 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/file/tip/a?style=raw'
1188 200 Script output follows
1207 200 Script output follows
1189
1208
1190 a
1209 a
1191 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'b/file/tip/b?style=raw'
1210 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'b/file/tip/b?style=raw'
1192 200 Script output follows
1211 200 Script output follows
1193
1212
1194 b
1213 b
1195 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'c/file/tip/c?style=raw'
1214 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'c/file/tip/c?style=raw'
1196 200 Script output follows
1215 200 Script output follows
1197
1216
1198 c
1217 c
1199
1218
1200 atom-log with basedir /
1219 atom-log with basedir /
1201
1220
1202 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/atom-log' | grep '<link'
1221 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/atom-log' | grep '<link'
1203 <link rel="self" href="http://hg.example.com:8080/a/atom-log"/>
1222 <link rel="self" href="http://hg.example.com:8080/a/atom-log"/>
1204 <link rel="alternate" href="http://hg.example.com:8080/a/"/>
1223 <link rel="alternate" href="http://hg.example.com:8080/a/"/>
1205 <link href="http://hg.example.com:8080/a/rev/8580ff50825a"/>
1224 <link href="http://hg.example.com:8080/a/rev/8580ff50825a"/>
1206
1225
1207 rss-log with basedir /
1226 rss-log with basedir /
1208
1227
1209 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1228 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1210 <guid isPermaLink="true">http://hg.example.com:8080/a/rev/8580ff50825a</guid>
1229 <guid isPermaLink="true">http://hg.example.com:8080/a/rev/8580ff50825a</guid>
1211 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1230 $ "$TESTDIR/killdaemons.py" $DAEMON_PIDS
1212 $ hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
1231 $ hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
1213 > --pid-file=hg.pid --webdir-conf collections.conf \
1232 > --pid-file=hg.pid --webdir-conf collections.conf \
1214 > -A access-collections-2.log -E error-collections-2.log
1233 > -A access-collections-2.log -E error-collections-2.log
1215 $ cat hg.pid >> $DAEMON_PIDS
1234 $ cat hg.pid >> $DAEMON_PIDS
1216
1235
1217 atom-log with basedir /foo/
1236 atom-log with basedir /foo/
1218
1237
1219 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/atom-log' | grep '<link'
1238 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/atom-log' | grep '<link'
1220 <link rel="self" href="http://hg.example.com:8080/foo/a/atom-log"/>
1239 <link rel="self" href="http://hg.example.com:8080/foo/a/atom-log"/>
1221 <link rel="alternate" href="http://hg.example.com:8080/foo/a/"/>
1240 <link rel="alternate" href="http://hg.example.com:8080/foo/a/"/>
1222 <link href="http://hg.example.com:8080/foo/a/rev/8580ff50825a"/>
1241 <link href="http://hg.example.com:8080/foo/a/rev/8580ff50825a"/>
1223
1242
1224 rss-log with basedir /foo/
1243 rss-log with basedir /foo/
1225
1244
1226 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1245 $ "$TESTDIR/get-with-headers.py" localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1227 <guid isPermaLink="true">http://hg.example.com:8080/foo/a/rev/8580ff50825a</guid>
1246 <guid isPermaLink="true">http://hg.example.com:8080/foo/a/rev/8580ff50825a</guid>
1228
1247
1229 paths errors 1
1248 paths errors 1
1230
1249
1231 $ cat error-paths-1.log
1250 $ cat error-paths-1.log
1232
1251
1233 paths errors 2
1252 paths errors 2
1234
1253
1235 $ cat error-paths-2.log
1254 $ cat error-paths-2.log
1236
1255
1237 paths errors 3
1256 paths errors 3
1238
1257
1239 $ cat error-paths-3.log
1258 $ cat error-paths-3.log
1240
1259
1241 paths errors 4
1260 paths errors 4
1242
1261
1243 $ cat error-paths-4.log
1262 $ cat error-paths-4.log
1244
1263
1245 paths errors 5
1264 paths errors 5
1246
1265
1247 $ cat error-paths-5.log
1266 $ cat error-paths-5.log
1248
1267
1249 paths errors 6
1268 paths errors 6
1250
1269
1251 $ cat error-paths-6.log
1270 $ cat error-paths-6.log
1252
1271
1253 paths errors 7
1272 paths errors 7
1254
1273
1255 $ cat error-paths-7.log
1274 $ cat error-paths-7.log
1256
1275
1257 paths errors 8
1276 paths errors 8
1258
1277
1259 $ cat error-paths-8.log
1278 $ cat error-paths-8.log
1260
1279
1261 collections errors
1280 collections errors
1262
1281
1263 $ cat error-collections.log
1282 $ cat error-collections.log
1264
1283
1265 collections errors 2
1284 collections errors 2
1266
1285
1267 $ cat error-collections-2.log
1286 $ cat error-collections-2.log
General Comments 0
You need to be logged in to leave comments. Login now