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