##// END OF EJS Templates
hgwebdir: add support for explicit index files...
Matt Harbison -
r31482:da7d1932 default
parent child Browse files
Show More
@@ -1,528 +1,535 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 from __future__ import absolute_import
9 from __future__ import absolute_import
10
10
11 import os
11 import os
12 import re
12 import re
13 import time
13 import time
14
14
15 from ..i18n import _
15 from ..i18n import _
16
16
17 from .common import (
17 from .common import (
18 ErrorResponse,
18 ErrorResponse,
19 HTTP_NOT_FOUND,
19 HTTP_NOT_FOUND,
20 HTTP_OK,
20 HTTP_OK,
21 HTTP_SERVER_ERROR,
21 HTTP_SERVER_ERROR,
22 cspvalues,
22 cspvalues,
23 get_contact,
23 get_contact,
24 get_mtime,
24 get_mtime,
25 ismember,
25 ismember,
26 paritygen,
26 paritygen,
27 staticfile,
27 staticfile,
28 )
28 )
29 from .request import wsgirequest
29 from .request import wsgirequest
30
30
31 from .. import (
31 from .. import (
32 encoding,
32 encoding,
33 error,
33 error,
34 hg,
34 hg,
35 profiling,
35 profiling,
36 scmutil,
36 scmutil,
37 templater,
37 templater,
38 ui as uimod,
38 ui as uimod,
39 util,
39 util,
40 )
40 )
41
41
42 from . import (
42 from . import (
43 hgweb_mod,
43 hgweb_mod,
44 webutil,
44 webutil,
45 wsgicgi,
45 wsgicgi,
46 )
46 )
47
47
48 def cleannames(items):
48 def cleannames(items):
49 return [(util.pconvert(name).strip('/'), path) for name, path in items]
49 return [(util.pconvert(name).strip('/'), path) for name, path in items]
50
50
51 def findrepos(paths):
51 def findrepos(paths):
52 repos = []
52 repos = []
53 for prefix, root in cleannames(paths):
53 for prefix, root in cleannames(paths):
54 roothead, roottail = os.path.split(root)
54 roothead, roottail = os.path.split(root)
55 # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below
55 # "foo = /bar/*" or "foo = /bar/**" lets every repo /bar/N in or below
56 # /bar/ be served as as foo/N .
56 # /bar/ be served as as foo/N .
57 # '*' will not search inside dirs with .hg (except .hg/patches),
57 # '*' will not search inside dirs with .hg (except .hg/patches),
58 # '**' will search inside dirs with .hg (and thus also find subrepos).
58 # '**' will search inside dirs with .hg (and thus also find subrepos).
59 try:
59 try:
60 recurse = {'*': False, '**': True}[roottail]
60 recurse = {'*': False, '**': True}[roottail]
61 except KeyError:
61 except KeyError:
62 repos.append((prefix, root))
62 repos.append((prefix, root))
63 continue
63 continue
64 roothead = os.path.normpath(os.path.abspath(roothead))
64 roothead = os.path.normpath(os.path.abspath(roothead))
65 paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse)
65 paths = scmutil.walkrepos(roothead, followsym=True, recurse=recurse)
66 repos.extend(urlrepos(prefix, roothead, paths))
66 repos.extend(urlrepos(prefix, roothead, paths))
67 return repos
67 return repos
68
68
69 def urlrepos(prefix, roothead, paths):
69 def urlrepos(prefix, roothead, paths):
70 """yield url paths and filesystem paths from a list of repo paths
70 """yield url paths and filesystem paths from a list of repo paths
71
71
72 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
72 >>> conv = lambda seq: [(v, util.pconvert(p)) for v,p in seq]
73 >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
73 >>> conv(urlrepos('hg', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
74 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
74 [('hg/r', '/opt/r'), ('hg/r/r', '/opt/r/r'), ('hg', '/opt')]
75 >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
75 >>> conv(urlrepos('', '/opt', ['/opt/r', '/opt/r/r', '/opt']))
76 [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
76 [('r', '/opt/r'), ('r/r', '/opt/r/r'), ('', '/opt')]
77 """
77 """
78 for path in paths:
78 for path in paths:
79 path = os.path.normpath(path)
79 path = os.path.normpath(path)
80 yield (prefix + '/' +
80 yield (prefix + '/' +
81 util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path
81 util.pconvert(path[len(roothead):]).lstrip('/')).strip('/'), path
82
82
83 def geturlcgivars(baseurl, port):
83 def geturlcgivars(baseurl, port):
84 """
84 """
85 Extract CGI variables from baseurl
85 Extract CGI variables from baseurl
86
86
87 >>> geturlcgivars("http://host.org/base", "80")
87 >>> geturlcgivars("http://host.org/base", "80")
88 ('host.org', '80', '/base')
88 ('host.org', '80', '/base')
89 >>> geturlcgivars("http://host.org:8000/base", "80")
89 >>> geturlcgivars("http://host.org:8000/base", "80")
90 ('host.org', '8000', '/base')
90 ('host.org', '8000', '/base')
91 >>> geturlcgivars('/base', 8000)
91 >>> geturlcgivars('/base', 8000)
92 ('', '8000', '/base')
92 ('', '8000', '/base')
93 >>> geturlcgivars("base", '8000')
93 >>> geturlcgivars("base", '8000')
94 ('', '8000', '/base')
94 ('', '8000', '/base')
95 >>> geturlcgivars("http://host", '8000')
95 >>> geturlcgivars("http://host", '8000')
96 ('host', '8000', '/')
96 ('host', '8000', '/')
97 >>> geturlcgivars("http://host/", '8000')
97 >>> geturlcgivars("http://host/", '8000')
98 ('host', '8000', '/')
98 ('host', '8000', '/')
99 """
99 """
100 u = util.url(baseurl)
100 u = util.url(baseurl)
101 name = u.host or ''
101 name = u.host or ''
102 if u.port:
102 if u.port:
103 port = u.port
103 port = u.port
104 path = u.path or ""
104 path = u.path or ""
105 if not path.startswith('/'):
105 if not path.startswith('/'):
106 path = '/' + path
106 path = '/' + path
107
107
108 return name, str(port), path
108 return name, str(port), path
109
109
110 class hgwebdir(object):
110 class hgwebdir(object):
111 """HTTP server for multiple repositories.
111 """HTTP server for multiple repositories.
112
112
113 Given a configuration, different repositories will be served depending
113 Given a configuration, different repositories will be served depending
114 on the request path.
114 on the request path.
115
115
116 Instances are typically used as WSGI applications.
116 Instances are typically used as WSGI applications.
117 """
117 """
118 def __init__(self, conf, baseui=None):
118 def __init__(self, conf, baseui=None):
119 self.conf = conf
119 self.conf = conf
120 self.baseui = baseui
120 self.baseui = baseui
121 self.ui = None
121 self.ui = None
122 self.lastrefresh = 0
122 self.lastrefresh = 0
123 self.motd = None
123 self.motd = None
124 self.refresh()
124 self.refresh()
125
125
126 def refresh(self):
126 def refresh(self):
127 refreshinterval = 20
127 refreshinterval = 20
128 if self.ui:
128 if self.ui:
129 refreshinterval = self.ui.configint('web', 'refreshinterval',
129 refreshinterval = self.ui.configint('web', 'refreshinterval',
130 refreshinterval)
130 refreshinterval)
131
131
132 # refreshinterval <= 0 means to always refresh.
132 # refreshinterval <= 0 means to always refresh.
133 if (refreshinterval > 0 and
133 if (refreshinterval > 0 and
134 self.lastrefresh + refreshinterval > time.time()):
134 self.lastrefresh + refreshinterval > time.time()):
135 return
135 return
136
136
137 if self.baseui:
137 if self.baseui:
138 u = self.baseui.copy()
138 u = self.baseui.copy()
139 else:
139 else:
140 u = uimod.ui.load()
140 u = uimod.ui.load()
141 u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
141 u.setconfig('ui', 'report_untrusted', 'off', 'hgwebdir')
142 u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
142 u.setconfig('ui', 'nontty', 'true', 'hgwebdir')
143 # displaying bundling progress bar while serving feels wrong and may
143 # displaying bundling progress bar while serving feels wrong and may
144 # break some wsgi implementations.
144 # break some wsgi implementations.
145 u.setconfig('progress', 'disable', 'true', 'hgweb')
145 u.setconfig('progress', 'disable', 'true', 'hgweb')
146
146
147 if not isinstance(self.conf, (dict, list, tuple)):
147 if not isinstance(self.conf, (dict, list, tuple)):
148 map = {'paths': 'hgweb-paths'}
148 map = {'paths': 'hgweb-paths'}
149 if not os.path.exists(self.conf):
149 if not os.path.exists(self.conf):
150 raise error.Abort(_('config file %s not found!') % self.conf)
150 raise error.Abort(_('config file %s not found!') % self.conf)
151 u.readconfig(self.conf, remap=map, trust=True)
151 u.readconfig(self.conf, remap=map, trust=True)
152 paths = []
152 paths = []
153 for name, ignored in u.configitems('hgweb-paths'):
153 for name, ignored in u.configitems('hgweb-paths'):
154 for path in u.configlist('hgweb-paths', name):
154 for path in u.configlist('hgweb-paths', name):
155 paths.append((name, path))
155 paths.append((name, path))
156 elif isinstance(self.conf, (list, tuple)):
156 elif isinstance(self.conf, (list, tuple)):
157 paths = self.conf
157 paths = self.conf
158 elif isinstance(self.conf, dict):
158 elif isinstance(self.conf, dict):
159 paths = self.conf.items()
159 paths = self.conf.items()
160
160
161 repos = findrepos(paths)
161 repos = findrepos(paths)
162 for prefix, root in u.configitems('collections'):
162 for prefix, root in u.configitems('collections'):
163 prefix = util.pconvert(prefix)
163 prefix = util.pconvert(prefix)
164 for path in scmutil.walkrepos(root, followsym=True):
164 for path in scmutil.walkrepos(root, followsym=True):
165 repo = os.path.normpath(path)
165 repo = os.path.normpath(path)
166 name = util.pconvert(repo)
166 name = util.pconvert(repo)
167 if name.startswith(prefix):
167 if name.startswith(prefix):
168 name = name[len(prefix):]
168 name = name[len(prefix):]
169 repos.append((name.lstrip('/'), repo))
169 repos.append((name.lstrip('/'), repo))
170
170
171 self.repos = repos
171 self.repos = repos
172 self.ui = u
172 self.ui = u
173 encoding.encoding = self.ui.config('web', 'encoding',
173 encoding.encoding = self.ui.config('web', 'encoding',
174 encoding.encoding)
174 encoding.encoding)
175 self.style = self.ui.config('web', 'style', 'paper')
175 self.style = self.ui.config('web', 'style', 'paper')
176 self.templatepath = self.ui.config('web', 'templates', None)
176 self.templatepath = self.ui.config('web', 'templates', None)
177 self.stripecount = self.ui.config('web', 'stripes', 1)
177 self.stripecount = self.ui.config('web', 'stripes', 1)
178 if self.stripecount:
178 if self.stripecount:
179 self.stripecount = int(self.stripecount)
179 self.stripecount = int(self.stripecount)
180 self._baseurl = self.ui.config('web', 'baseurl')
180 self._baseurl = self.ui.config('web', 'baseurl')
181 prefix = self.ui.config('web', 'prefix', '')
181 prefix = self.ui.config('web', 'prefix', '')
182 if prefix.startswith('/'):
182 if prefix.startswith('/'):
183 prefix = prefix[1:]
183 prefix = prefix[1:]
184 if prefix.endswith('/'):
184 if prefix.endswith('/'):
185 prefix = prefix[:-1]
185 prefix = prefix[:-1]
186 self.prefix = prefix
186 self.prefix = prefix
187 self.lastrefresh = time.time()
187 self.lastrefresh = time.time()
188
188
189 def run(self):
189 def run(self):
190 if not encoding.environ.get('GATEWAY_INTERFACE',
190 if not encoding.environ.get('GATEWAY_INTERFACE',
191 '').startswith("CGI/1."):
191 '').startswith("CGI/1."):
192 raise RuntimeError("This function is only intended to be "
192 raise RuntimeError("This function is only intended to be "
193 "called while running as a CGI script.")
193 "called while running as a CGI script.")
194 wsgicgi.launch(self)
194 wsgicgi.launch(self)
195
195
196 def __call__(self, env, respond):
196 def __call__(self, env, respond):
197 req = wsgirequest(env, respond)
197 req = wsgirequest(env, respond)
198 return self.run_wsgi(req)
198 return self.run_wsgi(req)
199
199
200 def read_allowed(self, ui, req):
200 def read_allowed(self, ui, req):
201 """Check allow_read and deny_read config options of a repo's ui object
201 """Check allow_read and deny_read config options of a repo's ui object
202 to determine user permissions. By default, with neither option set (or
202 to determine user permissions. By default, with neither option set (or
203 both empty), allow all users to read the repo. There are two ways a
203 both empty), allow all users to read the repo. There are two ways a
204 user can be denied read access: (1) deny_read is not empty, and the
204 user can be denied read access: (1) deny_read is not empty, and the
205 user is unauthenticated or deny_read contains user (or *), and (2)
205 user is unauthenticated or deny_read contains user (or *), and (2)
206 allow_read is not empty and the user is not in allow_read. Return True
206 allow_read is not empty and the user is not in allow_read. Return True
207 if user is allowed to read the repo, else return False."""
207 if user is allowed to read the repo, else return False."""
208
208
209 user = req.env.get('REMOTE_USER')
209 user = req.env.get('REMOTE_USER')
210
210
211 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
211 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
212 if deny_read and (not user or ismember(ui, user, deny_read)):
212 if deny_read and (not user or ismember(ui, user, deny_read)):
213 return False
213 return False
214
214
215 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
215 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
216 # by default, allow reading if no allow_read option has been set
216 # by default, allow reading if no allow_read option has been set
217 if (not allow_read) or ismember(ui, user, allow_read):
217 if (not allow_read) or ismember(ui, user, allow_read):
218 return True
218 return True
219
219
220 return False
220 return False
221
221
222 def run_wsgi(self, req):
222 def run_wsgi(self, req):
223 with profiling.maybeprofile(self.ui):
223 with profiling.maybeprofile(self.ui):
224 for r in self._runwsgi(req):
224 for r in self._runwsgi(req):
225 yield r
225 yield r
226
226
227 def _runwsgi(self, req):
227 def _runwsgi(self, req):
228 try:
228 try:
229 self.refresh()
229 self.refresh()
230
230
231 csp, nonce = cspvalues(self.ui)
231 csp, nonce = cspvalues(self.ui)
232 if csp:
232 if csp:
233 req.headers.append(('Content-Security-Policy', csp))
233 req.headers.append(('Content-Security-Policy', csp))
234
234
235 virtual = req.env.get("PATH_INFO", "").strip('/')
235 virtual = req.env.get("PATH_INFO", "").strip('/')
236 tmpl = self.templater(req, nonce)
236 tmpl = self.templater(req, nonce)
237 ctype = tmpl('mimetype', encoding=encoding.encoding)
237 ctype = tmpl('mimetype', encoding=encoding.encoding)
238 ctype = templater.stringify(ctype)
238 ctype = templater.stringify(ctype)
239
239
240 # a static file
240 # a static file
241 if virtual.startswith('static/') or 'static' in req.form:
241 if virtual.startswith('static/') or 'static' in req.form:
242 if virtual.startswith('static/'):
242 if virtual.startswith('static/'):
243 fname = virtual[7:]
243 fname = virtual[7:]
244 else:
244 else:
245 fname = req.form['static'][0]
245 fname = req.form['static'][0]
246 static = self.ui.config("web", "static", None,
246 static = self.ui.config("web", "static", None,
247 untrusted=False)
247 untrusted=False)
248 if not static:
248 if not static:
249 tp = self.templatepath or templater.templatepaths()
249 tp = self.templatepath or templater.templatepaths()
250 if isinstance(tp, str):
250 if isinstance(tp, str):
251 tp = [tp]
251 tp = [tp]
252 static = [os.path.join(p, 'static') for p in tp]
252 static = [os.path.join(p, 'static') for p in tp]
253 staticfile(static, fname, req)
253 staticfile(static, fname, req)
254 return []
254 return []
255
255
256 # top-level index
256 # top-level index
257 elif not virtual:
257
258 repos = dict(self.repos)
259
260 if not virtual or (virtual == 'index' and virtual not in repos):
258 req.respond(HTTP_OK, ctype)
261 req.respond(HTTP_OK, ctype)
259 return self.makeindex(req, tmpl)
262 return self.makeindex(req, tmpl)
260
263
261 # nested indexes and hgwebs
264 # nested indexes and hgwebs
262
265
263 repos = dict(self.repos)
266 if virtual.endswith('/index') and virtual not in repos:
267 subdir = virtual[:-len('index')]
268 if any(r.startswith(subdir) for r in repos):
269 req.respond(HTTP_OK, ctype)
270 return self.makeindex(req, tmpl, subdir)
271
264 virtualrepo = virtual
272 virtualrepo = virtual
265 while virtualrepo:
273 while virtualrepo:
266 real = repos.get(virtualrepo)
274 real = repos.get(virtualrepo)
267 if real:
275 if real:
268 req.env['REPO_NAME'] = virtualrepo
276 req.env['REPO_NAME'] = virtualrepo
269 try:
277 try:
270 # ensure caller gets private copy of ui
278 # ensure caller gets private copy of ui
271 repo = hg.repository(self.ui.copy(), real)
279 repo = hg.repository(self.ui.copy(), real)
272 return hgweb_mod.hgweb(repo).run_wsgi(req)
280 return hgweb_mod.hgweb(repo).run_wsgi(req)
273 except IOError as inst:
281 except IOError as inst:
274 msg = inst.strerror
282 msg = inst.strerror
275 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
283 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
276 except error.RepoError as inst:
284 except error.RepoError as inst:
277 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
285 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
278
286
279 up = virtualrepo.rfind('/')
287 up = virtualrepo.rfind('/')
280 if up < 0:
288 if up < 0:
281 break
289 break
282 virtualrepo = virtualrepo[:up]
290 virtualrepo = virtualrepo[:up]
283
291
284 # browse subdirectories
292 # browse subdirectories
285 subdir = virtual + '/'
293 subdir = virtual + '/'
286 if [r for r in repos if r.startswith(subdir)]:
294 if [r for r in repos if r.startswith(subdir)]:
287 req.respond(HTTP_OK, ctype)
295 req.respond(HTTP_OK, ctype)
288 return self.makeindex(req, tmpl, subdir)
296 return self.makeindex(req, tmpl, subdir)
289
297
290 # prefixes not found
298 # prefixes not found
291 req.respond(HTTP_NOT_FOUND, ctype)
299 req.respond(HTTP_NOT_FOUND, ctype)
292 return tmpl("notfound", repo=virtual)
300 return tmpl("notfound", repo=virtual)
293
301
294 except ErrorResponse as err:
302 except ErrorResponse as err:
295 req.respond(err, ctype)
303 req.respond(err, ctype)
296 return tmpl('error', error=err.message or '')
304 return tmpl('error', error=err.message or '')
297 finally:
305 finally:
298 tmpl = None
306 tmpl = None
299
307
300 def makeindex(self, req, tmpl, subdir=""):
308 def makeindex(self, req, tmpl, subdir=""):
301
309
302 def archivelist(ui, nodeid, url):
310 def archivelist(ui, nodeid, url):
303 allowed = ui.configlist("web", "allow_archive", untrusted=True)
311 allowed = ui.configlist("web", "allow_archive", untrusted=True)
304 archives = []
312 archives = []
305 for typ, spec in hgweb_mod.archivespecs.iteritems():
313 for typ, spec in hgweb_mod.archivespecs.iteritems():
306 if typ in allowed or ui.configbool("web", "allow" + typ,
314 if typ in allowed or ui.configbool("web", "allow" + typ,
307 untrusted=True):
315 untrusted=True):
308 archives.append({"type" : typ, "extension": spec[2],
316 archives.append({"type" : typ, "extension": spec[2],
309 "node": nodeid, "url": url})
317 "node": nodeid, "url": url})
310 return archives
318 return archives
311
319
312 def rawentries(subdir="", **map):
320 def rawentries(subdir="", **map):
313
321
314 descend = self.ui.configbool('web', 'descend', True)
322 descend = self.ui.configbool('web', 'descend', True)
315 collapse = self.ui.configbool('web', 'collapse', False)
323 collapse = self.ui.configbool('web', 'collapse', False)
316 seenrepos = set()
324 seenrepos = set()
317 seendirs = set()
325 seendirs = set()
318 for name, path in self.repos:
326 for name, path in self.repos:
319
327
320 if not name.startswith(subdir):
328 if not name.startswith(subdir):
321 continue
329 continue
322 name = name[len(subdir):]
330 name = name[len(subdir):]
323 directory = False
331 directory = False
324
332
325 if '/' in name:
333 if '/' in name:
326 if not descend:
334 if not descend:
327 continue
335 continue
328
336
329 nameparts = name.split('/')
337 nameparts = name.split('/')
330 rootname = nameparts[0]
338 rootname = nameparts[0]
331
339
332 if not collapse:
340 if not collapse:
333 pass
341 pass
334 elif rootname in seendirs:
342 elif rootname in seendirs:
335 continue
343 continue
336 elif rootname in seenrepos:
344 elif rootname in seenrepos:
337 pass
345 pass
338 else:
346 else:
339 directory = True
347 directory = True
340 name = rootname
348 name = rootname
341
349
342 # redefine the path to refer to the directory
350 # redefine the path to refer to the directory
343 discarded = '/'.join(nameparts[1:])
351 discarded = '/'.join(nameparts[1:])
344
352
345 # remove name parts plus accompanying slash
353 # remove name parts plus accompanying slash
346 path = path[:-len(discarded) - 1]
354 path = path[:-len(discarded) - 1]
347
355
348 try:
356 try:
349 r = hg.repository(self.ui, path)
357 r = hg.repository(self.ui, path)
350 directory = False
358 directory = False
351 except (IOError, error.RepoError):
359 except (IOError, error.RepoError):
352 pass
360 pass
353
361
354 parts = [name]
362 parts = [name]
355 if 'PATH_INFO' in req.env:
363 parts.insert(0, '/' + subdir.rstrip('/'))
356 parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
357 if req.env['SCRIPT_NAME']:
364 if req.env['SCRIPT_NAME']:
358 parts.insert(0, req.env['SCRIPT_NAME'])
365 parts.insert(0, req.env['SCRIPT_NAME'])
359 url = re.sub(r'/+', '/', '/'.join(parts) + '/')
366 url = re.sub(r'/+', '/', '/'.join(parts) + '/')
360
367
361 # show either a directory entry or a repository
368 # show either a directory entry or a repository
362 if directory:
369 if directory:
363 # get the directory's time information
370 # get the directory's time information
364 try:
371 try:
365 d = (get_mtime(path), util.makedate()[1])
372 d = (get_mtime(path), util.makedate()[1])
366 except OSError:
373 except OSError:
367 continue
374 continue
368
375
369 # add '/' to the name to make it obvious that
376 # add '/' to the name to make it obvious that
370 # the entry is a directory, not a regular repository
377 # the entry is a directory, not a regular repository
371 row = {'contact': "",
378 row = {'contact': "",
372 'contact_sort': "",
379 'contact_sort': "",
373 'name': name + '/',
380 'name': name + '/',
374 'name_sort': name,
381 'name_sort': name,
375 'url': url,
382 'url': url,
376 'description': "",
383 'description': "",
377 'description_sort': "",
384 'description_sort': "",
378 'lastchange': d,
385 'lastchange': d,
379 'lastchange_sort': d[1]-d[0],
386 'lastchange_sort': d[1]-d[0],
380 'archives': [],
387 'archives': [],
381 'isdirectory': True,
388 'isdirectory': True,
382 'labels': [],
389 'labels': [],
383 }
390 }
384
391
385 seendirs.add(name)
392 seendirs.add(name)
386 yield row
393 yield row
387 continue
394 continue
388
395
389 u = self.ui.copy()
396 u = self.ui.copy()
390 try:
397 try:
391 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
398 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
392 except Exception as e:
399 except Exception as e:
393 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
400 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
394 continue
401 continue
395 def get(section, name, default=None):
402 def get(section, name, default=None):
396 return u.config(section, name, default, untrusted=True)
403 return u.config(section, name, default, untrusted=True)
397
404
398 if u.configbool("web", "hidden", untrusted=True):
405 if u.configbool("web", "hidden", untrusted=True):
399 continue
406 continue
400
407
401 if not self.read_allowed(u, req):
408 if not self.read_allowed(u, req):
402 continue
409 continue
403
410
404 # update time with local timezone
411 # update time with local timezone
405 try:
412 try:
406 r = hg.repository(self.ui, path)
413 r = hg.repository(self.ui, path)
407 except IOError:
414 except IOError:
408 u.warn(_('error accessing repository at %s\n') % path)
415 u.warn(_('error accessing repository at %s\n') % path)
409 continue
416 continue
410 except error.RepoError:
417 except error.RepoError:
411 u.warn(_('error accessing repository at %s\n') % path)
418 u.warn(_('error accessing repository at %s\n') % path)
412 continue
419 continue
413 try:
420 try:
414 d = (get_mtime(r.spath), util.makedate()[1])
421 d = (get_mtime(r.spath), util.makedate()[1])
415 except OSError:
422 except OSError:
416 continue
423 continue
417
424
418 contact = get_contact(get)
425 contact = get_contact(get)
419 description = get("web", "description", "")
426 description = get("web", "description", "")
420 seenrepos.add(name)
427 seenrepos.add(name)
421 name = get("web", "name", name)
428 name = get("web", "name", name)
422 row = {'contact': contact or "unknown",
429 row = {'contact': contact or "unknown",
423 'contact_sort': contact.upper() or "unknown",
430 'contact_sort': contact.upper() or "unknown",
424 'name': name,
431 'name': name,
425 'name_sort': name,
432 'name_sort': name,
426 'url': url,
433 'url': url,
427 'description': description or "unknown",
434 'description': description or "unknown",
428 'description_sort': description.upper() or "unknown",
435 'description_sort': description.upper() or "unknown",
429 'lastchange': d,
436 'lastchange': d,
430 'lastchange_sort': d[1]-d[0],
437 'lastchange_sort': d[1]-d[0],
431 'archives': archivelist(u, "tip", url),
438 'archives': archivelist(u, "tip", url),
432 'isdirectory': None,
439 'isdirectory': None,
433 'labels': u.configlist('web', 'labels', untrusted=True),
440 'labels': u.configlist('web', 'labels', untrusted=True),
434 }
441 }
435
442
436 yield row
443 yield row
437
444
438 sortdefault = None, False
445 sortdefault = None, False
439 def entries(sortcolumn="", descending=False, subdir="", **map):
446 def entries(sortcolumn="", descending=False, subdir="", **map):
440 rows = rawentries(subdir=subdir, **map)
447 rows = rawentries(subdir=subdir, **map)
441
448
442 if sortcolumn and sortdefault != (sortcolumn, descending):
449 if sortcolumn and sortdefault != (sortcolumn, descending):
443 sortkey = '%s_sort' % sortcolumn
450 sortkey = '%s_sort' % sortcolumn
444 rows = sorted(rows, key=lambda x: x[sortkey],
451 rows = sorted(rows, key=lambda x: x[sortkey],
445 reverse=descending)
452 reverse=descending)
446 for row, parity in zip(rows, paritygen(self.stripecount)):
453 for row, parity in zip(rows, paritygen(self.stripecount)):
447 row['parity'] = parity
454 row['parity'] = parity
448 yield row
455 yield row
449
456
450 self.refresh()
457 self.refresh()
451 sortable = ["name", "description", "contact", "lastchange"]
458 sortable = ["name", "description", "contact", "lastchange"]
452 sortcolumn, descending = sortdefault
459 sortcolumn, descending = sortdefault
453 if 'sort' in req.form:
460 if 'sort' in req.form:
454 sortcolumn = req.form['sort'][0]
461 sortcolumn = req.form['sort'][0]
455 descending = sortcolumn.startswith('-')
462 descending = sortcolumn.startswith('-')
456 if descending:
463 if descending:
457 sortcolumn = sortcolumn[1:]
464 sortcolumn = sortcolumn[1:]
458 if sortcolumn not in sortable:
465 if sortcolumn not in sortable:
459 sortcolumn = ""
466 sortcolumn = ""
460
467
461 sort = [("sort_%s" % column,
468 sort = [("sort_%s" % column,
462 "%s%s" % ((not descending and column == sortcolumn)
469 "%s%s" % ((not descending and column == sortcolumn)
463 and "-" or "", column))
470 and "-" or "", column))
464 for column in sortable]
471 for column in sortable]
465
472
466 self.refresh()
473 self.refresh()
467 self.updatereqenv(req.env)
474 self.updatereqenv(req.env)
468
475
469 return tmpl("index", entries=entries, subdir=subdir,
476 return tmpl("index", entries=entries, subdir=subdir,
470 pathdef=hgweb_mod.makebreadcrumb('/' + subdir, self.prefix),
477 pathdef=hgweb_mod.makebreadcrumb('/' + subdir, self.prefix),
471 sortcolumn=sortcolumn, descending=descending,
478 sortcolumn=sortcolumn, descending=descending,
472 **dict(sort))
479 **dict(sort))
473
480
474 def templater(self, req, nonce):
481 def templater(self, req, nonce):
475
482
476 def motd(**map):
483 def motd(**map):
477 if self.motd is not None:
484 if self.motd is not None:
478 yield self.motd
485 yield self.motd
479 else:
486 else:
480 yield config('web', 'motd', '')
487 yield config('web', 'motd', '')
481
488
482 def config(section, name, default=None, untrusted=True):
489 def config(section, name, default=None, untrusted=True):
483 return self.ui.config(section, name, default, untrusted)
490 return self.ui.config(section, name, default, untrusted)
484
491
485 self.updatereqenv(req.env)
492 self.updatereqenv(req.env)
486
493
487 url = req.env.get('SCRIPT_NAME', '')
494 url = req.env.get('SCRIPT_NAME', '')
488 if not url.endswith('/'):
495 if not url.endswith('/'):
489 url += '/'
496 url += '/'
490
497
491 vars = {}
498 vars = {}
492 styles = (
499 styles = (
493 req.form.get('style', [None])[0],
500 req.form.get('style', [None])[0],
494 config('web', 'style'),
501 config('web', 'style'),
495 'paper'
502 'paper'
496 )
503 )
497 style, mapfile = templater.stylemap(styles, self.templatepath)
504 style, mapfile = templater.stylemap(styles, self.templatepath)
498 if style == styles[0]:
505 if style == styles[0]:
499 vars['style'] = style
506 vars['style'] = style
500
507
501 start = url[-1] == '?' and '&' or '?'
508 start = url[-1] == '?' and '&' or '?'
502 sessionvars = webutil.sessionvars(vars, start)
509 sessionvars = webutil.sessionvars(vars, start)
503 logourl = config('web', 'logourl', 'https://mercurial-scm.org/')
510 logourl = config('web', 'logourl', 'https://mercurial-scm.org/')
504 logoimg = config('web', 'logoimg', 'hglogo.png')
511 logoimg = config('web', 'logoimg', 'hglogo.png')
505 staticurl = config('web', 'staticurl') or url + 'static/'
512 staticurl = config('web', 'staticurl') or url + 'static/'
506 if not staticurl.endswith('/'):
513 if not staticurl.endswith('/'):
507 staticurl += '/'
514 staticurl += '/'
508
515
509 defaults = {
516 defaults = {
510 "encoding": encoding.encoding,
517 "encoding": encoding.encoding,
511 "motd": motd,
518 "motd": motd,
512 "url": url,
519 "url": url,
513 "logourl": logourl,
520 "logourl": logourl,
514 "logoimg": logoimg,
521 "logoimg": logoimg,
515 "staticurl": staticurl,
522 "staticurl": staticurl,
516 "sessionvars": sessionvars,
523 "sessionvars": sessionvars,
517 "style": style,
524 "style": style,
518 "nonce": nonce,
525 "nonce": nonce,
519 }
526 }
520 tmpl = templater.templater.frommapfile(mapfile, defaults=defaults)
527 tmpl = templater.templater.frommapfile(mapfile, defaults=defaults)
521 return tmpl
528 return tmpl
522
529
523 def updatereqenv(self, env):
530 def updatereqenv(self, env):
524 if self._baseurl is not None:
531 if self._baseurl is not None:
525 name, port, path = geturlcgivars(self._baseurl, env['SERVER_PORT'])
532 name, port, path = geturlcgivars(self._baseurl, env['SERVER_PORT'])
526 env['SERVER_NAME'] = name
533 env['SERVER_NAME'] = name
527 env['SERVER_PORT'] = port
534 env['SERVER_PORT'] = port
528 env['SCRIPT_NAME'] = path
535 env['SCRIPT_NAME'] = path
@@ -1,1616 +1,1729 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 > labels = foo, bar
65 > labels = foo, bar
66 > EOF
66 > EOF
67 $ cd ..
67 $ cd ..
68
68
69 create repository without .hg/store
69 create repository without .hg/store
70
70
71 $ hg init nostore
71 $ hg init nostore
72 $ rm -R nostore/.hg/store
72 $ rm -R nostore/.hg/store
73 $ root=`pwd`
73 $ root=`pwd`
74 $ cd ..
74 $ cd ..
75
75
76 serve
76 serve
77 $ cat > paths.conf <<EOF
77 $ cat > paths.conf <<EOF
78 > [paths]
78 > [paths]
79 > a=$root/a
79 > a=$root/a
80 > b=$root/b
80 > b=$root/b
81 > EOF
81 > EOF
82 $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
82 $ hg serve -p $HGPORT -d --pid-file=hg.pid --webdir-conf paths.conf \
83 > -A access-paths.log -E error-paths-1.log
83 > -A access-paths.log -E error-paths-1.log
84 $ cat hg.pid >> $DAEMON_PIDS
84 $ cat hg.pid >> $DAEMON_PIDS
85
85
86 should give a 404 - file does not exist
86 should give a 404 - file does not exist
87
87
88 $ get-with-headers.py localhost:$HGPORT 'a/file/tip/bork?style=raw'
88 $ get-with-headers.py localhost:$HGPORT 'a/file/tip/bork?style=raw'
89 404 Not Found
89 404 Not Found
90
90
91
91
92 error: bork@8580ff50825a: not found in manifest
92 error: bork@8580ff50825a: not found in manifest
93 [1]
93 [1]
94
94
95 should succeed
95 should succeed
96
96
97 $ get-with-headers.py localhost:$HGPORT '?style=raw'
97 $ get-with-headers.py localhost:$HGPORT '?style=raw'
98 200 Script output follows
98 200 Script output follows
99
99
100
100
101 /a/
101 /a/
102 /b/
102 /b/
103
103
104 $ get-with-headers.py localhost:$HGPORT '?style=json'
104 $ get-with-headers.py localhost:$HGPORT '?style=json'
105 200 Script output follows
105 200 Script output follows
106
106
107 {
107 {
108 "entries": [{
108 "entries": [{
109 "name": "a",
109 "name": "a",
110 "description": "unknown",
110 "description": "unknown",
111 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
111 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
112 "lastchange": [*, *], (glob)
112 "lastchange": [*, *], (glob)
113 "labels": []
113 "labels": []
114 }, {
114 }, {
115 "name": "b",
115 "name": "b",
116 "description": "unknown",
116 "description": "unknown",
117 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
117 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
118 "lastchange": [*, *], (glob)
118 "lastchange": [*, *], (glob)
119 "labels": []
119 "labels": []
120 }]
120 }]
121 } (no-eol)
121 } (no-eol)
122
122
123 $ get-with-headers.py localhost:$HGPORT 'a/file/tip/a?style=raw'
123 $ get-with-headers.py localhost:$HGPORT 'a/file/tip/a?style=raw'
124 200 Script output follows
124 200 Script output follows
125
125
126 a
126 a
127 $ get-with-headers.py localhost:$HGPORT 'b/file/tip/b?style=raw'
127 $ get-with-headers.py localhost:$HGPORT 'b/file/tip/b?style=raw'
128 200 Script output follows
128 200 Script output follows
129
129
130 b
130 b
131
131
132 should give a 404 - repo is not published
132 should give a 404 - repo is not published
133
133
134 $ get-with-headers.py localhost:$HGPORT 'c/file/tip/c?style=raw'
134 $ get-with-headers.py localhost:$HGPORT 'c/file/tip/c?style=raw'
135 404 Not Found
135 404 Not Found
136
136
137
137
138 error: repository c/file/tip/c not found
138 error: repository c/file/tip/c not found
139 [1]
139 [1]
140
140
141 atom-log without basedir
141 atom-log without basedir
142
142
143 $ get-with-headers.py localhost:$HGPORT 'a/atom-log' | grep '<link'
143 $ get-with-headers.py localhost:$HGPORT 'a/atom-log' | grep '<link'
144 <link rel="self" href="http://*:$HGPORT/a/atom-log"/> (glob)
144 <link rel="self" href="http://*:$HGPORT/a/atom-log"/> (glob)
145 <link rel="alternate" href="http://*:$HGPORT/a/"/> (glob)
145 <link rel="alternate" href="http://*:$HGPORT/a/"/> (glob)
146 <link href="http://*:$HGPORT/a/rev/8580ff50825a"/> (glob)
146 <link href="http://*:$HGPORT/a/rev/8580ff50825a"/> (glob)
147
147
148 rss-log without basedir
148 rss-log without basedir
149
149
150 $ get-with-headers.py localhost:$HGPORT 'a/rss-log' | grep '<guid'
150 $ get-with-headers.py localhost:$HGPORT 'a/rss-log' | grep '<guid'
151 <guid isPermaLink="true">http://*:$HGPORT/a/rev/8580ff50825a</guid> (glob)
151 <guid isPermaLink="true">http://*:$HGPORT/a/rev/8580ff50825a</guid> (glob)
152 $ cat > paths.conf <<EOF
152 $ cat > paths.conf <<EOF
153 > [paths]
153 > [paths]
154 > t/a/=$root/a
154 > t/a/=$root/a
155 > b=$root/b
155 > b=$root/b
156 > coll=$root/*
156 > coll=$root/*
157 > rcoll=$root/**
157 > rcoll=$root/**
158 > star=*
158 > star=*
159 > starstar=**
159 > starstar=**
160 > astar=webdir/a/*
160 > astar=webdir/a/*
161 > EOF
161 > EOF
162 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
162 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
163 > -A access-paths.log -E error-paths-2.log
163 > -A access-paths.log -E error-paths-2.log
164 $ cat hg.pid >> $DAEMON_PIDS
164 $ cat hg.pid >> $DAEMON_PIDS
165
165
166 should succeed, slashy names
166 should succeed, slashy names
167
167
168 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
168 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
169 200 Script output follows
169 200 Script output follows
170
170
171
171
172 /t/a/
172 /t/a/
173 /b/
173 /b/
174 /coll/a/
174 /coll/a/
175 /coll/a/.hg/patches/
175 /coll/a/.hg/patches/
176 /coll/b/
176 /coll/b/
177 /coll/c/
177 /coll/c/
178 /coll/notrepo/e/
178 /coll/notrepo/e/
179 /coll/notrepo/f/
179 /coll/notrepo/f/
180 /rcoll/a/
180 /rcoll/a/
181 /rcoll/a/.hg/patches/
181 /rcoll/a/.hg/patches/
182 /rcoll/b/
182 /rcoll/b/
183 /rcoll/b/d/
183 /rcoll/b/d/
184 /rcoll/c/
184 /rcoll/c/
185 /rcoll/notrepo/e/
185 /rcoll/notrepo/e/
186 /rcoll/notrepo/e/e2/
186 /rcoll/notrepo/e/e2/
187 /rcoll/notrepo/f/
187 /rcoll/notrepo/f/
188 /rcoll/notrepo/f/f2/
188 /rcoll/notrepo/f/f2/
189 /star/webdir/a/
189 /star/webdir/a/
190 /star/webdir/a/.hg/patches/
190 /star/webdir/a/.hg/patches/
191 /star/webdir/b/
191 /star/webdir/b/
192 /star/webdir/c/
192 /star/webdir/c/
193 /star/webdir/notrepo/e/
193 /star/webdir/notrepo/e/
194 /star/webdir/notrepo/f/
194 /star/webdir/notrepo/f/
195 /starstar/webdir/a/
195 /starstar/webdir/a/
196 /starstar/webdir/a/.hg/patches/
196 /starstar/webdir/a/.hg/patches/
197 /starstar/webdir/b/
197 /starstar/webdir/b/
198 /starstar/webdir/b/d/
198 /starstar/webdir/b/d/
199 /starstar/webdir/c/
199 /starstar/webdir/c/
200 /starstar/webdir/notrepo/e/
200 /starstar/webdir/notrepo/e/
201 /starstar/webdir/notrepo/e/e2/
201 /starstar/webdir/notrepo/e/e2/
202 /starstar/webdir/notrepo/f/
202 /starstar/webdir/notrepo/f/
203 /starstar/webdir/notrepo/f/f2/
203 /starstar/webdir/notrepo/f/f2/
204 /astar/
204 /astar/
205 /astar/.hg/patches/
205 /astar/.hg/patches/
206
206
207
207
208 $ get-with-headers.py localhost:$HGPORT1 '?style=json'
208 $ get-with-headers.py localhost:$HGPORT1 '?style=json'
209 200 Script output follows
209 200 Script output follows
210
210
211 {
211 {
212 "entries": [{
212 "entries": [{
213 "name": "t/a",
213 "name": "t/a",
214 "description": "unknown",
214 "description": "unknown",
215 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
215 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
216 "lastchange": [*, *], (glob)
216 "lastchange": [*, *], (glob)
217 "labels": []
217 "labels": []
218 }, {
218 }, {
219 "name": "b",
219 "name": "b",
220 "description": "unknown",
220 "description": "unknown",
221 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
221 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
222 "lastchange": [*, *], (glob)
222 "lastchange": [*, *], (glob)
223 "labels": []
223 "labels": []
224 }, {
224 }, {
225 "name": "coll/a",
225 "name": "coll/a",
226 "description": "unknown",
226 "description": "unknown",
227 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
227 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
228 "lastchange": [*, *], (glob)
228 "lastchange": [*, *], (glob)
229 "labels": []
229 "labels": []
230 }, {
230 }, {
231 "name": "coll/a/.hg/patches",
231 "name": "coll/a/.hg/patches",
232 "description": "unknown",
232 "description": "unknown",
233 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
233 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
234 "lastchange": [*, *], (glob)
234 "lastchange": [*, *], (glob)
235 "labels": []
235 "labels": []
236 }, {
236 }, {
237 "name": "coll/b",
237 "name": "coll/b",
238 "description": "unknown",
238 "description": "unknown",
239 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
239 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
240 "lastchange": [*, *], (glob)
240 "lastchange": [*, *], (glob)
241 "labels": []
241 "labels": []
242 }, {
242 }, {
243 "name": "coll/c",
243 "name": "coll/c",
244 "description": "unknown",
244 "description": "unknown",
245 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
245 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
246 "lastchange": [*, *], (glob)
246 "lastchange": [*, *], (glob)
247 "labels": []
247 "labels": []
248 }, {
248 }, {
249 "name": "coll/notrepo/e",
249 "name": "coll/notrepo/e",
250 "description": "unknown",
250 "description": "unknown",
251 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
251 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
252 "lastchange": [*, *], (glob)
252 "lastchange": [*, *], (glob)
253 "labels": []
253 "labels": []
254 }, {
254 }, {
255 "name": "fancy name for repo f",
255 "name": "fancy name for repo f",
256 "description": "unknown",
256 "description": "unknown",
257 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
257 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
258 "lastchange": [*, *], (glob)
258 "lastchange": [*, *], (glob)
259 "labels": ["foo", "bar"]
259 "labels": ["foo", "bar"]
260 }, {
260 }, {
261 "name": "rcoll/a",
261 "name": "rcoll/a",
262 "description": "unknown",
262 "description": "unknown",
263 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
263 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
264 "lastchange": [*, *], (glob)
264 "lastchange": [*, *], (glob)
265 "labels": []
265 "labels": []
266 }, {
266 }, {
267 "name": "rcoll/a/.hg/patches",
267 "name": "rcoll/a/.hg/patches",
268 "description": "unknown",
268 "description": "unknown",
269 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
269 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
270 "lastchange": [*, *], (glob)
270 "lastchange": [*, *], (glob)
271 "labels": []
271 "labels": []
272 }, {
272 }, {
273 "name": "rcoll/b",
273 "name": "rcoll/b",
274 "description": "unknown",
274 "description": "unknown",
275 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
275 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
276 "lastchange": [*, *], (glob)
276 "lastchange": [*, *], (glob)
277 "labels": []
277 "labels": []
278 }, {
278 }, {
279 "name": "rcoll/b/d",
279 "name": "rcoll/b/d",
280 "description": "unknown",
280 "description": "unknown",
281 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
281 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
282 "lastchange": [*, *], (glob)
282 "lastchange": [*, *], (glob)
283 "labels": []
283 "labels": []
284 }, {
284 }, {
285 "name": "rcoll/c",
285 "name": "rcoll/c",
286 "description": "unknown",
286 "description": "unknown",
287 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
287 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
288 "lastchange": [*, *], (glob)
288 "lastchange": [*, *], (glob)
289 "labels": []
289 "labels": []
290 }, {
290 }, {
291 "name": "rcoll/notrepo/e",
291 "name": "rcoll/notrepo/e",
292 "description": "unknown",
292 "description": "unknown",
293 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
293 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
294 "lastchange": [*, *], (glob)
294 "lastchange": [*, *], (glob)
295 "labels": []
295 "labels": []
296 }, {
296 }, {
297 "name": "rcoll/notrepo/e/e2",
297 "name": "rcoll/notrepo/e/e2",
298 "description": "unknown",
298 "description": "unknown",
299 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
299 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
300 "lastchange": [*, *], (glob)
300 "lastchange": [*, *], (glob)
301 "labels": []
301 "labels": []
302 }, {
302 }, {
303 "name": "fancy name for repo f",
303 "name": "fancy name for repo f",
304 "description": "unknown",
304 "description": "unknown",
305 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
305 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
306 "lastchange": [*, *], (glob)
306 "lastchange": [*, *], (glob)
307 "labels": ["foo", "bar"]
307 "labels": ["foo", "bar"]
308 }, {
308 }, {
309 "name": "rcoll/notrepo/f/f2",
309 "name": "rcoll/notrepo/f/f2",
310 "description": "unknown",
310 "description": "unknown",
311 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
311 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
312 "lastchange": [*, *], (glob)
312 "lastchange": [*, *], (glob)
313 "labels": []
313 "labels": []
314 }, {
314 }, {
315 "name": "star/webdir/a",
315 "name": "star/webdir/a",
316 "description": "unknown",
316 "description": "unknown",
317 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
317 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
318 "lastchange": [*, *], (glob)
318 "lastchange": [*, *], (glob)
319 "labels": []
319 "labels": []
320 }, {
320 }, {
321 "name": "star/webdir/a/.hg/patches",
321 "name": "star/webdir/a/.hg/patches",
322 "description": "unknown",
322 "description": "unknown",
323 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
323 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
324 "lastchange": [*, *], (glob)
324 "lastchange": [*, *], (glob)
325 "labels": []
325 "labels": []
326 }, {
326 }, {
327 "name": "star/webdir/b",
327 "name": "star/webdir/b",
328 "description": "unknown",
328 "description": "unknown",
329 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
329 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
330 "lastchange": [*, *], (glob)
330 "lastchange": [*, *], (glob)
331 "labels": []
331 "labels": []
332 }, {
332 }, {
333 "name": "star/webdir/c",
333 "name": "star/webdir/c",
334 "description": "unknown",
334 "description": "unknown",
335 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
335 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
336 "lastchange": [*, *], (glob)
336 "lastchange": [*, *], (glob)
337 "labels": []
337 "labels": []
338 }, {
338 }, {
339 "name": "star/webdir/notrepo/e",
339 "name": "star/webdir/notrepo/e",
340 "description": "unknown",
340 "description": "unknown",
341 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
341 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
342 "lastchange": [*, *], (glob)
342 "lastchange": [*, *], (glob)
343 "labels": []
343 "labels": []
344 }, {
344 }, {
345 "name": "fancy name for repo f",
345 "name": "fancy name for repo f",
346 "description": "unknown",
346 "description": "unknown",
347 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
347 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
348 "lastchange": [*, *], (glob)
348 "lastchange": [*, *], (glob)
349 "labels": ["foo", "bar"]
349 "labels": ["foo", "bar"]
350 }, {
350 }, {
351 "name": "starstar/webdir/a",
351 "name": "starstar/webdir/a",
352 "description": "unknown",
352 "description": "unknown",
353 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
353 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
354 "lastchange": [*, *], (glob)
354 "lastchange": [*, *], (glob)
355 "labels": []
355 "labels": []
356 }, {
356 }, {
357 "name": "starstar/webdir/a/.hg/patches",
357 "name": "starstar/webdir/a/.hg/patches",
358 "description": "unknown",
358 "description": "unknown",
359 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
359 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
360 "lastchange": [*, *], (glob)
360 "lastchange": [*, *], (glob)
361 "labels": []
361 "labels": []
362 }, {
362 }, {
363 "name": "starstar/webdir/b",
363 "name": "starstar/webdir/b",
364 "description": "unknown",
364 "description": "unknown",
365 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
365 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
366 "lastchange": [*, *], (glob)
366 "lastchange": [*, *], (glob)
367 "labels": []
367 "labels": []
368 }, {
368 }, {
369 "name": "starstar/webdir/b/d",
369 "name": "starstar/webdir/b/d",
370 "description": "unknown",
370 "description": "unknown",
371 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
371 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
372 "lastchange": [*, *], (glob)
372 "lastchange": [*, *], (glob)
373 "labels": []
373 "labels": []
374 }, {
374 }, {
375 "name": "starstar/webdir/c",
375 "name": "starstar/webdir/c",
376 "description": "unknown",
376 "description": "unknown",
377 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
377 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
378 "lastchange": [*, *], (glob)
378 "lastchange": [*, *], (glob)
379 "labels": []
379 "labels": []
380 }, {
380 }, {
381 "name": "starstar/webdir/notrepo/e",
381 "name": "starstar/webdir/notrepo/e",
382 "description": "unknown",
382 "description": "unknown",
383 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
383 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
384 "lastchange": [*, *], (glob)
384 "lastchange": [*, *], (glob)
385 "labels": []
385 "labels": []
386 }, {
386 }, {
387 "name": "starstar/webdir/notrepo/e/e2",
387 "name": "starstar/webdir/notrepo/e/e2",
388 "description": "unknown",
388 "description": "unknown",
389 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
389 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
390 "lastchange": [*, *], (glob)
390 "lastchange": [*, *], (glob)
391 "labels": []
391 "labels": []
392 }, {
392 }, {
393 "name": "fancy name for repo f",
393 "name": "fancy name for repo f",
394 "description": "unknown",
394 "description": "unknown",
395 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
395 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
396 "lastchange": [*, *], (glob)
396 "lastchange": [*, *], (glob)
397 "labels": ["foo", "bar"]
397 "labels": ["foo", "bar"]
398 }, {
398 }, {
399 "name": "starstar/webdir/notrepo/f/f2",
399 "name": "starstar/webdir/notrepo/f/f2",
400 "description": "unknown",
400 "description": "unknown",
401 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
401 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
402 "lastchange": [*, *], (glob)
402 "lastchange": [*, *], (glob)
403 "labels": []
403 "labels": []
404 }, {
404 }, {
405 "name": "astar",
405 "name": "astar",
406 "description": "unknown",
406 "description": "unknown",
407 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
407 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
408 "lastchange": [*, *], (glob)
408 "lastchange": [*, *], (glob)
409 "labels": []
409 "labels": []
410 }, {
410 }, {
411 "name": "astar/.hg/patches",
411 "name": "astar/.hg/patches",
412 "description": "unknown",
412 "description": "unknown",
413 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
413 "contact": "Foo Bar \u003cfoo.bar@example.com\u003e",
414 "lastchange": [*, *], (glob)
414 "lastchange": [*, *], (glob)
415 "labels": []
415 "labels": []
416 }]
416 }]
417 } (no-eol)
417 } (no-eol)
418
418
419 $ get-with-headers.py localhost:$HGPORT1 '?style=paper'
419 $ get-with-headers.py localhost:$HGPORT1 '?style=paper'
420 200 Script output follows
420 200 Script output follows
421
421
422 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
422 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
423 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
423 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
424 <head>
424 <head>
425 <link rel="icon" href="/static/hgicon.png" type="image/png" />
425 <link rel="icon" href="/static/hgicon.png" type="image/png" />
426 <meta name="robots" content="index, nofollow" />
426 <meta name="robots" content="index, nofollow" />
427 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
427 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
428 <script type="text/javascript" src="/static/mercurial.js"></script>
428 <script type="text/javascript" src="/static/mercurial.js"></script>
429
429
430 <title>Mercurial repositories index</title>
430 <title>Mercurial repositories index</title>
431 </head>
431 </head>
432 <body>
432 <body>
433
433
434 <div class="container">
434 <div class="container">
435 <div class="menu">
435 <div class="menu">
436 <a href="https://mercurial-scm.org/">
436 <a href="https://mercurial-scm.org/">
437 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
437 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
438 </div>
438 </div>
439 <div class="main">
439 <div class="main">
440 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
440 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
441
441
442 <table class="bigtable">
442 <table class="bigtable">
443 <thead>
443 <thead>
444 <tr>
444 <tr>
445 <th><a href="?sort=name">Name</a></th>
445 <th><a href="?sort=name">Name</a></th>
446 <th><a href="?sort=description">Description</a></th>
446 <th><a href="?sort=description">Description</a></th>
447 <th><a href="?sort=contact">Contact</a></th>
447 <th><a href="?sort=contact">Contact</a></th>
448 <th><a href="?sort=lastchange">Last modified</a></th>
448 <th><a href="?sort=lastchange">Last modified</a></th>
449 <th>&nbsp;</th>
449 <th>&nbsp;</th>
450 <th>&nbsp;</th>
450 <th>&nbsp;</th>
451 </tr>
451 </tr>
452 </thead>
452 </thead>
453 <tbody class="stripes2">
453 <tbody class="stripes2">
454
454
455 <tr>
455 <tr>
456 <td><a href="/t/a/?style=paper">t/a</a></td>
456 <td><a href="/t/a/?style=paper">t/a</a></td>
457 <td>unknown</td>
457 <td>unknown</td>
458 <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>
458 <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>
459 <td class="age">*</td> (glob)
459 <td class="age">*</td> (glob)
460 <td class="indexlinks"></td>
460 <td class="indexlinks"></td>
461 <td>
461 <td>
462 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
462 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
463 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
463 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
464 </a>
464 </a>
465 </td>
465 </td>
466 </tr>
466 </tr>
467
467
468 <tr>
468 <tr>
469 <td><a href="/b/?style=paper">b</a></td>
469 <td><a href="/b/?style=paper">b</a></td>
470 <td>unknown</td>
470 <td>unknown</td>
471 <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>
471 <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>
472 <td class="age">*</td> (glob)
472 <td class="age">*</td> (glob)
473 <td class="indexlinks"></td>
473 <td class="indexlinks"></td>
474 <td>
474 <td>
475 <a href="/b/atom-log" title="subscribe to repository atom feed">
475 <a href="/b/atom-log" title="subscribe to repository atom feed">
476 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
476 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
477 </a>
477 </a>
478 </td>
478 </td>
479 </tr>
479 </tr>
480
480
481 <tr>
481 <tr>
482 <td><a href="/coll/a/?style=paper">coll/a</a></td>
482 <td><a href="/coll/a/?style=paper">coll/a</a></td>
483 <td>unknown</td>
483 <td>unknown</td>
484 <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>
484 <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>
485 <td class="age">*</td> (glob)
485 <td class="age">*</td> (glob)
486 <td class="indexlinks"></td>
486 <td class="indexlinks"></td>
487 <td>
487 <td>
488 <a href="/coll/a/atom-log" title="subscribe to repository atom feed">
488 <a href="/coll/a/atom-log" title="subscribe to repository atom feed">
489 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
489 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
490 </a>
490 </a>
491 </td>
491 </td>
492 </tr>
492 </tr>
493
493
494 <tr>
494 <tr>
495 <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
495 <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
496 <td>unknown</td>
496 <td>unknown</td>
497 <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>
497 <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>
498 <td class="age">*</td> (glob)
498 <td class="age">*</td> (glob)
499 <td class="indexlinks"></td>
499 <td class="indexlinks"></td>
500 <td>
500 <td>
501 <a href="/coll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
501 <a href="/coll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
502 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
502 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
503 </a>
503 </a>
504 </td>
504 </td>
505 </tr>
505 </tr>
506
506
507 <tr>
507 <tr>
508 <td><a href="/coll/b/?style=paper">coll/b</a></td>
508 <td><a href="/coll/b/?style=paper">coll/b</a></td>
509 <td>unknown</td>
509 <td>unknown</td>
510 <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>
510 <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>
511 <td class="age">*</td> (glob)
511 <td class="age">*</td> (glob)
512 <td class="indexlinks"></td>
512 <td class="indexlinks"></td>
513 <td>
513 <td>
514 <a href="/coll/b/atom-log" title="subscribe to repository atom feed">
514 <a href="/coll/b/atom-log" title="subscribe to repository atom feed">
515 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
515 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
516 </a>
516 </a>
517 </td>
517 </td>
518 </tr>
518 </tr>
519
519
520 <tr>
520 <tr>
521 <td><a href="/coll/c/?style=paper">coll/c</a></td>
521 <td><a href="/coll/c/?style=paper">coll/c</a></td>
522 <td>unknown</td>
522 <td>unknown</td>
523 <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>
523 <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>
524 <td class="age">*</td> (glob)
524 <td class="age">*</td> (glob)
525 <td class="indexlinks"></td>
525 <td class="indexlinks"></td>
526 <td>
526 <td>
527 <a href="/coll/c/atom-log" title="subscribe to repository atom feed">
527 <a href="/coll/c/atom-log" title="subscribe to repository atom feed">
528 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
528 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
529 </a>
529 </a>
530 </td>
530 </td>
531 </tr>
531 </tr>
532
532
533 <tr>
533 <tr>
534 <td><a href="/coll/notrepo/e/?style=paper">coll/notrepo/e</a></td>
534 <td><a href="/coll/notrepo/e/?style=paper">coll/notrepo/e</a></td>
535 <td>unknown</td>
535 <td>unknown</td>
536 <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>
536 <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>
537 <td class="age">*</td> (glob)
537 <td class="age">*</td> (glob)
538 <td class="indexlinks"></td>
538 <td class="indexlinks"></td>
539 <td>
539 <td>
540 <a href="/coll/notrepo/e/atom-log" title="subscribe to repository atom feed">
540 <a href="/coll/notrepo/e/atom-log" title="subscribe to repository atom feed">
541 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
541 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
542 </a>
542 </a>
543 </td>
543 </td>
544 </tr>
544 </tr>
545
545
546 <tr>
546 <tr>
547 <td><a href="/coll/notrepo/f/?style=paper">fancy name for repo f</a></td>
547 <td><a href="/coll/notrepo/f/?style=paper">fancy name for repo f</a></td>
548 <td>unknown</td>
548 <td>unknown</td>
549 <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>
549 <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>
550 <td class="age">*</td> (glob)
550 <td class="age">*</td> (glob)
551 <td class="indexlinks"></td>
551 <td class="indexlinks"></td>
552 <td>
552 <td>
553 <a href="/coll/notrepo/f/atom-log" title="subscribe to repository atom feed">
553 <a href="/coll/notrepo/f/atom-log" title="subscribe to repository atom feed">
554 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
554 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
555 </a>
555 </a>
556 </td>
556 </td>
557 </tr>
557 </tr>
558
558
559 <tr>
559 <tr>
560 <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
560 <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
561 <td>unknown</td>
561 <td>unknown</td>
562 <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>
562 <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>
563 <td class="age">*</td> (glob)
563 <td class="age">*</td> (glob)
564 <td class="indexlinks"></td>
564 <td class="indexlinks"></td>
565 <td>
565 <td>
566 <a href="/rcoll/a/atom-log" title="subscribe to repository atom feed">
566 <a href="/rcoll/a/atom-log" title="subscribe to repository atom feed">
567 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
567 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
568 </a>
568 </a>
569 </td>
569 </td>
570 </tr>
570 </tr>
571
571
572 <tr>
572 <tr>
573 <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
573 <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
574 <td>unknown</td>
574 <td>unknown</td>
575 <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>
575 <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>
576 <td class="age">*</td> (glob)
576 <td class="age">*</td> (glob)
577 <td class="indexlinks"></td>
577 <td class="indexlinks"></td>
578 <td>
578 <td>
579 <a href="/rcoll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
579 <a href="/rcoll/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
580 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
580 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
581 </a>
581 </a>
582 </td>
582 </td>
583 </tr>
583 </tr>
584
584
585 <tr>
585 <tr>
586 <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
586 <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
587 <td>unknown</td>
587 <td>unknown</td>
588 <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>
588 <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>
589 <td class="age">*</td> (glob)
589 <td class="age">*</td> (glob)
590 <td class="indexlinks"></td>
590 <td class="indexlinks"></td>
591 <td>
591 <td>
592 <a href="/rcoll/b/atom-log" title="subscribe to repository atom feed">
592 <a href="/rcoll/b/atom-log" title="subscribe to repository atom feed">
593 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
593 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
594 </a>
594 </a>
595 </td>
595 </td>
596 </tr>
596 </tr>
597
597
598 <tr>
598 <tr>
599 <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
599 <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
600 <td>unknown</td>
600 <td>unknown</td>
601 <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>
601 <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>
602 <td class="age">*</td> (glob)
602 <td class="age">*</td> (glob)
603 <td class="indexlinks"></td>
603 <td class="indexlinks"></td>
604 <td>
604 <td>
605 <a href="/rcoll/b/d/atom-log" title="subscribe to repository atom feed">
605 <a href="/rcoll/b/d/atom-log" title="subscribe to repository atom feed">
606 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
606 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
607 </a>
607 </a>
608 </td>
608 </td>
609 </tr>
609 </tr>
610
610
611 <tr>
611 <tr>
612 <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
612 <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
613 <td>unknown</td>
613 <td>unknown</td>
614 <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>
614 <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>
615 <td class="age">*</td> (glob)
615 <td class="age">*</td> (glob)
616 <td class="indexlinks"></td>
616 <td class="indexlinks"></td>
617 <td>
617 <td>
618 <a href="/rcoll/c/atom-log" title="subscribe to repository atom feed">
618 <a href="/rcoll/c/atom-log" title="subscribe to repository atom feed">
619 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
619 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
620 </a>
620 </a>
621 </td>
621 </td>
622 </tr>
622 </tr>
623
623
624 <tr>
624 <tr>
625 <td><a href="/rcoll/notrepo/e/?style=paper">rcoll/notrepo/e</a></td>
625 <td><a href="/rcoll/notrepo/e/?style=paper">rcoll/notrepo/e</a></td>
626 <td>unknown</td>
626 <td>unknown</td>
627 <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>
627 <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>
628 <td class="age">*</td> (glob)
628 <td class="age">*</td> (glob)
629 <td class="indexlinks"></td>
629 <td class="indexlinks"></td>
630 <td>
630 <td>
631 <a href="/rcoll/notrepo/e/atom-log" title="subscribe to repository atom feed">
631 <a href="/rcoll/notrepo/e/atom-log" title="subscribe to repository atom feed">
632 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
632 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
633 </a>
633 </a>
634 </td>
634 </td>
635 </tr>
635 </tr>
636
636
637 <tr>
637 <tr>
638 <td><a href="/rcoll/notrepo/e/e2/?style=paper">rcoll/notrepo/e/e2</a></td>
638 <td><a href="/rcoll/notrepo/e/e2/?style=paper">rcoll/notrepo/e/e2</a></td>
639 <td>unknown</td>
639 <td>unknown</td>
640 <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>
640 <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>
641 <td class="age">*</td> (glob)
641 <td class="age">*</td> (glob)
642 <td class="indexlinks"></td>
642 <td class="indexlinks"></td>
643 <td>
643 <td>
644 <a href="/rcoll/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
644 <a href="/rcoll/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
645 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
645 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
646 </a>
646 </a>
647 </td>
647 </td>
648 </tr>
648 </tr>
649
649
650 <tr>
650 <tr>
651 <td><a href="/rcoll/notrepo/f/?style=paper">fancy name for repo f</a></td>
651 <td><a href="/rcoll/notrepo/f/?style=paper">fancy name for repo f</a></td>
652 <td>unknown</td>
652 <td>unknown</td>
653 <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>
653 <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>
654 <td class="age">*</td> (glob)
654 <td class="age">*</td> (glob)
655 <td class="indexlinks"></td>
655 <td class="indexlinks"></td>
656 <td>
656 <td>
657 <a href="/rcoll/notrepo/f/atom-log" title="subscribe to repository atom feed">
657 <a href="/rcoll/notrepo/f/atom-log" title="subscribe to repository atom feed">
658 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
658 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
659 </a>
659 </a>
660 </td>
660 </td>
661 </tr>
661 </tr>
662
662
663 <tr>
663 <tr>
664 <td><a href="/rcoll/notrepo/f/f2/?style=paper">rcoll/notrepo/f/f2</a></td>
664 <td><a href="/rcoll/notrepo/f/f2/?style=paper">rcoll/notrepo/f/f2</a></td>
665 <td>unknown</td>
665 <td>unknown</td>
666 <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>
666 <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>
667 <td class="age">*</td> (glob)
667 <td class="age">*</td> (glob)
668 <td class="indexlinks"></td>
668 <td class="indexlinks"></td>
669 <td>
669 <td>
670 <a href="/rcoll/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
670 <a href="/rcoll/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
671 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
671 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
672 </a>
672 </a>
673 </td>
673 </td>
674 </tr>
674 </tr>
675
675
676 <tr>
676 <tr>
677 <td><a href="/star/webdir/a/?style=paper">star/webdir/a</a></td>
677 <td><a href="/star/webdir/a/?style=paper">star/webdir/a</a></td>
678 <td>unknown</td>
678 <td>unknown</td>
679 <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>
679 <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>
680 <td class="age">*</td> (glob)
680 <td class="age">*</td> (glob)
681 <td class="indexlinks"></td>
681 <td class="indexlinks"></td>
682 <td>
682 <td>
683 <a href="/star/webdir/a/atom-log" title="subscribe to repository atom feed">
683 <a href="/star/webdir/a/atom-log" title="subscribe to repository atom feed">
684 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
684 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
685 </a>
685 </a>
686 </td>
686 </td>
687 </tr>
687 </tr>
688
688
689 <tr>
689 <tr>
690 <td><a href="/star/webdir/a/.hg/patches/?style=paper">star/webdir/a/.hg/patches</a></td>
690 <td><a href="/star/webdir/a/.hg/patches/?style=paper">star/webdir/a/.hg/patches</a></td>
691 <td>unknown</td>
691 <td>unknown</td>
692 <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>
692 <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>
693 <td class="age">*</td> (glob)
693 <td class="age">*</td> (glob)
694 <td class="indexlinks"></td>
694 <td class="indexlinks"></td>
695 <td>
695 <td>
696 <a href="/star/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
696 <a href="/star/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
697 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
697 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
698 </a>
698 </a>
699 </td>
699 </td>
700 </tr>
700 </tr>
701
701
702 <tr>
702 <tr>
703 <td><a href="/star/webdir/b/?style=paper">star/webdir/b</a></td>
703 <td><a href="/star/webdir/b/?style=paper">star/webdir/b</a></td>
704 <td>unknown</td>
704 <td>unknown</td>
705 <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>
705 <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>
706 <td class="age">*</td> (glob)
706 <td class="age">*</td> (glob)
707 <td class="indexlinks"></td>
707 <td class="indexlinks"></td>
708 <td>
708 <td>
709 <a href="/star/webdir/b/atom-log" title="subscribe to repository atom feed">
709 <a href="/star/webdir/b/atom-log" title="subscribe to repository atom feed">
710 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
710 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
711 </a>
711 </a>
712 </td>
712 </td>
713 </tr>
713 </tr>
714
714
715 <tr>
715 <tr>
716 <td><a href="/star/webdir/c/?style=paper">star/webdir/c</a></td>
716 <td><a href="/star/webdir/c/?style=paper">star/webdir/c</a></td>
717 <td>unknown</td>
717 <td>unknown</td>
718 <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>
718 <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>
719 <td class="age">*</td> (glob)
719 <td class="age">*</td> (glob)
720 <td class="indexlinks"></td>
720 <td class="indexlinks"></td>
721 <td>
721 <td>
722 <a href="/star/webdir/c/atom-log" title="subscribe to repository atom feed">
722 <a href="/star/webdir/c/atom-log" title="subscribe to repository atom feed">
723 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
723 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
724 </a>
724 </a>
725 </td>
725 </td>
726 </tr>
726 </tr>
727
727
728 <tr>
728 <tr>
729 <td><a href="/star/webdir/notrepo/e/?style=paper">star/webdir/notrepo/e</a></td>
729 <td><a href="/star/webdir/notrepo/e/?style=paper">star/webdir/notrepo/e</a></td>
730 <td>unknown</td>
730 <td>unknown</td>
731 <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>
731 <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>
732 <td class="age">*</td> (glob)
732 <td class="age">*</td> (glob)
733 <td class="indexlinks"></td>
733 <td class="indexlinks"></td>
734 <td>
734 <td>
735 <a href="/star/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
735 <a href="/star/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
736 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
736 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
737 </a>
737 </a>
738 </td>
738 </td>
739 </tr>
739 </tr>
740
740
741 <tr>
741 <tr>
742 <td><a href="/star/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
742 <td><a href="/star/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
743 <td>unknown</td>
743 <td>unknown</td>
744 <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>
744 <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>
745 <td class="age">*</td> (glob)
745 <td class="age">*</td> (glob)
746 <td class="indexlinks"></td>
746 <td class="indexlinks"></td>
747 <td>
747 <td>
748 <a href="/star/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
748 <a href="/star/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
749 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
749 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
750 </a>
750 </a>
751 </td>
751 </td>
752 </tr>
752 </tr>
753
753
754 <tr>
754 <tr>
755 <td><a href="/starstar/webdir/a/?style=paper">starstar/webdir/a</a></td>
755 <td><a href="/starstar/webdir/a/?style=paper">starstar/webdir/a</a></td>
756 <td>unknown</td>
756 <td>unknown</td>
757 <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>
757 <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>
758 <td class="age">*</td> (glob)
758 <td class="age">*</td> (glob)
759 <td class="indexlinks"></td>
759 <td class="indexlinks"></td>
760 <td>
760 <td>
761 <a href="/starstar/webdir/a/atom-log" title="subscribe to repository atom feed">
761 <a href="/starstar/webdir/a/atom-log" title="subscribe to repository atom feed">
762 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
762 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
763 </a>
763 </a>
764 </td>
764 </td>
765 </tr>
765 </tr>
766
766
767 <tr>
767 <tr>
768 <td><a href="/starstar/webdir/a/.hg/patches/?style=paper">starstar/webdir/a/.hg/patches</a></td>
768 <td><a href="/starstar/webdir/a/.hg/patches/?style=paper">starstar/webdir/a/.hg/patches</a></td>
769 <td>unknown</td>
769 <td>unknown</td>
770 <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>
770 <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>
771 <td class="age">*</td> (glob)
771 <td class="age">*</td> (glob)
772 <td class="indexlinks"></td>
772 <td class="indexlinks"></td>
773 <td>
773 <td>
774 <a href="/starstar/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
774 <a href="/starstar/webdir/a/.hg/patches/atom-log" title="subscribe to repository atom feed">
775 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
775 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
776 </a>
776 </a>
777 </td>
777 </td>
778 </tr>
778 </tr>
779
779
780 <tr>
780 <tr>
781 <td><a href="/starstar/webdir/b/?style=paper">starstar/webdir/b</a></td>
781 <td><a href="/starstar/webdir/b/?style=paper">starstar/webdir/b</a></td>
782 <td>unknown</td>
782 <td>unknown</td>
783 <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>
783 <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>
784 <td class="age">*</td> (glob)
784 <td class="age">*</td> (glob)
785 <td class="indexlinks"></td>
785 <td class="indexlinks"></td>
786 <td>
786 <td>
787 <a href="/starstar/webdir/b/atom-log" title="subscribe to repository atom feed">
787 <a href="/starstar/webdir/b/atom-log" title="subscribe to repository atom feed">
788 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
788 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
789 </a>
789 </a>
790 </td>
790 </td>
791 </tr>
791 </tr>
792
792
793 <tr>
793 <tr>
794 <td><a href="/starstar/webdir/b/d/?style=paper">starstar/webdir/b/d</a></td>
794 <td><a href="/starstar/webdir/b/d/?style=paper">starstar/webdir/b/d</a></td>
795 <td>unknown</td>
795 <td>unknown</td>
796 <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>
796 <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>
797 <td class="age">*</td> (glob)
797 <td class="age">*</td> (glob)
798 <td class="indexlinks"></td>
798 <td class="indexlinks"></td>
799 <td>
799 <td>
800 <a href="/starstar/webdir/b/d/atom-log" title="subscribe to repository atom feed">
800 <a href="/starstar/webdir/b/d/atom-log" title="subscribe to repository atom feed">
801 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
801 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
802 </a>
802 </a>
803 </td>
803 </td>
804 </tr>
804 </tr>
805
805
806 <tr>
806 <tr>
807 <td><a href="/starstar/webdir/c/?style=paper">starstar/webdir/c</a></td>
807 <td><a href="/starstar/webdir/c/?style=paper">starstar/webdir/c</a></td>
808 <td>unknown</td>
808 <td>unknown</td>
809 <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>
809 <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>
810 <td class="age">*</td> (glob)
810 <td class="age">*</td> (glob)
811 <td class="indexlinks"></td>
811 <td class="indexlinks"></td>
812 <td>
812 <td>
813 <a href="/starstar/webdir/c/atom-log" title="subscribe to repository atom feed">
813 <a href="/starstar/webdir/c/atom-log" title="subscribe to repository atom feed">
814 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
814 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
815 </a>
815 </a>
816 </td>
816 </td>
817 </tr>
817 </tr>
818
818
819 <tr>
819 <tr>
820 <td><a href="/starstar/webdir/notrepo/e/?style=paper">starstar/webdir/notrepo/e</a></td>
820 <td><a href="/starstar/webdir/notrepo/e/?style=paper">starstar/webdir/notrepo/e</a></td>
821 <td>unknown</td>
821 <td>unknown</td>
822 <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>
822 <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>
823 <td class="age">*</td> (glob)
823 <td class="age">*</td> (glob)
824 <td class="indexlinks"></td>
824 <td class="indexlinks"></td>
825 <td>
825 <td>
826 <a href="/starstar/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
826 <a href="/starstar/webdir/notrepo/e/atom-log" title="subscribe to repository atom feed">
827 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
827 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
828 </a>
828 </a>
829 </td>
829 </td>
830 </tr>
830 </tr>
831
831
832 <tr>
832 <tr>
833 <td><a href="/starstar/webdir/notrepo/e/e2/?style=paper">starstar/webdir/notrepo/e/e2</a></td>
833 <td><a href="/starstar/webdir/notrepo/e/e2/?style=paper">starstar/webdir/notrepo/e/e2</a></td>
834 <td>unknown</td>
834 <td>unknown</td>
835 <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>
835 <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>
836 <td class="age">*</td> (glob)
836 <td class="age">*</td> (glob)
837 <td class="indexlinks"></td>
837 <td class="indexlinks"></td>
838 <td>
838 <td>
839 <a href="/starstar/webdir/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
839 <a href="/starstar/webdir/notrepo/e/e2/atom-log" title="subscribe to repository atom feed">
840 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
840 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
841 </a>
841 </a>
842 </td>
842 </td>
843 </tr>
843 </tr>
844
844
845 <tr>
845 <tr>
846 <td><a href="/starstar/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
846 <td><a href="/starstar/webdir/notrepo/f/?style=paper">fancy name for repo f</a></td>
847 <td>unknown</td>
847 <td>unknown</td>
848 <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>
848 <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>
849 <td class="age">*</td> (glob)
849 <td class="age">*</td> (glob)
850 <td class="indexlinks"></td>
850 <td class="indexlinks"></td>
851 <td>
851 <td>
852 <a href="/starstar/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
852 <a href="/starstar/webdir/notrepo/f/atom-log" title="subscribe to repository atom feed">
853 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
853 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
854 </a>
854 </a>
855 </td>
855 </td>
856 </tr>
856 </tr>
857
857
858 <tr>
858 <tr>
859 <td><a href="/starstar/webdir/notrepo/f/f2/?style=paper">starstar/webdir/notrepo/f/f2</a></td>
859 <td><a href="/starstar/webdir/notrepo/f/f2/?style=paper">starstar/webdir/notrepo/f/f2</a></td>
860 <td>unknown</td>
860 <td>unknown</td>
861 <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>
861 <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>
862 <td class="age">*</td> (glob)
862 <td class="age">*</td> (glob)
863 <td class="indexlinks"></td>
863 <td class="indexlinks"></td>
864 <td>
864 <td>
865 <a href="/starstar/webdir/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
865 <a href="/starstar/webdir/notrepo/f/f2/atom-log" title="subscribe to repository atom feed">
866 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
866 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
867 </a>
867 </a>
868 </td>
868 </td>
869 </tr>
869 </tr>
870
870
871 <tr>
871 <tr>
872 <td><a href="/astar/?style=paper">astar</a></td>
872 <td><a href="/astar/?style=paper">astar</a></td>
873 <td>unknown</td>
873 <td>unknown</td>
874 <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>
874 <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>
875 <td class="age">*</td> (glob)
875 <td class="age">*</td> (glob)
876 <td class="indexlinks"></td>
876 <td class="indexlinks"></td>
877 <td>
877 <td>
878 <a href="/astar/atom-log" title="subscribe to repository atom feed">
878 <a href="/astar/atom-log" title="subscribe to repository atom feed">
879 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
879 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
880 </a>
880 </a>
881 </td>
881 </td>
882 </tr>
882 </tr>
883
883
884 <tr>
884 <tr>
885 <td><a href="/astar/.hg/patches/?style=paper">astar/.hg/patches</a></td>
885 <td><a href="/astar/.hg/patches/?style=paper">astar/.hg/patches</a></td>
886 <td>unknown</td>
886 <td>unknown</td>
887 <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>
887 <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>
888 <td class="age">*</td> (glob)
888 <td class="age">*</td> (glob)
889 <td class="indexlinks"></td>
889 <td class="indexlinks"></td>
890 <td>
890 <td>
891 <a href="/astar/.hg/patches/atom-log" title="subscribe to repository atom feed">
891 <a href="/astar/.hg/patches/atom-log" title="subscribe to repository atom feed">
892 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
892 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
893 </a>
893 </a>
894 </td>
894 </td>
895 </tr>
895 </tr>
896
896
897 </tbody>
897 </tbody>
898 </table>
898 </table>
899 </div>
899 </div>
900 </div>
900 </div>
901
901
902
902
903 </body>
903 </body>
904 </html>
904 </html>
905
905
906 $ get-with-headers.py localhost:$HGPORT1 't?style=raw'
906 $ get-with-headers.py localhost:$HGPORT1 't?style=raw'
907 200 Script output follows
907 200 Script output follows
908
908
909
909
910 /t/a/
910 /t/a/
911
911
912 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
912 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
913 200 Script output follows
913 200 Script output follows
914
914
915
915
916 /t/a/
916 /t/a/
917
917
918 $ get-with-headers.py localhost:$HGPORT1 't/?style=paper'
918 $ get-with-headers.py localhost:$HGPORT1 't/?style=paper'
919 200 Script output follows
919 200 Script output follows
920
920
921 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
921 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
922 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
922 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
923 <head>
923 <head>
924 <link rel="icon" href="/static/hgicon.png" type="image/png" />
924 <link rel="icon" href="/static/hgicon.png" type="image/png" />
925 <meta name="robots" content="index, nofollow" />
925 <meta name="robots" content="index, nofollow" />
926 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
926 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
927 <script type="text/javascript" src="/static/mercurial.js"></script>
927 <script type="text/javascript" src="/static/mercurial.js"></script>
928
928
929 <title>Mercurial repositories index</title>
929 <title>Mercurial repositories index</title>
930 </head>
930 </head>
931 <body>
931 <body>
932
932
933 <div class="container">
933 <div class="container">
934 <div class="menu">
934 <div class="menu">
935 <a href="https://mercurial-scm.org/">
935 <a href="https://mercurial-scm.org/">
936 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
936 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
937 </div>
937 </div>
938 <div class="main">
938 <div class="main">
939 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/t">t</a> </h2>
939 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/t">t</a> </h2>
940
940
941 <table class="bigtable">
941 <table class="bigtable">
942 <thead>
942 <thead>
943 <tr>
943 <tr>
944 <th><a href="?sort=name">Name</a></th>
944 <th><a href="?sort=name">Name</a></th>
945 <th><a href="?sort=description">Description</a></th>
945 <th><a href="?sort=description">Description</a></th>
946 <th><a href="?sort=contact">Contact</a></th>
946 <th><a href="?sort=contact">Contact</a></th>
947 <th><a href="?sort=lastchange">Last modified</a></th>
947 <th><a href="?sort=lastchange">Last modified</a></th>
948 <th>&nbsp;</th>
948 <th>&nbsp;</th>
949 <th>&nbsp;</th>
949 <th>&nbsp;</th>
950 </tr>
950 </tr>
951 </thead>
951 </thead>
952 <tbody class="stripes2">
952 <tbody class="stripes2">
953
953
954 <tr>
954 <tr>
955 <td><a href="/t/a/?style=paper">a</a></td>
955 <td><a href="/t/a/?style=paper">a</a></td>
956 <td>unknown</td>
956 <td>unknown</td>
957 <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>
957 <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>
958 <td class="age">*</td> (glob)
958 <td class="age">*</td> (glob)
959 <td class="indexlinks"></td>
959 <td class="indexlinks"></td>
960 <td>
960 <td>
961 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
961 <a href="/t/a/atom-log" title="subscribe to repository atom feed">
962 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
962 <img class="atom-logo" src="/static/feed-icon-14x14.png" alt="subscribe to repository atom feed">
963 </a>
963 </a>
964 </td>
964 </td>
965 </tr>
965 </tr>
966
966
967 </tbody>
967 </tbody>
968 </table>
968 </table>
969 </div>
969 </div>
970 </div>
970 </div>
971
971
972
972
973 </body>
973 </body>
974 </html>
974 </html>
975
975
976 $ get-with-headers.py localhost:$HGPORT1 't/a?style=atom'
976 $ get-with-headers.py localhost:$HGPORT1 't/a?style=atom'
977 200 Script output follows
977 200 Script output follows
978
978
979 <?xml version="1.0" encoding="ascii"?>
979 <?xml version="1.0" encoding="ascii"?>
980 <feed xmlns="http://www.w3.org/2005/Atom">
980 <feed xmlns="http://www.w3.org/2005/Atom">
981 <!-- Changelog -->
981 <!-- Changelog -->
982 <id>http://*:$HGPORT1/t/a/</id> (glob)
982 <id>http://*:$HGPORT1/t/a/</id> (glob)
983 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
983 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
984 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
984 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
985 <title>t/a Changelog</title>
985 <title>t/a Changelog</title>
986 <updated>1970-01-01T00:00:01+00:00</updated>
986 <updated>1970-01-01T00:00:01+00:00</updated>
987
987
988 <entry>
988 <entry>
989 <title>[default] a</title>
989 <title>[default] a</title>
990 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
990 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
991 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
991 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
992 <author>
992 <author>
993 <name>test</name>
993 <name>test</name>
994 <email>&#116;&#101;&#115;&#116;</email>
994 <email>&#116;&#101;&#115;&#116;</email>
995 </author>
995 </author>
996 <updated>1970-01-01T00:00:01+00:00</updated>
996 <updated>1970-01-01T00:00:01+00:00</updated>
997 <published>1970-01-01T00:00:01+00:00</published>
997 <published>1970-01-01T00:00:01+00:00</published>
998 <content type="xhtml">
998 <content type="xhtml">
999 <table xmlns="http://www.w3.org/1999/xhtml">
999 <table xmlns="http://www.w3.org/1999/xhtml">
1000 <tr>
1000 <tr>
1001 <th style="text-align:left;">changeset</th>
1001 <th style="text-align:left;">changeset</th>
1002 <td>8580ff50825a</td>
1002 <td>8580ff50825a</td>
1003 </tr>
1003 </tr>
1004 <tr>
1004 <tr>
1005 <th style="text-align:left;">branch</th>
1005 <th style="text-align:left;">branch</th>
1006 <td>default</td>
1006 <td>default</td>
1007 </tr>
1007 </tr>
1008 <tr>
1008 <tr>
1009 <th style="text-align:left;">bookmark</th>
1009 <th style="text-align:left;">bookmark</th>
1010 <td></td>
1010 <td></td>
1011 </tr>
1011 </tr>
1012 <tr>
1012 <tr>
1013 <th style="text-align:left;">tag</th>
1013 <th style="text-align:left;">tag</th>
1014 <td>tip</td>
1014 <td>tip</td>
1015 </tr>
1015 </tr>
1016 <tr>
1016 <tr>
1017 <th style="text-align:left;">user</th>
1017 <th style="text-align:left;">user</th>
1018 <td>&#116;&#101;&#115;&#116;</td>
1018 <td>&#116;&#101;&#115;&#116;</td>
1019 </tr>
1019 </tr>
1020 <tr>
1020 <tr>
1021 <th style="text-align:left;vertical-align:top;">description</th>
1021 <th style="text-align:left;vertical-align:top;">description</th>
1022 <td>a</td>
1022 <td>a</td>
1023 </tr>
1023 </tr>
1024 <tr>
1024 <tr>
1025 <th style="text-align:left;vertical-align:top;">files</th>
1025 <th style="text-align:left;vertical-align:top;">files</th>
1026 <td>a<br /></td>
1026 <td>a<br /></td>
1027 </tr>
1027 </tr>
1028 </table>
1028 </table>
1029 </content>
1029 </content>
1030 </entry>
1030 </entry>
1031
1031
1032 </feed>
1032 </feed>
1033 $ get-with-headers.py localhost:$HGPORT1 't/a/?style=atom'
1033 $ get-with-headers.py localhost:$HGPORT1 't/a/?style=atom'
1034 200 Script output follows
1034 200 Script output follows
1035
1035
1036 <?xml version="1.0" encoding="ascii"?>
1036 <?xml version="1.0" encoding="ascii"?>
1037 <feed xmlns="http://www.w3.org/2005/Atom">
1037 <feed xmlns="http://www.w3.org/2005/Atom">
1038 <!-- Changelog -->
1038 <!-- Changelog -->
1039 <id>http://*:$HGPORT1/t/a/</id> (glob)
1039 <id>http://*:$HGPORT1/t/a/</id> (glob)
1040 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
1040 <link rel="self" href="http://*:$HGPORT1/t/a/atom-log"/> (glob)
1041 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
1041 <link rel="alternate" href="http://*:$HGPORT1/t/a/"/> (glob)
1042 <title>t/a Changelog</title>
1042 <title>t/a Changelog</title>
1043 <updated>1970-01-01T00:00:01+00:00</updated>
1043 <updated>1970-01-01T00:00:01+00:00</updated>
1044
1044
1045 <entry>
1045 <entry>
1046 <title>[default] a</title>
1046 <title>[default] a</title>
1047 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
1047 <id>http://*:$HGPORT1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id> (glob)
1048 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
1048 <link href="http://*:$HGPORT1/t/a/rev/8580ff50825a"/> (glob)
1049 <author>
1049 <author>
1050 <name>test</name>
1050 <name>test</name>
1051 <email>&#116;&#101;&#115;&#116;</email>
1051 <email>&#116;&#101;&#115;&#116;</email>
1052 </author>
1052 </author>
1053 <updated>1970-01-01T00:00:01+00:00</updated>
1053 <updated>1970-01-01T00:00:01+00:00</updated>
1054 <published>1970-01-01T00:00:01+00:00</published>
1054 <published>1970-01-01T00:00:01+00:00</published>
1055 <content type="xhtml">
1055 <content type="xhtml">
1056 <table xmlns="http://www.w3.org/1999/xhtml">
1056 <table xmlns="http://www.w3.org/1999/xhtml">
1057 <tr>
1057 <tr>
1058 <th style="text-align:left;">changeset</th>
1058 <th style="text-align:left;">changeset</th>
1059 <td>8580ff50825a</td>
1059 <td>8580ff50825a</td>
1060 </tr>
1060 </tr>
1061 <tr>
1061 <tr>
1062 <th style="text-align:left;">branch</th>
1062 <th style="text-align:left;">branch</th>
1063 <td>default</td>
1063 <td>default</td>
1064 </tr>
1064 </tr>
1065 <tr>
1065 <tr>
1066 <th style="text-align:left;">bookmark</th>
1066 <th style="text-align:left;">bookmark</th>
1067 <td></td>
1067 <td></td>
1068 </tr>
1068 </tr>
1069 <tr>
1069 <tr>
1070 <th style="text-align:left;">tag</th>
1070 <th style="text-align:left;">tag</th>
1071 <td>tip</td>
1071 <td>tip</td>
1072 </tr>
1072 </tr>
1073 <tr>
1073 <tr>
1074 <th style="text-align:left;">user</th>
1074 <th style="text-align:left;">user</th>
1075 <td>&#116;&#101;&#115;&#116;</td>
1075 <td>&#116;&#101;&#115;&#116;</td>
1076 </tr>
1076 </tr>
1077 <tr>
1077 <tr>
1078 <th style="text-align:left;vertical-align:top;">description</th>
1078 <th style="text-align:left;vertical-align:top;">description</th>
1079 <td>a</td>
1079 <td>a</td>
1080 </tr>
1080 </tr>
1081 <tr>
1081 <tr>
1082 <th style="text-align:left;vertical-align:top;">files</th>
1082 <th style="text-align:left;vertical-align:top;">files</th>
1083 <td>a<br /></td>
1083 <td>a<br /></td>
1084 </tr>
1084 </tr>
1085 </table>
1085 </table>
1086 </content>
1086 </content>
1087 </entry>
1087 </entry>
1088
1088
1089 </feed>
1089 </feed>
1090 $ get-with-headers.py localhost:$HGPORT1 't/a/file/tip/a?style=raw'
1090 $ get-with-headers.py localhost:$HGPORT1 't/a/file/tip/a?style=raw'
1091 200 Script output follows
1091 200 Script output follows
1092
1092
1093 a
1093 a
1094
1094
1095 Test [paths] '*' extension
1095 Test [paths] '*' extension
1096
1096
1097 $ get-with-headers.py localhost:$HGPORT1 'coll/?style=raw'
1097 $ get-with-headers.py localhost:$HGPORT1 'coll/?style=raw'
1098 200 Script output follows
1098 200 Script output follows
1099
1099
1100
1100
1101 /coll/a/
1101 /coll/a/
1102 /coll/a/.hg/patches/
1102 /coll/a/.hg/patches/
1103 /coll/b/
1103 /coll/b/
1104 /coll/c/
1104 /coll/c/
1105 /coll/notrepo/e/
1105 /coll/notrepo/e/
1106 /coll/notrepo/f/
1106 /coll/notrepo/f/
1107
1107
1108 $ get-with-headers.py localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1108 $ get-with-headers.py localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1109 200 Script output follows
1109 200 Script output follows
1110
1110
1111 a
1111 a
1112
1112
1113 Test [paths] '**' extension
1113 Test [paths] '**' extension
1114
1114
1115 $ get-with-headers.py localhost:$HGPORT1 'rcoll/?style=raw'
1115 $ get-with-headers.py localhost:$HGPORT1 'rcoll/?style=raw'
1116 200 Script output follows
1116 200 Script output follows
1117
1117
1118
1118
1119 /rcoll/a/
1119 /rcoll/a/
1120 /rcoll/a/.hg/patches/
1120 /rcoll/a/.hg/patches/
1121 /rcoll/b/
1121 /rcoll/b/
1122 /rcoll/b/d/
1122 /rcoll/b/d/
1123 /rcoll/c/
1123 /rcoll/c/
1124 /rcoll/notrepo/e/
1124 /rcoll/notrepo/e/
1125 /rcoll/notrepo/e/e2/
1125 /rcoll/notrepo/e/e2/
1126 /rcoll/notrepo/f/
1126 /rcoll/notrepo/f/
1127 /rcoll/notrepo/f/f2/
1127 /rcoll/notrepo/f/f2/
1128
1128
1129 $ get-with-headers.py localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1129 $ get-with-headers.py localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1130 200 Script output follows
1130 200 Script output follows
1131
1131
1132 d
1132 d
1133
1133
1134 Test collapse = True
1134 Test collapse = True
1135
1135
1136 $ killdaemons.py
1136 $ killdaemons.py
1137 $ cat >> paths.conf <<EOF
1137 $ cat >> paths.conf <<EOF
1138 > [web]
1138 > [web]
1139 > collapse=true
1139 > collapse=true
1140 > descend = true
1140 > descend = true
1141 > EOF
1141 > EOF
1142 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1142 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1143 > -A access-paths.log -E error-paths-3.log
1143 > -A access-paths.log -E error-paths-3.log
1144 $ cat hg.pid >> $DAEMON_PIDS
1144 $ cat hg.pid >> $DAEMON_PIDS
1145 $ get-with-headers.py localhost:$HGPORT1 'coll/?style=raw'
1145 $ get-with-headers.py localhost:$HGPORT1 'coll/?style=raw'
1146 200 Script output follows
1146 200 Script output follows
1147
1147
1148
1148
1149 /coll/a/
1149 /coll/a/
1150 /coll/a/.hg/patches/
1150 /coll/a/.hg/patches/
1151 /coll/b/
1151 /coll/b/
1152 /coll/c/
1152 /coll/c/
1153 /coll/notrepo/
1153 /coll/notrepo/
1154
1154
1155 $ get-with-headers.py localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1155 $ get-with-headers.py localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1156 200 Script output follows
1156 200 Script output follows
1157
1157
1158 a
1158 a
1159 $ get-with-headers.py localhost:$HGPORT1 'rcoll/?style=raw'
1159 $ get-with-headers.py localhost:$HGPORT1 'rcoll/?style=raw'
1160 200 Script output follows
1160 200 Script output follows
1161
1161
1162
1162
1163 /rcoll/a/
1163 /rcoll/a/
1164 /rcoll/a/.hg/patches/
1164 /rcoll/a/.hg/patches/
1165 /rcoll/b/
1165 /rcoll/b/
1166 /rcoll/b/d/
1166 /rcoll/b/d/
1167 /rcoll/c/
1167 /rcoll/c/
1168 /rcoll/notrepo/
1168 /rcoll/notrepo/
1169
1169
1170 $ get-with-headers.py localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1170 $ get-with-headers.py localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1171 200 Script output follows
1171 200 Script output follows
1172
1172
1173 d
1173 d
1174
1174
1175 Test intermediate directories
1175 Test intermediate directories
1176
1176
1177 Hide the subrepo parent
1177 Hide the subrepo parent
1178
1178
1179 $ cp $root/notrepo/f/.hg/hgrc $root/notrepo/f/.hg/hgrc.bak
1179 $ cp $root/notrepo/f/.hg/hgrc $root/notrepo/f/.hg/hgrc.bak
1180 $ cat >> $root/notrepo/f/.hg/hgrc << EOF
1180 $ cat >> $root/notrepo/f/.hg/hgrc << EOF
1181 > [web]
1181 > [web]
1182 > hidden = True
1182 > hidden = True
1183 > EOF
1183 > EOF
1184
1184
1185 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1185 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1186 200 Script output follows
1186 200 Script output follows
1187
1187
1188
1188
1189 /rcoll/notrepo/e/
1189 /rcoll/notrepo/e/
1190 /rcoll/notrepo/e/e2/
1190 /rcoll/notrepo/e/e2/
1191
1191
1192
1192
1193 Subrepo parent not hidden
1193 Subrepo parent not hidden
1194 $ mv $root/notrepo/f/.hg/hgrc.bak $root/notrepo/f/.hg/hgrc
1194 $ mv $root/notrepo/f/.hg/hgrc.bak $root/notrepo/f/.hg/hgrc
1195
1195
1196 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1196 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1197 200 Script output follows
1197 200 Script output follows
1198
1198
1199
1199
1200 /rcoll/notrepo/e/
1200 /rcoll/notrepo/e/
1201 /rcoll/notrepo/e/e2/
1201 /rcoll/notrepo/e/e2/
1202 /rcoll/notrepo/f/
1202 /rcoll/notrepo/f/
1203 /rcoll/notrepo/f/f2/
1203 /rcoll/notrepo/f/f2/
1204
1204
1205
1205
1206 Test repositories inside intermediate directories
1206 Test repositories inside intermediate directories
1207
1207
1208 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
1208 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
1209 200 Script output follows
1209 200 Script output follows
1210
1210
1211 e
1211 e
1212
1212
1213 Test subrepositories inside intermediate directories
1213 Test subrepositories inside intermediate directories
1214
1214
1215 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
1215 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
1216 200 Script output follows
1216 200 Script output follows
1217
1217
1218 f2
1218 f2
1219
1219
1220 Test descend = False
1220 Test descend = False
1221
1221
1222 $ killdaemons.py
1222 $ killdaemons.py
1223 $ cat >> paths.conf <<EOF
1223 $ cat >> paths.conf <<EOF
1224 > descend=false
1224 > descend=false
1225 > EOF
1225 > EOF
1226 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1226 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1227 > -A access-paths.log -E error-paths-4.log
1227 > -A access-paths.log -E error-paths-4.log
1228 $ cat hg.pid >> $DAEMON_PIDS
1228 $ cat hg.pid >> $DAEMON_PIDS
1229 $ get-with-headers.py localhost:$HGPORT1 'coll/?style=raw'
1229 $ get-with-headers.py localhost:$HGPORT1 'coll/?style=raw'
1230 200 Script output follows
1230 200 Script output follows
1231
1231
1232
1232
1233 /coll/a/
1233 /coll/a/
1234 /coll/b/
1234 /coll/b/
1235 /coll/c/
1235 /coll/c/
1236
1236
1237 $ get-with-headers.py localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1237 $ get-with-headers.py localhost:$HGPORT1 'coll/a/file/tip/a?style=raw'
1238 200 Script output follows
1238 200 Script output follows
1239
1239
1240 a
1240 a
1241 $ get-with-headers.py localhost:$HGPORT1 'rcoll/?style=raw'
1241 $ get-with-headers.py localhost:$HGPORT1 'rcoll/?style=raw'
1242 200 Script output follows
1242 200 Script output follows
1243
1243
1244
1244
1245 /rcoll/a/
1245 /rcoll/a/
1246 /rcoll/b/
1246 /rcoll/b/
1247 /rcoll/c/
1247 /rcoll/c/
1248
1248
1249 $ get-with-headers.py localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1249 $ get-with-headers.py localhost:$HGPORT1 'rcoll/b/d/file/tip/d?style=raw'
1250 200 Script output follows
1250 200 Script output follows
1251
1251
1252 d
1252 d
1253
1253
1254 Test intermediate directories
1254 Test intermediate directories
1255
1255
1256 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1256 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/?style=raw'
1257 200 Script output follows
1257 200 Script output follows
1258
1258
1259
1259
1260 /rcoll/notrepo/e/
1260 /rcoll/notrepo/e/
1261 /rcoll/notrepo/f/
1261 /rcoll/notrepo/f/
1262
1262
1263
1263
1264 Test repositories inside intermediate directories
1264 Test repositories inside intermediate directories
1265
1265
1266 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
1266 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/e/file/tip/e?style=raw'
1267 200 Script output follows
1267 200 Script output follows
1268
1268
1269 e
1269 e
1270
1270
1271 Test subrepositories inside intermediate directories
1271 Test subrepositories inside intermediate directories
1272
1272
1273 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
1273 $ get-with-headers.py localhost:$HGPORT1 'rcoll/notrepo/f/f2/file/tip/f2?style=raw'
1274 200 Script output follows
1274 200 Script output follows
1275
1275
1276 f2
1276 f2
1277
1277
1278 Test [paths] '*' in a repo root
1278 Test [paths] '*' in a repo root
1279
1279
1280 $ hg id http://localhost:$HGPORT1/astar
1280 $ hg id http://localhost:$HGPORT1/astar
1281 8580ff50825a
1281 8580ff50825a
1282
1282
1283 $ killdaemons.py
1283 $ killdaemons.py
1284 $ cat > paths.conf <<EOF
1284 $ cat > paths.conf <<EOF
1285 > [paths]
1285 > [paths]
1286 > t/a = $root/a
1286 > t/a = $root/a
1287 > t/b = $root/b
1287 > t/b = $root/b
1288 > c = $root/c
1288 > c = $root/c
1289 > EOF
1289 > EOF
1290 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1290 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1291 > -A access-paths.log -E error-paths-5.log
1291 > -A access-paths.log -E error-paths-5.log
1292 $ cat hg.pid >> $DAEMON_PIDS
1292 $ cat hg.pid >> $DAEMON_PIDS
1293 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1293 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1294 200 Script output follows
1294 200 Script output follows
1295
1295
1296
1296
1297 /t/a/
1297 /t/a/
1298 /t/b/
1298 /t/b/
1299 /c/
1299 /c/
1300
1300
1301 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
1301 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
1302 200 Script output follows
1302 200 Script output follows
1303
1303
1304
1304
1305 /t/a/
1305 /t/a/
1306 /t/b/
1306 /t/b/
1307
1307
1308
1308
1309 Test collapse = True
1309 Test collapse = True
1310
1310
1311 $ killdaemons.py
1311 $ killdaemons.py
1312 $ cat >> paths.conf <<EOF
1312 $ cat >> paths.conf <<EOF
1313 > [web]
1313 > [web]
1314 > collapse=true
1314 > collapse=true
1315 > EOF
1315 > EOF
1316 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1316 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1317 > -A access-paths.log -E error-paths-6.log
1317 > -A access-paths.log -E error-paths-6.log
1318 $ cat hg.pid >> $DAEMON_PIDS
1318 $ cat hg.pid >> $DAEMON_PIDS
1319 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1319 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1320 200 Script output follows
1320 200 Script output follows
1321
1321
1322
1322
1323 /t/
1323 /t/
1324 /c/
1324 /c/
1325
1325
1326 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
1326 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
1327 200 Script output follows
1327 200 Script output follows
1328
1328
1329
1329
1330 /t/a/
1330 /t/a/
1331 /t/b/
1331 /t/b/
1332
1332
1333
1333
1334 test descend = False
1334 test descend = False
1335
1335
1336 $ killdaemons.py
1336 $ killdaemons.py
1337 $ cat >> paths.conf <<EOF
1337 $ cat >> paths.conf <<EOF
1338 > descend=false
1338 > descend=false
1339 > EOF
1339 > EOF
1340 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1340 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1341 > -A access-paths.log -E error-paths-7.log
1341 > -A access-paths.log -E error-paths-7.log
1342 $ cat hg.pid >> $DAEMON_PIDS
1342 $ cat hg.pid >> $DAEMON_PIDS
1343 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1343 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1344 200 Script output follows
1344 200 Script output follows
1345
1345
1346
1346
1347 /c/
1347 /c/
1348
1348
1349 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
1349 $ get-with-headers.py localhost:$HGPORT1 't/?style=raw'
1350 200 Script output follows
1350 200 Script output follows
1351
1351
1352
1352
1353 /t/a/
1353 /t/a/
1354 /t/b/
1354 /t/b/
1355
1355
1356 $ killdaemons.py
1356 $ killdaemons.py
1357 $ cat > paths.conf <<EOF
1357 $ cat > paths.conf <<EOF
1358 > [paths]
1358 > [paths]
1359 > nostore = $root/nostore
1359 > nostore = $root/nostore
1360 > inexistent = $root/inexistent
1360 > inexistent = $root/inexistent
1361 > EOF
1361 > EOF
1362 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1362 $ hg serve -p $HGPORT1 -d --pid-file=hg.pid --webdir-conf paths.conf \
1363 > -A access-paths.log -E error-paths-8.log
1363 > -A access-paths.log -E error-paths-8.log
1364 $ cat hg.pid >> $DAEMON_PIDS
1364 $ cat hg.pid >> $DAEMON_PIDS
1365
1365
1366 test inexistent and inaccessible repo should be ignored silently
1366 test inexistent and inaccessible repo should be ignored silently
1367
1367
1368 $ get-with-headers.py localhost:$HGPORT1 ''
1368 $ get-with-headers.py localhost:$HGPORT1 ''
1369 200 Script output follows
1369 200 Script output follows
1370
1370
1371 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1371 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
1372 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1372 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
1373 <head>
1373 <head>
1374 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1374 <link rel="icon" href="/static/hgicon.png" type="image/png" />
1375 <meta name="robots" content="index, nofollow" />
1375 <meta name="robots" content="index, nofollow" />
1376 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1376 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
1377 <script type="text/javascript" src="/static/mercurial.js"></script>
1377 <script type="text/javascript" src="/static/mercurial.js"></script>
1378
1378
1379 <title>Mercurial repositories index</title>
1379 <title>Mercurial repositories index</title>
1380 </head>
1380 </head>
1381 <body>
1381 <body>
1382
1382
1383 <div class="container">
1383 <div class="container">
1384 <div class="menu">
1384 <div class="menu">
1385 <a href="https://mercurial-scm.org/">
1385 <a href="https://mercurial-scm.org/">
1386 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
1386 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
1387 </div>
1387 </div>
1388 <div class="main">
1388 <div class="main">
1389 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1389 <h2 class="breadcrumb"><a href="/">Mercurial</a> </h2>
1390
1390
1391 <table class="bigtable">
1391 <table class="bigtable">
1392 <thead>
1392 <thead>
1393 <tr>
1393 <tr>
1394 <th><a href="?sort=name">Name</a></th>
1394 <th><a href="?sort=name">Name</a></th>
1395 <th><a href="?sort=description">Description</a></th>
1395 <th><a href="?sort=description">Description</a></th>
1396 <th><a href="?sort=contact">Contact</a></th>
1396 <th><a href="?sort=contact">Contact</a></th>
1397 <th><a href="?sort=lastchange">Last modified</a></th>
1397 <th><a href="?sort=lastchange">Last modified</a></th>
1398 <th>&nbsp;</th>
1398 <th>&nbsp;</th>
1399 <th>&nbsp;</th>
1399 <th>&nbsp;</th>
1400 </tr>
1400 </tr>
1401 </thead>
1401 </thead>
1402 <tbody class="stripes2">
1402 <tbody class="stripes2">
1403
1403
1404 </tbody>
1404 </tbody>
1405 </table>
1405 </table>
1406 </div>
1406 </div>
1407 </div>
1407 </div>
1408
1408
1409
1409
1410 </body>
1410 </body>
1411 </html>
1411 </html>
1412
1412
1413
1413
1414 test listening address/port specified by web-conf (issue4699):
1414 test listening address/port specified by web-conf (issue4699):
1415
1415
1416 $ killdaemons.py
1416 $ killdaemons.py
1417 $ cat >> paths.conf <<EOF
1417 $ cat >> paths.conf <<EOF
1418 > [web]
1418 > [web]
1419 > address = localhost
1419 > address = localhost
1420 > port = $HGPORT1
1420 > port = $HGPORT1
1421 > EOF
1421 > EOF
1422 $ hg serve -d --pid-file=hg.pid --web-conf paths.conf \
1422 $ hg serve -d --pid-file=hg.pid --web-conf paths.conf \
1423 > -A access-paths.log -E error-paths-9.log
1423 > -A access-paths.log -E error-paths-9.log
1424 listening at http://*:$HGPORT1/ (bound to *$LOCALIP*:$HGPORT1) (glob)
1424 listening at http://*:$HGPORT1/ (bound to *$LOCALIP*:$HGPORT1) (glob)
1425 $ cat hg.pid >> $DAEMON_PIDS
1425 $ cat hg.pid >> $DAEMON_PIDS
1426 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1426 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1427 200 Script output follows
1427 200 Script output follows
1428
1428
1429
1429
1430
1430
1431 test --port option overrides web.port:
1431 test --port option overrides web.port:
1432
1432
1433 $ killdaemons.py
1433 $ killdaemons.py
1434 $ hg serve -p $HGPORT2 -d -v --pid-file=hg.pid --web-conf paths.conf \
1434 $ hg serve -p $HGPORT2 -d -v --pid-file=hg.pid --web-conf paths.conf \
1435 > -A access-paths.log -E error-paths-10.log
1435 > -A access-paths.log -E error-paths-10.log
1436 listening at http://*:$HGPORT2/ (bound to *$LOCALIP*:$HGPORT2) (glob)
1436 listening at http://*:$HGPORT2/ (bound to *$LOCALIP*:$HGPORT2) (glob)
1437 $ cat hg.pid >> $DAEMON_PIDS
1437 $ cat hg.pid >> $DAEMON_PIDS
1438 $ get-with-headers.py localhost:$HGPORT2 '?style=raw'
1438 $ get-with-headers.py localhost:$HGPORT2 '?style=raw'
1439 200 Script output follows
1439 200 Script output follows
1440
1440
1441
1441
1442
1442
1443
1443
1444 $ killdaemons.py
1444 $ killdaemons.py
1445 $ cat > collections.conf <<EOF
1445 $ cat > collections.conf <<EOF
1446 > [collections]
1446 > [collections]
1447 > $root=$root
1447 > $root=$root
1448 > EOF
1448 > EOF
1449 $ hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
1449 $ hg serve --config web.baseurl=http://hg.example.com:8080/ -p $HGPORT2 -d \
1450 > --pid-file=hg.pid --webdir-conf collections.conf \
1450 > --pid-file=hg.pid --webdir-conf collections.conf \
1451 > -A access-collections.log -E error-collections.log
1451 > -A access-collections.log -E error-collections.log
1452 $ cat hg.pid >> $DAEMON_PIDS
1452 $ cat hg.pid >> $DAEMON_PIDS
1453
1453
1454 collections: should succeed
1454 collections: should succeed
1455
1455
1456 $ get-with-headers.py localhost:$HGPORT2 '?style=raw'
1456 $ get-with-headers.py localhost:$HGPORT2 '?style=raw'
1457 200 Script output follows
1457 200 Script output follows
1458
1458
1459
1459
1460 /a/
1460 /a/
1461 /a/.hg/patches/
1461 /a/.hg/patches/
1462 /b/
1462 /b/
1463 /c/
1463 /c/
1464 /notrepo/e/
1464 /notrepo/e/
1465 /notrepo/f/
1465 /notrepo/f/
1466
1466
1467 $ get-with-headers.py localhost:$HGPORT2 'a/file/tip/a?style=raw'
1467 $ get-with-headers.py localhost:$HGPORT2 'a/file/tip/a?style=raw'
1468 200 Script output follows
1468 200 Script output follows
1469
1469
1470 a
1470 a
1471 $ get-with-headers.py localhost:$HGPORT2 'b/file/tip/b?style=raw'
1471 $ get-with-headers.py localhost:$HGPORT2 'b/file/tip/b?style=raw'
1472 200 Script output follows
1472 200 Script output follows
1473
1473
1474 b
1474 b
1475 $ get-with-headers.py localhost:$HGPORT2 'c/file/tip/c?style=raw'
1475 $ get-with-headers.py localhost:$HGPORT2 'c/file/tip/c?style=raw'
1476 200 Script output follows
1476 200 Script output follows
1477
1477
1478 c
1478 c
1479
1479
1480 atom-log with basedir /
1480 atom-log with basedir /
1481
1481
1482 $ get-with-headers.py localhost:$HGPORT2 'a/atom-log' | grep '<link'
1482 $ get-with-headers.py localhost:$HGPORT2 'a/atom-log' | grep '<link'
1483 <link rel="self" href="http://hg.example.com:8080/a/atom-log"/>
1483 <link rel="self" href="http://hg.example.com:8080/a/atom-log"/>
1484 <link rel="alternate" href="http://hg.example.com:8080/a/"/>
1484 <link rel="alternate" href="http://hg.example.com:8080/a/"/>
1485 <link href="http://hg.example.com:8080/a/rev/8580ff50825a"/>
1485 <link href="http://hg.example.com:8080/a/rev/8580ff50825a"/>
1486
1486
1487 rss-log with basedir /
1487 rss-log with basedir /
1488
1488
1489 $ get-with-headers.py localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1489 $ get-with-headers.py localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1490 <guid isPermaLink="true">http://hg.example.com:8080/a/rev/8580ff50825a</guid>
1490 <guid isPermaLink="true">http://hg.example.com:8080/a/rev/8580ff50825a</guid>
1491 $ killdaemons.py
1491 $ killdaemons.py
1492 $ hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
1492 $ hg serve --config web.baseurl=http://hg.example.com:8080/foo/ -p $HGPORT2 -d \
1493 > --pid-file=hg.pid --webdir-conf collections.conf \
1493 > --pid-file=hg.pid --webdir-conf collections.conf \
1494 > -A access-collections-2.log -E error-collections-2.log
1494 > -A access-collections-2.log -E error-collections-2.log
1495 $ cat hg.pid >> $DAEMON_PIDS
1495 $ cat hg.pid >> $DAEMON_PIDS
1496
1496
1497 atom-log with basedir /foo/
1497 atom-log with basedir /foo/
1498
1498
1499 $ get-with-headers.py localhost:$HGPORT2 'a/atom-log' | grep '<link'
1499 $ get-with-headers.py localhost:$HGPORT2 'a/atom-log' | grep '<link'
1500 <link rel="self" href="http://hg.example.com:8080/foo/a/atom-log"/>
1500 <link rel="self" href="http://hg.example.com:8080/foo/a/atom-log"/>
1501 <link rel="alternate" href="http://hg.example.com:8080/foo/a/"/>
1501 <link rel="alternate" href="http://hg.example.com:8080/foo/a/"/>
1502 <link href="http://hg.example.com:8080/foo/a/rev/8580ff50825a"/>
1502 <link href="http://hg.example.com:8080/foo/a/rev/8580ff50825a"/>
1503
1503
1504 rss-log with basedir /foo/
1504 rss-log with basedir /foo/
1505
1505
1506 $ get-with-headers.py localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1506 $ get-with-headers.py localhost:$HGPORT2 'a/rss-log' | grep '<guid'
1507 <guid isPermaLink="true">http://hg.example.com:8080/foo/a/rev/8580ff50825a</guid>
1507 <guid isPermaLink="true">http://hg.example.com:8080/foo/a/rev/8580ff50825a</guid>
1508
1508
1509 Path refreshing works as expected
1509 Path refreshing works as expected
1510
1510
1511 $ killdaemons.py
1511 $ killdaemons.py
1512 $ mkdir $root/refreshtest
1512 $ mkdir $root/refreshtest
1513 $ hg init $root/refreshtest/a
1513 $ hg init $root/refreshtest/a
1514 $ cat > paths.conf << EOF
1514 $ cat > paths.conf << EOF
1515 > [paths]
1515 > [paths]
1516 > / = $root/refreshtest/*
1516 > / = $root/refreshtest/*
1517 > EOF
1517 > EOF
1518 $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
1518 $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
1519 $ cat hg.pid >> $DAEMON_PIDS
1519 $ cat hg.pid >> $DAEMON_PIDS
1520
1520
1521 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1521 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1522 200 Script output follows
1522 200 Script output follows
1523
1523
1524
1524
1525 /a/
1525 /a/
1526
1526
1527
1527
1528 By default refreshing occurs every 20s and a new repo won't be listed
1528 By default refreshing occurs every 20s and a new repo won't be listed
1529 immediately.
1529 immediately.
1530
1530
1531 $ hg init $root/refreshtest/b
1531 $ hg init $root/refreshtest/b
1532 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1532 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1533 200 Script output follows
1533 200 Script output follows
1534
1534
1535
1535
1536 /a/
1536 /a/
1537
1537
1538
1538
1539 Restart the server with no refresh interval. New repo should appear
1539 Restart the server with no refresh interval. New repo should appear
1540 immediately.
1540 immediately.
1541
1541
1542 $ killdaemons.py
1542 $ killdaemons.py
1543 $ cat > paths.conf << EOF
1543 $ cat > paths.conf << EOF
1544 > [web]
1544 > [web]
1545 > refreshinterval = -1
1545 > refreshinterval = -1
1546 > [paths]
1546 > [paths]
1547 > / = $root/refreshtest/*
1547 > / = $root/refreshtest/*
1548 > EOF
1548 > EOF
1549 $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
1549 $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
1550 $ cat hg.pid >> $DAEMON_PIDS
1550 $ cat hg.pid >> $DAEMON_PIDS
1551
1551
1552 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1552 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1553 200 Script output follows
1553 200 Script output follows
1554
1554
1555
1555
1556 /a/
1556 /a/
1557 /b/
1557 /b/
1558
1558
1559
1559
1560 $ hg init $root/refreshtest/c
1560 $ hg init $root/refreshtest/c
1561 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1561 $ get-with-headers.py localhost:$HGPORT1 '?style=raw'
1562 200 Script output follows
1562 200 Script output follows
1563
1563
1564
1564
1565 /a/
1565 /a/
1566 /b/
1566 /b/
1567 /c/
1567 /c/
1568
1568
1569 $ killdaemons.py
1570 $ cat > paths.conf << EOF
1571 > [paths]
1572 > /dir1/a_repo = $root/a
1573 > /dir1/a_repo/b_repo = $root/b
1574 > /dir1/dir2/index = $root/b
1575 > EOF
1576 $ hg serve -p $HGPORT1 -d --pid-file hg.pid --webdir-conf paths.conf
1577 $ cat hg.pid >> $DAEMON_PIDS
1578
1579 $ echo 'index file' > $root/a/index
1580 $ hg --cwd $root/a ci -Am 'add index file'
1581 adding index
1582
1583 $ get-with-headers.py localhost:$HGPORT1 '' | grep 'a_repo'
1584 <td><a href="/dir1/a_repo/">dir1/a_repo</a></td>
1585 <a href="/dir1/a_repo/atom-log" title="subscribe to repository atom feed">
1586 <td><a href="/dir1/a_repo/b_repo/">dir1/a_repo/b_repo</a></td>
1587 <a href="/dir1/a_repo/b_repo/atom-log" title="subscribe to repository atom feed">
1588
1589 $ get-with-headers.py localhost:$HGPORT1 'index' | grep 'a_repo'
1590 <td><a href="/dir1/a_repo/">dir1/a_repo</a></td>
1591 <a href="/dir1/a_repo/atom-log" title="subscribe to repository atom feed">
1592 <td><a href="/dir1/a_repo/b_repo/">dir1/a_repo/b_repo</a></td>
1593 <a href="/dir1/a_repo/b_repo/atom-log" title="subscribe to repository atom feed">
1594
1595 $ get-with-headers.py localhost:$HGPORT1 'dir1' | grep 'a_repo'
1596 <td><a href="/dir1/a_repo/">a_repo</a></td>
1597 <a href="/dir1/a_repo/atom-log" title="subscribe to repository atom feed">
1598 <td><a href="/dir1/a_repo/b_repo/">a_repo/b_repo</a></td>
1599 <a href="/dir1/a_repo/b_repo/atom-log" title="subscribe to repository atom feed">
1600
1601 $ get-with-headers.py localhost:$HGPORT1 'dir1/index' | grep 'a_repo'
1602 <td><a href="/dir1/a_repo/">a_repo</a></td>
1603 <a href="/dir1/a_repo/atom-log" title="subscribe to repository atom feed">
1604 <td><a href="/dir1/a_repo/b_repo/">a_repo/b_repo</a></td>
1605 <a href="/dir1/a_repo/b_repo/atom-log" title="subscribe to repository atom feed">
1606
1607 $ get-with-headers.py localhost:$HGPORT1 'dir1/a_repo' | grep 'a_repo'
1608 <link rel="icon" href="/dir1/a_repo/static/hgicon.png" type="image/png" />
1609 <link rel="stylesheet" href="/dir1/a_repo/static/style-paper.css" type="text/css" />
1610 <script type="text/javascript" src="/dir1/a_repo/static/mercurial.js"></script>
1611 <title>dir1/a_repo: log</title>
1612 href="/dir1/a_repo/atom-log" title="Atom feed for dir1/a_repo" />
1613 href="/dir1/a_repo/rss-log" title="RSS feed for dir1/a_repo" />
1614 <img src="/dir1/a_repo/static/hglogo.png" alt="mercurial" /></a>
1615 <li><a href="/dir1/a_repo/graph/tip">graph</a></li>
1616 <li><a href="/dir1/a_repo/tags">tags</a></li>
1617 <li><a href="/dir1/a_repo/bookmarks">bookmarks</a></li>
1618 <li><a href="/dir1/a_repo/branches">branches</a></li>
1619 <li><a href="/dir1/a_repo/rev/tip">changeset</a></li>
1620 <li><a href="/dir1/a_repo/file/tip">browse</a></li>
1621 <li><a href="/dir1/a_repo/help">help</a></li>
1622 <a href="/dir1/a_repo/atom-log" title="subscribe to atom feed">
1623 <img class="atom-logo" src="/dir1/a_repo/static/feed-icon-14x14.png" alt="atom feed" />
1624 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/dir1">dir1</a> &gt; <a href="/dir1/a_repo">a_repo</a> </h2>
1625 <form class="search" action="/dir1/a_repo/log">
1626 number or hash, or <a href="/dir1/a_repo/help/revsets">revset expression</a>.</div>
1627 <a href="/dir1/a_repo/shortlog/tip?revcount=30">less</a>
1628 <a href="/dir1/a_repo/shortlog/tip?revcount=120">more</a>
1629 | rev 1: <a href="/dir1/a_repo/shortlog/8580ff50825a">(0)</a> <a href="/dir1/a_repo/shortlog/tip">tip</a>
1630 <a href="/dir1/a_repo/rev/71a89161f014">add index file</a>
1631 <a href="/dir1/a_repo/rev/8580ff50825a">a</a>
1632 <a href="/dir1/a_repo/shortlog/tip?revcount=30">less</a>
1633 <a href="/dir1/a_repo/shortlog/tip?revcount=120">more</a>
1634 | rev 1: <a href="/dir1/a_repo/shortlog/8580ff50825a">(0)</a> <a href="/dir1/a_repo/shortlog/tip">tip</a>
1635 '/dir1/a_repo/shortlog/%next%',
1636
1637 $ get-with-headers.py localhost:$HGPORT1 'dir1/a_repo/index' | grep 'a_repo'
1638 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/dir1">dir1</a> &gt; <a href="/dir1/a_repo">a_repo</a> </h2>
1639 <td><a href="/dir1/a_repo/b_repo/">b_repo</a></td>
1640 <a href="/dir1/a_repo/b_repo/atom-log" title="subscribe to repository atom feed">
1641
1642 Files named 'index' are not blocked
1643
1644 $ get-with-headers.py localhost:$HGPORT1 'dir1/a_repo/raw-file/tip/index'
1645 200 Script output follows
1646
1647 index file
1648
1649 Repos named 'index' take precedence over the index file
1650
1651 $ get-with-headers.py localhost:$HGPORT1 'dir1/dir2/index' | grep 'index'
1652 <link rel="icon" href="/dir1/dir2/index/static/hgicon.png" type="image/png" />
1653 <meta name="robots" content="index, nofollow" />
1654 <link rel="stylesheet" href="/dir1/dir2/index/static/style-paper.css" type="text/css" />
1655 <script type="text/javascript" src="/dir1/dir2/index/static/mercurial.js"></script>
1656 <title>dir1/dir2/index: log</title>
1657 href="/dir1/dir2/index/atom-log" title="Atom feed for dir1/dir2/index" />
1658 href="/dir1/dir2/index/rss-log" title="RSS feed for dir1/dir2/index" />
1659 <img src="/dir1/dir2/index/static/hglogo.png" alt="mercurial" /></a>
1660 <li><a href="/dir1/dir2/index/graph/tip">graph</a></li>
1661 <li><a href="/dir1/dir2/index/tags">tags</a></li>
1662 <li><a href="/dir1/dir2/index/bookmarks">bookmarks</a></li>
1663 <li><a href="/dir1/dir2/index/branches">branches</a></li>
1664 <li><a href="/dir1/dir2/index/rev/tip">changeset</a></li>
1665 <li><a href="/dir1/dir2/index/file/tip">browse</a></li>
1666 <li><a href="/dir1/dir2/index/help">help</a></li>
1667 <a href="/dir1/dir2/index/atom-log" title="subscribe to atom feed">
1668 <img class="atom-logo" src="/dir1/dir2/index/static/feed-icon-14x14.png" alt="atom feed" />
1669 <h2 class="breadcrumb"><a href="/">Mercurial</a> &gt; <a href="/dir1">dir1</a> &gt; <a href="/dir1/dir2">dir2</a> &gt; <a href="/dir1/dir2/index">index</a> </h2>
1670 <form class="search" action="/dir1/dir2/index/log">
1671 number or hash, or <a href="/dir1/dir2/index/help/revsets">revset expression</a>.</div>
1672 <a href="/dir1/dir2/index/shortlog/tip?revcount=30">less</a>
1673 <a href="/dir1/dir2/index/shortlog/tip?revcount=120">more</a>
1674 | rev 0: <a href="/dir1/dir2/index/shortlog/39505516671b">(0)</a> <a href="/dir1/dir2/index/shortlog/tip">tip</a>
1675 <a href="/dir1/dir2/index/rev/39505516671b">b</a>
1676 <a href="/dir1/dir2/index/shortlog/tip?revcount=30">less</a>
1677 <a href="/dir1/dir2/index/shortlog/tip?revcount=120">more</a>
1678 | rev 0: <a href="/dir1/dir2/index/shortlog/39505516671b">(0)</a> <a href="/dir1/dir2/index/shortlog/tip">tip</a>
1679 '/dir1/dir2/index/shortlog/%next%',
1680
1681 $ killdaemons.py
1569
1682
1570 paths errors 1
1683 paths errors 1
1571
1684
1572 $ cat error-paths-1.log
1685 $ cat error-paths-1.log
1573
1686
1574 paths errors 2
1687 paths errors 2
1575
1688
1576 $ cat error-paths-2.log
1689 $ cat error-paths-2.log
1577
1690
1578 paths errors 3
1691 paths errors 3
1579
1692
1580 $ cat error-paths-3.log
1693 $ cat error-paths-3.log
1581
1694
1582 paths errors 4
1695 paths errors 4
1583
1696
1584 $ cat error-paths-4.log
1697 $ cat error-paths-4.log
1585
1698
1586 paths errors 5
1699 paths errors 5
1587
1700
1588 $ cat error-paths-5.log
1701 $ cat error-paths-5.log
1589
1702
1590 paths errors 6
1703 paths errors 6
1591
1704
1592 $ cat error-paths-6.log
1705 $ cat error-paths-6.log
1593
1706
1594 paths errors 7
1707 paths errors 7
1595
1708
1596 $ cat error-paths-7.log
1709 $ cat error-paths-7.log
1597
1710
1598 paths errors 8
1711 paths errors 8
1599
1712
1600 $ cat error-paths-8.log
1713 $ cat error-paths-8.log
1601
1714
1602 paths errors 9
1715 paths errors 9
1603
1716
1604 $ cat error-paths-9.log
1717 $ cat error-paths-9.log
1605
1718
1606 paths errors 10
1719 paths errors 10
1607
1720
1608 $ cat error-paths-10.log
1721 $ cat error-paths-10.log
1609
1722
1610 collections errors
1723 collections errors
1611
1724
1612 $ cat error-collections.log
1725 $ cat error-collections.log
1613
1726
1614 collections errors 2
1727 collections errors 2
1615
1728
1616 $ cat error-collections-2.log
1729 $ cat error-collections-2.log
General Comments 0
You need to be logged in to leave comments. Login now