##// END OF EJS Templates
hgweb: keep original order from hgwebdir config files (issue1535)
Dirkjan Ochtman -
r9724:40ef3bf3 default
parent child Browse files
Show More
@@ -1,338 +1,337
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, incorporated herein by reference.
7 # GNU General Public License version 2, incorporated herein by reference.
8
8
9 import os, re, time
9 import os, re, time
10 from mercurial.i18n import _
10 from mercurial.i18n import _
11 from mercurial import ui, hg, util, templater
11 from mercurial import ui, hg, util, templater
12 from mercurial import error, encoding
12 from mercurial import error, encoding
13 from common import ErrorResponse, get_mtime, staticfile, paritygen,\
13 from common import ErrorResponse, get_mtime, staticfile, paritygen,\
14 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
14 get_contact, HTTP_OK, HTTP_NOT_FOUND, HTTP_SERVER_ERROR
15 from hgweb_mod import hgweb
15 from hgweb_mod import hgweb
16 from request import wsgirequest
16 from request import wsgirequest
17 import webutil
17 import webutil
18
18
19 def cleannames(items):
19 def cleannames(items):
20 return [(util.pconvert(name).strip('/'), path) for name, path in items]
20 return [(util.pconvert(name).strip('/'), path) for name, path in items]
21
21
22 def findrepos(paths):
22 def findrepos(paths):
23 repos = []
23 repos = []
24 for prefix, root in cleannames(paths):
24 for prefix, root in cleannames(paths):
25 roothead, roottail = os.path.split(root)
25 roothead, roottail = os.path.split(root)
26 # "foo = /bar/*" makes every subrepo of /bar/ to be
26 # "foo = /bar/*" makes every subrepo of /bar/ to be
27 # mounted as foo/subrepo
27 # mounted as foo/subrepo
28 # and "foo = /bar/**" also recurses into the subdirectories,
28 # and "foo = /bar/**" also recurses into the subdirectories,
29 # remember to use it without working dir.
29 # remember to use it without working dir.
30 try:
30 try:
31 recurse = {'*': False, '**': True}[roottail]
31 recurse = {'*': False, '**': True}[roottail]
32 except KeyError:
32 except KeyError:
33 repos.append((prefix, root))
33 repos.append((prefix, root))
34 continue
34 continue
35 roothead = os.path.normpath(roothead)
35 roothead = os.path.normpath(roothead)
36 for path in util.walkrepos(roothead, followsym=True, recurse=recurse):
36 for path in util.walkrepos(roothead, followsym=True, recurse=recurse):
37 path = os.path.normpath(path)
37 path = os.path.normpath(path)
38 name = util.pconvert(path[len(roothead):]).strip('/')
38 name = util.pconvert(path[len(roothead):]).strip('/')
39 if prefix:
39 if prefix:
40 name = prefix + '/' + name
40 name = prefix + '/' + name
41 repos.append((name, path))
41 repos.append((name, path))
42 return repos
42 return repos
43
43
44 class hgwebdir(object):
44 class hgwebdir(object):
45 refreshinterval = 20
45 refreshinterval = 20
46
46
47 def __init__(self, conf, baseui=None):
47 def __init__(self, conf, baseui=None):
48 self.conf = conf
48 self.conf = conf
49 self.baseui = baseui
49 self.baseui = baseui
50 self.lastrefresh = 0
50 self.lastrefresh = 0
51 self.refresh()
51 self.refresh()
52
52
53 def refresh(self):
53 def refresh(self):
54 if self.lastrefresh + self.refreshinterval > time.time():
54 if self.lastrefresh + self.refreshinterval > time.time():
55 return
55 return
56
56
57 if self.baseui:
57 if self.baseui:
58 self.ui = self.baseui.copy()
58 self.ui = self.baseui.copy()
59 else:
59 else:
60 self.ui = ui.ui()
60 self.ui = ui.ui()
61 self.ui.setconfig('ui', 'report_untrusted', 'off')
61 self.ui.setconfig('ui', 'report_untrusted', 'off')
62 self.ui.setconfig('ui', 'interactive', 'off')
62 self.ui.setconfig('ui', 'interactive', 'off')
63
63
64 if not isinstance(self.conf, (dict, list, tuple)):
64 if not isinstance(self.conf, (dict, list, tuple)):
65 map = {'paths': 'hgweb-paths'}
65 map = {'paths': 'hgweb-paths'}
66 self.ui.readconfig(self.conf, remap=map, trust=True)
66 self.ui.readconfig(self.conf, remap=map, trust=True)
67 paths = self.ui.configitems('hgweb-paths')
67 paths = self.ui.configitems('hgweb-paths')
68 elif isinstance(self.conf, (list, tuple)):
68 elif isinstance(self.conf, (list, tuple)):
69 paths = self.conf
69 paths = self.conf
70 elif isinstance(self.conf, dict):
70 elif isinstance(self.conf, dict):
71 paths = self.conf.items()
71 paths = self.conf.items()
72
72
73 encoding.encoding = self.ui.config('web', 'encoding',
73 encoding.encoding = self.ui.config('web', 'encoding',
74 encoding.encoding)
74 encoding.encoding)
75 self.motd = self.ui.config('web', 'motd')
75 self.motd = self.ui.config('web', 'motd')
76 self.style = self.ui.config('web', 'style', 'paper')
76 self.style = self.ui.config('web', 'style', 'paper')
77 self.stripecount = self.ui.config('web', 'stripes', 1)
77 self.stripecount = self.ui.config('web', 'stripes', 1)
78 if self.stripecount:
78 if self.stripecount:
79 self.stripecount = int(self.stripecount)
79 self.stripecount = int(self.stripecount)
80 self._baseurl = self.ui.config('web', 'baseurl')
80 self._baseurl = self.ui.config('web', 'baseurl')
81
81
82 self.repos = findrepos(paths)
82 self.repos = findrepos(paths)
83 for prefix, root in self.ui.configitems('collections'):
83 for prefix, root in self.ui.configitems('collections'):
84 prefix = util.pconvert(prefix)
84 prefix = util.pconvert(prefix)
85 for path in util.walkrepos(root, followsym=True):
85 for path in util.walkrepos(root, followsym=True):
86 repo = os.path.normpath(path)
86 repo = os.path.normpath(path)
87 name = util.pconvert(repo)
87 name = util.pconvert(repo)
88 if name.startswith(prefix):
88 if name.startswith(prefix):
89 name = name[len(prefix):]
89 name = name[len(prefix):]
90 self.repos.append((name.lstrip('/'), repo))
90 self.repos.append((name.lstrip('/'), repo))
91
91
92 self.repos.sort()
93 self.lastrefresh = time.time()
92 self.lastrefresh = time.time()
94
93
95 def run(self):
94 def run(self):
96 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
95 if not os.environ.get('GATEWAY_INTERFACE', '').startswith("CGI/1."):
97 raise RuntimeError("This function is only intended to be "
96 raise RuntimeError("This function is only intended to be "
98 "called while running as a CGI script.")
97 "called while running as a CGI script.")
99 import mercurial.hgweb.wsgicgi as wsgicgi
98 import mercurial.hgweb.wsgicgi as wsgicgi
100 wsgicgi.launch(self)
99 wsgicgi.launch(self)
101
100
102 def __call__(self, env, respond):
101 def __call__(self, env, respond):
103 req = wsgirequest(env, respond)
102 req = wsgirequest(env, respond)
104 return self.run_wsgi(req)
103 return self.run_wsgi(req)
105
104
106 def read_allowed(self, ui, req):
105 def read_allowed(self, ui, req):
107 """Check allow_read and deny_read config options of a repo's ui object
106 """Check allow_read and deny_read config options of a repo's ui object
108 to determine user permissions. By default, with neither option set (or
107 to determine user permissions. By default, with neither option set (or
109 both empty), allow all users to read the repo. There are two ways a
108 both empty), allow all users to read the repo. There are two ways a
110 user can be denied read access: (1) deny_read is not empty, and the
109 user can be denied read access: (1) deny_read is not empty, and the
111 user is unauthenticated or deny_read contains user (or *), and (2)
110 user is unauthenticated or deny_read contains user (or *), and (2)
112 allow_read is not empty and the user is not in allow_read. Return True
111 allow_read is not empty and the user is not in allow_read. Return True
113 if user is allowed to read the repo, else return False."""
112 if user is allowed to read the repo, else return False."""
114
113
115 user = req.env.get('REMOTE_USER')
114 user = req.env.get('REMOTE_USER')
116
115
117 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
116 deny_read = ui.configlist('web', 'deny_read', untrusted=True)
118 if deny_read and (not user or deny_read == ['*'] or user in deny_read):
117 if deny_read and (not user or deny_read == ['*'] or user in deny_read):
119 return False
118 return False
120
119
121 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
120 allow_read = ui.configlist('web', 'allow_read', untrusted=True)
122 # by default, allow reading if no allow_read option has been set
121 # by default, allow reading if no allow_read option has been set
123 if (not allow_read) or (allow_read == ['*']) or (user in allow_read):
122 if (not allow_read) or (allow_read == ['*']) or (user in allow_read):
124 return True
123 return True
125
124
126 return False
125 return False
127
126
128 def run_wsgi(self, req):
127 def run_wsgi(self, req):
129 try:
128 try:
130 try:
129 try:
131 self.refresh()
130 self.refresh()
132
131
133 virtual = req.env.get("PATH_INFO", "").strip('/')
132 virtual = req.env.get("PATH_INFO", "").strip('/')
134 tmpl = self.templater(req)
133 tmpl = self.templater(req)
135 ctype = tmpl('mimetype', encoding=encoding.encoding)
134 ctype = tmpl('mimetype', encoding=encoding.encoding)
136 ctype = templater.stringify(ctype)
135 ctype = templater.stringify(ctype)
137
136
138 # a static file
137 # a static file
139 if virtual.startswith('static/') or 'static' in req.form:
138 if virtual.startswith('static/') or 'static' in req.form:
140 if virtual.startswith('static/'):
139 if virtual.startswith('static/'):
141 fname = virtual[7:]
140 fname = virtual[7:]
142 else:
141 else:
143 fname = req.form['static'][0]
142 fname = req.form['static'][0]
144 static = templater.templatepath('static')
143 static = templater.templatepath('static')
145 return (staticfile(static, fname, req),)
144 return (staticfile(static, fname, req),)
146
145
147 # top-level index
146 # top-level index
148 elif not virtual:
147 elif not virtual:
149 req.respond(HTTP_OK, ctype)
148 req.respond(HTTP_OK, ctype)
150 return self.makeindex(req, tmpl)
149 return self.makeindex(req, tmpl)
151
150
152 # nested indexes and hgwebs
151 # nested indexes and hgwebs
153
152
154 repos = dict(self.repos)
153 repos = dict(self.repos)
155 while virtual:
154 while virtual:
156 real = repos.get(virtual)
155 real = repos.get(virtual)
157 if real:
156 if real:
158 req.env['REPO_NAME'] = virtual
157 req.env['REPO_NAME'] = virtual
159 try:
158 try:
160 repo = hg.repository(self.ui, real)
159 repo = hg.repository(self.ui, real)
161 return hgweb(repo).run_wsgi(req)
160 return hgweb(repo).run_wsgi(req)
162 except IOError, inst:
161 except IOError, inst:
163 msg = inst.strerror
162 msg = inst.strerror
164 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
163 raise ErrorResponse(HTTP_SERVER_ERROR, msg)
165 except error.RepoError, inst:
164 except error.RepoError, inst:
166 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
165 raise ErrorResponse(HTTP_SERVER_ERROR, str(inst))
167
166
168 # browse subdirectories
167 # browse subdirectories
169 subdir = virtual + '/'
168 subdir = virtual + '/'
170 if [r for r in repos if r.startswith(subdir)]:
169 if [r for r in repos if r.startswith(subdir)]:
171 req.respond(HTTP_OK, ctype)
170 req.respond(HTTP_OK, ctype)
172 return self.makeindex(req, tmpl, subdir)
171 return self.makeindex(req, tmpl, subdir)
173
172
174 up = virtual.rfind('/')
173 up = virtual.rfind('/')
175 if up < 0:
174 if up < 0:
176 break
175 break
177 virtual = virtual[:up]
176 virtual = virtual[:up]
178
177
179 # prefixes not found
178 # prefixes not found
180 req.respond(HTTP_NOT_FOUND, ctype)
179 req.respond(HTTP_NOT_FOUND, ctype)
181 return tmpl("notfound", repo=virtual)
180 return tmpl("notfound", repo=virtual)
182
181
183 except ErrorResponse, err:
182 except ErrorResponse, err:
184 req.respond(err, ctype)
183 req.respond(err, ctype)
185 return tmpl('error', error=err.message or '')
184 return tmpl('error', error=err.message or '')
186 finally:
185 finally:
187 tmpl = None
186 tmpl = None
188
187
189 def makeindex(self, req, tmpl, subdir=""):
188 def makeindex(self, req, tmpl, subdir=""):
190
189
191 def archivelist(ui, nodeid, url):
190 def archivelist(ui, nodeid, url):
192 allowed = ui.configlist("web", "allow_archive", untrusted=True)
191 allowed = ui.configlist("web", "allow_archive", untrusted=True)
193 for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]:
192 for i in [('zip', '.zip'), ('gz', '.tar.gz'), ('bz2', '.tar.bz2')]:
194 if i[0] in allowed or ui.configbool("web", "allow" + i[0],
193 if i[0] in allowed or ui.configbool("web", "allow" + i[0],
195 untrusted=True):
194 untrusted=True):
196 yield {"type" : i[0], "extension": i[1],
195 yield {"type" : i[0], "extension": i[1],
197 "node": nodeid, "url": url}
196 "node": nodeid, "url": url}
198
197
199 sortdefault = 'name', False
198 sortdefault = None, False
200 def entries(sortcolumn="", descending=False, subdir="", **map):
199 def entries(sortcolumn="", descending=False, subdir="", **map):
201
200
202 rows = []
201 rows = []
203 parity = paritygen(self.stripecount)
202 parity = paritygen(self.stripecount)
204 descend = self.ui.configbool('web', 'descend', True)
203 descend = self.ui.configbool('web', 'descend', True)
205 for name, path in self.repos:
204 for name, path in self.repos:
206
205
207 if not name.startswith(subdir):
206 if not name.startswith(subdir):
208 continue
207 continue
209 name = name[len(subdir):]
208 name = name[len(subdir):]
210 if not descend and '/' in name:
209 if not descend and '/' in name:
211 continue
210 continue
212
211
213 u = self.ui.copy()
212 u = self.ui.copy()
214 try:
213 try:
215 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
214 u.readconfig(os.path.join(path, '.hg', 'hgrc'))
216 except Exception, e:
215 except Exception, e:
217 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
216 u.warn(_('error reading %s/.hg/hgrc: %s\n') % (path, e))
218 continue
217 continue
219 def get(section, name, default=None):
218 def get(section, name, default=None):
220 return u.config(section, name, default, untrusted=True)
219 return u.config(section, name, default, untrusted=True)
221
220
222 if u.configbool("web", "hidden", untrusted=True):
221 if u.configbool("web", "hidden", untrusted=True):
223 continue
222 continue
224
223
225 if not self.read_allowed(u, req):
224 if not self.read_allowed(u, req):
226 continue
225 continue
227
226
228 parts = [name]
227 parts = [name]
229 if 'PATH_INFO' in req.env:
228 if 'PATH_INFO' in req.env:
230 parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
229 parts.insert(0, req.env['PATH_INFO'].rstrip('/'))
231 if req.env['SCRIPT_NAME']:
230 if req.env['SCRIPT_NAME']:
232 parts.insert(0, req.env['SCRIPT_NAME'])
231 parts.insert(0, req.env['SCRIPT_NAME'])
233 m = re.match('((?:https?://)?)(.*)', '/'.join(parts))
232 m = re.match('((?:https?://)?)(.*)', '/'.join(parts))
234 # squish repeated slashes out of the path component
233 # squish repeated slashes out of the path component
235 url = m.group(1) + re.sub('/+', '/', m.group(2)) + '/'
234 url = m.group(1) + re.sub('/+', '/', m.group(2)) + '/'
236
235
237 # update time with local timezone
236 # update time with local timezone
238 try:
237 try:
239 d = (get_mtime(path), util.makedate()[1])
238 d = (get_mtime(path), util.makedate()[1])
240 except OSError:
239 except OSError:
241 continue
240 continue
242
241
243 contact = get_contact(get)
242 contact = get_contact(get)
244 description = get("web", "description", "")
243 description = get("web", "description", "")
245 name = get("web", "name", name)
244 name = get("web", "name", name)
246 row = dict(contact=contact or "unknown",
245 row = dict(contact=contact or "unknown",
247 contact_sort=contact.upper() or "unknown",
246 contact_sort=contact.upper() or "unknown",
248 name=name,
247 name=name,
249 name_sort=name,
248 name_sort=name,
250 url=url,
249 url=url,
251 description=description or "unknown",
250 description=description or "unknown",
252 description_sort=description.upper() or "unknown",
251 description_sort=description.upper() or "unknown",
253 lastchange=d,
252 lastchange=d,
254 lastchange_sort=d[1]-d[0],
253 lastchange_sort=d[1]-d[0],
255 archives=archivelist(u, "tip", url))
254 archives=archivelist(u, "tip", url))
256 if (not sortcolumn or (sortcolumn, descending) == sortdefault):
255 if (not sortcolumn or (sortcolumn, descending) == sortdefault):
257 # fast path for unsorted output
256 # fast path for unsorted output
258 row['parity'] = parity.next()
257 row['parity'] = parity.next()
259 yield row
258 yield row
260 else:
259 else:
261 rows.append((row["%s_sort" % sortcolumn], row))
260 rows.append((row["%s_sort" % sortcolumn], row))
262 if rows:
261 if rows:
263 rows.sort()
262 rows.sort()
264 if descending:
263 if descending:
265 rows.reverse()
264 rows.reverse()
266 for key, row in rows:
265 for key, row in rows:
267 row['parity'] = parity.next()
266 row['parity'] = parity.next()
268 yield row
267 yield row
269
268
270 self.refresh()
269 self.refresh()
271 sortable = ["name", "description", "contact", "lastchange"]
270 sortable = ["name", "description", "contact", "lastchange"]
272 sortcolumn, descending = sortdefault
271 sortcolumn, descending = sortdefault
273 if 'sort' in req.form:
272 if 'sort' in req.form:
274 sortcolumn = req.form['sort'][0]
273 sortcolumn = req.form['sort'][0]
275 descending = sortcolumn.startswith('-')
274 descending = sortcolumn.startswith('-')
276 if descending:
275 if descending:
277 sortcolumn = sortcolumn[1:]
276 sortcolumn = sortcolumn[1:]
278 if sortcolumn not in sortable:
277 if sortcolumn not in sortable:
279 sortcolumn = ""
278 sortcolumn = ""
280
279
281 sort = [("sort_%s" % column,
280 sort = [("sort_%s" % column,
282 "%s%s" % ((not descending and column == sortcolumn)
281 "%s%s" % ((not descending and column == sortcolumn)
283 and "-" or "", column))
282 and "-" or "", column))
284 for column in sortable]
283 for column in sortable]
285
284
286 self.refresh()
285 self.refresh()
287 if self._baseurl is not None:
286 if self._baseurl is not None:
288 req.env['SCRIPT_NAME'] = self._baseurl
287 req.env['SCRIPT_NAME'] = self._baseurl
289
288
290 return tmpl("index", entries=entries, subdir=subdir,
289 return tmpl("index", entries=entries, subdir=subdir,
291 sortcolumn=sortcolumn, descending=descending,
290 sortcolumn=sortcolumn, descending=descending,
292 **dict(sort))
291 **dict(sort))
293
292
294 def templater(self, req):
293 def templater(self, req):
295
294
296 def header(**map):
295 def header(**map):
297 yield tmpl('header', encoding=encoding.encoding, **map)
296 yield tmpl('header', encoding=encoding.encoding, **map)
298
297
299 def footer(**map):
298 def footer(**map):
300 yield tmpl("footer", **map)
299 yield tmpl("footer", **map)
301
300
302 def motd(**map):
301 def motd(**map):
303 if self.motd is not None:
302 if self.motd is not None:
304 yield self.motd
303 yield self.motd
305 else:
304 else:
306 yield config('web', 'motd', '')
305 yield config('web', 'motd', '')
307
306
308 def config(section, name, default=None, untrusted=True):
307 def config(section, name, default=None, untrusted=True):
309 return self.ui.config(section, name, default, untrusted)
308 return self.ui.config(section, name, default, untrusted)
310
309
311 if self._baseurl is not None:
310 if self._baseurl is not None:
312 req.env['SCRIPT_NAME'] = self._baseurl
311 req.env['SCRIPT_NAME'] = self._baseurl
313
312
314 url = req.env.get('SCRIPT_NAME', '')
313 url = req.env.get('SCRIPT_NAME', '')
315 if not url.endswith('/'):
314 if not url.endswith('/'):
316 url += '/'
315 url += '/'
317
316
318 vars = {}
317 vars = {}
319 style = self.style
318 style = self.style
320 if 'style' in req.form:
319 if 'style' in req.form:
321 vars['style'] = style = req.form['style'][0]
320 vars['style'] = style = req.form['style'][0]
322 start = url[-1] == '?' and '&' or '?'
321 start = url[-1] == '?' and '&' or '?'
323 sessionvars = webutil.sessionvars(vars, start)
322 sessionvars = webutil.sessionvars(vars, start)
324
323
325 staticurl = config('web', 'staticurl') or url + 'static/'
324 staticurl = config('web', 'staticurl') or url + 'static/'
326 if not staticurl.endswith('/'):
325 if not staticurl.endswith('/'):
327 staticurl += '/'
326 staticurl += '/'
328
327
329 style = 'style' in req.form and req.form['style'][0] or self.style
328 style = 'style' in req.form and req.form['style'][0] or self.style
330 mapfile = templater.stylemap(style)
329 mapfile = templater.stylemap(style)
331 tmpl = templater.templater(mapfile,
330 tmpl = templater.templater(mapfile,
332 defaults={"header": header,
331 defaults={"header": header,
333 "footer": footer,
332 "footer": footer,
334 "motd": motd,
333 "motd": motd,
335 "url": url,
334 "url": url,
336 "staticurl": staticurl,
335 "staticurl": staticurl,
337 "sessionvars": sessionvars})
336 "sessionvars": sessionvars})
338 return tmpl
337 return tmpl
@@ -1,343 +1,343
1 adding a
1 adding a
2 adding b
2 adding b
3 adding d
3 adding d
4 adding c
4 adding c
5 % should give a 404 - file does not exist
5 % should give a 404 - file does not exist
6 404 Not Found
6 404 Not Found
7
7
8
8
9 error: bork@8580ff50825a: not found in manifest
9 error: bork@8580ff50825a: not found in manifest
10 % should succeed
10 % should succeed
11 200 Script output follows
11 200 Script output follows
12
12
13
13
14 /a/
14 /a/
15 /b/
15 /b/
16
16
17 200 Script output follows
17 200 Script output follows
18
18
19 a
19 a
20 200 Script output follows
20 200 Script output follows
21
21
22 b
22 b
23 % should give a 404 - repo is not published
23 % should give a 404 - repo is not published
24 404 Not Found
24 404 Not Found
25
25
26
26
27 error: repository c not found
27 error: repository c not found
28 % should succeed, slashy names
28 % should succeed, slashy names
29 200 Script output follows
29 200 Script output follows
30
30
31
31
32 /t/a/
32 /b/
33 /b/
33 /coll/a/
34 /coll/a/
34 /coll/a/.hg/patches/
35 /coll/a/.hg/patches/
35 /coll/b/
36 /coll/b/
36 /coll/c/
37 /coll/c/
37 /rcoll/a/
38 /rcoll/a/
38 /rcoll/a/.hg/patches/
39 /rcoll/a/.hg/patches/
39 /rcoll/b/
40 /rcoll/b/
40 /rcoll/b/d/
41 /rcoll/b/d/
41 /rcoll/c/
42 /rcoll/c/
42 /t/a/
43
43
44 200 Script output follows
44 200 Script output follows
45
45
46 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
46 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
47 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
47 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
48 <head>
48 <head>
49 <link rel="icon" href="/static/hgicon.png" type="image/png" />
49 <link rel="icon" href="/static/hgicon.png" type="image/png" />
50 <meta name="robots" content="index, nofollow" />
50 <meta name="robots" content="index, nofollow" />
51 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
51 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
52
52
53 <title>Mercurial repositories index</title>
53 <title>Mercurial repositories index</title>
54 </head>
54 </head>
55 <body>
55 <body>
56
56
57 <div class="container">
57 <div class="container">
58 <div class="menu">
58 <div class="menu">
59 <a href="http://mercurial.selenic.com/">
59 <a href="http://mercurial.selenic.com/">
60 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
60 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
61 </div>
61 </div>
62 <div class="main">
62 <div class="main">
63 <h2>Mercurial Repositories</h2>
63 <h2>Mercurial Repositories</h2>
64
64
65 <table class="bigtable">
65 <table class="bigtable">
66 <tr>
66 <tr>
67 <th><a href="?sort=-name">Name</a></th>
67 <th><a href="?sort=name">Name</a></th>
68 <th><a href="?sort=description">Description</a></th>
68 <th><a href="?sort=description">Description</a></th>
69 <th><a href="?sort=contact">Contact</a></th>
69 <th><a href="?sort=contact">Contact</a></th>
70 <th><a href="?sort=lastchange">Last change</a></th>
70 <th><a href="?sort=lastchange">Last change</a></th>
71 <th>&nbsp;</th>
71 <th>&nbsp;</th>
72 </tr>
72 </tr>
73
73
74 <tr class="parity0">
74 <tr class="parity0">
75 <td><a href="/b/?style=paper">b</a></td>
75 <td><a href="/t/a/?style=paper">t/a</a></td>
76 <td>unknown</td>
76 <td>unknown</td>
77 <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>
77 <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>
78 <td class="age">seconds ago</td>
78 <td class="age">seconds ago</td>
79 <td class="indexlinks"></td>
79 <td class="indexlinks"></td>
80 </tr>
80 </tr>
81
81
82 <tr class="parity1">
82 <tr class="parity1">
83 <td><a href="/coll/a/?style=paper">coll/a</a></td>
83 <td><a href="/b/?style=paper">b</a></td>
84 <td>unknown</td>
84 <td>unknown</td>
85 <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>
85 <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>
86 <td class="age">seconds ago</td>
86 <td class="age">seconds ago</td>
87 <td class="indexlinks"></td>
87 <td class="indexlinks"></td>
88 </tr>
88 </tr>
89
89
90 <tr class="parity0">
90 <tr class="parity0">
91 <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
91 <td><a href="/coll/a/?style=paper">coll/a</a></td>
92 <td>unknown</td>
92 <td>unknown</td>
93 <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>
93 <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>
94 <td class="age">seconds ago</td>
94 <td class="age">seconds ago</td>
95 <td class="indexlinks"></td>
95 <td class="indexlinks"></td>
96 </tr>
96 </tr>
97
97
98 <tr class="parity1">
98 <tr class="parity1">
99 <td><a href="/coll/b/?style=paper">coll/b</a></td>
99 <td><a href="/coll/a/.hg/patches/?style=paper">coll/a/.hg/patches</a></td>
100 <td>unknown</td>
100 <td>unknown</td>
101 <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>
101 <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>
102 <td class="age">seconds ago</td>
102 <td class="age">seconds ago</td>
103 <td class="indexlinks"></td>
103 <td class="indexlinks"></td>
104 </tr>
104 </tr>
105
105
106 <tr class="parity0">
106 <tr class="parity0">
107 <td><a href="/coll/c/?style=paper">coll/c</a></td>
107 <td><a href="/coll/b/?style=paper">coll/b</a></td>
108 <td>unknown</td>
108 <td>unknown</td>
109 <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>
109 <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>
110 <td class="age">seconds ago</td>
110 <td class="age">seconds ago</td>
111 <td class="indexlinks"></td>
111 <td class="indexlinks"></td>
112 </tr>
112 </tr>
113
113
114 <tr class="parity1">
114 <tr class="parity1">
115 <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
115 <td><a href="/coll/c/?style=paper">coll/c</a></td>
116 <td>unknown</td>
116 <td>unknown</td>
117 <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>
117 <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>
118 <td class="age">seconds ago</td>
118 <td class="age">seconds ago</td>
119 <td class="indexlinks"></td>
119 <td class="indexlinks"></td>
120 </tr>
120 </tr>
121
121
122 <tr class="parity0">
122 <tr class="parity0">
123 <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
123 <td><a href="/rcoll/a/?style=paper">rcoll/a</a></td>
124 <td>unknown</td>
124 <td>unknown</td>
125 <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>
125 <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>
126 <td class="age">seconds ago</td>
126 <td class="age">seconds ago</td>
127 <td class="indexlinks"></td>
127 <td class="indexlinks"></td>
128 </tr>
128 </tr>
129
129
130 <tr class="parity1">
130 <tr class="parity1">
131 <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
131 <td><a href="/rcoll/a/.hg/patches/?style=paper">rcoll/a/.hg/patches</a></td>
132 <td>unknown</td>
132 <td>unknown</td>
133 <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>
133 <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>
134 <td class="age">seconds ago</td>
134 <td class="age">seconds ago</td>
135 <td class="indexlinks"></td>
135 <td class="indexlinks"></td>
136 </tr>
136 </tr>
137
137
138 <tr class="parity0">
138 <tr class="parity0">
139 <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
139 <td><a href="/rcoll/b/?style=paper">rcoll/b</a></td>
140 <td>unknown</td>
140 <td>unknown</td>
141 <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>
141 <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>
142 <td class="age">seconds ago</td>
142 <td class="age">seconds ago</td>
143 <td class="indexlinks"></td>
143 <td class="indexlinks"></td>
144 </tr>
144 </tr>
145
145
146 <tr class="parity1">
146 <tr class="parity1">
147 <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
147 <td><a href="/rcoll/b/d/?style=paper">rcoll/b/d</a></td>
148 <td>unknown</td>
148 <td>unknown</td>
149 <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>
149 <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>
150 <td class="age">seconds ago</td>
150 <td class="age">seconds ago</td>
151 <td class="indexlinks"></td>
151 <td class="indexlinks"></td>
152 </tr>
152 </tr>
153
153
154 <tr class="parity0">
154 <tr class="parity0">
155 <td><a href="/t/a/?style=paper">t/a</a></td>
155 <td><a href="/rcoll/c/?style=paper">rcoll/c</a></td>
156 <td>unknown</td>
156 <td>unknown</td>
157 <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>
157 <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>
158 <td class="age">seconds ago</td>
158 <td class="age">seconds ago</td>
159 <td class="indexlinks"></td>
159 <td class="indexlinks"></td>
160 </tr>
160 </tr>
161
161
162 </table>
162 </table>
163 </div>
163 </div>
164 </div>
164 </div>
165
165
166
166
167 </body>
167 </body>
168 </html>
168 </html>
169
169
170 200 Script output follows
170 200 Script output follows
171
171
172
172
173 /t/a/
173 /t/a/
174
174
175 200 Script output follows
175 200 Script output follows
176
176
177
177
178 /t/a/
178 /t/a/
179
179
180 200 Script output follows
180 200 Script output follows
181
181
182 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
182 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
183 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
183 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
184 <head>
184 <head>
185 <link rel="icon" href="/static/hgicon.png" type="image/png" />
185 <link rel="icon" href="/static/hgicon.png" type="image/png" />
186 <meta name="robots" content="index, nofollow" />
186 <meta name="robots" content="index, nofollow" />
187 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
187 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
188
188
189 <title>Mercurial repositories index</title>
189 <title>Mercurial repositories index</title>
190 </head>
190 </head>
191 <body>
191 <body>
192
192
193 <div class="container">
193 <div class="container">
194 <div class="menu">
194 <div class="menu">
195 <a href="http://mercurial.selenic.com/">
195 <a href="http://mercurial.selenic.com/">
196 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
196 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial" /></a>
197 </div>
197 </div>
198 <div class="main">
198 <div class="main">
199 <h2>Mercurial Repositories</h2>
199 <h2>Mercurial Repositories</h2>
200
200
201 <table class="bigtable">
201 <table class="bigtable">
202 <tr>
202 <tr>
203 <th><a href="?sort=-name">Name</a></th>
203 <th><a href="?sort=name">Name</a></th>
204 <th><a href="?sort=description">Description</a></th>
204 <th><a href="?sort=description">Description</a></th>
205 <th><a href="?sort=contact">Contact</a></th>
205 <th><a href="?sort=contact">Contact</a></th>
206 <th><a href="?sort=lastchange">Last change</a></th>
206 <th><a href="?sort=lastchange">Last change</a></th>
207 <th>&nbsp;</th>
207 <th>&nbsp;</th>
208 </tr>
208 </tr>
209
209
210 <tr class="parity0">
210 <tr class="parity0">
211 <td><a href="/t/a/?style=paper">a</a></td>
211 <td><a href="/t/a/?style=paper">a</a></td>
212 <td>unknown</td>
212 <td>unknown</td>
213 <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>
213 <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>
214 <td class="age">seconds ago</td>
214 <td class="age">seconds ago</td>
215 <td class="indexlinks"></td>
215 <td class="indexlinks"></td>
216 </tr>
216 </tr>
217
217
218 </table>
218 </table>
219 </div>
219 </div>
220 </div>
220 </div>
221
221
222
222
223 </body>
223 </body>
224 </html>
224 </html>
225
225
226 200 Script output follows
226 200 Script output follows
227
227
228 <?xml version="1.0" encoding="ascii"?>
228 <?xml version="1.0" encoding="ascii"?>
229 <feed xmlns="http://127.0.0.1/2005/Atom">
229 <feed xmlns="http://127.0.0.1/2005/Atom">
230 <!-- Changelog -->
230 <!-- Changelog -->
231 <id>http://127.0.0.1/t/a/</id>
231 <id>http://127.0.0.1/t/a/</id>
232 <link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
232 <link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
233 <link rel="alternate" href="http://127.0.0.1/t/a/"/>
233 <link rel="alternate" href="http://127.0.0.1/t/a/"/>
234 <title>t/a Changelog</title>
234 <title>t/a Changelog</title>
235 <updated>1970-01-01T00:00:01+00:00</updated>
235 <updated>1970-01-01T00:00:01+00:00</updated>
236
236
237 <entry>
237 <entry>
238 <title>a</title>
238 <title>a</title>
239 <id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
239 <id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
240 <link href="http://127.0.0.1/t/a/rev/8580ff50825a"/>
240 <link href="http://127.0.0.1/t/a/rev/8580ff50825a"/>
241 <author>
241 <author>
242 <name>test</name>
242 <name>test</name>
243 <email>&#116;&#101;&#115;&#116;</email>
243 <email>&#116;&#101;&#115;&#116;</email>
244 </author>
244 </author>
245 <updated>1970-01-01T00:00:01+00:00</updated>
245 <updated>1970-01-01T00:00:01+00:00</updated>
246 <published>1970-01-01T00:00:01+00:00</published>
246 <published>1970-01-01T00:00:01+00:00</published>
247 <content type="xhtml">
247 <content type="xhtml">
248 <div xmlns="http://127.0.0.1/1999/xhtml">
248 <div xmlns="http://127.0.0.1/1999/xhtml">
249 <pre xml:space="preserve">a</pre>
249 <pre xml:space="preserve">a</pre>
250 </div>
250 </div>
251 </content>
251 </content>
252 </entry>
252 </entry>
253
253
254 </feed>
254 </feed>
255 200 Script output follows
255 200 Script output follows
256
256
257 <?xml version="1.0" encoding="ascii"?>
257 <?xml version="1.0" encoding="ascii"?>
258 <feed xmlns="http://127.0.0.1/2005/Atom">
258 <feed xmlns="http://127.0.0.1/2005/Atom">
259 <!-- Changelog -->
259 <!-- Changelog -->
260 <id>http://127.0.0.1/t/a/</id>
260 <id>http://127.0.0.1/t/a/</id>
261 <link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
261 <link rel="self" href="http://127.0.0.1/t/a/atom-log"/>
262 <link rel="alternate" href="http://127.0.0.1/t/a/"/>
262 <link rel="alternate" href="http://127.0.0.1/t/a/"/>
263 <title>t/a Changelog</title>
263 <title>t/a Changelog</title>
264 <updated>1970-01-01T00:00:01+00:00</updated>
264 <updated>1970-01-01T00:00:01+00:00</updated>
265
265
266 <entry>
266 <entry>
267 <title>a</title>
267 <title>a</title>
268 <id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
268 <id>http://127.0.0.1/t/a/#changeset-8580ff50825a50c8f716709acdf8de0deddcd6ab</id>
269 <link href="http://127.0.0.1/t/a/rev/8580ff50825a"/>
269 <link href="http://127.0.0.1/t/a/rev/8580ff50825a"/>
270 <author>
270 <author>
271 <name>test</name>
271 <name>test</name>
272 <email>&#116;&#101;&#115;&#116;</email>
272 <email>&#116;&#101;&#115;&#116;</email>
273 </author>
273 </author>
274 <updated>1970-01-01T00:00:01+00:00</updated>
274 <updated>1970-01-01T00:00:01+00:00</updated>
275 <published>1970-01-01T00:00:01+00:00</published>
275 <published>1970-01-01T00:00:01+00:00</published>
276 <content type="xhtml">
276 <content type="xhtml">
277 <div xmlns="http://127.0.0.1/1999/xhtml">
277 <div xmlns="http://127.0.0.1/1999/xhtml">
278 <pre xml:space="preserve">a</pre>
278 <pre xml:space="preserve">a</pre>
279 </div>
279 </div>
280 </content>
280 </content>
281 </entry>
281 </entry>
282
282
283 </feed>
283 </feed>
284 200 Script output follows
284 200 Script output follows
285
285
286 a
286 a
287 200 Script output follows
287 200 Script output follows
288
288
289
289
290 /coll/a/
290 /coll/a/
291 /coll/a/.hg/patches/
291 /coll/a/.hg/patches/
292 /coll/b/
292 /coll/b/
293 /coll/c/
293 /coll/c/
294
294
295 200 Script output follows
295 200 Script output follows
296
296
297 a
297 a
298 200 Script output follows
298 200 Script output follows
299
299
300
300
301 /rcoll/a/
301 /rcoll/a/
302 /rcoll/a/.hg/patches/
302 /rcoll/a/.hg/patches/
303 /rcoll/b/
303 /rcoll/b/
304 /rcoll/b/d/
304 /rcoll/b/d/
305 /rcoll/c/
305 /rcoll/c/
306
306
307 200 Script output follows
307 200 Script output follows
308
308
309 d
309 d
310 % test descend = False
310 % test descend = False
311 200 Script output follows
311 200 Script output follows
312
312
313
313
314 /c/
314 /c/
315
315
316 200 Script output follows
316 200 Script output follows
317
317
318
318
319 /t/a/
319 /t/a/
320 /t/b/
320 /t/b/
321
321
322 % collections: should succeed
322 % collections: should succeed
323 200 Script output follows
323 200 Script output follows
324
324
325
325
326 http://hg.example.com:8080/a/
326 http://hg.example.com:8080/a/
327 http://hg.example.com:8080/a/.hg/patches/
327 http://hg.example.com:8080/a/.hg/patches/
328 http://hg.example.com:8080/b/
328 http://hg.example.com:8080/b/
329 http://hg.example.com:8080/c/
329 http://hg.example.com:8080/c/
330
330
331 200 Script output follows
331 200 Script output follows
332
332
333 a
333 a
334 200 Script output follows
334 200 Script output follows
335
335
336 b
336 b
337 200 Script output follows
337 200 Script output follows
338
338
339 c
339 c
340 % paths errors 1
340 % paths errors 1
341 % paths errors 2
341 % paths errors 2
342 % paths errors 3
342 % paths errors 3
343 % collections errors
343 % collections errors
General Comments 0
You need to be logged in to leave comments. Login now