##// END OF EJS Templates
wireproto: allow unbundle with hashed heads parameter (issue2126)...
Shuhei Takahashi -
r13942:88f0e41d default
parent child Browse files
Show More
@@ -0,0 +1,31 b''
1
2 Test wire protocol unbundle with hashed heads (capability: unbundlehash)
3
4 Create a remote repository.
5
6 $ hg init remote
7 $ hg serve -R remote --config web.push_ssl=False --config web.allow_push=* -p $HGPORT -d --pid-file=hg1.pid -E error.log -A access.log
8 $ cat hg1.pid >> $DAEMON_PIDS
9
10 Clone the repository and push a change.
11
12 $ hg clone http://localhost:$HGPORT/ local
13 no changes found
14 updating to branch default
15 0 files updated, 0 files merged, 0 files removed, 0 files unresolved
16 $ touch local/README
17 $ hg ci -R local -A -m hoge
18 adding README
19 $ hg push -R local
20 pushing to http://localhost:$HGPORT/
21 searching for changes
22 remote: adding changesets
23 remote: adding manifests
24 remote: adding file changes
25 remote: added 1 changesets with 1 changes to 1 files
26
27 Ensure hashed heads format is used.
28 The hash here is always the same since the remote repository only has the null head.
29
30 $ cat access.log | grep unbundle
31 * - - [*] "POST /?cmd=unbundle&heads=686173686564+6768033e216468247bd031a0a2d9876d79818f8f HTTP/1.1" 200 - (glob)
@@ -1,411 +1,420 b''
1 # wireproto.py - generic wire protocol support functions
1 # wireproto.py - generic wire protocol support functions
2 #
2 #
3 # Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
3 # Copyright 2005-2010 Matt Mackall <mpm@selenic.com>
4 #
4 #
5 # This software may be used and distributed according to the terms of the
5 # This software may be used and distributed according to the terms of the
6 # GNU General Public License version 2 or any later version.
6 # GNU General Public License version 2 or any later version.
7
7
8 import urllib, tempfile, os, sys
8 import urllib, tempfile, os, sys
9 from i18n import _
9 from i18n import _
10 from node import bin, hex
10 from node import bin, hex
11 import changegroup as changegroupmod
11 import changegroup as changegroupmod
12 import repo, error, encoding, util, store
12 import repo, error, encoding, util, store
13 import pushkey as pushkeymod
13 import pushkey as pushkeymod
14
14
15 # list of nodes encoding / decoding
15 # list of nodes encoding / decoding
16
16
17 def decodelist(l, sep=' '):
17 def decodelist(l, sep=' '):
18 if l:
18 if l:
19 return map(bin, l.split(sep))
19 return map(bin, l.split(sep))
20 return []
20 return []
21
21
22 def encodelist(l, sep=' '):
22 def encodelist(l, sep=' '):
23 return sep.join(map(hex, l))
23 return sep.join(map(hex, l))
24
24
25 # client side
25 # client side
26
26
27 class wirerepository(repo.repository):
27 class wirerepository(repo.repository):
28 def lookup(self, key):
28 def lookup(self, key):
29 self.requirecap('lookup', _('look up remote revision'))
29 self.requirecap('lookup', _('look up remote revision'))
30 d = self._call("lookup", key=encoding.fromlocal(key))
30 d = self._call("lookup", key=encoding.fromlocal(key))
31 success, data = d[:-1].split(" ", 1)
31 success, data = d[:-1].split(" ", 1)
32 if int(success):
32 if int(success):
33 return bin(data)
33 return bin(data)
34 self._abort(error.RepoError(data))
34 self._abort(error.RepoError(data))
35
35
36 def heads(self):
36 def heads(self):
37 d = self._call("heads")
37 d = self._call("heads")
38 try:
38 try:
39 return decodelist(d[:-1])
39 return decodelist(d[:-1])
40 except ValueError:
40 except ValueError:
41 self._abort(error.ResponseError(_("unexpected response:"), d))
41 self._abort(error.ResponseError(_("unexpected response:"), d))
42
42
43 def known(self, nodes):
43 def known(self, nodes):
44 n = encodelist(nodes)
44 n = encodelist(nodes)
45 d = self._call("known", nodes=n)
45 d = self._call("known", nodes=n)
46 try:
46 try:
47 return [bool(int(f)) for f in d]
47 return [bool(int(f)) for f in d]
48 except ValueError:
48 except ValueError:
49 self._abort(error.ResponseError(_("unexpected response:"), d))
49 self._abort(error.ResponseError(_("unexpected response:"), d))
50
50
51 def branchmap(self):
51 def branchmap(self):
52 d = self._call("branchmap")
52 d = self._call("branchmap")
53 try:
53 try:
54 branchmap = {}
54 branchmap = {}
55 for branchpart in d.splitlines():
55 for branchpart in d.splitlines():
56 branchname, branchheads = branchpart.split(' ', 1)
56 branchname, branchheads = branchpart.split(' ', 1)
57 branchname = encoding.tolocal(urllib.unquote(branchname))
57 branchname = encoding.tolocal(urllib.unquote(branchname))
58 branchheads = decodelist(branchheads)
58 branchheads = decodelist(branchheads)
59 branchmap[branchname] = branchheads
59 branchmap[branchname] = branchheads
60 return branchmap
60 return branchmap
61 except TypeError:
61 except TypeError:
62 self._abort(error.ResponseError(_("unexpected response:"), d))
62 self._abort(error.ResponseError(_("unexpected response:"), d))
63
63
64 def branches(self, nodes):
64 def branches(self, nodes):
65 n = encodelist(nodes)
65 n = encodelist(nodes)
66 d = self._call("branches", nodes=n)
66 d = self._call("branches", nodes=n)
67 try:
67 try:
68 br = [tuple(decodelist(b)) for b in d.splitlines()]
68 br = [tuple(decodelist(b)) for b in d.splitlines()]
69 return br
69 return br
70 except ValueError:
70 except ValueError:
71 self._abort(error.ResponseError(_("unexpected response:"), d))
71 self._abort(error.ResponseError(_("unexpected response:"), d))
72
72
73 def between(self, pairs):
73 def between(self, pairs):
74 batch = 8 # avoid giant requests
74 batch = 8 # avoid giant requests
75 r = []
75 r = []
76 for i in xrange(0, len(pairs), batch):
76 for i in xrange(0, len(pairs), batch):
77 n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]])
77 n = " ".join([encodelist(p, '-') for p in pairs[i:i + batch]])
78 d = self._call("between", pairs=n)
78 d = self._call("between", pairs=n)
79 try:
79 try:
80 r.extend(l and decodelist(l) or [] for l in d.splitlines())
80 r.extend(l and decodelist(l) or [] for l in d.splitlines())
81 except ValueError:
81 except ValueError:
82 self._abort(error.ResponseError(_("unexpected response:"), d))
82 self._abort(error.ResponseError(_("unexpected response:"), d))
83 return r
83 return r
84
84
85 def pushkey(self, namespace, key, old, new):
85 def pushkey(self, namespace, key, old, new):
86 if not self.capable('pushkey'):
86 if not self.capable('pushkey'):
87 return False
87 return False
88 d = self._call("pushkey",
88 d = self._call("pushkey",
89 namespace=encoding.fromlocal(namespace),
89 namespace=encoding.fromlocal(namespace),
90 key=encoding.fromlocal(key),
90 key=encoding.fromlocal(key),
91 old=encoding.fromlocal(old),
91 old=encoding.fromlocal(old),
92 new=encoding.fromlocal(new))
92 new=encoding.fromlocal(new))
93 try:
93 try:
94 d = bool(int(d))
94 d = bool(int(d))
95 except ValueError:
95 except ValueError:
96 raise error.ResponseError(
96 raise error.ResponseError(
97 _('push failed (unexpected response):'), d)
97 _('push failed (unexpected response):'), d)
98 return d
98 return d
99
99
100 def listkeys(self, namespace):
100 def listkeys(self, namespace):
101 if not self.capable('pushkey'):
101 if not self.capable('pushkey'):
102 return {}
102 return {}
103 d = self._call("listkeys", namespace=encoding.fromlocal(namespace))
103 d = self._call("listkeys", namespace=encoding.fromlocal(namespace))
104 r = {}
104 r = {}
105 for l in d.splitlines():
105 for l in d.splitlines():
106 k, v = l.split('\t')
106 k, v = l.split('\t')
107 r[encoding.tolocal(k)] = encoding.tolocal(v)
107 r[encoding.tolocal(k)] = encoding.tolocal(v)
108 return r
108 return r
109
109
110 def stream_out(self):
110 def stream_out(self):
111 return self._callstream('stream_out')
111 return self._callstream('stream_out')
112
112
113 def changegroup(self, nodes, kind):
113 def changegroup(self, nodes, kind):
114 n = encodelist(nodes)
114 n = encodelist(nodes)
115 f = self._callstream("changegroup", roots=n)
115 f = self._callstream("changegroup", roots=n)
116 return changegroupmod.unbundle10(self._decompress(f), 'UN')
116 return changegroupmod.unbundle10(self._decompress(f), 'UN')
117
117
118 def changegroupsubset(self, bases, heads, kind):
118 def changegroupsubset(self, bases, heads, kind):
119 self.requirecap('changegroupsubset', _('look up remote changes'))
119 self.requirecap('changegroupsubset', _('look up remote changes'))
120 bases = encodelist(bases)
120 bases = encodelist(bases)
121 heads = encodelist(heads)
121 heads = encodelist(heads)
122 f = self._callstream("changegroupsubset",
122 f = self._callstream("changegroupsubset",
123 bases=bases, heads=heads)
123 bases=bases, heads=heads)
124 return changegroupmod.unbundle10(self._decompress(f), 'UN')
124 return changegroupmod.unbundle10(self._decompress(f), 'UN')
125
125
126 def getbundle(self, source, heads=None, common=None):
126 def getbundle(self, source, heads=None, common=None):
127 self.requirecap('getbundle', _('look up remote changes'))
127 self.requirecap('getbundle', _('look up remote changes'))
128 opts = {}
128 opts = {}
129 if heads is not None:
129 if heads is not None:
130 opts['heads'] = encodelist(heads)
130 opts['heads'] = encodelist(heads)
131 if common is not None:
131 if common is not None:
132 opts['common'] = encodelist(common)
132 opts['common'] = encodelist(common)
133 f = self._callstream("getbundle", **opts)
133 f = self._callstream("getbundle", **opts)
134 return changegroupmod.unbundle10(self._decompress(f), 'UN')
134 return changegroupmod.unbundle10(self._decompress(f), 'UN')
135
135
136 def unbundle(self, cg, heads, source):
136 def unbundle(self, cg, heads, source):
137 '''Send cg (a readable file-like object representing the
137 '''Send cg (a readable file-like object representing the
138 changegroup to push, typically a chunkbuffer object) to the
138 changegroup to push, typically a chunkbuffer object) to the
139 remote server as a bundle. Return an integer indicating the
139 remote server as a bundle. Return an integer indicating the
140 result of the push (see localrepository.addchangegroup()).'''
140 result of the push (see localrepository.addchangegroup()).'''
141
141
142 ret, output = self._callpush("unbundle", cg, heads=encodelist(heads))
142 if self.capable('unbundlehash'):
143 heads = encodelist(['hashed',
144 util.sha1(''.join(sorted(heads))).digest()])
145 else:
146 heads = encodelist(heads)
147
148 ret, output = self._callpush("unbundle", cg, heads=heads)
143 if ret == "":
149 if ret == "":
144 raise error.ResponseError(
150 raise error.ResponseError(
145 _('push failed:'), output)
151 _('push failed:'), output)
146 try:
152 try:
147 ret = int(ret)
153 ret = int(ret)
148 except ValueError:
154 except ValueError:
149 raise error.ResponseError(
155 raise error.ResponseError(
150 _('push failed (unexpected response):'), ret)
156 _('push failed (unexpected response):'), ret)
151
157
152 for l in output.splitlines(True):
158 for l in output.splitlines(True):
153 self.ui.status(_('remote: '), l)
159 self.ui.status(_('remote: '), l)
154 return ret
160 return ret
155
161
156 def debugwireargs(self, one, two, three=None, four=None):
162 def debugwireargs(self, one, two, three=None, four=None):
157 # don't pass optional arguments left at their default value
163 # don't pass optional arguments left at their default value
158 opts = {}
164 opts = {}
159 if three is not None:
165 if three is not None:
160 opts['three'] = three
166 opts['three'] = three
161 if four is not None:
167 if four is not None:
162 opts['four'] = four
168 opts['four'] = four
163 return self._call('debugwireargs', one=one, two=two, **opts)
169 return self._call('debugwireargs', one=one, two=two, **opts)
164
170
165 # server side
171 # server side
166
172
167 class streamres(object):
173 class streamres(object):
168 def __init__(self, gen):
174 def __init__(self, gen):
169 self.gen = gen
175 self.gen = gen
170
176
171 class pushres(object):
177 class pushres(object):
172 def __init__(self, res):
178 def __init__(self, res):
173 self.res = res
179 self.res = res
174
180
175 class pusherr(object):
181 class pusherr(object):
176 def __init__(self, res):
182 def __init__(self, res):
177 self.res = res
183 self.res = res
178
184
179 def dispatch(repo, proto, command):
185 def dispatch(repo, proto, command):
180 func, spec = commands[command]
186 func, spec = commands[command]
181 args = proto.getargs(spec)
187 args = proto.getargs(spec)
182 return func(repo, proto, *args)
188 return func(repo, proto, *args)
183
189
184 def options(cmd, keys, others):
190 def options(cmd, keys, others):
185 opts = {}
191 opts = {}
186 for k in keys:
192 for k in keys:
187 if k in others:
193 if k in others:
188 opts[k] = others[k]
194 opts[k] = others[k]
189 del others[k]
195 del others[k]
190 if others:
196 if others:
191 sys.stderr.write("abort: %s got unexpected arguments %s\n"
197 sys.stderr.write("abort: %s got unexpected arguments %s\n"
192 % (cmd, ",".join(others)))
198 % (cmd, ",".join(others)))
193 return opts
199 return opts
194
200
195 def between(repo, proto, pairs):
201 def between(repo, proto, pairs):
196 pairs = [decodelist(p, '-') for p in pairs.split(" ")]
202 pairs = [decodelist(p, '-') for p in pairs.split(" ")]
197 r = []
203 r = []
198 for b in repo.between(pairs):
204 for b in repo.between(pairs):
199 r.append(encodelist(b) + "\n")
205 r.append(encodelist(b) + "\n")
200 return "".join(r)
206 return "".join(r)
201
207
202 def branchmap(repo, proto):
208 def branchmap(repo, proto):
203 branchmap = repo.branchmap()
209 branchmap = repo.branchmap()
204 heads = []
210 heads = []
205 for branch, nodes in branchmap.iteritems():
211 for branch, nodes in branchmap.iteritems():
206 branchname = urllib.quote(encoding.fromlocal(branch))
212 branchname = urllib.quote(encoding.fromlocal(branch))
207 branchnodes = encodelist(nodes)
213 branchnodes = encodelist(nodes)
208 heads.append('%s %s' % (branchname, branchnodes))
214 heads.append('%s %s' % (branchname, branchnodes))
209 return '\n'.join(heads)
215 return '\n'.join(heads)
210
216
211 def branches(repo, proto, nodes):
217 def branches(repo, proto, nodes):
212 nodes = decodelist(nodes)
218 nodes = decodelist(nodes)
213 r = []
219 r = []
214 for b in repo.branches(nodes):
220 for b in repo.branches(nodes):
215 r.append(encodelist(b) + "\n")
221 r.append(encodelist(b) + "\n")
216 return "".join(r)
222 return "".join(r)
217
223
218 def capabilities(repo, proto):
224 def capabilities(repo, proto):
219 caps = 'lookup changegroupsubset branchmap pushkey known getbundle'.split()
225 caps = ('lookup changegroupsubset branchmap pushkey known getbundle '
226 'unbundlehash').split()
220 if _allowstream(repo.ui):
227 if _allowstream(repo.ui):
221 requiredformats = repo.requirements & repo.supportedformats
228 requiredformats = repo.requirements & repo.supportedformats
222 # if our local revlogs are just revlogv1, add 'stream' cap
229 # if our local revlogs are just revlogv1, add 'stream' cap
223 if not requiredformats - set(('revlogv1',)):
230 if not requiredformats - set(('revlogv1',)):
224 caps.append('stream')
231 caps.append('stream')
225 # otherwise, add 'streamreqs' detailing our local revlog format
232 # otherwise, add 'streamreqs' detailing our local revlog format
226 else:
233 else:
227 caps.append('streamreqs=%s' % ','.join(requiredformats))
234 caps.append('streamreqs=%s' % ','.join(requiredformats))
228 caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority))
235 caps.append('unbundle=%s' % ','.join(changegroupmod.bundlepriority))
229 return ' '.join(caps)
236 return ' '.join(caps)
230
237
231 def changegroup(repo, proto, roots):
238 def changegroup(repo, proto, roots):
232 nodes = decodelist(roots)
239 nodes = decodelist(roots)
233 cg = repo.changegroup(nodes, 'serve')
240 cg = repo.changegroup(nodes, 'serve')
234 return streamres(proto.groupchunks(cg))
241 return streamres(proto.groupchunks(cg))
235
242
236 def changegroupsubset(repo, proto, bases, heads):
243 def changegroupsubset(repo, proto, bases, heads):
237 bases = decodelist(bases)
244 bases = decodelist(bases)
238 heads = decodelist(heads)
245 heads = decodelist(heads)
239 cg = repo.changegroupsubset(bases, heads, 'serve')
246 cg = repo.changegroupsubset(bases, heads, 'serve')
240 return streamres(proto.groupchunks(cg))
247 return streamres(proto.groupchunks(cg))
241
248
242 def debugwireargs(repo, proto, one, two, others):
249 def debugwireargs(repo, proto, one, two, others):
243 # only accept optional args from the known set
250 # only accept optional args from the known set
244 opts = options('debugwireargs', ['three', 'four'], others)
251 opts = options('debugwireargs', ['three', 'four'], others)
245 return repo.debugwireargs(one, two, **opts)
252 return repo.debugwireargs(one, two, **opts)
246
253
247 def getbundle(repo, proto, others):
254 def getbundle(repo, proto, others):
248 opts = options('getbundle', ['heads', 'common'], others)
255 opts = options('getbundle', ['heads', 'common'], others)
249 for k, v in opts.iteritems():
256 for k, v in opts.iteritems():
250 opts[k] = decodelist(v)
257 opts[k] = decodelist(v)
251 cg = repo.getbundle('serve', **opts)
258 cg = repo.getbundle('serve', **opts)
252 return streamres(proto.groupchunks(cg))
259 return streamres(proto.groupchunks(cg))
253
260
254 def heads(repo, proto):
261 def heads(repo, proto):
255 h = repo.heads()
262 h = repo.heads()
256 return encodelist(h) + "\n"
263 return encodelist(h) + "\n"
257
264
258 def hello(repo, proto):
265 def hello(repo, proto):
259 '''the hello command returns a set of lines describing various
266 '''the hello command returns a set of lines describing various
260 interesting things about the server, in an RFC822-like format.
267 interesting things about the server, in an RFC822-like format.
261 Currently the only one defined is "capabilities", which
268 Currently the only one defined is "capabilities", which
262 consists of a line in the form:
269 consists of a line in the form:
263
270
264 capabilities: space separated list of tokens
271 capabilities: space separated list of tokens
265 '''
272 '''
266 return "capabilities: %s\n" % (capabilities(repo, proto))
273 return "capabilities: %s\n" % (capabilities(repo, proto))
267
274
268 def listkeys(repo, proto, namespace):
275 def listkeys(repo, proto, namespace):
269 d = pushkeymod.list(repo, encoding.tolocal(namespace)).items()
276 d = pushkeymod.list(repo, encoding.tolocal(namespace)).items()
270 t = '\n'.join(['%s\t%s' % (encoding.fromlocal(k), encoding.fromlocal(v))
277 t = '\n'.join(['%s\t%s' % (encoding.fromlocal(k), encoding.fromlocal(v))
271 for k, v in d])
278 for k, v in d])
272 return t
279 return t
273
280
274 def lookup(repo, proto, key):
281 def lookup(repo, proto, key):
275 try:
282 try:
276 r = hex(repo.lookup(encoding.tolocal(key)))
283 r = hex(repo.lookup(encoding.tolocal(key)))
277 success = 1
284 success = 1
278 except Exception, inst:
285 except Exception, inst:
279 r = str(inst)
286 r = str(inst)
280 success = 0
287 success = 0
281 return "%s %s\n" % (success, r)
288 return "%s %s\n" % (success, r)
282
289
283 def known(repo, proto, nodes):
290 def known(repo, proto, nodes):
284 return ''.join(b and "1" or "0" for b in repo.known(decodelist(nodes)))
291 return ''.join(b and "1" or "0" for b in repo.known(decodelist(nodes)))
285
292
286 def pushkey(repo, proto, namespace, key, old, new):
293 def pushkey(repo, proto, namespace, key, old, new):
287 # compatibility with pre-1.8 clients which were accidentally
294 # compatibility with pre-1.8 clients which were accidentally
288 # sending raw binary nodes rather than utf-8-encoded hex
295 # sending raw binary nodes rather than utf-8-encoded hex
289 if len(new) == 20 and new.encode('string-escape') != new:
296 if len(new) == 20 and new.encode('string-escape') != new:
290 # looks like it could be a binary node
297 # looks like it could be a binary node
291 try:
298 try:
292 u = new.decode('utf-8')
299 u = new.decode('utf-8')
293 new = encoding.tolocal(new) # but cleanly decodes as UTF-8
300 new = encoding.tolocal(new) # but cleanly decodes as UTF-8
294 except UnicodeDecodeError:
301 except UnicodeDecodeError:
295 pass # binary, leave unmodified
302 pass # binary, leave unmodified
296 else:
303 else:
297 new = encoding.tolocal(new) # normal path
304 new = encoding.tolocal(new) # normal path
298
305
299 r = pushkeymod.push(repo,
306 r = pushkeymod.push(repo,
300 encoding.tolocal(namespace), encoding.tolocal(key),
307 encoding.tolocal(namespace), encoding.tolocal(key),
301 encoding.tolocal(old), new)
308 encoding.tolocal(old), new)
302 return '%s\n' % int(r)
309 return '%s\n' % int(r)
303
310
304 def _allowstream(ui):
311 def _allowstream(ui):
305 return ui.configbool('server', 'uncompressed', True, untrusted=True)
312 return ui.configbool('server', 'uncompressed', True, untrusted=True)
306
313
307 def stream(repo, proto):
314 def stream(repo, proto):
308 '''If the server supports streaming clone, it advertises the "stream"
315 '''If the server supports streaming clone, it advertises the "stream"
309 capability with a value representing the version and flags of the repo
316 capability with a value representing the version and flags of the repo
310 it is serving. Client checks to see if it understands the format.
317 it is serving. Client checks to see if it understands the format.
311
318
312 The format is simple: the server writes out a line with the amount
319 The format is simple: the server writes out a line with the amount
313 of files, then the total amount of bytes to be transfered (separated
320 of files, then the total amount of bytes to be transfered (separated
314 by a space). Then, for each file, the server first writes the filename
321 by a space). Then, for each file, the server first writes the filename
315 and filesize (separated by the null character), then the file contents.
322 and filesize (separated by the null character), then the file contents.
316 '''
323 '''
317
324
318 if not _allowstream(repo.ui):
325 if not _allowstream(repo.ui):
319 return '1\n'
326 return '1\n'
320
327
321 entries = []
328 entries = []
322 total_bytes = 0
329 total_bytes = 0
323 try:
330 try:
324 # get consistent snapshot of repo, lock during scan
331 # get consistent snapshot of repo, lock during scan
325 lock = repo.lock()
332 lock = repo.lock()
326 try:
333 try:
327 repo.ui.debug('scanning\n')
334 repo.ui.debug('scanning\n')
328 for name, ename, size in repo.store.walk():
335 for name, ename, size in repo.store.walk():
329 entries.append((name, size))
336 entries.append((name, size))
330 total_bytes += size
337 total_bytes += size
331 finally:
338 finally:
332 lock.release()
339 lock.release()
333 except error.LockError:
340 except error.LockError:
334 return '2\n' # error: 2
341 return '2\n' # error: 2
335
342
336 def streamer(repo, entries, total):
343 def streamer(repo, entries, total):
337 '''stream out all metadata files in repository.'''
344 '''stream out all metadata files in repository.'''
338 yield '0\n' # success
345 yield '0\n' # success
339 repo.ui.debug('%d files, %d bytes to transfer\n' %
346 repo.ui.debug('%d files, %d bytes to transfer\n' %
340 (len(entries), total_bytes))
347 (len(entries), total_bytes))
341 yield '%d %d\n' % (len(entries), total_bytes)
348 yield '%d %d\n' % (len(entries), total_bytes)
342 for name, size in entries:
349 for name, size in entries:
343 repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
350 repo.ui.debug('sending %s (%d bytes)\n' % (name, size))
344 # partially encode name over the wire for backwards compat
351 # partially encode name over the wire for backwards compat
345 yield '%s\0%d\n' % (store.encodedir(name), size)
352 yield '%s\0%d\n' % (store.encodedir(name), size)
346 for chunk in util.filechunkiter(repo.sopener(name), limit=size):
353 for chunk in util.filechunkiter(repo.sopener(name), limit=size):
347 yield chunk
354 yield chunk
348
355
349 return streamres(streamer(repo, entries, total_bytes))
356 return streamres(streamer(repo, entries, total_bytes))
350
357
351 def unbundle(repo, proto, heads):
358 def unbundle(repo, proto, heads):
352 their_heads = decodelist(heads)
359 their_heads = decodelist(heads)
353
360
354 def check_heads():
361 def check_heads():
355 heads = repo.heads()
362 heads = repo.heads()
356 return their_heads == ['force'] or their_heads == heads
363 heads_hash = util.sha1(''.join(sorted(heads))).digest()
364 return (their_heads == ['force'] or their_heads == heads or
365 their_heads == ['hashed', heads_hash])
357
366
358 proto.redirect()
367 proto.redirect()
359
368
360 # fail early if possible
369 # fail early if possible
361 if not check_heads():
370 if not check_heads():
362 return pusherr('unsynced changes')
371 return pusherr('unsynced changes')
363
372
364 # write bundle data to temporary file because it can be big
373 # write bundle data to temporary file because it can be big
365 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
374 fd, tempname = tempfile.mkstemp(prefix='hg-unbundle-')
366 fp = os.fdopen(fd, 'wb+')
375 fp = os.fdopen(fd, 'wb+')
367 r = 0
376 r = 0
368 try:
377 try:
369 proto.getfile(fp)
378 proto.getfile(fp)
370 lock = repo.lock()
379 lock = repo.lock()
371 try:
380 try:
372 if not check_heads():
381 if not check_heads():
373 # someone else committed/pushed/unbundled while we
382 # someone else committed/pushed/unbundled while we
374 # were transferring data
383 # were transferring data
375 return pusherr('unsynced changes')
384 return pusherr('unsynced changes')
376
385
377 # push can proceed
386 # push can proceed
378 fp.seek(0)
387 fp.seek(0)
379 gen = changegroupmod.readbundle(fp, None)
388 gen = changegroupmod.readbundle(fp, None)
380
389
381 try:
390 try:
382 r = repo.addchangegroup(gen, 'serve', proto._client(),
391 r = repo.addchangegroup(gen, 'serve', proto._client(),
383 lock=lock)
392 lock=lock)
384 except util.Abort, inst:
393 except util.Abort, inst:
385 sys.stderr.write("abort: %s\n" % inst)
394 sys.stderr.write("abort: %s\n" % inst)
386 finally:
395 finally:
387 lock.release()
396 lock.release()
388 return pushres(r)
397 return pushres(r)
389
398
390 finally:
399 finally:
391 fp.close()
400 fp.close()
392 os.unlink(tempname)
401 os.unlink(tempname)
393
402
394 commands = {
403 commands = {
395 'between': (between, 'pairs'),
404 'between': (between, 'pairs'),
396 'branchmap': (branchmap, ''),
405 'branchmap': (branchmap, ''),
397 'branches': (branches, 'nodes'),
406 'branches': (branches, 'nodes'),
398 'capabilities': (capabilities, ''),
407 'capabilities': (capabilities, ''),
399 'changegroup': (changegroup, 'roots'),
408 'changegroup': (changegroup, 'roots'),
400 'changegroupsubset': (changegroupsubset, 'bases heads'),
409 'changegroupsubset': (changegroupsubset, 'bases heads'),
401 'debugwireargs': (debugwireargs, 'one two *'),
410 'debugwireargs': (debugwireargs, 'one two *'),
402 'getbundle': (getbundle, '*'),
411 'getbundle': (getbundle, '*'),
403 'heads': (heads, ''),
412 'heads': (heads, ''),
404 'hello': (hello, ''),
413 'hello': (hello, ''),
405 'known': (known, 'nodes'),
414 'known': (known, 'nodes'),
406 'listkeys': (listkeys, 'namespace'),
415 'listkeys': (listkeys, 'namespace'),
407 'lookup': (lookup, 'key'),
416 'lookup': (lookup, 'key'),
408 'pushkey': (pushkey, 'namespace key old new'),
417 'pushkey': (pushkey, 'namespace key old new'),
409 'stream_out': (stream, ''),
418 'stream_out': (stream, ''),
410 'unbundle': (unbundle, 'heads'),
419 'unbundle': (unbundle, 'heads'),
411 }
420 }
@@ -1,1119 +1,1119 b''
1 An attempt at more fully testing the hgweb web interface.
1 An attempt at more fully testing the hgweb web interface.
2 The following things are tested elsewhere and are therefore omitted:
2 The following things are tested elsewhere and are therefore omitted:
3 - archive, tested in test-archive
3 - archive, tested in test-archive
4 - unbundle, tested in test-push-http
4 - unbundle, tested in test-push-http
5 - changegroupsubset, tested in test-pull
5 - changegroupsubset, tested in test-pull
6
6
7 Set up the repo
7 Set up the repo
8
8
9 $ hg init test
9 $ hg init test
10 $ cd test
10 $ cd test
11 $ mkdir da
11 $ mkdir da
12 $ echo foo > da/foo
12 $ echo foo > da/foo
13 $ echo foo > foo
13 $ echo foo > foo
14 $ hg ci -Ambase
14 $ hg ci -Ambase
15 adding da/foo
15 adding da/foo
16 adding foo
16 adding foo
17 $ hg tag 1.0
17 $ hg tag 1.0
18 $ hg bookmark something
18 $ hg bookmark something
19 $ hg bookmark -r0 anotherthing
19 $ hg bookmark -r0 anotherthing
20 $ echo another > foo
20 $ echo another > foo
21 $ hg branch stable
21 $ hg branch stable
22 marked working directory as branch stable
22 marked working directory as branch stable
23 $ hg ci -Ambranch
23 $ hg ci -Ambranch
24 $ hg serve --config server.uncompressed=False -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
24 $ hg serve --config server.uncompressed=False -n test -p $HGPORT -d --pid-file=hg.pid -E errors.log
25 $ cat hg.pid >> $DAEMON_PIDS
25 $ cat hg.pid >> $DAEMON_PIDS
26
26
27 Logs and changes
27 Logs and changes
28
28
29 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/?style=atom'
29 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/?style=atom'
30 200 Script output follows
30 200 Script output follows
31
31
32 <?xml version="1.0" encoding="ascii"?>
32 <?xml version="1.0" encoding="ascii"?>
33 <feed xmlns="http://www.w3.org/2005/Atom">
33 <feed xmlns="http://www.w3.org/2005/Atom">
34 <!-- Changelog -->
34 <!-- Changelog -->
35 <id>http://*:$HGPORT/</id> (glob)
35 <id>http://*:$HGPORT/</id> (glob)
36 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
36 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
37 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
37 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
38 <title>test Changelog</title>
38 <title>test Changelog</title>
39 <updated>1970-01-01T00:00:00+00:00</updated>
39 <updated>1970-01-01T00:00:00+00:00</updated>
40
40
41 <entry>
41 <entry>
42 <title>branch</title>
42 <title>branch</title>
43 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
43 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
44 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
44 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
45 <author>
45 <author>
46 <name>test</name>
46 <name>test</name>
47 <email>&#116;&#101;&#115;&#116;</email>
47 <email>&#116;&#101;&#115;&#116;</email>
48 </author>
48 </author>
49 <updated>1970-01-01T00:00:00+00:00</updated>
49 <updated>1970-01-01T00:00:00+00:00</updated>
50 <published>1970-01-01T00:00:00+00:00</published>
50 <published>1970-01-01T00:00:00+00:00</published>
51 <content type="xhtml">
51 <content type="xhtml">
52 <div xmlns="http://www.w3.org/1999/xhtml">
52 <div xmlns="http://www.w3.org/1999/xhtml">
53 <pre xml:space="preserve">branch</pre>
53 <pre xml:space="preserve">branch</pre>
54 </div>
54 </div>
55 </content>
55 </content>
56 </entry>
56 </entry>
57 <entry>
57 <entry>
58 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
58 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
59 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
59 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
60 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
60 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
61 <author>
61 <author>
62 <name>test</name>
62 <name>test</name>
63 <email>&#116;&#101;&#115;&#116;</email>
63 <email>&#116;&#101;&#115;&#116;</email>
64 </author>
64 </author>
65 <updated>1970-01-01T00:00:00+00:00</updated>
65 <updated>1970-01-01T00:00:00+00:00</updated>
66 <published>1970-01-01T00:00:00+00:00</published>
66 <published>1970-01-01T00:00:00+00:00</published>
67 <content type="xhtml">
67 <content type="xhtml">
68 <div xmlns="http://www.w3.org/1999/xhtml">
68 <div xmlns="http://www.w3.org/1999/xhtml">
69 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
69 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
70 </div>
70 </div>
71 </content>
71 </content>
72 </entry>
72 </entry>
73 <entry>
73 <entry>
74 <title>base</title>
74 <title>base</title>
75 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
75 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
76 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
76 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
77 <author>
77 <author>
78 <name>test</name>
78 <name>test</name>
79 <email>&#116;&#101;&#115;&#116;</email>
79 <email>&#116;&#101;&#115;&#116;</email>
80 </author>
80 </author>
81 <updated>1970-01-01T00:00:00+00:00</updated>
81 <updated>1970-01-01T00:00:00+00:00</updated>
82 <published>1970-01-01T00:00:00+00:00</published>
82 <published>1970-01-01T00:00:00+00:00</published>
83 <content type="xhtml">
83 <content type="xhtml">
84 <div xmlns="http://www.w3.org/1999/xhtml">
84 <div xmlns="http://www.w3.org/1999/xhtml">
85 <pre xml:space="preserve">base</pre>
85 <pre xml:space="preserve">base</pre>
86 </div>
86 </div>
87 </content>
87 </content>
88 </entry>
88 </entry>
89
89
90 </feed>
90 </feed>
91 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/?style=atom'
91 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/?style=atom'
92 200 Script output follows
92 200 Script output follows
93
93
94 <?xml version="1.0" encoding="ascii"?>
94 <?xml version="1.0" encoding="ascii"?>
95 <feed xmlns="http://www.w3.org/2005/Atom">
95 <feed xmlns="http://www.w3.org/2005/Atom">
96 <!-- Changelog -->
96 <!-- Changelog -->
97 <id>http://*:$HGPORT/</id> (glob)
97 <id>http://*:$HGPORT/</id> (glob)
98 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
98 <link rel="self" href="http://*:$HGPORT/atom-log"/> (glob)
99 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
99 <link rel="alternate" href="http://*:$HGPORT/"/> (glob)
100 <title>test Changelog</title>
100 <title>test Changelog</title>
101 <updated>1970-01-01T00:00:00+00:00</updated>
101 <updated>1970-01-01T00:00:00+00:00</updated>
102
102
103 <entry>
103 <entry>
104 <title>branch</title>
104 <title>branch</title>
105 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
105 <id>http://*:$HGPORT/#changeset-1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe</id> (glob)
106 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
106 <link href="http://*:$HGPORT/rev/1d22e65f027e"/> (glob)
107 <author>
107 <author>
108 <name>test</name>
108 <name>test</name>
109 <email>&#116;&#101;&#115;&#116;</email>
109 <email>&#116;&#101;&#115;&#116;</email>
110 </author>
110 </author>
111 <updated>1970-01-01T00:00:00+00:00</updated>
111 <updated>1970-01-01T00:00:00+00:00</updated>
112 <published>1970-01-01T00:00:00+00:00</published>
112 <published>1970-01-01T00:00:00+00:00</published>
113 <content type="xhtml">
113 <content type="xhtml">
114 <div xmlns="http://www.w3.org/1999/xhtml">
114 <div xmlns="http://www.w3.org/1999/xhtml">
115 <pre xml:space="preserve">branch</pre>
115 <pre xml:space="preserve">branch</pre>
116 </div>
116 </div>
117 </content>
117 </content>
118 </entry>
118 </entry>
119 <entry>
119 <entry>
120 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
120 <title>Added tag 1.0 for changeset 2ef0ac749a14</title>
121 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
121 <id>http://*:$HGPORT/#changeset-a4f92ed23982be056b9852de5dfe873eaac7f0de</id> (glob)
122 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
122 <link href="http://*:$HGPORT/rev/a4f92ed23982"/> (glob)
123 <author>
123 <author>
124 <name>test</name>
124 <name>test</name>
125 <email>&#116;&#101;&#115;&#116;</email>
125 <email>&#116;&#101;&#115;&#116;</email>
126 </author>
126 </author>
127 <updated>1970-01-01T00:00:00+00:00</updated>
127 <updated>1970-01-01T00:00:00+00:00</updated>
128 <published>1970-01-01T00:00:00+00:00</published>
128 <published>1970-01-01T00:00:00+00:00</published>
129 <content type="xhtml">
129 <content type="xhtml">
130 <div xmlns="http://www.w3.org/1999/xhtml">
130 <div xmlns="http://www.w3.org/1999/xhtml">
131 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
131 <pre xml:space="preserve">Added tag 1.0 for changeset 2ef0ac749a14</pre>
132 </div>
132 </div>
133 </content>
133 </content>
134 </entry>
134 </entry>
135 <entry>
135 <entry>
136 <title>base</title>
136 <title>base</title>
137 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
137 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
138 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
138 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
139 <author>
139 <author>
140 <name>test</name>
140 <name>test</name>
141 <email>&#116;&#101;&#115;&#116;</email>
141 <email>&#116;&#101;&#115;&#116;</email>
142 </author>
142 </author>
143 <updated>1970-01-01T00:00:00+00:00</updated>
143 <updated>1970-01-01T00:00:00+00:00</updated>
144 <published>1970-01-01T00:00:00+00:00</published>
144 <published>1970-01-01T00:00:00+00:00</published>
145 <content type="xhtml">
145 <content type="xhtml">
146 <div xmlns="http://www.w3.org/1999/xhtml">
146 <div xmlns="http://www.w3.org/1999/xhtml">
147 <pre xml:space="preserve">base</pre>
147 <pre xml:space="preserve">base</pre>
148 </div>
148 </div>
149 </content>
149 </content>
150 </entry>
150 </entry>
151
151
152 </feed>
152 </feed>
153 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/foo/?style=atom'
153 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log/1/foo/?style=atom'
154 200 Script output follows
154 200 Script output follows
155
155
156 <?xml version="1.0" encoding="ascii"?>
156 <?xml version="1.0" encoding="ascii"?>
157 <feed xmlns="http://www.w3.org/2005/Atom">
157 <feed xmlns="http://www.w3.org/2005/Atom">
158 <id>http://*:$HGPORT/atom-log/tip/foo</id> (glob)
158 <id>http://*:$HGPORT/atom-log/tip/foo</id> (glob)
159 <link rel="self" href="http://*:$HGPORT/atom-log/tip/foo"/> (glob)
159 <link rel="self" href="http://*:$HGPORT/atom-log/tip/foo"/> (glob)
160 <title>test: foo history</title>
160 <title>test: foo history</title>
161 <updated>1970-01-01T00:00:00+00:00</updated>
161 <updated>1970-01-01T00:00:00+00:00</updated>
162
162
163 <entry>
163 <entry>
164 <title>base</title>
164 <title>base</title>
165 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
165 <id>http://*:$HGPORT/#changeset-2ef0ac749a14e4f57a5a822464a0902c6f7f448f</id> (glob)
166 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
166 <link href="http://*:$HGPORT/rev/2ef0ac749a14"/> (glob)
167 <author>
167 <author>
168 <name>test</name>
168 <name>test</name>
169 <email>&#116;&#101;&#115;&#116;</email>
169 <email>&#116;&#101;&#115;&#116;</email>
170 </author>
170 </author>
171 <updated>1970-01-01T00:00:00+00:00</updated>
171 <updated>1970-01-01T00:00:00+00:00</updated>
172 <published>1970-01-01T00:00:00+00:00</published>
172 <published>1970-01-01T00:00:00+00:00</published>
173 <content type="xhtml">
173 <content type="xhtml">
174 <div xmlns="http://www.w3.org/1999/xhtml">
174 <div xmlns="http://www.w3.org/1999/xhtml">
175 <pre xml:space="preserve">base</pre>
175 <pre xml:space="preserve">base</pre>
176 </div>
176 </div>
177 </content>
177 </content>
178 </entry>
178 </entry>
179
179
180 </feed>
180 </feed>
181 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/shortlog/'
181 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/shortlog/'
182 200 Script output follows
182 200 Script output follows
183
183
184 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
184 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
185 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
185 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
186 <head>
186 <head>
187 <link rel="icon" href="/static/hgicon.png" type="image/png" />
187 <link rel="icon" href="/static/hgicon.png" type="image/png" />
188 <meta name="robots" content="index, nofollow" />
188 <meta name="robots" content="index, nofollow" />
189 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
189 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
190
190
191 <title>test: log</title>
191 <title>test: log</title>
192 <link rel="alternate" type="application/atom+xml"
192 <link rel="alternate" type="application/atom+xml"
193 href="/atom-log" title="Atom feed for test" />
193 href="/atom-log" title="Atom feed for test" />
194 <link rel="alternate" type="application/rss+xml"
194 <link rel="alternate" type="application/rss+xml"
195 href="/rss-log" title="RSS feed for test" />
195 href="/rss-log" title="RSS feed for test" />
196 </head>
196 </head>
197 <body>
197 <body>
198
198
199 <div class="container">
199 <div class="container">
200 <div class="menu">
200 <div class="menu">
201 <div class="logo">
201 <div class="logo">
202 <a href="http://mercurial.selenic.com/">
202 <a href="http://mercurial.selenic.com/">
203 <img src="/static/hglogo.png" alt="mercurial" /></a>
203 <img src="/static/hglogo.png" alt="mercurial" /></a>
204 </div>
204 </div>
205 <ul>
205 <ul>
206 <li class="active">log</li>
206 <li class="active">log</li>
207 <li><a href="/graph/1d22e65f027e">graph</a></li>
207 <li><a href="/graph/1d22e65f027e">graph</a></li>
208 <li><a href="/tags">tags</a></li>
208 <li><a href="/tags">tags</a></li>
209 <li><a href="/bookmarks">bookmarks</a></li>
209 <li><a href="/bookmarks">bookmarks</a></li>
210 <li><a href="/branches">branches</a></li>
210 <li><a href="/branches">branches</a></li>
211 </ul>
211 </ul>
212 <ul>
212 <ul>
213 <li><a href="/rev/1d22e65f027e">changeset</a></li>
213 <li><a href="/rev/1d22e65f027e">changeset</a></li>
214 <li><a href="/file/1d22e65f027e">browse</a></li>
214 <li><a href="/file/1d22e65f027e">browse</a></li>
215 </ul>
215 </ul>
216 <ul>
216 <ul>
217
217
218 </ul>
218 </ul>
219 <ul>
219 <ul>
220 <li><a href="/help">help</a></li>
220 <li><a href="/help">help</a></li>
221 </ul>
221 </ul>
222 </div>
222 </div>
223
223
224 <div class="main">
224 <div class="main">
225 <h2><a href="/">test</a></h2>
225 <h2><a href="/">test</a></h2>
226 <h3>log</h3>
226 <h3>log</h3>
227
227
228 <form class="search" action="/log">
228 <form class="search" action="/log">
229
229
230 <p><input name="rev" id="search1" type="text" size="30" /></p>
230 <p><input name="rev" id="search1" type="text" size="30" /></p>
231 <div id="hint">find changesets by author, revision,
231 <div id="hint">find changesets by author, revision,
232 files, or words in the commit message</div>
232 files, or words in the commit message</div>
233 </form>
233 </form>
234
234
235 <div class="navigate">
235 <div class="navigate">
236 <a href="/shortlog/2?revcount=30">less</a>
236 <a href="/shortlog/2?revcount=30">less</a>
237 <a href="/shortlog/2?revcount=120">more</a>
237 <a href="/shortlog/2?revcount=120">more</a>
238 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
238 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
239 </div>
239 </div>
240
240
241 <table class="bigtable">
241 <table class="bigtable">
242 <tr>
242 <tr>
243 <th class="age">age</th>
243 <th class="age">age</th>
244 <th class="author">author</th>
244 <th class="author">author</th>
245 <th class="description">description</th>
245 <th class="description">description</th>
246 </tr>
246 </tr>
247 <tr class="parity0">
247 <tr class="parity0">
248 <td class="age">1970-01-01</td>
248 <td class="age">1970-01-01</td>
249 <td class="author">test</td>
249 <td class="author">test</td>
250 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> <span class="tag">something</span> </td>
250 <td class="description"><a href="/rev/1d22e65f027e">branch</a><span class="branchhead">stable</span> <span class="tag">tip</span> <span class="tag">something</span> </td>
251 </tr>
251 </tr>
252 <tr class="parity1">
252 <tr class="parity1">
253 <td class="age">1970-01-01</td>
253 <td class="age">1970-01-01</td>
254 <td class="author">test</td>
254 <td class="author">test</td>
255 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
255 <td class="description"><a href="/rev/a4f92ed23982">Added tag 1.0 for changeset 2ef0ac749a14</a><span class="branchhead">default</span> </td>
256 </tr>
256 </tr>
257 <tr class="parity0">
257 <tr class="parity0">
258 <td class="age">1970-01-01</td>
258 <td class="age">1970-01-01</td>
259 <td class="author">test</td>
259 <td class="author">test</td>
260 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
260 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
261 </tr>
261 </tr>
262
262
263 </table>
263 </table>
264
264
265 <div class="navigate">
265 <div class="navigate">
266 <a href="/shortlog/2?revcount=30">less</a>
266 <a href="/shortlog/2?revcount=30">less</a>
267 <a href="/shortlog/2?revcount=120">more</a>
267 <a href="/shortlog/2?revcount=120">more</a>
268 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
268 | rev 2: <a href="/shortlog/2ef0ac749a14">(0)</a> <a href="/shortlog/tip">tip</a>
269 </div>
269 </div>
270
270
271 </div>
271 </div>
272 </div>
272 </div>
273
273
274
274
275
275
276 </body>
276 </body>
277 </html>
277 </html>
278
278
279 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/0/'
279 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/0/'
280 200 Script output follows
280 200 Script output follows
281
281
282 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
282 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
283 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
283 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
284 <head>
284 <head>
285 <link rel="icon" href="/static/hgicon.png" type="image/png" />
285 <link rel="icon" href="/static/hgicon.png" type="image/png" />
286 <meta name="robots" content="index, nofollow" />
286 <meta name="robots" content="index, nofollow" />
287 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
287 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
288
288
289 <title>test: 2ef0ac749a14</title>
289 <title>test: 2ef0ac749a14</title>
290 </head>
290 </head>
291 <body>
291 <body>
292 <div class="container">
292 <div class="container">
293 <div class="menu">
293 <div class="menu">
294 <div class="logo">
294 <div class="logo">
295 <a href="http://mercurial.selenic.com/">
295 <a href="http://mercurial.selenic.com/">
296 <img src="/static/hglogo.png" alt="mercurial" /></a>
296 <img src="/static/hglogo.png" alt="mercurial" /></a>
297 </div>
297 </div>
298 <ul>
298 <ul>
299 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
299 <li><a href="/shortlog/2ef0ac749a14">log</a></li>
300 <li><a href="/graph/2ef0ac749a14">graph</a></li>
300 <li><a href="/graph/2ef0ac749a14">graph</a></li>
301 <li><a href="/tags">tags</a></li>
301 <li><a href="/tags">tags</a></li>
302 <li><a href="/bookmarks">bookmarks</a></li>
302 <li><a href="/bookmarks">bookmarks</a></li>
303 <li><a href="/branches">branches</a></li>
303 <li><a href="/branches">branches</a></li>
304 </ul>
304 </ul>
305 <ul>
305 <ul>
306 <li class="active">changeset</li>
306 <li class="active">changeset</li>
307 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
307 <li><a href="/raw-rev/2ef0ac749a14">raw</a></li>
308 <li><a href="/file/2ef0ac749a14">browse</a></li>
308 <li><a href="/file/2ef0ac749a14">browse</a></li>
309 </ul>
309 </ul>
310 <ul>
310 <ul>
311
311
312 </ul>
312 </ul>
313 <ul>
313 <ul>
314 <li><a href="/help">help</a></li>
314 <li><a href="/help">help</a></li>
315 </ul>
315 </ul>
316 </div>
316 </div>
317
317
318 <div class="main">
318 <div class="main">
319
319
320 <h2><a href="/">test</a></h2>
320 <h2><a href="/">test</a></h2>
321 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> <span class="tag">anotherthing</span> </h3>
321 <h3>changeset 0:2ef0ac749a14 <span class="tag">1.0</span> <span class="tag">anotherthing</span> </h3>
322
322
323 <form class="search" action="/log">
323 <form class="search" action="/log">
324
324
325 <p><input name="rev" id="search1" type="text" size="30" /></p>
325 <p><input name="rev" id="search1" type="text" size="30" /></p>
326 <div id="hint">find changesets by author, revision,
326 <div id="hint">find changesets by author, revision,
327 files, or words in the commit message</div>
327 files, or words in the commit message</div>
328 </form>
328 </form>
329
329
330 <div class="description">base</div>
330 <div class="description">base</div>
331
331
332 <table id="changesetEntry">
332 <table id="changesetEntry">
333 <tr>
333 <tr>
334 <th class="author">author</th>
334 <th class="author">author</th>
335 <td class="author">&#116;&#101;&#115;&#116;</td>
335 <td class="author">&#116;&#101;&#115;&#116;</td>
336 </tr>
336 </tr>
337 <tr>
337 <tr>
338 <th class="date">date</th>
338 <th class="date">date</th>
339 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
339 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td></tr>
340 <tr>
340 <tr>
341 <th class="author">parents</th>
341 <th class="author">parents</th>
342 <td class="author"></td>
342 <td class="author"></td>
343 </tr>
343 </tr>
344 <tr>
344 <tr>
345 <th class="author">children</th>
345 <th class="author">children</th>
346 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
346 <td class="author"> <a href="/rev/a4f92ed23982">a4f92ed23982</a></td>
347 </tr>
347 </tr>
348 <tr>
348 <tr>
349 <th class="files">files</th>
349 <th class="files">files</th>
350 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
350 <td class="files"><a href="/file/2ef0ac749a14/da/foo">da/foo</a> <a href="/file/2ef0ac749a14/foo">foo</a> </td>
351 </tr>
351 </tr>
352 </table>
352 </table>
353
353
354 <div class="overflow">
354 <div class="overflow">
355 <div class="sourcefirst"> line diff</div>
355 <div class="sourcefirst"> line diff</div>
356
356
357 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
357 <div class="source bottomline parity0"><pre><a href="#l1.1" id="l1.1"> 1.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
358 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/da/foo Thu Jan 01 00:00:00 1970 +0000
358 </span><a href="#l1.2" id="l1.2"> 1.2</a> <span class="plusline">+++ b/da/foo Thu Jan 01 00:00:00 1970 +0000
359 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
359 </span><a href="#l1.3" id="l1.3"> 1.3</a> <span class="atline">@@ -0,0 +1,1 @@
360 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
360 </span><a href="#l1.4" id="l1.4"> 1.4</a> <span class="plusline">+foo
361 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
361 </span></pre></div><div class="source bottomline parity1"><pre><a href="#l2.1" id="l2.1"> 2.1</a> <span class="minusline">--- /dev/null Thu Jan 01 00:00:00 1970 +0000
362 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
362 </span><a href="#l2.2" id="l2.2"> 2.2</a> <span class="plusline">+++ b/foo Thu Jan 01 00:00:00 1970 +0000
363 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
363 </span><a href="#l2.3" id="l2.3"> 2.3</a> <span class="atline">@@ -0,0 +1,1 @@
364 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
364 </span><a href="#l2.4" id="l2.4"> 2.4</a> <span class="plusline">+foo
365 </span></pre></div>
365 </span></pre></div>
366 </div>
366 </div>
367
367
368 </div>
368 </div>
369 </div>
369 </div>
370
370
371
371
372 </body>
372 </body>
373 </html>
373 </html>
374
374
375 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/1/?style=raw'
375 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/rev/1/?style=raw'
376 200 Script output follows
376 200 Script output follows
377
377
378
378
379 # HG changeset patch
379 # HG changeset patch
380 # User test
380 # User test
381 # Date 0 0
381 # Date 0 0
382 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
382 # Node ID a4f92ed23982be056b9852de5dfe873eaac7f0de
383 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
383 # Parent 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
384 Added tag 1.0 for changeset 2ef0ac749a14
384 Added tag 1.0 for changeset 2ef0ac749a14
385
385
386 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
386 diff -r 2ef0ac749a14 -r a4f92ed23982 .hgtags
387 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
387 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
388 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
388 +++ b/.hgtags Thu Jan 01 00:00:00 1970 +0000
389 @@ -0,0 +1,1 @@
389 @@ -0,0 +1,1 @@
390 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
390 +2ef0ac749a14e4f57a5a822464a0902c6f7f448f 1.0
391
391
392 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log?rev=base'
392 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/log?rev=base'
393 200 Script output follows
393 200 Script output follows
394
394
395 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
395 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
396 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
396 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
397 <head>
397 <head>
398 <link rel="icon" href="/static/hgicon.png" type="image/png" />
398 <link rel="icon" href="/static/hgicon.png" type="image/png" />
399 <meta name="robots" content="index, nofollow" />
399 <meta name="robots" content="index, nofollow" />
400 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
400 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
401
401
402 <title>test: searching for base</title>
402 <title>test: searching for base</title>
403 </head>
403 </head>
404 <body>
404 <body>
405
405
406 <div class="container">
406 <div class="container">
407 <div class="menu">
407 <div class="menu">
408 <div class="logo">
408 <div class="logo">
409 <a href="http://mercurial.selenic.com/">
409 <a href="http://mercurial.selenic.com/">
410 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
410 <img src="/static/hglogo.png" width=75 height=90 border=0 alt="mercurial"></a>
411 </div>
411 </div>
412 <ul>
412 <ul>
413 <li><a href="/shortlog">log</a></li>
413 <li><a href="/shortlog">log</a></li>
414 <li><a href="/graph">graph</a></li>
414 <li><a href="/graph">graph</a></li>
415 <li><a href="/tags">tags</a></li>
415 <li><a href="/tags">tags</a></li>
416 <li><a href="/bookmarks">bookmarks</a></li>
416 <li><a href="/bookmarks">bookmarks</a></li>
417 <li><a href="/branches">branches</a></li>
417 <li><a href="/branches">branches</a></li>
418 <li><a href="/help">help</a></li>
418 <li><a href="/help">help</a></li>
419 </ul>
419 </ul>
420 </div>
420 </div>
421
421
422 <div class="main">
422 <div class="main">
423 <h2><a href="/">test</a></h2>
423 <h2><a href="/">test</a></h2>
424 <h3>searching for 'base'</h3>
424 <h3>searching for 'base'</h3>
425
425
426 <form class="search" action="/log">
426 <form class="search" action="/log">
427
427
428 <p><input name="rev" id="search1" type="text" size="30"></p>
428 <p><input name="rev" id="search1" type="text" size="30"></p>
429 <div id="hint">find changesets by author, revision,
429 <div id="hint">find changesets by author, revision,
430 files, or words in the commit message</div>
430 files, or words in the commit message</div>
431 </form>
431 </form>
432
432
433 <div class="navigate">
433 <div class="navigate">
434 <a href="/search/?rev=base&revcount=5">less</a>
434 <a href="/search/?rev=base&revcount=5">less</a>
435 <a href="/search/?rev=base&revcount=20">more</a>
435 <a href="/search/?rev=base&revcount=20">more</a>
436 </div>
436 </div>
437
437
438 <table class="bigtable">
438 <table class="bigtable">
439 <tr>
439 <tr>
440 <th class="age">age</th>
440 <th class="age">age</th>
441 <th class="author">author</th>
441 <th class="author">author</th>
442 <th class="description">description</th>
442 <th class="description">description</th>
443 </tr>
443 </tr>
444 <tr class="parity0">
444 <tr class="parity0">
445 <td class="age">1970-01-01</td>
445 <td class="age">1970-01-01</td>
446 <td class="author">test</td>
446 <td class="author">test</td>
447 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
447 <td class="description"><a href="/rev/2ef0ac749a14">base</a><span class="tag">1.0</span> <span class="tag">anotherthing</span> </td>
448 </tr>
448 </tr>
449
449
450 </table>
450 </table>
451
451
452 <div class="navigate">
452 <div class="navigate">
453 <a href="/search/?rev=base&revcount=5">less</a>
453 <a href="/search/?rev=base&revcount=5">less</a>
454 <a href="/search/?rev=base&revcount=20">more</a>
454 <a href="/search/?rev=base&revcount=20">more</a>
455 </div>
455 </div>
456
456
457 </div>
457 </div>
458 </div>
458 </div>
459
459
460
460
461
461
462 </body>
462 </body>
463 </html>
463 </html>
464
464
465
465
466 File-related
466 File-related
467
467
468 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo/?style=raw'
468 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo/?style=raw'
469 200 Script output follows
469 200 Script output follows
470
470
471 foo
471 foo
472 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/annotate/1/foo/?style=raw'
472 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/annotate/1/foo/?style=raw'
473 200 Script output follows
473 200 Script output follows
474
474
475
475
476 test@0: foo
476 test@0: foo
477
477
478
478
479
479
480
480
481 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/?style=raw'
481 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/?style=raw'
482 200 Script output follows
482 200 Script output follows
483
483
484
484
485 drwxr-xr-x da
485 drwxr-xr-x da
486 -rw-r--r-- 45 .hgtags
486 -rw-r--r-- 45 .hgtags
487 -rw-r--r-- 4 foo
487 -rw-r--r-- 4 foo
488
488
489
489
490 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo'
490 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/file/1/foo'
491 200 Script output follows
491 200 Script output follows
492
492
493 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
493 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
494 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
494 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US">
495 <head>
495 <head>
496 <link rel="icon" href="/static/hgicon.png" type="image/png" />
496 <link rel="icon" href="/static/hgicon.png" type="image/png" />
497 <meta name="robots" content="index, nofollow" />
497 <meta name="robots" content="index, nofollow" />
498 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
498 <link rel="stylesheet" href="/static/style-paper.css" type="text/css" />
499
499
500 <title>test: a4f92ed23982 foo</title>
500 <title>test: a4f92ed23982 foo</title>
501 </head>
501 </head>
502 <body>
502 <body>
503
503
504 <div class="container">
504 <div class="container">
505 <div class="menu">
505 <div class="menu">
506 <div class="logo">
506 <div class="logo">
507 <a href="http://mercurial.selenic.com/">
507 <a href="http://mercurial.selenic.com/">
508 <img src="/static/hglogo.png" alt="mercurial" /></a>
508 <img src="/static/hglogo.png" alt="mercurial" /></a>
509 </div>
509 </div>
510 <ul>
510 <ul>
511 <li><a href="/shortlog/a4f92ed23982">log</a></li>
511 <li><a href="/shortlog/a4f92ed23982">log</a></li>
512 <li><a href="/graph/a4f92ed23982">graph</a></li>
512 <li><a href="/graph/a4f92ed23982">graph</a></li>
513 <li><a href="/tags">tags</a></li>
513 <li><a href="/tags">tags</a></li>
514 <li><a href="/branches">branches</a></li>
514 <li><a href="/branches">branches</a></li>
515 </ul>
515 </ul>
516 <ul>
516 <ul>
517 <li><a href="/rev/a4f92ed23982">changeset</a></li>
517 <li><a href="/rev/a4f92ed23982">changeset</a></li>
518 <li><a href="/file/a4f92ed23982/">browse</a></li>
518 <li><a href="/file/a4f92ed23982/">browse</a></li>
519 </ul>
519 </ul>
520 <ul>
520 <ul>
521 <li class="active">file</li>
521 <li class="active">file</li>
522 <li><a href="/file/tip/foo">latest</a></li>
522 <li><a href="/file/tip/foo">latest</a></li>
523 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
523 <li><a href="/diff/a4f92ed23982/foo">diff</a></li>
524 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
524 <li><a href="/annotate/a4f92ed23982/foo">annotate</a></li>
525 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
525 <li><a href="/log/a4f92ed23982/foo">file log</a></li>
526 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
526 <li><a href="/raw-file/a4f92ed23982/foo">raw</a></li>
527 </ul>
527 </ul>
528 <ul>
528 <ul>
529 <li><a href="/help">help</a></li>
529 <li><a href="/help">help</a></li>
530 </ul>
530 </ul>
531 </div>
531 </div>
532
532
533 <div class="main">
533 <div class="main">
534 <h2><a href="/">test</a></h2>
534 <h2><a href="/">test</a></h2>
535 <h3>view foo @ 1:a4f92ed23982</h3>
535 <h3>view foo @ 1:a4f92ed23982</h3>
536
536
537 <form class="search" action="/log">
537 <form class="search" action="/log">
538
538
539 <p><input name="rev" id="search1" type="text" size="30" /></p>
539 <p><input name="rev" id="search1" type="text" size="30" /></p>
540 <div id="hint">find changesets by author, revision,
540 <div id="hint">find changesets by author, revision,
541 files, or words in the commit message</div>
541 files, or words in the commit message</div>
542 </form>
542 </form>
543
543
544 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
544 <div class="description">Added tag 1.0 for changeset 2ef0ac749a14</div>
545
545
546 <table id="changesetEntry">
546 <table id="changesetEntry">
547 <tr>
547 <tr>
548 <th class="author">author</th>
548 <th class="author">author</th>
549 <td class="author">&#116;&#101;&#115;&#116;</td>
549 <td class="author">&#116;&#101;&#115;&#116;</td>
550 </tr>
550 </tr>
551 <tr>
551 <tr>
552 <th class="date">date</th>
552 <th class="date">date</th>
553 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
553 <td class="date">Thu Jan 01 00:00:00 1970 +0000 (1970-01-01)</td>
554 </tr>
554 </tr>
555 <tr>
555 <tr>
556 <th class="author">parents</th>
556 <th class="author">parents</th>
557 <td class="author"></td>
557 <td class="author"></td>
558 </tr>
558 </tr>
559 <tr>
559 <tr>
560 <th class="author">children</th>
560 <th class="author">children</th>
561 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
561 <td class="author"><a href="/file/1d22e65f027e/foo">1d22e65f027e</a> </td>
562 </tr>
562 </tr>
563
563
564 </table>
564 </table>
565
565
566 <div class="overflow">
566 <div class="overflow">
567 <div class="sourcefirst"> line source</div>
567 <div class="sourcefirst"> line source</div>
568
568
569 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
569 <div class="parity0 source"><a href="#l1" id="l1"> 1</a> foo
570 </div>
570 </div>
571 <div class="sourcelast"></div>
571 <div class="sourcelast"></div>
572 </div>
572 </div>
573 </div>
573 </div>
574 </div>
574 </div>
575
575
576
576
577
577
578 </body>
578 </body>
579 </html>
579 </html>
580
580
581 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/filediff/1/foo/?style=raw'
581 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/filediff/1/foo/?style=raw'
582 200 Script output follows
582 200 Script output follows
583
583
584
584
585 diff -r 000000000000 -r a4f92ed23982 foo
585 diff -r 000000000000 -r a4f92ed23982 foo
586 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
586 --- /dev/null Thu Jan 01 00:00:00 1970 +0000
587 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
587 +++ b/foo Thu Jan 01 00:00:00 1970 +0000
588 @@ -0,0 +1,1 @@
588 @@ -0,0 +1,1 @@
589 +foo
589 +foo
590
590
591
591
592
592
593
593
594
594
595 Overviews
595 Overviews
596
596
597 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-tags'
597 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-tags'
598 200 Script output follows
598 200 Script output follows
599
599
600 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
600 tip 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
601 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
601 1.0 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
602 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-branches'
602 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-branches'
603 200 Script output follows
603 200 Script output follows
604
604
605 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
605 stable 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe open
606 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
606 default a4f92ed23982be056b9852de5dfe873eaac7f0de inactive
607 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-bookmarks'
607 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/raw-bookmarks'
608 200 Script output follows
608 200 Script output follows
609
609
610 anotherthing 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
610 anotherthing 2ef0ac749a14e4f57a5a822464a0902c6f7f448f
611 something 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
611 something 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
612 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/summary/?style=gitweb'
612 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/summary/?style=gitweb'
613 200 Script output follows
613 200 Script output follows
614
614
615 <?xml version="1.0" encoding="ascii"?>
615 <?xml version="1.0" encoding="ascii"?>
616 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
616 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
617 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
617 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
618 <head>
618 <head>
619 <link rel="icon" href="/static/hgicon.png" type="image/png" />
619 <link rel="icon" href="/static/hgicon.png" type="image/png" />
620 <meta name="robots" content="index, nofollow"/>
620 <meta name="robots" content="index, nofollow"/>
621 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
621 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
622
622
623
623
624 <title>test: Summary</title>
624 <title>test: Summary</title>
625 <link rel="alternate" type="application/atom+xml"
625 <link rel="alternate" type="application/atom+xml"
626 href="/atom-log" title="Atom feed for test"/>
626 href="/atom-log" title="Atom feed for test"/>
627 <link rel="alternate" type="application/rss+xml"
627 <link rel="alternate" type="application/rss+xml"
628 href="/rss-log" title="RSS feed for test"/>
628 href="/rss-log" title="RSS feed for test"/>
629 </head>
629 </head>
630 <body>
630 <body>
631
631
632 <div class="page_header">
632 <div class="page_header">
633 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
633 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / summary
634
634
635 <form action="/log">
635 <form action="/log">
636 <input type="hidden" name="style" value="gitweb" />
636 <input type="hidden" name="style" value="gitweb" />
637 <div class="search">
637 <div class="search">
638 <input type="text" name="rev" />
638 <input type="text" name="rev" />
639 </div>
639 </div>
640 </form>
640 </form>
641 </div>
641 </div>
642
642
643 <div class="page_nav">
643 <div class="page_nav">
644 summary |
644 summary |
645 <a href="/shortlog?style=gitweb">shortlog</a> |
645 <a href="/shortlog?style=gitweb">shortlog</a> |
646 <a href="/log?style=gitweb">changelog</a> |
646 <a href="/log?style=gitweb">changelog</a> |
647 <a href="/graph?style=gitweb">graph</a> |
647 <a href="/graph?style=gitweb">graph</a> |
648 <a href="/tags?style=gitweb">tags</a> |
648 <a href="/tags?style=gitweb">tags</a> |
649 <a href="/bookmarks?style=gitweb">bookmarks</a> |
649 <a href="/bookmarks?style=gitweb">bookmarks</a> |
650 <a href="/branches?style=gitweb">branches</a> |
650 <a href="/branches?style=gitweb">branches</a> |
651 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
651 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
652 <a href="/help?style=gitweb">help</a>
652 <a href="/help?style=gitweb">help</a>
653 <br/>
653 <br/>
654 </div>
654 </div>
655
655
656 <div class="title">&nbsp;</div>
656 <div class="title">&nbsp;</div>
657 <table cellspacing="0">
657 <table cellspacing="0">
658 <tr><td>description</td><td>unknown</td></tr>
658 <tr><td>description</td><td>unknown</td></tr>
659 <tr><td>owner</td><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></tr>
659 <tr><td>owner</td><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></tr>
660 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
660 <tr><td>last change</td><td>Thu, 01 Jan 1970 00:00:00 +0000</td></tr>
661 </table>
661 </table>
662
662
663 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
663 <div><a class="title" href="/shortlog?style=gitweb">changes</a></div>
664 <table cellspacing="0">
664 <table cellspacing="0">
665
665
666 <tr class="parity0">
666 <tr class="parity0">
667 <td class="age"><i>1970-01-01</i></td>
667 <td class="age"><i>1970-01-01</i></td>
668 <td><i>test</i></td>
668 <td><i>test</i></td>
669 <td>
669 <td>
670 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
670 <a class="list" href="/rev/1d22e65f027e?style=gitweb">
671 <b>branch</b>
671 <b>branch</b>
672 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> <span class="bookmarktag" title="something">something</span> </span>
672 <span class="logtags"><span class="branchtag" title="stable">stable</span> <span class="tagtag" title="tip">tip</span> <span class="bookmarktag" title="something">something</span> </span>
673 </a>
673 </a>
674 </td>
674 </td>
675 <td class="link" nowrap>
675 <td class="link" nowrap>
676 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
676 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
677 <a href="/file/1d22e65f027e?style=gitweb">files</a>
677 <a href="/file/1d22e65f027e?style=gitweb">files</a>
678 </td>
678 </td>
679 </tr>
679 </tr>
680 <tr class="parity1">
680 <tr class="parity1">
681 <td class="age"><i>1970-01-01</i></td>
681 <td class="age"><i>1970-01-01</i></td>
682 <td><i>test</i></td>
682 <td><i>test</i></td>
683 <td>
683 <td>
684 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
684 <a class="list" href="/rev/a4f92ed23982?style=gitweb">
685 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
685 <b>Added tag 1.0 for changeset 2ef0ac749a14</b>
686 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
686 <span class="logtags"><span class="branchtag" title="default">default</span> </span>
687 </a>
687 </a>
688 </td>
688 </td>
689 <td class="link" nowrap>
689 <td class="link" nowrap>
690 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
690 <a href="/rev/a4f92ed23982?style=gitweb">changeset</a> |
691 <a href="/file/a4f92ed23982?style=gitweb">files</a>
691 <a href="/file/a4f92ed23982?style=gitweb">files</a>
692 </td>
692 </td>
693 </tr>
693 </tr>
694 <tr class="parity0">
694 <tr class="parity0">
695 <td class="age"><i>1970-01-01</i></td>
695 <td class="age"><i>1970-01-01</i></td>
696 <td><i>test</i></td>
696 <td><i>test</i></td>
697 <td>
697 <td>
698 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
698 <a class="list" href="/rev/2ef0ac749a14?style=gitweb">
699 <b>base</b>
699 <b>base</b>
700 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> <span class="bookmarktag" title="anotherthing">anotherthing</span> </span>
700 <span class="logtags"><span class="tagtag" title="1.0">1.0</span> <span class="bookmarktag" title="anotherthing">anotherthing</span> </span>
701 </a>
701 </a>
702 </td>
702 </td>
703 <td class="link" nowrap>
703 <td class="link" nowrap>
704 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
704 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
705 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
705 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
706 </td>
706 </td>
707 </tr>
707 </tr>
708 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
708 <tr class="light"><td colspan="4"><a class="list" href="/shortlog?style=gitweb">...</a></td></tr>
709 </table>
709 </table>
710
710
711 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
711 <div><a class="title" href="/tags?style=gitweb">tags</a></div>
712 <table cellspacing="0">
712 <table cellspacing="0">
713
713
714 <tr class="parity0">
714 <tr class="parity0">
715 <td class="age"><i>1970-01-01</i></td>
715 <td class="age"><i>1970-01-01</i></td>
716 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
716 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>1.0</b></a></td>
717 <td class="link">
717 <td class="link">
718 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
718 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
719 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
719 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
720 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
720 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
721 </td>
721 </td>
722 </tr>
722 </tr>
723 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
723 <tr class="light"><td colspan="3"><a class="list" href="/tags?style=gitweb">...</a></td></tr>
724 </table>
724 </table>
725
725
726 <div><a class="title" href="/bookmarks?style=gitweb">bookmarks</a></div>
726 <div><a class="title" href="/bookmarks?style=gitweb">bookmarks</a></div>
727 <table cellspacing="0">
727 <table cellspacing="0">
728
728
729 <tr class="parity0">
729 <tr class="parity0">
730 <td class="age"><i>1970-01-01</i></td>
730 <td class="age"><i>1970-01-01</i></td>
731 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>anotherthing</b></a></td>
731 <td><a class="list" href="/rev/2ef0ac749a14?style=gitweb"><b>anotherthing</b></a></td>
732 <td class="link">
732 <td class="link">
733 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
733 <a href="/rev/2ef0ac749a14?style=gitweb">changeset</a> |
734 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
734 <a href="/log/2ef0ac749a14?style=gitweb">changelog</a> |
735 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
735 <a href="/file/2ef0ac749a14?style=gitweb">files</a>
736 </td>
736 </td>
737 </tr>
737 </tr>
738 <tr class="parity1">
738 <tr class="parity1">
739 <td class="age"><i>1970-01-01</i></td>
739 <td class="age"><i>1970-01-01</i></td>
740 <td><a class="list" href="/rev/1d22e65f027e?style=gitweb"><b>something</b></a></td>
740 <td><a class="list" href="/rev/1d22e65f027e?style=gitweb"><b>something</b></a></td>
741 <td class="link">
741 <td class="link">
742 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
742 <a href="/rev/1d22e65f027e?style=gitweb">changeset</a> |
743 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
743 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
744 <a href="/file/1d22e65f027e?style=gitweb">files</a>
744 <a href="/file/1d22e65f027e?style=gitweb">files</a>
745 </td>
745 </td>
746 </tr>
746 </tr>
747 <tr class="light"><td colspan="3"><a class="list" href="/bookmarks?style=gitweb">...</a></td></tr>
747 <tr class="light"><td colspan="3"><a class="list" href="/bookmarks?style=gitweb">...</a></td></tr>
748 </table>
748 </table>
749
749
750 <div><a class="title" href="#">branches</a></div>
750 <div><a class="title" href="#">branches</a></div>
751 <table cellspacing="0">
751 <table cellspacing="0">
752
752
753 <tr class="parity0">
753 <tr class="parity0">
754 <td class="age"><i>1970-01-01</i></td>
754 <td class="age"><i>1970-01-01</i></td>
755 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
755 <td><a class="list" href="/shortlog/1d22e65f027e?style=gitweb"><b>1d22e65f027e</b></a></td>
756 <td class="">stable</td>
756 <td class="">stable</td>
757 <td class="link">
757 <td class="link">
758 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
758 <a href="/changeset/1d22e65f027e?style=gitweb">changeset</a> |
759 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
759 <a href="/log/1d22e65f027e?style=gitweb">changelog</a> |
760 <a href="/file/1d22e65f027e?style=gitweb">files</a>
760 <a href="/file/1d22e65f027e?style=gitweb">files</a>
761 </td>
761 </td>
762 </tr>
762 </tr>
763 <tr class="parity1">
763 <tr class="parity1">
764 <td class="age"><i>1970-01-01</i></td>
764 <td class="age"><i>1970-01-01</i></td>
765 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
765 <td><a class="list" href="/shortlog/a4f92ed23982?style=gitweb"><b>a4f92ed23982</b></a></td>
766 <td class="">default</td>
766 <td class="">default</td>
767 <td class="link">
767 <td class="link">
768 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
768 <a href="/changeset/a4f92ed23982?style=gitweb">changeset</a> |
769 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
769 <a href="/log/a4f92ed23982?style=gitweb">changelog</a> |
770 <a href="/file/a4f92ed23982?style=gitweb">files</a>
770 <a href="/file/a4f92ed23982?style=gitweb">files</a>
771 </td>
771 </td>
772 </tr>
772 </tr>
773 <tr class="light">
773 <tr class="light">
774 <td colspan="4"><a class="list" href="#">...</a></td>
774 <td colspan="4"><a class="list" href="#">...</a></td>
775 </tr>
775 </tr>
776 </table>
776 </table>
777 <div class="page_footer">
777 <div class="page_footer">
778 <div class="page_footer_text">test</div>
778 <div class="page_footer_text">test</div>
779 <div class="rss_logo">
779 <div class="rss_logo">
780 <a href="/rss-log">RSS</a>
780 <a href="/rss-log">RSS</a>
781 <a href="/atom-log">Atom</a>
781 <a href="/atom-log">Atom</a>
782 </div>
782 </div>
783 <br />
783 <br />
784
784
785 </div>
785 </div>
786 </body>
786 </body>
787 </html>
787 </html>
788
788
789 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/?style=gitweb'
789 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/?style=gitweb'
790 200 Script output follows
790 200 Script output follows
791
791
792 <?xml version="1.0" encoding="ascii"?>
792 <?xml version="1.0" encoding="ascii"?>
793 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
793 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
794 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
794 <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en-US" lang="en-US">
795 <head>
795 <head>
796 <link rel="icon" href="/static/hgicon.png" type="image/png" />
796 <link rel="icon" href="/static/hgicon.png" type="image/png" />
797 <meta name="robots" content="index, nofollow"/>
797 <meta name="robots" content="index, nofollow"/>
798 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
798 <link rel="stylesheet" href="/static/style-gitweb.css" type="text/css" />
799
799
800
800
801 <title>test: Graph</title>
801 <title>test: Graph</title>
802 <link rel="alternate" type="application/atom+xml"
802 <link rel="alternate" type="application/atom+xml"
803 href="/atom-log" title="Atom feed for test"/>
803 href="/atom-log" title="Atom feed for test"/>
804 <link rel="alternate" type="application/rss+xml"
804 <link rel="alternate" type="application/rss+xml"
805 href="/rss-log" title="RSS feed for test"/>
805 href="/rss-log" title="RSS feed for test"/>
806 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
806 <!--[if IE]><script type="text/javascript" src="/static/excanvas.js"></script><![endif]-->
807 </head>
807 </head>
808 <body>
808 <body>
809
809
810 <div class="page_header">
810 <div class="page_header">
811 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
811 <a href="http://mercurial.selenic.com/" title="Mercurial" style="float: right;">Mercurial</a><a href="/summary?style=gitweb">test</a> / graph
812 </div>
812 </div>
813
813
814 <form action="/log">
814 <form action="/log">
815 <input type="hidden" name="style" value="gitweb" />
815 <input type="hidden" name="style" value="gitweb" />
816 <div class="search">
816 <div class="search">
817 <input type="text" name="rev" />
817 <input type="text" name="rev" />
818 </div>
818 </div>
819 </form>
819 </form>
820 <div class="page_nav">
820 <div class="page_nav">
821 <a href="/summary?style=gitweb">summary</a> |
821 <a href="/summary?style=gitweb">summary</a> |
822 <a href="/shortlog?style=gitweb">shortlog</a> |
822 <a href="/shortlog?style=gitweb">shortlog</a> |
823 <a href="/log/2?style=gitweb">changelog</a> |
823 <a href="/log/2?style=gitweb">changelog</a> |
824 graph |
824 graph |
825 <a href="/tags?style=gitweb">tags</a> |
825 <a href="/tags?style=gitweb">tags</a> |
826 <a href="/bookmarks?style=gitweb">bookmarks</a> |
826 <a href="/bookmarks?style=gitweb">bookmarks</a> |
827 <a href="/branches?style=gitweb">branches</a> |
827 <a href="/branches?style=gitweb">branches</a> |
828 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
828 <a href="/file/1d22e65f027e?style=gitweb">files</a> |
829 <a href="/help?style=gitweb">help</a>
829 <a href="/help?style=gitweb">help</a>
830 <br/>
830 <br/>
831 <a href="/graph/2?style=gitweb&revcount=30">less</a>
831 <a href="/graph/2?style=gitweb&revcount=30">less</a>
832 <a href="/graph/2?style=gitweb&revcount=120">more</a>
832 <a href="/graph/2?style=gitweb&revcount=120">more</a>
833 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
833 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a> <br/>
834 </div>
834 </div>
835
835
836 <div class="title">&nbsp;</div>
836 <div class="title">&nbsp;</div>
837
837
838 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
838 <noscript>The revision graph only works with JavaScript-enabled browsers.</noscript>
839
839
840 <div id="wrapper">
840 <div id="wrapper">
841 <ul id="nodebgs"></ul>
841 <ul id="nodebgs"></ul>
842 <canvas id="graph" width="480" height="129"></canvas>
842 <canvas id="graph" width="480" height="129"></canvas>
843 <ul id="graphnodes"></ul>
843 <ul id="graphnodes"></ul>
844 </div>
844 </div>
845
845
846 <script type="text/javascript" src="/static/graph.js"></script>
846 <script type="text/javascript" src="/static/graph.js"></script>
847 <script>
847 <script>
848 <!-- hide script content
848 <!-- hide script content
849
849
850 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], [], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"], ["anotherthing"]]];
850 var data = [["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], [], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"], ["anotherthing"]]];
851 var graph = new Graph();
851 var graph = new Graph();
852 graph.scale(39);
852 graph.scale(39);
853
853
854 graph.edge = function(x0, y0, x1, y1, color) {
854 graph.edge = function(x0, y0, x1, y1, color) {
855
855
856 this.setColor(color, 0.0, 0.65);
856 this.setColor(color, 0.0, 0.65);
857 this.ctx.beginPath();
857 this.ctx.beginPath();
858 this.ctx.moveTo(x0, y0);
858 this.ctx.moveTo(x0, y0);
859 this.ctx.lineTo(x1, y1);
859 this.ctx.lineTo(x1, y1);
860 this.ctx.stroke();
860 this.ctx.stroke();
861
861
862 }
862 }
863
863
864 var revlink = '<li style="_STYLE"><span class="desc">';
864 var revlink = '<li style="_STYLE"><span class="desc">';
865 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
865 revlink += '<a class="list" href="/rev/_NODEID?style=gitweb" title="_NODEID"><b>_DESC</b></a>';
866 revlink += '</span> _TAGS';
866 revlink += '</span> _TAGS';
867 revlink += '<span class="info">_DATE, by _USER</span></li>';
867 revlink += '<span class="info">_DATE, by _USER</span></li>';
868
868
869 graph.vertex = function(x, y, color, parity, cur) {
869 graph.vertex = function(x, y, color, parity, cur) {
870
870
871 this.ctx.beginPath();
871 this.ctx.beginPath();
872 color = this.setColor(color, 0.25, 0.75);
872 color = this.setColor(color, 0.25, 0.75);
873 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
873 this.ctx.arc(x, y, radius, 0, Math.PI * 2, true);
874 this.ctx.fill();
874 this.ctx.fill();
875
875
876 var bg = '<li class="bg parity' + parity + '"></li>';
876 var bg = '<li class="bg parity' + parity + '"></li>';
877 var left = (this.columns + 1) * this.bg_height;
877 var left = (this.columns + 1) * this.bg_height;
878 var nstyle = 'padding-left: ' + left + 'px;';
878 var nstyle = 'padding-left: ' + left + 'px;';
879 var item = revlink.replace(/_STYLE/, nstyle);
879 var item = revlink.replace(/_STYLE/, nstyle);
880 item = item.replace(/_PARITY/, 'parity' + parity);
880 item = item.replace(/_PARITY/, 'parity' + parity);
881 item = item.replace(/_NODEID/, cur[0]);
881 item = item.replace(/_NODEID/, cur[0]);
882 item = item.replace(/_NODEID/, cur[0]);
882 item = item.replace(/_NODEID/, cur[0]);
883 item = item.replace(/_DESC/, cur[3]);
883 item = item.replace(/_DESC/, cur[3]);
884 item = item.replace(/_USER/, cur[4]);
884 item = item.replace(/_USER/, cur[4]);
885 item = item.replace(/_DATE/, cur[5]);
885 item = item.replace(/_DATE/, cur[5]);
886
886
887 var tagspan = '';
887 var tagspan = '';
888 if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) {
888 if (cur[7].length || cur[8].length || (cur[6][0] != 'default' || cur[6][1])) {
889 tagspan = '<span class="logtags">';
889 tagspan = '<span class="logtags">';
890 if (cur[6][1]) {
890 if (cur[6][1]) {
891 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
891 tagspan += '<span class="branchtag" title="' + cur[6][0] + '">';
892 tagspan += cur[6][0] + '</span> ';
892 tagspan += cur[6][0] + '</span> ';
893 } else if (!cur[6][1] && cur[6][0] != 'default') {
893 } else if (!cur[6][1] && cur[6][0] != 'default') {
894 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
894 tagspan += '<span class="inbranchtag" title="' + cur[6][0] + '">';
895 tagspan += cur[6][0] + '</span> ';
895 tagspan += cur[6][0] + '</span> ';
896 }
896 }
897 if (cur[7].length) {
897 if (cur[7].length) {
898 for (var t in cur[7]) {
898 for (var t in cur[7]) {
899 var tag = cur[7][t];
899 var tag = cur[7][t];
900 tagspan += '<span class="tagtag">' + tag + '</span> ';
900 tagspan += '<span class="tagtag">' + tag + '</span> ';
901 }
901 }
902 }
902 }
903 if (cur[8].length) {
903 if (cur[8].length) {
904 for (var t in cur[8]) {
904 for (var t in cur[8]) {
905 var bookmark = cur[8][t];
905 var bookmark = cur[8][t];
906 tagspan += '<span class="bookmarktag">' + bookmark + '</span> ';
906 tagspan += '<span class="bookmarktag">' + bookmark + '</span> ';
907 }
907 }
908 }
908 }
909 tagspan += '</span>';
909 tagspan += '</span>';
910 }
910 }
911
911
912 item = item.replace(/_TAGS/, tagspan);
912 item = item.replace(/_TAGS/, tagspan);
913 return [bg, item];
913 return [bg, item];
914
914
915 }
915 }
916
916
917 graph.render(data);
917 graph.render(data);
918
918
919 // stop hiding script -->
919 // stop hiding script -->
920 </script>
920 </script>
921
921
922 <div class="page_nav">
922 <div class="page_nav">
923 <a href="/graph/2?style=gitweb&revcount=30">less</a>
923 <a href="/graph/2?style=gitweb&revcount=30">less</a>
924 <a href="/graph/2?style=gitweb&revcount=120">more</a>
924 <a href="/graph/2?style=gitweb&revcount=120">more</a>
925 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
925 | <a href="/graph/2ef0ac749a14?style=gitweb">(0)</a> <a href="/graph/2ef0ac749a14?style=gitweb">-2</a> <a href="/graph/tip?style=gitweb">tip</a>
926 </div>
926 </div>
927
927
928 <div class="page_footer">
928 <div class="page_footer">
929 <div class="page_footer_text">test</div>
929 <div class="page_footer_text">test</div>
930 <div class="rss_logo">
930 <div class="rss_logo">
931 <a href="/rss-log">RSS</a>
931 <a href="/rss-log">RSS</a>
932 <a href="/atom-log">Atom</a>
932 <a href="/atom-log">Atom</a>
933 </div>
933 </div>
934 <br />
934 <br />
935
935
936 </div>
936 </div>
937 </body>
937 </body>
938 </html>
938 </html>
939
939
940
940
941 capabilities
941 capabilities
942
942
943 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=capabilities'; echo
943 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=capabilities'; echo
944 200 Script output follows
944 200 Script output follows
945
945
946 lookup changegroupsubset branchmap pushkey known getbundle unbundle=HG10GZ,HG10BZ,HG10UN
946 lookup changegroupsubset branchmap pushkey known getbundle unbundlehash unbundle=HG10GZ,HG10BZ,HG10UN
947
947
948 heads
948 heads
949
949
950 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=heads'
950 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=heads'
951 200 Script output follows
951 200 Script output follows
952
952
953 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
953 1d22e65f027e5a0609357e7d8e7508cd2ba5d2fe
954
954
955 branches
955 branches
956
956
957 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches&nodes=0000000000000000000000000000000000000000'
957 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=branches&nodes=0000000000000000000000000000000000000000'
958 200 Script output follows
958 200 Script output follows
959
959
960 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
960 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000 0000000000000000000000000000000000000000
961
961
962 changegroup
962 changegroup
963
963
964 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=changegroup&roots=0000000000000000000000000000000000000000'
964 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=changegroup&roots=0000000000000000000000000000000000000000'
965 200 Script output follows
965 200 Script output follows
966
966
967 x\x9c\xbdTMHUA\x14\xbe\xa8\xf9\xec\xda&\x10\x11*\xb8\x88\x81\x99\xbef\xe6\xce\xbdw\xc6\xf2a\x16E\x1b\x11[%\x98\xcc\xaf\x8f\x8c\xf7\xc0\xf7\x82 (esc)
967 x\x9c\xbdTMHUA\x14\xbe\xa8\xf9\xec\xda&\x10\x11*\xb8\x88\x81\x99\xbef\xe6\xce\xbdw\xc6\xf2a\x16E\x1b\x11[%\x98\xcc\xaf\x8f\x8c\xf7\xc0\xf7\x82 (esc)
968 4\x11KP2m\x95\xad*\xabE\x05AP\xd0\xc22Z\x14\xf9\x03\xb9j\xa3\x9b$\xa4MJ\xb4\x90\xc0\x9a\x9bO0\x10\xdf\x13\xa2\x81\x0f\x869g\xe6|\xe7\x9c\xef\x8ceY\xf7\xa2KO\xd2\xb7K\x16~\\n\xe9\xad\x90w\x86\xab\x93W\x8e\xdf\xb0r\\Y\xee6(\xa2)\xf6\x95\xc6\x01\xe4\x1az\x80R\xe8kN\x98\xe7R\xa4\xa9K@\xe0!A\xb4k\xa7U*m\x03\x07\xd8\x92\x1d\xd2\xc9\xa4\x1d\xc2\xe6,\xa5\xcc+\x1f\xef\xafDgi\xef\xab\x1d\x1d\xb7\x9a\xe7[W\xfbc\x8f\xde-\xcd\xe7\xcaz\xb3\xbb\x19\xd3\x81\x10>c>\x08\x00"X\x11\xc2\x84@\xd2\xe7B*L\x00\x01P\x04R\xc3@\xbaB0\xdb8#\x83:\x83\xa2h\xbc=\xcd\xdaS\xe1Y,L\xd3\xa0\xf2\xa8\x94J:\xe6\xd8\x81Q\xe0\xe8d\xa7#\xe2,\xd1\xaeR*\xed \xa5\x01\x13\x01\xa6\x0cb\xe3;\xbe\xaf\xfcK[^wK\xe1N\xaf\xbbk\xe8B\xd1\xf4\xc1\x07\xb3\xab[\x10\xfdkmvwcB\xa6\xa4\xd4G\xc4D\xc2\x141\xad\x91\x10\x00\x08J\x81\xcb}\xee \xee+W\xba\x8a\x80\x90|\xd4\xa0\xd6\xa0\xd4T\xde\xe1\x9d,!\xe2\xb5\xa94\xe3\xe7\xd5\x9f\x06\x18\xcba\x03aP\xb8f\xcd\x04\x1a_\\9\xf1\xed\xe4\x9e\xe5\xa6\xd1\xd2\x9f\x03\xa7o\xae\x90H\xf3\xfb\xef\xffH3\xadk (esc)
968 4\x11KP2m\x95\xad*\xabE\x05AP\xd0\xc22Z\x14\xf9\x03\xb9j\xa3\x9b$\xa4MJ\xb4\x90\xc0\x9a\x9bO0\x10\xdf\x13\xa2\x81\x0f\x869g\xe6|\xe7\x9c\xef\x8ceY\xf7\xa2KO\xd2\xb7K\x16~\\n\xe9\xad\x90w\x86\xab\x93W\x8e\xdf\xb0r\\Y\xee6(\xa2)\xf6\x95\xc6\x01\xe4\x1az\x80R\xe8kN\x98\xe7R\xa4\xa9K@\xe0!A\xb4k\xa7U*m\x03\x07\xd8\x92\x1d\xd2\xc9\xa4\x1d\xc2\xe6,\xa5\xcc+\x1f\xef\xafDgi\xef\xab\x1d\x1d\xb7\x9a\xe7[W\xfbc\x8f\xde-\xcd\xe7\xcaz\xb3\xbb\x19\xd3\x81\x10>c>\x08\x00"X\x11\xc2\x84@\xd2\xe7B*L\x00\x01P\x04R\xc3@\xbaB0\xdb8#\x83:\x83\xa2h\xbc=\xcd\xdaS\xe1Y,L\xd3\xa0\xf2\xa8\x94J:\xe6\xd8\x81Q\xe0\xe8d\xa7#\xe2,\xd1\xaeR*\xed \xa5\x01\x13\x01\xa6\x0cb\xe3;\xbe\xaf\xfcK[^wK\xe1N\xaf\xbbk\xe8B\xd1\xf4\xc1\x07\xb3\xab[\x10\xfdkmvwcB\xa6\xa4\xd4G\xc4D\xc2\x141\xad\x91\x10\x00\x08J\x81\xcb}\xee \xee+W\xba\x8a\x80\x90|\xd4\xa0\xd6\xa0\xd4T\xde\xe1\x9d,!\xe2\xb5\xa94\xe3\xe7\xd5\x9f\x06\x18\xcba\x03aP\xb8f\xcd\x04\x1a_\\9\xf1\xed\xe4\x9e\xe5\xa6\xd1\xd2\x9f\x03\xa7o\xae\x90H\xf3\xfb\xef\xffH3\xadk (esc)
969 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3'\x859 (esc)
969 \xb0\x90\x92\x88\xb9\x14"\x068\xc2\x1e@\x00\xbb\x8a)\xd3'\x859 (esc)
970 \xa8\x80\x84S \xa5\xbd-g\x13`\xe4\xdc\xc3H^\xdf\xe2\xc0TM\xc7\xf4BO\xcf\xde\xae\xe5\xae#\x1frM(K\x97`F\x19\x16s\x05GD\xb9\x01\xc1\x00+\x8c|\x9fp\xc11\xf0\x14\x00\x9cJ\x82<\xe0\x12\x9f\xc1\x90\xd0\xf5\xc8\x19>Pr\xaa\xeaW\xf5\xc4\xae\xd1\xfc\x17\xcf'\x13u\xb1\x9e\xcdHnC\x0e\xcc`\xc8\xa0&\xac\x0e\xf1|\x8c\x10$\xc4\x8c\xa2p\x05`\xdc\x08 \x80\xc4\xd7Rr-\x94\x10\x102\xedi;\xf3f\xf1z\x16\x86\xdb\xd8d\xe5\xe7\x8b\xf5\x8d\rzp\xb2\xfe\xac\xf5\xf2\xd3\xfe\xfckws\xedt\x96b\xd5l\x1c\x0b\x85\xb5\x170\x8f\x11\x84\xb0\x8f\x19\xa0\x00 _\x07\x1ac\xa2\xc3\x89Z\xe7\x96\xf9 \xccNFg\xc7F\xaa\x8a+\x9a\x9cc_\x17\x1b\x17\x9e]z38<\x97+\xb5,",\xc8\xc8?\\\x91\xff\x17.~U\x96\x97\xf5%\xdeN<\x8e\xf5\x97%\xe7^\xcfL\xed~\xda\x96k\xdc->\x86\x02\x83"\x96H\xa6\xe3\xaas=-\xeb7\xe5\xda\x8f\xbc (no-eol) (esc)
970 \xa8\x80\x84S \xa5\xbd-g\x13`\xe4\xdc\xc3H^\xdf\xe2\xc0TM\xc7\xf4BO\xcf\xde\xae\xe5\xae#\x1frM(K\x97`F\x19\x16s\x05GD\xb9\x01\xc1\x00+\x8c|\x9fp\xc11\xf0\x14\x00\x9cJ\x82<\xe0\x12\x9f\xc1\x90\xd0\xf5\xc8\x19>Pr\xaa\xeaW\xf5\xc4\xae\xd1\xfc\x17\xcf'\x13u\xb1\x9e\xcdHnC\x0e\xcc`\xc8\xa0&\xac\x0e\xf1|\x8c\x10$\xc4\x8c\xa2p\x05`\xdc\x08 \x80\xc4\xd7Rr-\x94\x10\x102\xedi;\xf3f\xf1z\x16\x86\xdb\xd8d\xe5\xe7\x8b\xf5\x8d\rzp\xb2\xfe\xac\xf5\xf2\xd3\xfe\xfckws\xedt\x96b\xd5l\x1c\x0b\x85\xb5\x170\x8f\x11\x84\xb0\x8f\x19\xa0\x00 _\x07\x1ac\xa2\xc3\x89Z\xe7\x96\xf9 \xccNFg\xc7F\xaa\x8a+\x9a\x9cc_\x17\x1b\x17\x9e]z38<\x97+\xb5,",\xc8\xc8?\\\x91\xff\x17.~U\x96\x97\xf5%\xdeN<\x8e\xf5\x97%\xe7^\xcfL\xed~\xda\x96k\xdc->\x86\x02\x83"\x96H\xa6\xe3\xaas=-\xeb7\xe5\xda\x8f\xbc (no-eol) (esc)
971
971
972 stream_out
972 stream_out
973
973
974 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=stream_out'
974 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=stream_out'
975 200 Script output follows
975 200 Script output follows
976
976
977 1
977 1
978
978
979 failing unbundle, requires POST request
979 failing unbundle, requires POST request
980
980
981 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=unbundle'
981 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '?cmd=unbundle'
982 405 push requires POST request
982 405 push requires POST request
983
983
984 0
984 0
985 push requires POST request
985 push requires POST request
986 [1]
986 [1]
987
987
988 Static files
988 Static files
989
989
990 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/static/style.css'
990 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/static/style.css'
991 200 Script output follows
991 200 Script output follows
992
992
993 a { text-decoration:none; }
993 a { text-decoration:none; }
994 .age { white-space:nowrap; }
994 .age { white-space:nowrap; }
995 .date { white-space:nowrap; }
995 .date { white-space:nowrap; }
996 .indexlinks { white-space:nowrap; }
996 .indexlinks { white-space:nowrap; }
997 .parity0 { background-color: #ddd; }
997 .parity0 { background-color: #ddd; }
998 .parity1 { background-color: #eee; }
998 .parity1 { background-color: #eee; }
999 .lineno { width: 60px; color: #aaa; font-size: smaller;
999 .lineno { width: 60px; color: #aaa; font-size: smaller;
1000 text-align: right; }
1000 text-align: right; }
1001 .plusline { color: green; }
1001 .plusline { color: green; }
1002 .minusline { color: red; }
1002 .minusline { color: red; }
1003 .atline { color: purple; }
1003 .atline { color: purple; }
1004 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
1004 .annotate { font-size: smaller; text-align: right; padding-right: 1em; }
1005 .buttons a {
1005 .buttons a {
1006 background-color: #666;
1006 background-color: #666;
1007 padding: 2pt;
1007 padding: 2pt;
1008 color: white;
1008 color: white;
1009 font-family: sans;
1009 font-family: sans;
1010 font-weight: bold;
1010 font-weight: bold;
1011 }
1011 }
1012 .navigate a {
1012 .navigate a {
1013 background-color: #ccc;
1013 background-color: #ccc;
1014 padding: 2pt;
1014 padding: 2pt;
1015 font-family: sans;
1015 font-family: sans;
1016 color: black;
1016 color: black;
1017 }
1017 }
1018
1018
1019 .metatag {
1019 .metatag {
1020 background-color: #888;
1020 background-color: #888;
1021 color: white;
1021 color: white;
1022 text-align: right;
1022 text-align: right;
1023 }
1023 }
1024
1024
1025 /* Common */
1025 /* Common */
1026 pre { margin: 0; }
1026 pre { margin: 0; }
1027
1027
1028 .logo {
1028 .logo {
1029 float: right;
1029 float: right;
1030 clear: right;
1030 clear: right;
1031 }
1031 }
1032
1032
1033 /* Changelog/Filelog entries */
1033 /* Changelog/Filelog entries */
1034 .logEntry { width: 100%; }
1034 .logEntry { width: 100%; }
1035 .logEntry .age { width: 15%; }
1035 .logEntry .age { width: 15%; }
1036 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
1036 .logEntry th { font-weight: normal; text-align: right; vertical-align: top; }
1037 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
1037 .logEntry th.age, .logEntry th.firstline { font-weight: bold; }
1038 .logEntry th.firstline { text-align: left; width: inherit; }
1038 .logEntry th.firstline { text-align: left; width: inherit; }
1039
1039
1040 /* Shortlog entries */
1040 /* Shortlog entries */
1041 .slogEntry { width: 100%; }
1041 .slogEntry { width: 100%; }
1042 .slogEntry .age { width: 8em; }
1042 .slogEntry .age { width: 8em; }
1043 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
1043 .slogEntry td { font-weight: normal; text-align: left; vertical-align: top; }
1044 .slogEntry td.author { width: 15em; }
1044 .slogEntry td.author { width: 15em; }
1045
1045
1046 /* Tag entries */
1046 /* Tag entries */
1047 #tagEntries { list-style: none; margin: 0; padding: 0; }
1047 #tagEntries { list-style: none; margin: 0; padding: 0; }
1048 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
1048 #tagEntries .tagEntry { list-style: none; margin: 0; padding: 0; }
1049
1049
1050 /* Changeset entry */
1050 /* Changeset entry */
1051 #changesetEntry { }
1051 #changesetEntry { }
1052 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1052 #changesetEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1053 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
1053 #changesetEntry th.files, #changesetEntry th.description { vertical-align: top; }
1054
1054
1055 /* File diff view */
1055 /* File diff view */
1056 #filediffEntry { }
1056 #filediffEntry { }
1057 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1057 #filediffEntry th { font-weight: normal; background-color: #888; color: #fff; text-align: right; }
1058
1058
1059 /* Graph */
1059 /* Graph */
1060 div#wrapper {
1060 div#wrapper {
1061 position: relative;
1061 position: relative;
1062 margin: 0;
1062 margin: 0;
1063 padding: 0;
1063 padding: 0;
1064 }
1064 }
1065
1065
1066 canvas {
1066 canvas {
1067 position: absolute;
1067 position: absolute;
1068 z-index: 5;
1068 z-index: 5;
1069 top: -0.6em;
1069 top: -0.6em;
1070 margin: 0;
1070 margin: 0;
1071 }
1071 }
1072
1072
1073 ul#nodebgs {
1073 ul#nodebgs {
1074 list-style: none inside none;
1074 list-style: none inside none;
1075 padding: 0;
1075 padding: 0;
1076 margin: 0;
1076 margin: 0;
1077 top: -0.7em;
1077 top: -0.7em;
1078 }
1078 }
1079
1079
1080 ul#graphnodes li, ul#nodebgs li {
1080 ul#graphnodes li, ul#nodebgs li {
1081 height: 39px;
1081 height: 39px;
1082 }
1082 }
1083
1083
1084 ul#graphnodes {
1084 ul#graphnodes {
1085 position: absolute;
1085 position: absolute;
1086 z-index: 10;
1086 z-index: 10;
1087 top: -0.85em;
1087 top: -0.85em;
1088 list-style: none inside none;
1088 list-style: none inside none;
1089 padding: 0;
1089 padding: 0;
1090 }
1090 }
1091
1091
1092 ul#graphnodes li .info {
1092 ul#graphnodes li .info {
1093 display: block;
1093 display: block;
1094 font-size: 70%;
1094 font-size: 70%;
1095 position: relative;
1095 position: relative;
1096 top: -1px;
1096 top: -1px;
1097 }
1097 }
1098
1098
1099 Stop and restart with HGENCODING=cp932
1099 Stop and restart with HGENCODING=cp932
1100
1100
1101 $ "$TESTDIR/killdaemons.py"
1101 $ "$TESTDIR/killdaemons.py"
1102 $ HGENCODING=cp932 hg serve --config server.uncompressed=False -n test \
1102 $ HGENCODING=cp932 hg serve --config server.uncompressed=False -n test \
1103 > -p $HGPORT -d --pid-file=hg.pid -E errors.log
1103 > -p $HGPORT -d --pid-file=hg.pid -E errors.log
1104 $ cat hg.pid >> $DAEMON_PIDS
1104 $ cat hg.pid >> $DAEMON_PIDS
1105
1105
1106 commit message with Japanese Kanji 'Noh', which ends with '\x5c'
1106 commit message with Japanese Kanji 'Noh', which ends with '\x5c'
1107
1107
1108 $ echo foo >> foo
1108 $ echo foo >> foo
1109 $ HGENCODING=cp932 hg ci -m `python -c 'print("\x94\x5c")'`
1109 $ HGENCODING=cp932 hg ci -m `python -c 'print("\x94\x5c")'`
1110
1110
1111 Graph json escape of multibyte character
1111 Graph json escape of multibyte character
1112
1112
1113 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/' \
1113 $ "$TESTDIR/get-with-headers.py" 127.0.0.1:$HGPORT '/graph/' \
1114 > | grep '^var data ='
1114 > | grep '^var data ='
1115 var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], [], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], [], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"], ["anotherthing"]]];
1115 var data = [["40b4d6888e92", [0, 1], [[0, 0, 1]], "\u80fd", "test", "1970-01-01", ["stable", true], ["tip"], ["something"]], ["1d22e65f027e", [0, 1], [[0, 0, 1]], "branch", "test", "1970-01-01", ["stable", false], [], []], ["a4f92ed23982", [0, 1], [[0, 0, 1]], "Added tag 1.0 for changeset 2ef0ac749a14", "test", "1970-01-01", ["default", true], [], []], ["2ef0ac749a14", [0, 1], [], "base", "test", "1970-01-01", ["default", false], ["1.0"], ["anotherthing"]]];
1116
1116
1117 ERRORS ENCOUNTERED
1117 ERRORS ENCOUNTERED
1118
1118
1119 $ cat errors.log
1119 $ cat errors.log
General Comments 0
You need to be logged in to leave comments. Login now