##// END OF EJS Templates
hgweb: link to successors of obsoleted changesets...
av6 -
r35502:4c7ae95e default
parent child Browse files
Show More
@@ -1,651 +1,654 b''
1 # hgweb/webutil.py - utility library for the web interface.
1 # hgweb/webutil.py - utility library for the web interface.
2 #
2 #
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
3 # Copyright 21 May 2005 - (c) 2005 Jake Edge <jake@edge2.net>
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
4 # Copyright 2005-2007 Matt Mackall <mpm@selenic.com>
5 #
5 #
6 # This software may be used and distributed according to the terms of the
6 # This software may be used and distributed according to the terms of the
7 # GNU General Public License version 2 or any later version.
7 # GNU General Public License version 2 or any later version.
8
8
9 from __future__ import absolute_import
9 from __future__ import absolute_import
10
10
11 import copy
11 import copy
12 import difflib
12 import difflib
13 import os
13 import os
14 import re
14 import re
15
15
16 from ..i18n import _
16 from ..i18n import _
17 from ..node import hex, nullid, short
17 from ..node import hex, nullid, short
18
18
19 from .common import (
19 from .common import (
20 ErrorResponse,
20 ErrorResponse,
21 HTTP_BAD_REQUEST,
21 HTTP_BAD_REQUEST,
22 HTTP_NOT_FOUND,
22 HTTP_NOT_FOUND,
23 paritygen,
23 paritygen,
24 )
24 )
25
25
26 from .. import (
26 from .. import (
27 context,
27 context,
28 error,
28 error,
29 match,
29 match,
30 mdiff,
30 mdiff,
31 patch,
31 patch,
32 pathutil,
32 pathutil,
33 pycompat,
33 pycompat,
34 templatefilters,
34 templatefilters,
35 templatekw,
35 templatekw,
36 ui as uimod,
36 ui as uimod,
37 util,
37 util,
38 )
38 )
39
39
40 def up(p):
40 def up(p):
41 if p[0] != "/":
41 if p[0] != "/":
42 p = "/" + p
42 p = "/" + p
43 if p[-1] == "/":
43 if p[-1] == "/":
44 p = p[:-1]
44 p = p[:-1]
45 up = os.path.dirname(p)
45 up = os.path.dirname(p)
46 if up == "/":
46 if up == "/":
47 return "/"
47 return "/"
48 return up + "/"
48 return up + "/"
49
49
50 def _navseq(step, firststep=None):
50 def _navseq(step, firststep=None):
51 if firststep:
51 if firststep:
52 yield firststep
52 yield firststep
53 if firststep >= 20 and firststep <= 40:
53 if firststep >= 20 and firststep <= 40:
54 firststep = 50
54 firststep = 50
55 yield firststep
55 yield firststep
56 assert step > 0
56 assert step > 0
57 assert firststep > 0
57 assert firststep > 0
58 while step <= firststep:
58 while step <= firststep:
59 step *= 10
59 step *= 10
60 while True:
60 while True:
61 yield 1 * step
61 yield 1 * step
62 yield 3 * step
62 yield 3 * step
63 step *= 10
63 step *= 10
64
64
65 class revnav(object):
65 class revnav(object):
66
66
67 def __init__(self, repo):
67 def __init__(self, repo):
68 """Navigation generation object
68 """Navigation generation object
69
69
70 :repo: repo object we generate nav for
70 :repo: repo object we generate nav for
71 """
71 """
72 # used for hex generation
72 # used for hex generation
73 self._revlog = repo.changelog
73 self._revlog = repo.changelog
74
74
75 def __nonzero__(self):
75 def __nonzero__(self):
76 """return True if any revision to navigate over"""
76 """return True if any revision to navigate over"""
77 return self._first() is not None
77 return self._first() is not None
78
78
79 __bool__ = __nonzero__
79 __bool__ = __nonzero__
80
80
81 def _first(self):
81 def _first(self):
82 """return the minimum non-filtered changeset or None"""
82 """return the minimum non-filtered changeset or None"""
83 try:
83 try:
84 return next(iter(self._revlog))
84 return next(iter(self._revlog))
85 except StopIteration:
85 except StopIteration:
86 return None
86 return None
87
87
88 def hex(self, rev):
88 def hex(self, rev):
89 return hex(self._revlog.node(rev))
89 return hex(self._revlog.node(rev))
90
90
91 def gen(self, pos, pagelen, limit):
91 def gen(self, pos, pagelen, limit):
92 """computes label and revision id for navigation link
92 """computes label and revision id for navigation link
93
93
94 :pos: is the revision relative to which we generate navigation.
94 :pos: is the revision relative to which we generate navigation.
95 :pagelen: the size of each navigation page
95 :pagelen: the size of each navigation page
96 :limit: how far shall we link
96 :limit: how far shall we link
97
97
98 The return is:
98 The return is:
99 - a single element tuple
99 - a single element tuple
100 - containing a dictionary with a `before` and `after` key
100 - containing a dictionary with a `before` and `after` key
101 - values are generator functions taking arbitrary number of kwargs
101 - values are generator functions taking arbitrary number of kwargs
102 - yield items are dictionaries with `label` and `node` keys
102 - yield items are dictionaries with `label` and `node` keys
103 """
103 """
104 if not self:
104 if not self:
105 # empty repo
105 # empty repo
106 return ({'before': (), 'after': ()},)
106 return ({'before': (), 'after': ()},)
107
107
108 targets = []
108 targets = []
109 for f in _navseq(1, pagelen):
109 for f in _navseq(1, pagelen):
110 if f > limit:
110 if f > limit:
111 break
111 break
112 targets.append(pos + f)
112 targets.append(pos + f)
113 targets.append(pos - f)
113 targets.append(pos - f)
114 targets.sort()
114 targets.sort()
115
115
116 first = self._first()
116 first = self._first()
117 navbefore = [("(%i)" % first, self.hex(first))]
117 navbefore = [("(%i)" % first, self.hex(first))]
118 navafter = []
118 navafter = []
119 for rev in targets:
119 for rev in targets:
120 if rev not in self._revlog:
120 if rev not in self._revlog:
121 continue
121 continue
122 if pos < rev < limit:
122 if pos < rev < limit:
123 navafter.append(("+%d" % abs(rev - pos), self.hex(rev)))
123 navafter.append(("+%d" % abs(rev - pos), self.hex(rev)))
124 if 0 < rev < pos:
124 if 0 < rev < pos:
125 navbefore.append(("-%d" % abs(rev - pos), self.hex(rev)))
125 navbefore.append(("-%d" % abs(rev - pos), self.hex(rev)))
126
126
127
127
128 navafter.append(("tip", "tip"))
128 navafter.append(("tip", "tip"))
129
129
130 data = lambda i: {"label": i[0], "node": i[1]}
130 data = lambda i: {"label": i[0], "node": i[1]}
131 return ({'before': lambda **map: (data(i) for i in navbefore),
131 return ({'before': lambda **map: (data(i) for i in navbefore),
132 'after': lambda **map: (data(i) for i in navafter)},)
132 'after': lambda **map: (data(i) for i in navafter)},)
133
133
134 class filerevnav(revnav):
134 class filerevnav(revnav):
135
135
136 def __init__(self, repo, path):
136 def __init__(self, repo, path):
137 """Navigation generation object
137 """Navigation generation object
138
138
139 :repo: repo object we generate nav for
139 :repo: repo object we generate nav for
140 :path: path of the file we generate nav for
140 :path: path of the file we generate nav for
141 """
141 """
142 # used for iteration
142 # used for iteration
143 self._changelog = repo.unfiltered().changelog
143 self._changelog = repo.unfiltered().changelog
144 # used for hex generation
144 # used for hex generation
145 self._revlog = repo.file(path)
145 self._revlog = repo.file(path)
146
146
147 def hex(self, rev):
147 def hex(self, rev):
148 return hex(self._changelog.node(self._revlog.linkrev(rev)))
148 return hex(self._changelog.node(self._revlog.linkrev(rev)))
149
149
150 class _siblings(object):
150 class _siblings(object):
151 def __init__(self, siblings=None, hiderev=None):
151 def __init__(self, siblings=None, hiderev=None):
152 if siblings is None:
152 if siblings is None:
153 siblings = []
153 siblings = []
154 self.siblings = [s for s in siblings if s.node() != nullid]
154 self.siblings = [s for s in siblings if s.node() != nullid]
155 if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
155 if len(self.siblings) == 1 and self.siblings[0].rev() == hiderev:
156 self.siblings = []
156 self.siblings = []
157
157
158 def __iter__(self):
158 def __iter__(self):
159 for s in self.siblings:
159 for s in self.siblings:
160 d = {
160 d = {
161 'node': s.hex(),
161 'node': s.hex(),
162 'rev': s.rev(),
162 'rev': s.rev(),
163 'user': s.user(),
163 'user': s.user(),
164 'date': s.date(),
164 'date': s.date(),
165 'description': s.description(),
165 'description': s.description(),
166 'branch': s.branch(),
166 'branch': s.branch(),
167 }
167 }
168 if util.safehasattr(s, 'path'):
168 if util.safehasattr(s, 'path'):
169 d['file'] = s.path()
169 d['file'] = s.path()
170 yield d
170 yield d
171
171
172 def __len__(self):
172 def __len__(self):
173 return len(self.siblings)
173 return len(self.siblings)
174
174
175 def difffeatureopts(req, ui, section):
175 def difffeatureopts(req, ui, section):
176 diffopts = patch.difffeatureopts(ui, untrusted=True,
176 diffopts = patch.difffeatureopts(ui, untrusted=True,
177 section=section, whitespace=True)
177 section=section, whitespace=True)
178
178
179 for k in ('ignorews', 'ignorewsamount', 'ignorewseol', 'ignoreblanklines'):
179 for k in ('ignorews', 'ignorewsamount', 'ignorewseol', 'ignoreblanklines'):
180 v = req.form.get(k, [None])[0]
180 v = req.form.get(k, [None])[0]
181 if v is not None:
181 if v is not None:
182 v = util.parsebool(v)
182 v = util.parsebool(v)
183 setattr(diffopts, k, v if v is not None else True)
183 setattr(diffopts, k, v if v is not None else True)
184
184
185 return diffopts
185 return diffopts
186
186
187 def annotate(req, fctx, ui):
187 def annotate(req, fctx, ui):
188 diffopts = difffeatureopts(req, ui, 'annotate')
188 diffopts = difffeatureopts(req, ui, 'annotate')
189 return fctx.annotate(follow=True, linenumber=True, diffopts=diffopts)
189 return fctx.annotate(follow=True, linenumber=True, diffopts=diffopts)
190
190
191 def parents(ctx, hide=None):
191 def parents(ctx, hide=None):
192 if isinstance(ctx, context.basefilectx):
192 if isinstance(ctx, context.basefilectx):
193 introrev = ctx.introrev()
193 introrev = ctx.introrev()
194 if ctx.changectx().rev() != introrev:
194 if ctx.changectx().rev() != introrev:
195 return _siblings([ctx.repo()[introrev]], hide)
195 return _siblings([ctx.repo()[introrev]], hide)
196 return _siblings(ctx.parents(), hide)
196 return _siblings(ctx.parents(), hide)
197
197
198 def children(ctx, hide=None):
198 def children(ctx, hide=None):
199 return _siblings(ctx.children(), hide)
199 return _siblings(ctx.children(), hide)
200
200
201 def renamelink(fctx):
201 def renamelink(fctx):
202 r = fctx.renamed()
202 r = fctx.renamed()
203 if r:
203 if r:
204 return [{'file': r[0], 'node': hex(r[1])}]
204 return [{'file': r[0], 'node': hex(r[1])}]
205 return []
205 return []
206
206
207 def nodetagsdict(repo, node):
207 def nodetagsdict(repo, node):
208 return [{"name": i} for i in repo.nodetags(node)]
208 return [{"name": i} for i in repo.nodetags(node)]
209
209
210 def nodebookmarksdict(repo, node):
210 def nodebookmarksdict(repo, node):
211 return [{"name": i} for i in repo.nodebookmarks(node)]
211 return [{"name": i} for i in repo.nodebookmarks(node)]
212
212
213 def nodebranchdict(repo, ctx):
213 def nodebranchdict(repo, ctx):
214 branches = []
214 branches = []
215 branch = ctx.branch()
215 branch = ctx.branch()
216 # If this is an empty repo, ctx.node() == nullid,
216 # If this is an empty repo, ctx.node() == nullid,
217 # ctx.branch() == 'default'.
217 # ctx.branch() == 'default'.
218 try:
218 try:
219 branchnode = repo.branchtip(branch)
219 branchnode = repo.branchtip(branch)
220 except error.RepoLookupError:
220 except error.RepoLookupError:
221 branchnode = None
221 branchnode = None
222 if branchnode == ctx.node():
222 if branchnode == ctx.node():
223 branches.append({"name": branch})
223 branches.append({"name": branch})
224 return branches
224 return branches
225
225
226 def nodeinbranch(repo, ctx):
226 def nodeinbranch(repo, ctx):
227 branches = []
227 branches = []
228 branch = ctx.branch()
228 branch = ctx.branch()
229 try:
229 try:
230 branchnode = repo.branchtip(branch)
230 branchnode = repo.branchtip(branch)
231 except error.RepoLookupError:
231 except error.RepoLookupError:
232 branchnode = None
232 branchnode = None
233 if branch != 'default' and branchnode != ctx.node():
233 if branch != 'default' and branchnode != ctx.node():
234 branches.append({"name": branch})
234 branches.append({"name": branch})
235 return branches
235 return branches
236
236
237 def nodebranchnodefault(ctx):
237 def nodebranchnodefault(ctx):
238 branches = []
238 branches = []
239 branch = ctx.branch()
239 branch = ctx.branch()
240 if branch != 'default':
240 if branch != 'default':
241 branches.append({"name": branch})
241 branches.append({"name": branch})
242 return branches
242 return branches
243
243
244 def showtag(repo, tmpl, t1, node=nullid, **args):
244 def showtag(repo, tmpl, t1, node=nullid, **args):
245 for t in repo.nodetags(node):
245 for t in repo.nodetags(node):
246 yield tmpl(t1, tag=t, **args)
246 yield tmpl(t1, tag=t, **args)
247
247
248 def showbookmark(repo, tmpl, t1, node=nullid, **args):
248 def showbookmark(repo, tmpl, t1, node=nullid, **args):
249 for t in repo.nodebookmarks(node):
249 for t in repo.nodebookmarks(node):
250 yield tmpl(t1, bookmark=t, **args)
250 yield tmpl(t1, bookmark=t, **args)
251
251
252 def branchentries(repo, stripecount, limit=0):
252 def branchentries(repo, stripecount, limit=0):
253 tips = []
253 tips = []
254 heads = repo.heads()
254 heads = repo.heads()
255 parity = paritygen(stripecount)
255 parity = paritygen(stripecount)
256 sortkey = lambda item: (not item[1], item[0].rev())
256 sortkey = lambda item: (not item[1], item[0].rev())
257
257
258 def entries(**map):
258 def entries(**map):
259 count = 0
259 count = 0
260 if not tips:
260 if not tips:
261 for tag, hs, tip, closed in repo.branchmap().iterbranches():
261 for tag, hs, tip, closed in repo.branchmap().iterbranches():
262 tips.append((repo[tip], closed))
262 tips.append((repo[tip], closed))
263 for ctx, closed in sorted(tips, key=sortkey, reverse=True):
263 for ctx, closed in sorted(tips, key=sortkey, reverse=True):
264 if limit > 0 and count >= limit:
264 if limit > 0 and count >= limit:
265 return
265 return
266 count += 1
266 count += 1
267 if closed:
267 if closed:
268 status = 'closed'
268 status = 'closed'
269 elif ctx.node() not in heads:
269 elif ctx.node() not in heads:
270 status = 'inactive'
270 status = 'inactive'
271 else:
271 else:
272 status = 'open'
272 status = 'open'
273 yield {
273 yield {
274 'parity': next(parity),
274 'parity': next(parity),
275 'branch': ctx.branch(),
275 'branch': ctx.branch(),
276 'status': status,
276 'status': status,
277 'node': ctx.hex(),
277 'node': ctx.hex(),
278 'date': ctx.date()
278 'date': ctx.date()
279 }
279 }
280
280
281 return entries
281 return entries
282
282
283 def cleanpath(repo, path):
283 def cleanpath(repo, path):
284 path = path.lstrip('/')
284 path = path.lstrip('/')
285 return pathutil.canonpath(repo.root, '', path)
285 return pathutil.canonpath(repo.root, '', path)
286
286
287 def changeidctx(repo, changeid):
287 def changeidctx(repo, changeid):
288 try:
288 try:
289 ctx = repo[changeid]
289 ctx = repo[changeid]
290 except error.RepoError:
290 except error.RepoError:
291 man = repo.manifestlog._revlog
291 man = repo.manifestlog._revlog
292 ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
292 ctx = repo[man.linkrev(man.rev(man.lookup(changeid)))]
293
293
294 return ctx
294 return ctx
295
295
296 def changectx(repo, req):
296 def changectx(repo, req):
297 changeid = "tip"
297 changeid = "tip"
298 if 'node' in req.form:
298 if 'node' in req.form:
299 changeid = req.form['node'][0]
299 changeid = req.form['node'][0]
300 ipos = changeid.find(':')
300 ipos = changeid.find(':')
301 if ipos != -1:
301 if ipos != -1:
302 changeid = changeid[(ipos + 1):]
302 changeid = changeid[(ipos + 1):]
303 elif 'manifest' in req.form:
303 elif 'manifest' in req.form:
304 changeid = req.form['manifest'][0]
304 changeid = req.form['manifest'][0]
305
305
306 return changeidctx(repo, changeid)
306 return changeidctx(repo, changeid)
307
307
308 def basechangectx(repo, req):
308 def basechangectx(repo, req):
309 if 'node' in req.form:
309 if 'node' in req.form:
310 changeid = req.form['node'][0]
310 changeid = req.form['node'][0]
311 ipos = changeid.find(':')
311 ipos = changeid.find(':')
312 if ipos != -1:
312 if ipos != -1:
313 changeid = changeid[:ipos]
313 changeid = changeid[:ipos]
314 return changeidctx(repo, changeid)
314 return changeidctx(repo, changeid)
315
315
316 return None
316 return None
317
317
318 def filectx(repo, req):
318 def filectx(repo, req):
319 if 'file' not in req.form:
319 if 'file' not in req.form:
320 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
320 raise ErrorResponse(HTTP_NOT_FOUND, 'file not given')
321 path = cleanpath(repo, req.form['file'][0])
321 path = cleanpath(repo, req.form['file'][0])
322 if 'node' in req.form:
322 if 'node' in req.form:
323 changeid = req.form['node'][0]
323 changeid = req.form['node'][0]
324 elif 'filenode' in req.form:
324 elif 'filenode' in req.form:
325 changeid = req.form['filenode'][0]
325 changeid = req.form['filenode'][0]
326 else:
326 else:
327 raise ErrorResponse(HTTP_NOT_FOUND, 'node or filenode not given')
327 raise ErrorResponse(HTTP_NOT_FOUND, 'node or filenode not given')
328 try:
328 try:
329 fctx = repo[changeid][path]
329 fctx = repo[changeid][path]
330 except error.RepoError:
330 except error.RepoError:
331 fctx = repo.filectx(path, fileid=changeid)
331 fctx = repo.filectx(path, fileid=changeid)
332
332
333 return fctx
333 return fctx
334
334
335 def linerange(req):
335 def linerange(req):
336 linerange = req.form.get('linerange')
336 linerange = req.form.get('linerange')
337 if linerange is None:
337 if linerange is None:
338 return None
338 return None
339 if len(linerange) > 1:
339 if len(linerange) > 1:
340 raise ErrorResponse(HTTP_BAD_REQUEST,
340 raise ErrorResponse(HTTP_BAD_REQUEST,
341 'redundant linerange parameter')
341 'redundant linerange parameter')
342 try:
342 try:
343 fromline, toline = map(int, linerange[0].split(':', 1))
343 fromline, toline = map(int, linerange[0].split(':', 1))
344 except ValueError:
344 except ValueError:
345 raise ErrorResponse(HTTP_BAD_REQUEST,
345 raise ErrorResponse(HTTP_BAD_REQUEST,
346 'invalid linerange parameter')
346 'invalid linerange parameter')
347 try:
347 try:
348 return util.processlinerange(fromline, toline)
348 return util.processlinerange(fromline, toline)
349 except error.ParseError as exc:
349 except error.ParseError as exc:
350 raise ErrorResponse(HTTP_BAD_REQUEST, str(exc))
350 raise ErrorResponse(HTTP_BAD_REQUEST, str(exc))
351
351
352 def formatlinerange(fromline, toline):
352 def formatlinerange(fromline, toline):
353 return '%d:%d' % (fromline + 1, toline)
353 return '%d:%d' % (fromline + 1, toline)
354
354
355 def succsandmarkers(repo, ctx):
355 def succsandmarkers(repo, ctx):
356 return templatekw.showsuccsandmarkers(repo, ctx)
356 for item in templatekw.showsuccsandmarkers(repo, ctx):
357 item['successors'] = _siblings(repo[successor]
358 for successor in item['successors'])
359 yield item
357
360
358 def commonentry(repo, ctx):
361 def commonentry(repo, ctx):
359 node = ctx.node()
362 node = ctx.node()
360 return {
363 return {
361 'rev': ctx.rev(),
364 'rev': ctx.rev(),
362 'node': hex(node),
365 'node': hex(node),
363 'author': ctx.user(),
366 'author': ctx.user(),
364 'desc': ctx.description(),
367 'desc': ctx.description(),
365 'date': ctx.date(),
368 'date': ctx.date(),
366 'extra': ctx.extra(),
369 'extra': ctx.extra(),
367 'phase': ctx.phasestr(),
370 'phase': ctx.phasestr(),
368 'obsolete': ctx.obsolete(),
371 'obsolete': ctx.obsolete(),
369 'succsandmarkers': lambda **x: succsandmarkers(repo, ctx),
372 'succsandmarkers': lambda **x: succsandmarkers(repo, ctx),
370 'instabilities': [{"instability": i} for i in ctx.instabilities()],
373 'instabilities': [{"instability": i} for i in ctx.instabilities()],
371 'branch': nodebranchnodefault(ctx),
374 'branch': nodebranchnodefault(ctx),
372 'inbranch': nodeinbranch(repo, ctx),
375 'inbranch': nodeinbranch(repo, ctx),
373 'branches': nodebranchdict(repo, ctx),
376 'branches': nodebranchdict(repo, ctx),
374 'tags': nodetagsdict(repo, node),
377 'tags': nodetagsdict(repo, node),
375 'bookmarks': nodebookmarksdict(repo, node),
378 'bookmarks': nodebookmarksdict(repo, node),
376 'parent': lambda **x: parents(ctx),
379 'parent': lambda **x: parents(ctx),
377 'child': lambda **x: children(ctx),
380 'child': lambda **x: children(ctx),
378 }
381 }
379
382
380 def changelistentry(web, ctx, tmpl):
383 def changelistentry(web, ctx, tmpl):
381 '''Obtain a dictionary to be used for entries in a changelist.
384 '''Obtain a dictionary to be used for entries in a changelist.
382
385
383 This function is called when producing items for the "entries" list passed
386 This function is called when producing items for the "entries" list passed
384 to the "shortlog" and "changelog" templates.
387 to the "shortlog" and "changelog" templates.
385 '''
388 '''
386 repo = web.repo
389 repo = web.repo
387 rev = ctx.rev()
390 rev = ctx.rev()
388 n = ctx.node()
391 n = ctx.node()
389 showtags = showtag(repo, tmpl, 'changelogtag', n)
392 showtags = showtag(repo, tmpl, 'changelogtag', n)
390 files = listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
393 files = listfilediffs(tmpl, ctx.files(), n, web.maxfiles)
391
394
392 entry = commonentry(repo, ctx)
395 entry = commonentry(repo, ctx)
393 entry.update(
396 entry.update(
394 allparents=lambda **x: parents(ctx),
397 allparents=lambda **x: parents(ctx),
395 parent=lambda **x: parents(ctx, rev - 1),
398 parent=lambda **x: parents(ctx, rev - 1),
396 child=lambda **x: children(ctx, rev + 1),
399 child=lambda **x: children(ctx, rev + 1),
397 changelogtag=showtags,
400 changelogtag=showtags,
398 files=files,
401 files=files,
399 )
402 )
400 return entry
403 return entry
401
404
402 def symrevorshortnode(req, ctx):
405 def symrevorshortnode(req, ctx):
403 if 'node' in req.form:
406 if 'node' in req.form:
404 return templatefilters.revescape(req.form['node'][0])
407 return templatefilters.revescape(req.form['node'][0])
405 else:
408 else:
406 return short(ctx.node())
409 return short(ctx.node())
407
410
408 def changesetentry(web, req, tmpl, ctx):
411 def changesetentry(web, req, tmpl, ctx):
409 '''Obtain a dictionary to be used to render the "changeset" template.'''
412 '''Obtain a dictionary to be used to render the "changeset" template.'''
410
413
411 showtags = showtag(web.repo, tmpl, 'changesettag', ctx.node())
414 showtags = showtag(web.repo, tmpl, 'changesettag', ctx.node())
412 showbookmarks = showbookmark(web.repo, tmpl, 'changesetbookmark',
415 showbookmarks = showbookmark(web.repo, tmpl, 'changesetbookmark',
413 ctx.node())
416 ctx.node())
414 showbranch = nodebranchnodefault(ctx)
417 showbranch = nodebranchnodefault(ctx)
415
418
416 files = []
419 files = []
417 parity = paritygen(web.stripecount)
420 parity = paritygen(web.stripecount)
418 for blockno, f in enumerate(ctx.files()):
421 for blockno, f in enumerate(ctx.files()):
419 template = 'filenodelink' if f in ctx else 'filenolink'
422 template = 'filenodelink' if f in ctx else 'filenolink'
420 files.append(tmpl(template,
423 files.append(tmpl(template,
421 node=ctx.hex(), file=f, blockno=blockno + 1,
424 node=ctx.hex(), file=f, blockno=blockno + 1,
422 parity=next(parity)))
425 parity=next(parity)))
423
426
424 basectx = basechangectx(web.repo, req)
427 basectx = basechangectx(web.repo, req)
425 if basectx is None:
428 if basectx is None:
426 basectx = ctx.p1()
429 basectx = ctx.p1()
427
430
428 style = web.config('web', 'style')
431 style = web.config('web', 'style')
429 if 'style' in req.form:
432 if 'style' in req.form:
430 style = req.form['style'][0]
433 style = req.form['style'][0]
431
434
432 diff = diffs(web, tmpl, ctx, basectx, None, style)
435 diff = diffs(web, tmpl, ctx, basectx, None, style)
433
436
434 parity = paritygen(web.stripecount)
437 parity = paritygen(web.stripecount)
435 diffstatsgen = diffstatgen(ctx, basectx)
438 diffstatsgen = diffstatgen(ctx, basectx)
436 diffstats = diffstat(tmpl, ctx, diffstatsgen, parity)
439 diffstats = diffstat(tmpl, ctx, diffstatsgen, parity)
437
440
438 return dict(
441 return dict(
439 diff=diff,
442 diff=diff,
440 symrev=symrevorshortnode(req, ctx),
443 symrev=symrevorshortnode(req, ctx),
441 basenode=basectx.hex(),
444 basenode=basectx.hex(),
442 changesettag=showtags,
445 changesettag=showtags,
443 changesetbookmark=showbookmarks,
446 changesetbookmark=showbookmarks,
444 changesetbranch=showbranch,
447 changesetbranch=showbranch,
445 files=files,
448 files=files,
446 diffsummary=lambda **x: diffsummary(diffstatsgen),
449 diffsummary=lambda **x: diffsummary(diffstatsgen),
447 diffstat=diffstats,
450 diffstat=diffstats,
448 archives=web.archivelist(ctx.hex()),
451 archives=web.archivelist(ctx.hex()),
449 **commonentry(web.repo, ctx))
452 **commonentry(web.repo, ctx))
450
453
451 def listfilediffs(tmpl, files, node, max):
454 def listfilediffs(tmpl, files, node, max):
452 for f in files[:max]:
455 for f in files[:max]:
453 yield tmpl('filedifflink', node=hex(node), file=f)
456 yield tmpl('filedifflink', node=hex(node), file=f)
454 if len(files) > max:
457 if len(files) > max:
455 yield tmpl('fileellipses')
458 yield tmpl('fileellipses')
456
459
457 def diffs(web, tmpl, ctx, basectx, files, style, linerange=None,
460 def diffs(web, tmpl, ctx, basectx, files, style, linerange=None,
458 lineidprefix=''):
461 lineidprefix=''):
459
462
460 def prettyprintlines(lines, blockno):
463 def prettyprintlines(lines, blockno):
461 for lineno, l in enumerate(lines, 1):
464 for lineno, l in enumerate(lines, 1):
462 difflineno = "%d.%d" % (blockno, lineno)
465 difflineno = "%d.%d" % (blockno, lineno)
463 if l.startswith('+'):
466 if l.startswith('+'):
464 ltype = "difflineplus"
467 ltype = "difflineplus"
465 elif l.startswith('-'):
468 elif l.startswith('-'):
466 ltype = "difflineminus"
469 ltype = "difflineminus"
467 elif l.startswith('@'):
470 elif l.startswith('@'):
468 ltype = "difflineat"
471 ltype = "difflineat"
469 else:
472 else:
470 ltype = "diffline"
473 ltype = "diffline"
471 yield tmpl(ltype,
474 yield tmpl(ltype,
472 line=l,
475 line=l,
473 lineno=lineno,
476 lineno=lineno,
474 lineid=lineidprefix + "l%s" % difflineno,
477 lineid=lineidprefix + "l%s" % difflineno,
475 linenumber="% 8s" % difflineno)
478 linenumber="% 8s" % difflineno)
476
479
477 repo = web.repo
480 repo = web.repo
478 if files:
481 if files:
479 m = match.exact(repo.root, repo.getcwd(), files)
482 m = match.exact(repo.root, repo.getcwd(), files)
480 else:
483 else:
481 m = match.always(repo.root, repo.getcwd())
484 m = match.always(repo.root, repo.getcwd())
482
485
483 diffopts = patch.diffopts(repo.ui, untrusted=True)
486 diffopts = patch.diffopts(repo.ui, untrusted=True)
484 node1 = basectx.node()
487 node1 = basectx.node()
485 node2 = ctx.node()
488 node2 = ctx.node()
486 parity = paritygen(web.stripecount)
489 parity = paritygen(web.stripecount)
487
490
488 diffhunks = patch.diffhunks(repo, node1, node2, m, opts=diffopts)
491 diffhunks = patch.diffhunks(repo, node1, node2, m, opts=diffopts)
489 for blockno, (fctx1, fctx2, header, hunks) in enumerate(diffhunks, 1):
492 for blockno, (fctx1, fctx2, header, hunks) in enumerate(diffhunks, 1):
490 if style != 'raw':
493 if style != 'raw':
491 header = header[1:]
494 header = header[1:]
492 lines = [h + '\n' for h in header]
495 lines = [h + '\n' for h in header]
493 for hunkrange, hunklines in hunks:
496 for hunkrange, hunklines in hunks:
494 if linerange is not None and hunkrange is not None:
497 if linerange is not None and hunkrange is not None:
495 s1, l1, s2, l2 = hunkrange
498 s1, l1, s2, l2 = hunkrange
496 if not mdiff.hunkinrange((s2, l2), linerange):
499 if not mdiff.hunkinrange((s2, l2), linerange):
497 continue
500 continue
498 lines.extend(hunklines)
501 lines.extend(hunklines)
499 if lines:
502 if lines:
500 yield tmpl('diffblock', parity=next(parity), blockno=blockno,
503 yield tmpl('diffblock', parity=next(parity), blockno=blockno,
501 lines=prettyprintlines(lines, blockno))
504 lines=prettyprintlines(lines, blockno))
502
505
503 def compare(tmpl, context, leftlines, rightlines):
506 def compare(tmpl, context, leftlines, rightlines):
504 '''Generator function that provides side-by-side comparison data.'''
507 '''Generator function that provides side-by-side comparison data.'''
505
508
506 def compline(type, leftlineno, leftline, rightlineno, rightline):
509 def compline(type, leftlineno, leftline, rightlineno, rightline):
507 lineid = leftlineno and ("l%s" % leftlineno) or ''
510 lineid = leftlineno and ("l%s" % leftlineno) or ''
508 lineid += rightlineno and ("r%s" % rightlineno) or ''
511 lineid += rightlineno and ("r%s" % rightlineno) or ''
509 return tmpl('comparisonline',
512 return tmpl('comparisonline',
510 type=type,
513 type=type,
511 lineid=lineid,
514 lineid=lineid,
512 leftlineno=leftlineno,
515 leftlineno=leftlineno,
513 leftlinenumber="% 6s" % (leftlineno or ''),
516 leftlinenumber="% 6s" % (leftlineno or ''),
514 leftline=leftline or '',
517 leftline=leftline or '',
515 rightlineno=rightlineno,
518 rightlineno=rightlineno,
516 rightlinenumber="% 6s" % (rightlineno or ''),
519 rightlinenumber="% 6s" % (rightlineno or ''),
517 rightline=rightline or '')
520 rightline=rightline or '')
518
521
519 def getblock(opcodes):
522 def getblock(opcodes):
520 for type, llo, lhi, rlo, rhi in opcodes:
523 for type, llo, lhi, rlo, rhi in opcodes:
521 len1 = lhi - llo
524 len1 = lhi - llo
522 len2 = rhi - rlo
525 len2 = rhi - rlo
523 count = min(len1, len2)
526 count = min(len1, len2)
524 for i in xrange(count):
527 for i in xrange(count):
525 yield compline(type=type,
528 yield compline(type=type,
526 leftlineno=llo + i + 1,
529 leftlineno=llo + i + 1,
527 leftline=leftlines[llo + i],
530 leftline=leftlines[llo + i],
528 rightlineno=rlo + i + 1,
531 rightlineno=rlo + i + 1,
529 rightline=rightlines[rlo + i])
532 rightline=rightlines[rlo + i])
530 if len1 > len2:
533 if len1 > len2:
531 for i in xrange(llo + count, lhi):
534 for i in xrange(llo + count, lhi):
532 yield compline(type=type,
535 yield compline(type=type,
533 leftlineno=i + 1,
536 leftlineno=i + 1,
534 leftline=leftlines[i],
537 leftline=leftlines[i],
535 rightlineno=None,
538 rightlineno=None,
536 rightline=None)
539 rightline=None)
537 elif len2 > len1:
540 elif len2 > len1:
538 for i in xrange(rlo + count, rhi):
541 for i in xrange(rlo + count, rhi):
539 yield compline(type=type,
542 yield compline(type=type,
540 leftlineno=None,
543 leftlineno=None,
541 leftline=None,
544 leftline=None,
542 rightlineno=i + 1,
545 rightlineno=i + 1,
543 rightline=rightlines[i])
546 rightline=rightlines[i])
544
547
545 s = difflib.SequenceMatcher(None, leftlines, rightlines)
548 s = difflib.SequenceMatcher(None, leftlines, rightlines)
546 if context < 0:
549 if context < 0:
547 yield tmpl('comparisonblock', lines=getblock(s.get_opcodes()))
550 yield tmpl('comparisonblock', lines=getblock(s.get_opcodes()))
548 else:
551 else:
549 for oc in s.get_grouped_opcodes(n=context):
552 for oc in s.get_grouped_opcodes(n=context):
550 yield tmpl('comparisonblock', lines=getblock(oc))
553 yield tmpl('comparisonblock', lines=getblock(oc))
551
554
552 def diffstatgen(ctx, basectx):
555 def diffstatgen(ctx, basectx):
553 '''Generator function that provides the diffstat data.'''
556 '''Generator function that provides the diffstat data.'''
554
557
555 stats = patch.diffstatdata(
558 stats = patch.diffstatdata(
556 util.iterlines(ctx.diff(basectx, noprefix=False)))
559 util.iterlines(ctx.diff(basectx, noprefix=False)))
557 maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats)
560 maxname, maxtotal, addtotal, removetotal, binary = patch.diffstatsum(stats)
558 while True:
561 while True:
559 yield stats, maxname, maxtotal, addtotal, removetotal, binary
562 yield stats, maxname, maxtotal, addtotal, removetotal, binary
560
563
561 def diffsummary(statgen):
564 def diffsummary(statgen):
562 '''Return a short summary of the diff.'''
565 '''Return a short summary of the diff.'''
563
566
564 stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen)
567 stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen)
565 return _(' %d files changed, %d insertions(+), %d deletions(-)\n') % (
568 return _(' %d files changed, %d insertions(+), %d deletions(-)\n') % (
566 len(stats), addtotal, removetotal)
569 len(stats), addtotal, removetotal)
567
570
568 def diffstat(tmpl, ctx, statgen, parity):
571 def diffstat(tmpl, ctx, statgen, parity):
569 '''Return a diffstat template for each file in the diff.'''
572 '''Return a diffstat template for each file in the diff.'''
570
573
571 stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen)
574 stats, maxname, maxtotal, addtotal, removetotal, binary = next(statgen)
572 files = ctx.files()
575 files = ctx.files()
573
576
574 def pct(i):
577 def pct(i):
575 if maxtotal == 0:
578 if maxtotal == 0:
576 return 0
579 return 0
577 return (float(i) / maxtotal) * 100
580 return (float(i) / maxtotal) * 100
578
581
579 fileno = 0
582 fileno = 0
580 for filename, adds, removes, isbinary in stats:
583 for filename, adds, removes, isbinary in stats:
581 template = 'diffstatlink' if filename in files else 'diffstatnolink'
584 template = 'diffstatlink' if filename in files else 'diffstatnolink'
582 total = adds + removes
585 total = adds + removes
583 fileno += 1
586 fileno += 1
584 yield tmpl(template, node=ctx.hex(), file=filename, fileno=fileno,
587 yield tmpl(template, node=ctx.hex(), file=filename, fileno=fileno,
585 total=total, addpct=pct(adds), removepct=pct(removes),
588 total=total, addpct=pct(adds), removepct=pct(removes),
586 parity=next(parity))
589 parity=next(parity))
587
590
588 class sessionvars(object):
591 class sessionvars(object):
589 def __init__(self, vars, start='?'):
592 def __init__(self, vars, start='?'):
590 self.start = start
593 self.start = start
591 self.vars = vars
594 self.vars = vars
592 def __getitem__(self, key):
595 def __getitem__(self, key):
593 return self.vars[key]
596 return self.vars[key]
594 def __setitem__(self, key, value):
597 def __setitem__(self, key, value):
595 self.vars[key] = value
598 self.vars[key] = value
596 def __copy__(self):
599 def __copy__(self):
597 return sessionvars(copy.copy(self.vars), self.start)
600 return sessionvars(copy.copy(self.vars), self.start)
598 def __iter__(self):
601 def __iter__(self):
599 separator = self.start
602 separator = self.start
600 for key, value in sorted(self.vars.iteritems()):
603 for key, value in sorted(self.vars.iteritems()):
601 yield {'name': key,
604 yield {'name': key,
602 'value': pycompat.bytestr(value),
605 'value': pycompat.bytestr(value),
603 'separator': separator,
606 'separator': separator,
604 }
607 }
605 separator = '&'
608 separator = '&'
606
609
607 class wsgiui(uimod.ui):
610 class wsgiui(uimod.ui):
608 # default termwidth breaks under mod_wsgi
611 # default termwidth breaks under mod_wsgi
609 def termwidth(self):
612 def termwidth(self):
610 return 80
613 return 80
611
614
612 def getwebsubs(repo):
615 def getwebsubs(repo):
613 websubtable = []
616 websubtable = []
614 websubdefs = repo.ui.configitems('websub')
617 websubdefs = repo.ui.configitems('websub')
615 # we must maintain interhg backwards compatibility
618 # we must maintain interhg backwards compatibility
616 websubdefs += repo.ui.configitems('interhg')
619 websubdefs += repo.ui.configitems('interhg')
617 for key, pattern in websubdefs:
620 for key, pattern in websubdefs:
618 # grab the delimiter from the character after the "s"
621 # grab the delimiter from the character after the "s"
619 unesc = pattern[1]
622 unesc = pattern[1]
620 delim = re.escape(unesc)
623 delim = re.escape(unesc)
621
624
622 # identify portions of the pattern, taking care to avoid escaped
625 # identify portions of the pattern, taking care to avoid escaped
623 # delimiters. the replace format and flags are optional, but
626 # delimiters. the replace format and flags are optional, but
624 # delimiters are required.
627 # delimiters are required.
625 match = re.match(
628 match = re.match(
626 r'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$'
629 r'^s%s(.+)(?:(?<=\\\\)|(?<!\\))%s(.*)%s([ilmsux])*$'
627 % (delim, delim, delim), pattern)
630 % (delim, delim, delim), pattern)
628 if not match:
631 if not match:
629 repo.ui.warn(_("websub: invalid pattern for %s: %s\n")
632 repo.ui.warn(_("websub: invalid pattern for %s: %s\n")
630 % (key, pattern))
633 % (key, pattern))
631 continue
634 continue
632
635
633 # we need to unescape the delimiter for regexp and format
636 # we need to unescape the delimiter for regexp and format
634 delim_re = re.compile(r'(?<!\\)\\%s' % delim)
637 delim_re = re.compile(r'(?<!\\)\\%s' % delim)
635 regexp = delim_re.sub(unesc, match.group(1))
638 regexp = delim_re.sub(unesc, match.group(1))
636 format = delim_re.sub(unesc, match.group(2))
639 format = delim_re.sub(unesc, match.group(2))
637
640
638 # the pattern allows for 6 regexp flags, so set them if necessary
641 # the pattern allows for 6 regexp flags, so set them if necessary
639 flagin = match.group(3)
642 flagin = match.group(3)
640 flags = 0
643 flags = 0
641 if flagin:
644 if flagin:
642 for flag in flagin.upper():
645 for flag in flagin.upper():
643 flags |= re.__dict__[flag]
646 flags |= re.__dict__[flag]
644
647
645 try:
648 try:
646 regexp = re.compile(regexp, flags)
649 regexp = re.compile(regexp, flags)
647 websubtable.append((regexp, format))
650 websubtable.append((regexp, format))
648 except re.error:
651 except re.error:
649 repo.ui.warn(_("websub: invalid regexp for %s: %s\n")
652 repo.ui.warn(_("websub: invalid regexp for %s: %s\n")
650 % (key, regexp))
653 % (key, regexp))
651 return websubtable
654 return websubtable
@@ -1,360 +1,361 b''
1 default = 'summary'
1 default = 'summary'
2 mimetype = 'text/html; charset={encoding}'
2 mimetype = 'text/html; charset={encoding}'
3 header = header.tmpl
3 header = header.tmpl
4 footer = footer.tmpl
4 footer = footer.tmpl
5 search = search.tmpl
5 search = search.tmpl
6 changelog = changelog.tmpl
6 changelog = changelog.tmpl
7 summary = summary.tmpl
7 summary = summary.tmpl
8 error = error.tmpl
8 error = error.tmpl
9 notfound = notfound.tmpl
9 notfound = notfound.tmpl
10
10
11 help = help.tmpl
11 help = help.tmpl
12 helptopics = helptopics.tmpl
12 helptopics = helptopics.tmpl
13
13
14 helpentry = '
14 helpentry = '
15 <tr><td>
15 <tr><td>
16 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
16 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
17 {if(basename, '{basename|escape}', '{topic|escape}')}
17 {if(basename, '{basename|escape}', '{topic|escape}')}
18 </a>
18 </a>
19 </td><td>
19 </td><td>
20 {summary|escape}
20 {summary|escape}
21 </td></tr>'
21 </td></tr>'
22
22
23 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
23 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
24 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
24 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
26 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
27 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
27 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
28 filenodelink = '
28 filenodelink = '
29 <tr class="parity{parity}">
29 <tr class="parity{parity}">
30 <td><a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
30 <td><a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
31 <td></td>
31 <td></td>
32 <td class="link">
32 <td class="link">
33 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
33 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
34 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
34 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
35 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
35 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
36 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
36 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
37 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
37 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
38 </td>
38 </td>
39 </tr>'
39 </tr>'
40 filenolink = '
40 filenolink = '
41 <tr class="parity{parity}">
41 <tr class="parity{parity}">
42 <td><a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
42 <td><a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
43 <td></td>
43 <td></td>
44 <td class="link">
44 <td class="link">
45 file |
45 file |
46 annotate |
46 annotate |
47 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
47 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
48 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
48 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
49 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
49 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
50 </td>
50 </td>
51 </tr>'
51 </tr>'
52
52
53 nav = '{before%naventry} {after%naventry}'
53 nav = '{before%naventry} {after%naventry}'
54 navshort = '{before%navshortentry}{after%navshortentry}'
54 navshort = '{before%navshortentry}{after%navshortentry}'
55 navgraph = '{before%navgraphentry}{after%navgraphentry}'
55 navgraph = '{before%navgraphentry}{after%navgraphentry}'
56 filenav = '{before%filenaventry}{after%filenaventry}'
56 filenav = '{before%filenaventry}{after%filenaventry}'
57
57
58 fileellipses = '...'
58 fileellipses = '...'
59 changelogentry = changelogentry.tmpl
59 changelogentry = changelogentry.tmpl
60 searchentry = changelogentry.tmpl
60 searchentry = changelogentry.tmpl
61 changeset = changeset.tmpl
61 changeset = changeset.tmpl
62 manifest = manifest.tmpl
62 manifest = manifest.tmpl
63 direntry = '
63 direntry = '
64 <tr class="parity{parity}">
64 <tr class="parity{parity}">
65 <td style="font-family:monospace">drwxr-xr-x</td>
65 <td style="font-family:monospace">drwxr-xr-x</td>
66 <td style="font-family:monospace"></td>
66 <td style="font-family:monospace"></td>
67 <td style="font-family:monospace"></td>
67 <td style="font-family:monospace"></td>
68 <td>
68 <td>
69 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
69 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
70 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
70 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
71 </td>
71 </td>
72 <td class="link">
72 <td class="link">
73 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">files</a>
73 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">files</a>
74 </td>
74 </td>
75 </tr>'
75 </tr>'
76 fileentry = '
76 fileentry = '
77 <tr class="parity{parity}">
77 <tr class="parity{parity}">
78 <td style="font-family:monospace">{permissions|permissions}</td>
78 <td style="font-family:monospace">{permissions|permissions}</td>
79 <td style="font-family:monospace" align=right>{date|isodate}</td>
79 <td style="font-family:monospace" align=right>{date|isodate}</td>
80 <td style="font-family:monospace" align=right>{size}</td>
80 <td style="font-family:monospace" align=right>{size}</td>
81 <td class="list">
81 <td class="list">
82 <a class="list" href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
82 <a class="list" href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
83 </td>
83 </td>
84 <td class="link">
84 <td class="link">
85 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
85 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
86 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
86 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
87 <a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
87 <a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
88 </td>
88 </td>
89 </tr>'
89 </tr>'
90 filerevision = filerevision.tmpl
90 filerevision = filerevision.tmpl
91 fileannotate = fileannotate.tmpl
91 fileannotate = fileannotate.tmpl
92 filediff = filediff.tmpl
92 filediff = filediff.tmpl
93 filecomparison = filecomparison.tmpl
93 filecomparison = filecomparison.tmpl
94 filelog = filelog.tmpl
94 filelog = filelog.tmpl
95 fileline = '
95 fileline = '
96 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
96 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
97 annotateline = '
97 annotateline = '
98 <tr id="{lineid}" style="font-family:monospace" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
98 <tr id="{lineid}" style="font-family:monospace" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
99 <td class="annotate linenr parity{blockparity}" style="text-align: right;">
99 <td class="annotate linenr parity{blockparity}" style="text-align: right;">
100 {if(blockhead,
100 {if(blockhead,
101 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
101 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
102 {rev}
102 {rev}
103 </a>')}
103 </a>')}
104 <div class="annotate-info">
104 <div class="annotate-info">
105 <div>
105 <div>
106 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
106 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
107 {node|short}</a>
107 {node|short}</a>
108 {desc|escape|firstline}
108 {desc|escape|firstline}
109 </div>
109 </div>
110 <div><em>{author|obfuscate}</em></div>
110 <div><em>{author|obfuscate}</em></div>
111 <div>parents: {parents%annotateparent}</div>
111 <div>parents: {parents%annotateparent}</div>
112 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
112 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
113 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
113 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
114 </div>
114 </div>
115 </td>
115 </td>
116 <td class="followlines-btn-parent"><pre><a class="linenr" href="#{lineid}">{linenumber}</a></pre></td>
116 <td class="followlines-btn-parent"><pre><a class="linenr" href="#{lineid}">{linenumber}</a></pre></td>
117 <td><pre>{line|escape}</pre></td>
117 <td><pre>{line|escape}</pre></td>
118 </tr>'
118 </tr>'
119 annotateparent = '
119 annotateparent = '
120 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
120 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
121 difflineplus = '
121 difflineplus = '
122 <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
122 <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
123 difflineminus = '
123 difflineminus = '
124 <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
124 <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
125 difflineat = '
125 difflineat = '
126 <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
126 <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
127 diffline = '
127 diffline = '
128 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
128 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
129
129
130 comparisonblock ='
130 comparisonblock ='
131 <tbody class="block">
131 <tbody class="block">
132 {lines}
132 {lines}
133 </tbody>'
133 </tbody>'
134 comparisonline = '
134 comparisonline = '
135 <tr id="{lineid}" style="font-family:monospace">
135 <tr id="{lineid}" style="font-family:monospace">
136 <td class="{type}"><pre><a class="linenr" href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</pre></td>
136 <td class="{type}"><pre><a class="linenr" href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</pre></td>
137 <td class="{type}"><pre><a class="linenr" href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</pre></td>
137 <td class="{type}"><pre><a class="linenr" href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</pre></td>
138 </tr>'
138 </tr>'
139
139
140 changesetlink = '<a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
140 changesetlink = '<a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
141 changesetbranch = '<tr><td>branch</td><td>{name|escape}</td></tr>'
141 changesetbranch = '<tr><td>branch</td><td>{name|escape}</td></tr>'
142 changesetparent = '
142 changesetparent = '
143 <tr>
143 <tr>
144 <td>parent {rev}</td>
144 <td>parent {rev}</td>
145 <td style="font-family:monospace">
145 <td style="font-family:monospace">
146 {changesetlink}
146 {changesetlink}
147 </td>
147 </td>
148 </tr>'
148 </tr>'
149 changesetparentdiff = '
149 changesetparentdiff = '
150 <tr>
150 <tr>
151 <td>parent {rev}</td>
151 <td>parent {rev}</td>
152 <td style="font-family:monospace">
152 <td style="font-family:monospace">
153 {changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}
153 {changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}
154 </td>
154 </td>
155 </tr>'
155 </tr>'
156 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
156 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
157 filerevbranch = '<tr><td>branch</td><td>{name|escape}</td></tr>'
157 filerevbranch = '<tr><td>branch</td><td>{name|escape}</td></tr>'
158 filerevparent = '
158 filerevparent = '
159 <tr>
159 <tr>
160 <td>parent {rev}</td>
160 <td>parent {rev}</td>
161 <td style="font-family:monospace">
161 <td style="font-family:monospace">
162 <a class="list" href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
162 <a class="list" href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
163 {rename%filerename}{node|short}
163 {rename%filerename}{node|short}
164 </a>
164 </a>
165 </td>
165 </td>
166 </tr>'
166 </tr>'
167 filerename = '{file|escape}@'
167 filerename = '{file|escape}@'
168 filelogrename = '| <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
168 filelogrename = '| <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
169 fileannotateparent = '
169 fileannotateparent = '
170 <tr>
170 <tr>
171 <td>parent {rev}</td>
171 <td>parent {rev}</td>
172 <td style="font-family:monospace">
172 <td style="font-family:monospace">
173 <a class="list" href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
173 <a class="list" href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
174 {rename%filerename}{node|short}
174 {rename%filerename}{node|short}
175 </a>
175 </a>
176 </td>
176 </td>
177 </tr>'
177 </tr>'
178 changesetchild = '
178 changesetchild = '
179 <tr>
179 <tr>
180 <td>child {rev}</td>
180 <td>child {rev}</td>
181 <td style="font-family:monospace">
181 <td style="font-family:monospace">
182 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
182 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
183 </td>
183 </td>
184 </tr>'
184 </tr>'
185 filerevchild = '
185 filerevchild = '
186 <tr>
186 <tr>
187 <td>child {rev}</td>
187 <td>child {rev}</td>
188 <td style="font-family:monospace">
188 <td style="font-family:monospace">
189 <a class="list" href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
189 <a class="list" href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
190 </tr>'
190 </tr>'
191 fileannotatechild = '
191 fileannotatechild = '
192 <tr>
192 <tr>
193 <td>child {rev}</td>
193 <td>child {rev}</td>
194 <td style="font-family:monospace">
194 <td style="font-family:monospace">
195 <a class="list" href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
195 <a class="list" href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
196 </tr>'
196 </tr>'
197 tags = tags.tmpl
197 tags = tags.tmpl
198 tagentry = '
198 tagentry = '
199 <tr class="parity{parity}">
199 <tr class="parity{parity}">
200 <td class="age"><i class="age">{date|rfc822date}</i></td>
200 <td class="age"><i class="age">{date|rfc822date}</i></td>
201 <td><a class="list" href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}"><b>{tag|escape}</b></a></td>
201 <td><a class="list" href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}"><b>{tag|escape}</b></a></td>
202 <td class="link">
202 <td class="link">
203 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
203 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
204 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
204 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
205 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
205 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
206 </td>
206 </td>
207 </tr>'
207 </tr>'
208 bookmarks = bookmarks.tmpl
208 bookmarks = bookmarks.tmpl
209 bookmarkentry = '
209 bookmarkentry = '
210 <tr class="parity{parity}">
210 <tr class="parity{parity}">
211 <td class="age"><i class="age">{date|rfc822date}</i></td>
211 <td class="age"><i class="age">{date|rfc822date}</i></td>
212 <td><a class="list" href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}"><b>{bookmark|escape}</b></a></td>
212 <td><a class="list" href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}"><b>{bookmark|escape}</b></a></td>
213 <td class="link">
213 <td class="link">
214 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
214 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
215 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
215 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
216 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
216 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
217 </td>
217 </td>
218 </tr>'
218 </tr>'
219 branches = branches.tmpl
219 branches = branches.tmpl
220 branchentry = '
220 branchentry = '
221 <tr class="parity{parity}">
221 <tr class="parity{parity}">
222 <td class="age"><i class="age">{date|rfc822date}</i></td>
222 <td class="age"><i class="age">{date|rfc822date}</i></td>
223 <td class="{status}"><a class="list" href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}"><b>{branch|escape}</b></a></td>
223 <td class="{status}"><a class="list" href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}"><b>{branch|escape}</b></a></td>
224 <td class="link">
224 <td class="link">
225 <a href="{url|urlescape}changeset/{node|short}{sessionvars%urlparameter}">changeset</a> |
225 <a href="{url|urlescape}changeset/{node|short}{sessionvars%urlparameter}">changeset</a> |
226 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
226 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
227 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
227 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
228 </td>
228 </td>
229 </tr>'
229 </tr>'
230 diffblock = '<div class="diffblock"><pre class="sourcelines">{lines}</pre></div>'
230 diffblock = '<div class="diffblock"><pre class="sourcelines">{lines}</pre></div>'
231 filediffparent = '
231 filediffparent = '
232 <tr>
232 <tr>
233 <td>parent {rev}</td>
233 <td>parent {rev}</td>
234 <td style="font-family:monospace">
234 <td style="font-family:monospace">
235 <a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
235 <a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
236 {node|short}
236 {node|short}
237 </a>
237 </a>
238 </td>
238 </td>
239 </tr>'
239 </tr>'
240 filecompparent = '
240 filecompparent = '
241 <tr>
241 <tr>
242 <td>parent {rev}</td>
242 <td>parent {rev}</td>
243 <td style="font-family:monospace">
243 <td style="font-family:monospace">
244 <a class="list" href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
244 <a class="list" href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
245 {node|short}
245 {node|short}
246 </a>
246 </a>
247 </td>
247 </td>
248 </tr>'
248 </tr>'
249 filediffchild = '
249 filediffchild = '
250 <tr>
250 <tr>
251 <td>child {rev}</td>
251 <td>child {rev}</td>
252 <td style="font-family:monospace">
252 <td style="font-family:monospace">
253 <a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
253 <a class="list" href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
254 </td>
254 </td>
255 </tr>'
255 </tr>'
256 filecompchild = '
256 filecompchild = '
257 <tr>
257 <tr>
258 <td>child {rev}</td>
258 <td>child {rev}</td>
259 <td style="font-family:monospace">
259 <td style="font-family:monospace">
260 <a class="list" href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
260 <a class="list" href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
261 </td>
261 </td>
262 </tr>'
262 </tr>'
263 shortlog = shortlog.tmpl
263 shortlog = shortlog.tmpl
264 graph = graph.tmpl
264 graph = graph.tmpl
265 graphentry = graphentry.tmpl
265 graphentry = graphentry.tmpl
266 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
266 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
267 obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
267 obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
268 instabilitytag = '<span class="instabilitytag" title="{instability|escape}">{instability|escape}</span> '
268 instabilitytag = '<span class="instabilitytag" title="{instability|escape}">{instability|escape}</span> '
269 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
269 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
270 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
270 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
271 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
271 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
272 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
272 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
273 alltags = '<span class="logtags">{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
273 alltags = '<span class="logtags">{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
274 obsfatesuccessors = '{if(successors, ' as ')}{join(successors, ', ')}'
274 successorlink = '<a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
275 obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
275 obsfateverb = '{obsfateverb(successors, markers)}'
276 obsfateverb = '{obsfateverb(successors, markers)}'
276 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
277 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
277 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
278 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
278 shortlogentry = '
279 shortlogentry = '
279 <tr class="parity{parity}">
280 <tr class="parity{parity}">
280 <td class="age"><i class="age">{date|rfc822date}</i></td>
281 <td class="age"><i class="age">{date|rfc822date}</i></td>
281 <td><i>{author|person}</i></td>
282 <td><i>{author|person}</i></td>
282 <td>
283 <td>
283 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
284 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
284 <b>{desc|strip|firstline|escape|nonempty}</b>
285 <b>{desc|strip|firstline|escape|nonempty}</b>
285 {alltags}
286 {alltags}
286 </a>
287 </a>
287 </td>
288 </td>
288 <td class="link" nowrap>
289 <td class="link" nowrap>
289 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
290 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
290 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
291 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
291 </td>
292 </td>
292 </tr>'
293 </tr>'
293 filelogentry = '
294 filelogentry = '
294 <tr class="parity{if(patch, '1', '{parity}')}">
295 <tr class="parity{if(patch, '1', '{parity}')}">
295 <td class="age"><i class="age">{date|rfc822date}</i></td>
296 <td class="age"><i class="age">{date|rfc822date}</i></td>
296 <td><i>{author|person}</i></td>
297 <td><i>{author|person}</i></td>
297 <td>
298 <td>
298 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
299 <a class="list" href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
299 <b>{desc|strip|firstline|escape|nonempty}</b>
300 <b>{desc|strip|firstline|escape|nonempty}</b>
300 {alltags}
301 {alltags}
301 </a>
302 </a>
302 </td>
303 </td>
303 <td class="link">
304 <td class="link">
304 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
305 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
305 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
306 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
306 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
307 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
307 {rename%filelogrename}
308 {rename%filelogrename}
308 </td>
309 </td>
309 </tr>
310 </tr>
310 {if(patch, '<tr><td colspan="4">{diff}</td></tr>')}'
311 {if(patch, '<tr><td colspan="4">{diff}</td></tr>')}'
311 archiveentry = ' | <a href="{url|urlescape}archive/{symrev}{extension}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a> '
312 archiveentry = ' | <a href="{url|urlescape}archive/{symrev}{extension}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a> '
312 indexentry = '
313 indexentry = '
313 <tr class="parity{parity}">
314 <tr class="parity{parity}">
314 <td>
315 <td>
315 <a class="list" href="{url|urlescape}{sessionvars%urlparameter}">
316 <a class="list" href="{url|urlescape}{sessionvars%urlparameter}">
316 <b>{name|escape}</b>
317 <b>{name|escape}</b>
317 </a>
318 </a>
318 </td>
319 </td>
319 <td>{description}</td>
320 <td>{description}</td>
320 <td>{contact|obfuscate}</td>
321 <td>{contact|obfuscate}</td>
321 <td class="age">{lastchange|rfc822date}</td>
322 <td class="age">{lastchange|rfc822date}</td>
322 <td class="indexlinks">{archives%indexarchiveentry}</td>
323 <td class="indexlinks">{archives%indexarchiveentry}</td>
323 <td>{if(isdirectory, '',
324 <td>{if(isdirectory, '',
324 '<div class="rss_logo">
325 '<div class="rss_logo">
325 <a href="{url|urlescape}rss-log">RSS</a> <a href="{url|urlescape}atom-log">Atom</a>
326 <a href="{url|urlescape}rss-log">RSS</a> <a href="{url|urlescape}atom-log">Atom</a>
326 </div>'
327 </div>'
327 )}
328 )}
328 </td>
329 </td>
329 </tr>\n'
330 </tr>\n'
330 indexarchiveentry = ' <a href="{url|urlescape}archive/{node|short}{extension}">{type|escape}</a> '
331 indexarchiveentry = ' <a href="{url|urlescape}archive/{node|short}{extension}">{type|escape}</a> '
331 index = index.tmpl
332 index = index.tmpl
332 urlparameter = '{separator}{name}={value|urlescape}'
333 urlparameter = '{separator}{name}={value|urlescape}'
333 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
334 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
334 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
335 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
335
336
336 searchform = '
337 searchform = '
337 <div class="search">
338 <div class="search">
338 <form id="searchform" action="{url|urlescape}log">
339 <form id="searchform" action="{url|urlescape}log">
339 {sessionvars%hiddenformentry}
340 {sessionvars%hiddenformentry}
340 <input name="rev" type="text" value="{query|escape}" size="40" />
341 <input name="rev" type="text" value="{query|escape}" size="40" />
341 <div id="hint">{searchhint}</div>
342 <div id="hint">{searchhint}</div>
342 </form>
343 </form>
343 </div>'
344 </div>'
344 searchhint = 'Find changesets by keywords (author, files, the commit message), revision
345 searchhint = 'Find changesets by keywords (author, files, the commit message), revision
345 number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
346 number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
346
347
347 diffoptsform = '
348 diffoptsform = '
348 <form id="diffopts-form"
349 <form id="diffopts-form"
349 data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
350 data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
350 data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
351 data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
351 data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
352 data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
352 data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
353 data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
353 <span>Ignore whitespace changes - </span>
354 <span>Ignore whitespace changes - </span>
354 <span>Everywhere:</span>
355 <span>Everywhere:</span>
355 <input id="ignorews-checkbox" type="checkbox" />
356 <input id="ignorews-checkbox" type="checkbox" />
356 <span>Within whitespace:</span>
357 <span>Within whitespace:</span>
357 <input id="ignorewsamount-checkbox" type="checkbox" />
358 <input id="ignorewsamount-checkbox" type="checkbox" />
358 <span>At end of lines:</span>
359 <span>At end of lines:</span>
359 <input id="ignorewseol-checkbox" type="checkbox" />
360 <input id="ignorewseol-checkbox" type="checkbox" />
360 </form>'
361 </form>'
@@ -1,299 +1,300 b''
1 default = 'summary'
1 default = 'summary'
2 mimetype = 'text/html; charset={encoding}'
2 mimetype = 'text/html; charset={encoding}'
3 header = header.tmpl
3 header = header.tmpl
4 footer = footer.tmpl
4 footer = footer.tmpl
5 search = search.tmpl
5 search = search.tmpl
6 changelog = changelog.tmpl
6 changelog = changelog.tmpl
7 summary = summary.tmpl
7 summary = summary.tmpl
8 error = error.tmpl
8 error = error.tmpl
9 notfound = notfound.tmpl
9 notfound = notfound.tmpl
10
10
11 help = help.tmpl
11 help = help.tmpl
12 helptopics = helptopics.tmpl
12 helptopics = helptopics.tmpl
13
13
14 helpentry = '
14 helpentry = '
15 <tr><td>
15 <tr><td>
16 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
16 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
17 {if(basename, '{basename|escape}', '{topic|escape}')}
17 {if(basename, '{basename|escape}', '{topic|escape}')}
18 </a>
18 </a>
19 </td><td>
19 </td><td>
20 {summary|escape}
20 {summary|escape}
21 </td></tr>'
21 </td></tr>'
22
22
23 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
23 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
24 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
24 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
26 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
27 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
27 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
28 filenodelink = '
28 filenodelink = '
29 <tr class="parity{parity}">
29 <tr class="parity{parity}">
30 <td><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
30 <td><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
31 <td></td>
31 <td></td>
32 <td>
32 <td>
33 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
33 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
34 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
34 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a> |
35 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
35 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
36 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
36 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
37 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
37 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
38 </td>
38 </td>
39 </tr>'
39 </tr>'
40 filenolink = '
40 filenolink = '
41 <tr class="parity{parity}">
41 <tr class="parity{parity}">
42 <td><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
42 <td><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a></td>
43 <td></td>
43 <td></td>
44 <td>
44 <td>
45 file |
45 file |
46 annotate |
46 annotate |
47 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
47 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
48 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
48 <a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">comparison</a> |
49 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
49 <a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">revisions</a>
50 </td>
50 </td>
51 </tr>'
51 </tr>'
52
52
53 nav = '{before%naventry} {after%naventry}'
53 nav = '{before%naventry} {after%naventry}'
54 navshort = '{before%navshortentry}{after%navshortentry}'
54 navshort = '{before%navshortentry}{after%navshortentry}'
55 navgraph = '{before%navgraphentry}{after%navgraphentry}'
55 navgraph = '{before%navgraphentry}{after%navgraphentry}'
56 filenav = '{before%filenaventry}{after%filenaventry}'
56 filenav = '{before%filenaventry}{after%filenaventry}'
57
57
58 fileellipses = '...'
58 fileellipses = '...'
59 changelogentry = changelogentry.tmpl
59 changelogentry = changelogentry.tmpl
60 searchentry = changelogentry.tmpl
60 searchentry = changelogentry.tmpl
61 changeset = changeset.tmpl
61 changeset = changeset.tmpl
62 manifest = manifest.tmpl
62 manifest = manifest.tmpl
63 direntry = '
63 direntry = '
64 <tr class="parity{parity}">
64 <tr class="parity{parity}">
65 <td>drwxr-xr-x</td>
65 <td>drwxr-xr-x</td>
66 <td></td>
66 <td></td>
67 <td></td>
67 <td></td>
68 <td>
68 <td>
69 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
69 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>
70 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
70 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">{emptydirs|escape}</a>
71 </td>
71 </td>
72 <td><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">files</a></td>
72 <td><a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">files</a></td>
73 </tr>'
73 </tr>'
74 fileentry = '
74 fileentry = '
75 <tr class="parity{parity}">
75 <tr class="parity{parity}">
76 <td>{permissions|permissions}</td>
76 <td>{permissions|permissions}</td>
77 <td>{date|isodate}</td>
77 <td>{date|isodate}</td>
78 <td>{size}</td>
78 <td>{size}</td>
79 <td><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a></td>
79 <td><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a></td>
80 <td>
80 <td>
81 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
81 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
82 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
82 <a href="{url|urlescape}log/{symrev}/{file|urlescape}{sessionvars%urlparameter}">revisions</a> |
83 <a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
83 <a href="{url|urlescape}annotate/{symrev}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
84 </td>
84 </td>
85 </tr>'
85 </tr>'
86 filerevision = filerevision.tmpl
86 filerevision = filerevision.tmpl
87 fileannotate = fileannotate.tmpl
87 fileannotate = fileannotate.tmpl
88 filediff = filediff.tmpl
88 filediff = filediff.tmpl
89 filecomparison = filecomparison.tmpl
89 filecomparison = filecomparison.tmpl
90 filelog = filelog.tmpl
90 filelog = filelog.tmpl
91 fileline = '
91 fileline = '
92 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
92 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
93 annotateline = '
93 annotateline = '
94 <tr id="{lineid}" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
94 <tr id="{lineid}" class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
95 <td class="annotate linenr parity{blockparity}">
95 <td class="annotate linenr parity{blockparity}">
96 {if(blockhead,
96 {if(blockhead,
97 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
97 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
98 {rev}
98 {rev}
99 </a>')}
99 </a>')}
100 <div class="annotate-info">
100 <div class="annotate-info">
101 <div>
101 <div>
102 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
102 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
103 {node|short}</a>
103 {node|short}</a>
104 {desc|escape|firstline}
104 {desc|escape|firstline}
105 </div>
105 </div>
106 <div><em>{author|obfuscate}</em></div>
106 <div><em>{author|obfuscate}</em></div>
107 <div>parents: {parents%annotateparent}</div>
107 <div>parents: {parents%annotateparent}</div>
108 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
108 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
109 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
109 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
110 </div>
110 </div>
111 </td>
111 </td>
112 <td class="lineno">
112 <td class="lineno">
113 <a href="#{lineid}">{linenumber}</a>
113 <a href="#{lineid}">{linenumber}</a>
114 </td>
114 </td>
115 <td class="source">{line|escape}</td>
115 <td class="source">{line|escape}</td>
116 </tr>'
116 </tr>'
117 annotateparent = '
117 annotateparent = '
118 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
118 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
119 difflineplus = '
119 difflineplus = '
120 <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
120 <a href="#{lineid}"></a><span id="{lineid}" class="difflineplus">{strip(line|escape, '\r\n')}</span>'
121 difflineminus = '
121 difflineminus = '
122 <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
122 <a href="#{lineid}"></a><span id="{lineid}" class="difflineminus">{strip(line|escape, '\r\n')}</span>'
123 difflineat = '
123 difflineat = '
124 <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
124 <a href="#{lineid}"></a><span id="{lineid}" class="difflineat">{strip(line|escape, '\r\n')}</span>'
125 diffline = '
125 diffline = '
126 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
126 <a href="#{lineid}"></a><span id="{lineid}">{strip(line|escape, '\r\n')}</span>'
127
127
128 comparisonblock ='
128 comparisonblock ='
129 <tbody class="block">
129 <tbody class="block">
130 {lines}
130 {lines}
131 </tbody>'
131 </tbody>'
132 comparisonline = '
132 comparisonline = '
133 <tr id="{lineid}">
133 <tr id="{lineid}">
134 <td class="source {type}"><a class="linenr" href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
134 <td class="source {type}"><a class="linenr" href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
135 <td class="source {type}"><a class="linenr" href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
135 <td class="source {type}"><a class="linenr" href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
136 </tr>'
136 </tr>'
137
137
138 changesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
138 changesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
139 changesetbranch = '<dt>branch</dt><dd>{name|escape}</dd>'
139 changesetbranch = '<dt>branch</dt><dd>{name|escape}</dd>'
140 changesetparent = '
140 changesetparent = '
141 <dt>parent {rev}</dt>
141 <dt>parent {rev}</dt>
142 <dd>{changesetlink}</dd>'
142 <dd>{changesetlink}</dd>'
143 changesetparentdiff = '
143 changesetparentdiff = '
144 <dt>parent {rev}</dt>
144 <dt>parent {rev}</dt>
145 <dd>{changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}</dd>'
145 <dd>{changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}</dd>'
146 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
146 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
147 filerevbranch = '<dt>branch</dt><dd>{name|escape}</dd>'
147 filerevbranch = '<dt>branch</dt><dd>{name|escape}</dd>'
148 filerevparent = '
148 filerevparent = '
149 <dt>parent {rev}</dt>
149 <dt>parent {rev}</dt>
150 <dd>
150 <dd>
151 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
151 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
152 {rename%filerename}{node|short}
152 {rename%filerename}{node|short}
153 </a>
153 </a>
154 </dd>'
154 </dd>'
155 filerename = '{file|escape}@'
155 filerename = '{file|escape}@'
156 filelogrename = '| <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
156 filelogrename = '| <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">base</a>'
157 fileannotateparent = '
157 fileannotateparent = '
158 <dt>parent {rev}</dt>
158 <dt>parent {rev}</dt>
159 <dd>
159 <dd>
160 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
160 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
161 {rename%filerename}{node|short}
161 {rename%filerename}{node|short}
162 </a>
162 </a>
163 </dd>'
163 </dd>'
164 changesetchild = '
164 changesetchild = '
165 <dt>child {rev}</dt>
165 <dt>child {rev}</dt>
166 <dd><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>'
166 <dd><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></dd>'
167 filerevchild = '
167 filerevchild = '
168 <dt>child {rev}</dt>
168 <dt>child {rev}</dt>
169 <dd>
169 <dd>
170 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
170 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
171 </dd>'
171 </dd>'
172 fileannotatechild = '
172 fileannotatechild = '
173 <dt>child {rev}</dt>
173 <dt>child {rev}</dt>
174 <dd>
174 <dd>
175 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
175 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a>
176 </dd>'
176 </dd>'
177 tags = tags.tmpl
177 tags = tags.tmpl
178 tagentry = '
178 tagentry = '
179 <tr class="parity{parity}">
179 <tr class="parity{parity}">
180 <td class="nowrap age">{date|rfc822date}</td>
180 <td class="nowrap age">{date|rfc822date}</td>
181 <td><a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">{tag|escape}</a></td>
181 <td><a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">{tag|escape}</a></td>
182 <td class="nowrap">
182 <td class="nowrap">
183 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
183 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
184 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
184 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
185 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
185 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
186 </td>
186 </td>
187 </tr>'
187 </tr>'
188 bookmarks = bookmarks.tmpl
188 bookmarks = bookmarks.tmpl
189 bookmarkentry = '
189 bookmarkentry = '
190 <tr class="parity{parity}">
190 <tr class="parity{parity}">
191 <td class="nowrap age">{date|rfc822date}</td>
191 <td class="nowrap age">{date|rfc822date}</td>
192 <td><a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">{bookmark|escape}</a></td>
192 <td><a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">{bookmark|escape}</a></td>
193 <td class="nowrap">
193 <td class="nowrap">
194 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
194 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
195 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
195 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
196 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
196 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
197 </td>
197 </td>
198 </tr>'
198 </tr>'
199 branches = branches.tmpl
199 branches = branches.tmpl
200 branchentry = '
200 branchentry = '
201 <tr class="parity{parity}">
201 <tr class="parity{parity}">
202 <td class="nowrap age">{date|rfc822date}</td>
202 <td class="nowrap age">{date|rfc822date}</td>
203 <td class="{status}"><a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}">{branch|escape}</a></td>
203 <td class="{status}"><a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}">{branch|escape}</a></td>
204 <td class="nowrap">
204 <td class="nowrap">
205 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
205 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
206 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
206 <a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">changelog</a> |
207 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
207 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
208 </td>
208 </td>
209 </tr>'
209 </tr>'
210 diffblock = '<div class="diffblock"><pre class="sourcelines">{lines}</pre></div>'
210 diffblock = '<div class="diffblock"><pre class="sourcelines">{lines}</pre></div>'
211 filediffparent = '
211 filediffparent = '
212 <dt>parent {rev}</dt>
212 <dt>parent {rev}</dt>
213 <dd><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
213 <dd><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
214 filecompparent = '
214 filecompparent = '
215 <dt>parent {rev}</dt>
215 <dt>parent {rev}</dt>
216 <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
216 <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
217 filediffchild = '
217 filediffchild = '
218 <dt>child {rev}</dt>
218 <dt>child {rev}</dt>
219 <dd><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
219 <dd><a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
220 filecompchild = '
220 filecompchild = '
221 <dt>child {rev}</dt>
221 <dt>child {rev}</dt>
222 <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
222 <dd><a href="{url|urlescape}comparison/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></dd>'
223 shortlog = shortlog.tmpl
223 shortlog = shortlog.tmpl
224 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
224 phasetag = '{ifeq(phase, 'public', '', '<span class="phasetag" title="{phase|escape}">{phase|escape}</span> ')}'
225 obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
225 obsoletetag = '{if(obsolete, '<span class="obsoletetag" title="obsolete">obsolete</span> ')}'
226 instabilitytag = '<span class="instabilitytag" title="{instability|escape}">{instability|escape}</span> '
226 instabilitytag = '<span class="instabilitytag" title="{instability|escape}">{instability|escape}</span> '
227 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
227 tagtag = '<span class="tagtag" title="{name|escape}">{name|escape}</span> '
228 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
228 branchtag = '<span class="branchtag" title="{name|escape}">{name|escape}</span> '
229 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
229 inbranchtag = '<span class="inbranchtag" title="{name|escape}">{name|escape}</span> '
230 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
230 bookmarktag = '<span class="bookmarktag" title="{name|escape}">{name|escape}</span> '
231 alltags = '<span class="logtags">{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
231 alltags = '<span class="logtags">{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%inbranchtag}{branches%branchtag}{tags%tagtag}{bookmarks%bookmarktag}</span>'
232 obsfatesuccessors = '{if(successors, ' as ')}{join(successors, ', ')}'
232 successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
233 obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
233 obsfateverb = '{obsfateverb(successors, markers)}'
234 obsfateverb = '{obsfateverb(successors, markers)}'
234 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
235 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
235 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
236 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
236 shortlogentry = '
237 shortlogentry = '
237 <tr class="parity{parity}">
238 <tr class="parity{parity}">
238 <td class="nowrap age">{date|rfc822date}</td>
239 <td class="nowrap age">{date|rfc822date}</td>
239 <td>{author|person}</td>
240 <td>{author|person}</td>
240 <td>
241 <td>
241 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
242 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
242 {desc|strip|firstline|escape|nonempty}
243 {desc|strip|firstline|escape|nonempty}
243 {alltags}
244 {alltags}
244 </a>
245 </a>
245 </td>
246 </td>
246 <td class="nowrap">
247 <td class="nowrap">
247 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
248 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a> |
248 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
249 <a href="{url|urlescape}file/{node|short}{sessionvars%urlparameter}">files</a>
249 </td>
250 </td>
250 </tr>'
251 </tr>'
251 filelogentry = '
252 filelogentry = '
252 <tr class="parity{parity}">
253 <tr class="parity{parity}">
253 <td class="nowrap age">{date|rfc822date}</td>
254 <td class="nowrap age">{date|rfc822date}</td>
254 <td>{author|person}</td>
255 <td>{author|person}</td>
255 <td>
256 <td>
256 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
257 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
257 {desc|strip|firstline|escape|nonempty}
258 {desc|strip|firstline|escape|nonempty}
258 {alltags}
259 {alltags}
259 </a>
260 </a>
260 </td>
261 </td>
261 <td class="nowrap">
262 <td class="nowrap">
262 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
263 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">file</a> |
263 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
264 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a> |
264 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
265 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">annotate</a>
265 {rename%filelogrename}
266 {rename%filelogrename}
266 </td>
267 </td>
267 </tr>'
268 </tr>'
268 archiveentry = '<li><a href="{url|urlescape}archive/{symrev}{extension}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a></li>'
269 archiveentry = '<li><a href="{url|urlescape}archive/{symrev}{extension}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a></li>'
269 indexentry = '
270 indexentry = '
270 <tr class="parity{parity}">
271 <tr class="parity{parity}">
271 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
272 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
272 <td>{description}</td>
273 <td>{description}</td>
273 <td>{contact|obfuscate}</td>
274 <td>{contact|obfuscate}</td>
274 <td class="age">{lastchange|rfc822date}</td>
275 <td class="age">{lastchange|rfc822date}</td>
275 <td class="indexlinks">{archives%indexarchiveentry}</td>
276 <td class="indexlinks">{archives%indexarchiveentry}</td>
276 <td>
277 <td>
277 {if(isdirectory, '',
278 {if(isdirectory, '',
278 '<div class="rss_logo">
279 '<div class="rss_logo">
279 <a href="{url|urlescape}rss-log">RSS</a> <a href="{url|urlescape}atom-log">Atom</a>
280 <a href="{url|urlescape}rss-log">RSS</a> <a href="{url|urlescape}atom-log">Atom</a>
280 </div>'
281 </div>'
281 )}
282 )}
282 </td>
283 </td>
283 </tr>\n'
284 </tr>\n'
284 indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension}">{type|escape}</a> '
285 indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension}">{type|escape}</a> '
285 index = index.tmpl
286 index = index.tmpl
286 urlparameter = '{separator}{name}={value|urlescape}'
287 urlparameter = '{separator}{name}={value|urlescape}'
287 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
288 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
288 graph = graph.tmpl
289 graph = graph.tmpl
289 graphentry = graphentry.tmpl
290 graphentry = graphentry.tmpl
290 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
291 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
291
292
292 searchform = '
293 searchform = '
293 <form action="{url|urlescape}log">
294 <form action="{url|urlescape}log">
294 {sessionvars%hiddenformentry}
295 {sessionvars%hiddenformentry}
295 <dl class="search">
296 <dl class="search">
296 <dt><label>Search: </label></dt>
297 <dt><label>Search: </label></dt>
297 <dd><input type="text" name="rev" value="{query|escape}" /></dd>
298 <dd><input type="text" name="rev" value="{query|escape}" /></dd>
298 </dl>
299 </dl>
299 </form>'
300 </form>'
@@ -1,278 +1,279 b''
1 default = 'shortlog'
1 default = 'shortlog'
2
2
3 mimetype = 'text/html; charset={encoding}'
3 mimetype = 'text/html; charset={encoding}'
4 header = header.tmpl
4 header = header.tmpl
5 footer = footer.tmpl
5 footer = footer.tmpl
6 search = search.tmpl
6 search = search.tmpl
7
7
8 changelog = shortlog.tmpl
8 changelog = shortlog.tmpl
9 shortlog = shortlog.tmpl
9 shortlog = shortlog.tmpl
10 shortlogentry = shortlogentry.tmpl
10 shortlogentry = shortlogentry.tmpl
11 graph = graph.tmpl
11 graph = graph.tmpl
12 graphentry = graphentry.tmpl
12 graphentry = graphentry.tmpl
13 help = help.tmpl
13 help = help.tmpl
14 helptopics = helptopics.tmpl
14 helptopics = helptopics.tmpl
15
15
16 helpentry = '
16 helpentry = '
17 <tr><td>
17 <tr><td>
18 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
18 <a href="{url|urlescape}help/{topic|escape}{sessionvars%urlparameter}">
19 {if(basename, '{basename|escape}', '{topic|escape}')}
19 {if(basename, '{basename|escape}', '{topic|escape}')}
20 </a>
20 </a>
21 </td><td>
21 </td><td>
22 {summary|escape}
22 {summary|escape}
23 </td></tr>'
23 </td></tr>'
24
24
25 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
25 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
26 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
27 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
27 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
28 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
28 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
29 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
29 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
30 filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
30 filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
31 filenolink = '{file|escape} '
31 filenolink = '{file|escape} '
32 fileellipses = '...'
32 fileellipses = '...'
33 diffstatlink = diffstat.tmpl
33 diffstatlink = diffstat.tmpl
34 diffstatnolink = diffstat.tmpl
34 diffstatnolink = diffstat.tmpl
35 changelogentry = shortlogentry.tmpl
35 changelogentry = shortlogentry.tmpl
36 searchentry = shortlogentry.tmpl
36 searchentry = shortlogentry.tmpl
37 changeset = changeset.tmpl
37 changeset = changeset.tmpl
38 manifest = manifest.tmpl
38 manifest = manifest.tmpl
39
39
40 nav = '{before%naventry} {after%naventry}'
40 nav = '{before%naventry} {after%naventry}'
41 navshort = '{before%navshortentry}{after%navshortentry}'
41 navshort = '{before%navshortentry}{after%navshortentry}'
42 navgraph = '{before%navgraphentry}{after%navgraphentry}'
42 navgraph = '{before%navgraphentry}{after%navgraphentry}'
43 filenav = '{before%filenaventry}{after%filenaventry}'
43 filenav = '{before%filenaventry}{after%filenaventry}'
44
44
45 direntry = '
45 direntry = '
46 <tr class="fileline">
46 <tr class="fileline">
47 <td class="name">
47 <td class="name">
48 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">
48 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">
49 <img src="{staticurl|urlescape}coal-folder.png" alt="dir."/> {basename|escape}/
49 <img src="{staticurl|urlescape}coal-folder.png" alt="dir."/> {basename|escape}/
50 </a>
50 </a>
51 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
51 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
52 {emptydirs|escape}
52 {emptydirs|escape}
53 </a>
53 </a>
54 </td>
54 </td>
55 <td class="size"></td>
55 <td class="size"></td>
56 <td class="permissions">drwxr-xr-x</td>
56 <td class="permissions">drwxr-xr-x</td>
57 </tr>'
57 </tr>'
58
58
59 fileentry = '
59 fileentry = '
60 <tr class="fileline">
60 <tr class="fileline">
61 <td class="filename">
61 <td class="filename">
62 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">
62 <a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">
63 <img src="{staticurl|urlescape}coal-file.png" alt="file"/> {basename|escape}
63 <img src="{staticurl|urlescape}coal-file.png" alt="file"/> {basename|escape}
64 </a>
64 </a>
65 </td>
65 </td>
66 <td class="size">{size}</td>
66 <td class="size">{size}</td>
67 <td class="permissions">{permissions|permissions}</td>
67 <td class="permissions">{permissions|permissions}</td>
68 </tr>'
68 </tr>'
69
69
70 filerevision = filerevision.tmpl
70 filerevision = filerevision.tmpl
71 fileannotate = fileannotate.tmpl
71 fileannotate = fileannotate.tmpl
72 filediff = filediff.tmpl
72 filediff = filediff.tmpl
73 filecomparison = filecomparison.tmpl
73 filecomparison = filecomparison.tmpl
74 filelog = filelog.tmpl
74 filelog = filelog.tmpl
75 fileline = '
75 fileline = '
76 <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
76 <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
77 filelogentry = filelogentry.tmpl
77 filelogentry = filelogentry.tmpl
78
78
79 annotateline = '
79 annotateline = '
80 <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
80 <tr id="{lineid}"{ifeq(node, originalnode, ' class="thisrev"')}>
81 <td class="annotate parity{blockparity}">
81 <td class="annotate parity{blockparity}">
82 {if(blockhead,
82 {if(blockhead,
83 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
83 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
84 {rev}
84 {rev}
85 </a>')}
85 </a>')}
86 <div class="annotate-info">
86 <div class="annotate-info">
87 <div>
87 <div>
88 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
88 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
89 {node|short}</a>
89 {node|short}</a>
90 {desc|escape|firstline}
90 {desc|escape|firstline}
91 </div>
91 </div>
92 <div><em>{author|obfuscate}</em></div>
92 <div><em>{author|obfuscate}</em></div>
93 <div>parents: {parents%annotateparent}</div>
93 <div>parents: {parents%annotateparent}</div>
94 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
94 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
95 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
95 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
96 </div>
96 </div>
97 </td>
97 </td>
98 <td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
98 <td class="source followlines-btn-parent"><a href="#{lineid}">{linenumber}</a> {line|escape}</td>
99 </tr>'
99 </tr>'
100 annotateparent = '
100 annotateparent = '
101 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
101 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
102 diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
102 diffblock = '<div class="bottomline inc-lineno"><pre class="sourcelines wrap">{lines}</pre></div>'
103 difflineplus = '
103 difflineplus = '
104 <span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
104 <span id="{lineid}" class="plusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
105 difflineminus = '
105 difflineminus = '
106 <span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
106 <span id="{lineid}" class="minusline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
107 difflineat = '
107 difflineat = '
108 <span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
108 <span id="{lineid}" class="atline">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
109 diffline = '
109 diffline = '
110 <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
110 <span id="{lineid}">{strip(line|escape, '\r\n')}</span><a href="#{lineid}"></a>'
111
111
112 comparisonblock ='
112 comparisonblock ='
113 <tbody class="block">
113 <tbody class="block">
114 {lines}
114 {lines}
115 </tbody>'
115 </tbody>'
116 comparisonline = '
116 comparisonline = '
117 <tr id="{lineid}">
117 <tr id="{lineid}">
118 <td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
118 <td class="source {type}"><a href="#{lineid}">{leftlinenumber}</a> {leftline|escape}</td>
119 <td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
119 <td class="source {type}"><a href="#{lineid}">{rightlinenumber}</a> {rightline|escape}</td>
120 </tr>'
120 </tr>'
121
121
122 changesetparent = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
122 changesetparent = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
123
123
124 changesetparentdiff = '
124 changesetparentdiff = '
125 {changesetparent}
125 {changesetparent}
126 {ifeq(node, basenode, '(current diff)', '({difffrom})')}'
126 {ifeq(node, basenode, '(current diff)', '({difffrom})')}'
127
127
128 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
128 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
129
129
130 filerevparent = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
130 filerevparent = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rename%filerename}{node|short}</a> '
131 filerevchild = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
131 filerevchild = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a> '
132
132
133 filerename = '{file|escape}@'
133 filerename = '{file|escape}@'
134 filelogrename = '
134 filelogrename = '
135 <span class="base">
135 <span class="base">
136 base
136 base
137 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
137 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
138 {file|escape}@{node|short}
138 {file|escape}@{node|short}
139 </a>
139 </a>
140 </span>'
140 </span>'
141 fileannotateparent = '
141 fileannotateparent = '
142 <tr>
142 <tr>
143 <td class="metatag">parent:</td>
143 <td class="metatag">parent:</td>
144 <td>
144 <td>
145 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
145 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
146 {rename%filerename}{node|short}
146 {rename%filerename}{node|short}
147 </a>
147 </a>
148 </td>
148 </td>
149 </tr>'
149 </tr>'
150 changesetchild = ' <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
150 changesetchild = ' <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
151 fileannotatechild = '
151 fileannotatechild = '
152 <tr>
152 <tr>
153 <td class="metatag">child:</td>
153 <td class="metatag">child:</td>
154 <td>
154 <td>
155 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
155 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
156 {node|short}
156 {node|short}
157 </a>
157 </a>
158 </td>
158 </td>
159 </tr>'
159 </tr>'
160 tags = tags.tmpl
160 tags = tags.tmpl
161 tagentry = '
161 tagentry = '
162 <tr class="tagEntry">
162 <tr class="tagEntry">
163 <td>
163 <td>
164 <a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
164 <a href="{url|urlescape}rev/{tag|revescape}{sessionvars%urlparameter}">
165 {tag|escape}
165 {tag|escape}
166 </a>
166 </a>
167 </td>
167 </td>
168 <td class="node">
168 <td class="node">
169 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
169 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
170 {node|short}
170 {node|short}
171 </a>
171 </a>
172 </td>
172 </td>
173 </tr>'
173 </tr>'
174 bookmarks = bookmarks.tmpl
174 bookmarks = bookmarks.tmpl
175 bookmarkentry = '
175 bookmarkentry = '
176 <tr class="tagEntry">
176 <tr class="tagEntry">
177 <td>
177 <td>
178 <a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
178 <a href="{url|urlescape}rev/{bookmark|revescape}{sessionvars%urlparameter}">
179 {bookmark|escape}
179 {bookmark|escape}
180 </a>
180 </a>
181 </td>
181 </td>
182 <td class="node">
182 <td class="node">
183 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
183 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">
184 {node|short}
184 {node|short}
185 </a>
185 </a>
186 </td>
186 </td>
187 </tr>'
187 </tr>'
188 branches = branches.tmpl
188 branches = branches.tmpl
189 branchentry = '
189 branchentry = '
190 <tr class="tagEntry">
190 <tr class="tagEntry">
191 <td>
191 <td>
192 <a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
192 <a href="{url|urlescape}shortlog/{branch|revescape}{sessionvars%urlparameter}" class="{status}">
193 {branch|escape}
193 {branch|escape}
194 </a>
194 </a>
195 </td>
195 </td>
196 <td class="node">
196 <td class="node">
197 <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
197 <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">
198 {node|short}
198 {node|short}
199 </a>
199 </a>
200 </td>
200 </td>
201 </tr>'
201 </tr>'
202 phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
202 phasetag = '{ifeq(phase, 'public', '', '<span class="phase">{phase|escape}</span> ')}'
203 obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
203 obsoletetag = '{if(obsolete, '<span class="obsolete">obsolete</span> ')}'
204 instabilitytag = '<span class="instability">{instability|escape}</span> '
204 instabilitytag = '<span class="instability">{instability|escape}</span> '
205 changelogtag = '<span class="tag">{name|escape}</span> '
205 changelogtag = '<span class="tag">{name|escape}</span> '
206 changesettag = '<span class="tag">{tag|escape}</span> '
206 changesettag = '<span class="tag">{tag|escape}</span> '
207 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
207 changesetbookmark = '<span class="tag">{bookmark|escape}</span> '
208 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
208 changelogbranchhead = '<span class="branchhead">{name|escape}</span> '
209 changelogbranchname = '<span class="branchname">{name|escape}</span> '
209 changelogbranchname = '<span class="branchname">{name|escape}</span> '
210 alltags = '{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
210 alltags = '{phasetag}{obsoletetag}{instabilities%instabilitytag}{inbranch%changelogbranchname}{branches%changelogbranchhead}{tags%changelogtag}{bookmarks%changelogtag}'
211
211
212 obsfatesuccessors = '{if(successors, ' as ')}{join(successors, ', ')}'
212 successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
213 obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
213 obsfateverb = '{obsfateverb(successors, markers)}'
214 obsfateverb = '{obsfateverb(successors, markers)}'
214 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
215 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
215 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
216 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
216
217
217 filediffparent = '
218 filediffparent = '
218 <tr>
219 <tr>
219 <th class="parent">parent {rev}:</th>
220 <th class="parent">parent {rev}:</th>
220 <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
221 <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
221 </tr>'
222 </tr>'
222 filediffchild = '
223 filediffchild = '
223 <tr>
224 <tr>
224 <th class="child">child {rev}:</th>
225 <th class="child">child {rev}:</th>
225 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
226 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>
226 </td>
227 </td>
227 </tr>'
228 </tr>'
228
229
229 indexentry = '
230 indexentry = '
230 <tr>
231 <tr>
231 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
232 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
232 <td>{description}</td>
233 <td>{description}</td>
233 <td>{contact|obfuscate}</td>
234 <td>{contact|obfuscate}</td>
234 <td class="age">{lastchange|rfc822date}</td>
235 <td class="age">{lastchange|rfc822date}</td>
235 <td class="indexlinks">{archives%indexarchiveentry}</td>
236 <td class="indexlinks">{archives%indexarchiveentry}</td>
236 <td>
237 <td>
237 {if(isdirectory, '',
238 {if(isdirectory, '',
238 '<a href="{url|urlescape}atom-log" title="subscribe to repository atom feed">
239 '<a href="{url|urlescape}atom-log" title="subscribe to repository atom feed">
239 <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository atom feed">
240 <img class="atom-logo" src="{staticurl|urlescape}feed-icon-14x14.png" alt="subscribe to repository atom feed">
240 </a>'
241 </a>'
241 )}
242 )}
242 </td>
243 </td>
243 </tr>\n'
244 </tr>\n'
244 indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
245 indexarchiveentry = '<a href="{url|urlescape}archive/{node|short}{extension|urlescape}">&nbsp;&darr;{type|escape}</a>'
245 index = index.tmpl
246 index = index.tmpl
246 archiveentry = '
247 archiveentry = '
247 <li>
248 <li>
248 <a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
249 <a href="{url|urlescape}archive/{symrev}{extension|urlescape}{ifeq(path,'/','',path|urlescape)}">{type|escape}</a>
249 </li>'
250 </li>'
250 notfound = notfound.tmpl
251 notfound = notfound.tmpl
251 error = error.tmpl
252 error = error.tmpl
252 urlparameter = '{separator}{name}={value|urlescape}'
253 urlparameter = '{separator}{name}={value|urlescape}'
253 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
254 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
254 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
255 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
255
256
256 searchform = '
257 searchform = '
257 <form class="search" action="{url|urlescape}log">
258 <form class="search" action="{url|urlescape}log">
258 {sessionvars%hiddenformentry}
259 {sessionvars%hiddenformentry}
259 <p><input name="rev" id="search1" type="text" size="30" value="{query|escape}" /></p>
260 <p><input name="rev" id="search1" type="text" size="30" value="{query|escape}" /></p>
260 <div id="hint">{searchhint}</div>
261 <div id="hint">{searchhint}</div>
261 </form>'
262 </form>'
262 searchhint = 'Find changesets by keywords (author, files, the commit message), revision
263 searchhint = 'Find changesets by keywords (author, files, the commit message), revision
263 number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
264 number or hash, or <a href="{url|urlescape}help/revsets">revset expression</a>.'
264
265
265 diffoptsform = '
266 diffoptsform = '
266 <form id="diffopts-form"
267 <form id="diffopts-form"
267 data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
268 data-ignorews="{if(get(diffopts, 'ignorews'), '1', '0')}"
268 data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
269 data-ignorewsamount="{if(get(diffopts, 'ignorewsamount'), '1', '0')}"
269 data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
270 data-ignorewseol="{if(get(diffopts, 'ignorewseol'), '1', '0')}"
270 data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
271 data-ignoreblanklines="{if(get(diffopts, 'ignoreblanklines'), '1', '0')}">
271 <span>Ignore whitespace changes - </span>
272 <span>Ignore whitespace changes - </span>
272 <span>Everywhere:</span>
273 <span>Everywhere:</span>
273 <input id="ignorews-checkbox" type="checkbox" />
274 <input id="ignorews-checkbox" type="checkbox" />
274 <span>Within whitespace:</span>
275 <span>Within whitespace:</span>
275 <input id="ignorewsamount-checkbox" type="checkbox" />
276 <input id="ignorewsamount-checkbox" type="checkbox" />
276 <span>At end of lines:</span>
277 <span>At end of lines:</span>
277 <input id="ignorewseol-checkbox" type="checkbox" />
278 <input id="ignorewseol-checkbox" type="checkbox" />
278 </form>'
279 </form>'
@@ -1,201 +1,202 b''
1 default = 'shortlog'
1 default = 'shortlog'
2 mimetype = 'text/html; charset={encoding}'
2 mimetype = 'text/html; charset={encoding}'
3 header = header.tmpl
3 header = header.tmpl
4 footer = footer.tmpl
4 footer = footer.tmpl
5 search = search.tmpl
5 search = search.tmpl
6 changelog = changelog.tmpl
6 changelog = changelog.tmpl
7 shortlog = shortlog.tmpl
7 shortlog = shortlog.tmpl
8 shortlogentry = shortlogentry.tmpl
8 shortlogentry = shortlogentry.tmpl
9 graph = graph.tmpl
9 graph = graph.tmpl
10 graphentry = graphentry.tmpl
10 graphentry = graphentry.tmpl
11 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
11 naventry = '<a href="{url|urlescape}log/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
12 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
12 navshortentry = '<a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
13 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
13 navgraphentry = '<a href="{url|urlescape}graph/{node|short}{sessionvars%urlparameter}">{label|escape}</a> '
14 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
14 filenaventry = '<a href="{url|urlescape}log/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{label|escape}</a> '
15 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
15 filedifflink = '<a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
16 filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
16 filenodelink = '<a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{file|escape}</a> '
17 filenolink = '{file|escape} '
17 filenolink = '{file|escape} '
18 fileellipses = '...'
18 fileellipses = '...'
19 changelogentry = changelogentry.tmpl
19 changelogentry = changelogentry.tmpl
20 searchentry = changelogentry.tmpl
20 searchentry = changelogentry.tmpl
21 changeset = changeset.tmpl
21 changeset = changeset.tmpl
22 manifest = manifest.tmpl
22 manifest = manifest.tmpl
23
23
24 nav = '{before%naventry} {after%naventry}'
24 nav = '{before%naventry} {after%naventry}'
25 navshort = '{before%navshortentry}{after%navshortentry}'
25 navshort = '{before%navshortentry}{after%navshortentry}'
26 navgraph = '{before%navgraphentry}{after%navgraphentry}'
26 navgraph = '{before%navgraphentry}{after%navgraphentry}'
27 filenav = '{before%filenaventry}{after%filenaventry}'
27 filenav = '{before%filenaventry}{after%filenaventry}'
28
28
29 direntry = '
29 direntry = '
30 <tr class="parity{parity}">
30 <tr class="parity{parity}">
31 <td><tt>drwxr-xr-x</tt>&nbsp;
31 <td><tt>drwxr-xr-x</tt>&nbsp;
32 <td>&nbsp;
32 <td>&nbsp;
33 <td>&nbsp;
33 <td>&nbsp;
34 <td>
34 <td>
35 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}/</a>
35 <a href="{url|urlescape}file/{symrev}{path|urlescape}{sessionvars%urlparameter}">{basename|escape}/</a>
36 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
36 <a href="{url|urlescape}file/{symrev}{path|urlescape}/{emptydirs|urlescape}{sessionvars%urlparameter}">
37 {emptydirs|urlescape}
37 {emptydirs|urlescape}
38 </a>'
38 </a>'
39
39
40 fileentry = '
40 fileentry = '
41 <tr class="parity{parity}">
41 <tr class="parity{parity}">
42 <td><tt>{permissions|permissions}</tt>&nbsp;
42 <td><tt>{permissions|permissions}</tt>&nbsp;
43 <td align=right><tt class="date">{date|isodate}</tt>&nbsp;
43 <td align=right><tt class="date">{date|isodate}</tt>&nbsp;
44 <td align=right><tt>{size}</tt>&nbsp;
44 <td align=right><tt>{size}</tt>&nbsp;
45 <td><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>'
45 <td><a href="{url|urlescape}file/{symrev}/{file|urlescape}{sessionvars%urlparameter}">{basename|escape}</a>'
46
46
47 filerevision = filerevision.tmpl
47 filerevision = filerevision.tmpl
48 fileannotate = fileannotate.tmpl
48 fileannotate = fileannotate.tmpl
49 filediff = filediff.tmpl
49 filediff = filediff.tmpl
50 filelog = filelog.tmpl
50 filelog = filelog.tmpl
51 fileline = '<div class="parity{parity}"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>&nbsp;{line|escape}</div>'
51 fileline = '<div class="parity{parity}"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>&nbsp;{line|escape}</div>'
52 filelogentry = filelogentry.tmpl
52 filelogentry = filelogentry.tmpl
53
53
54 # The &nbsp; ensures that all table cells have content (even if there
54 # The &nbsp; ensures that all table cells have content (even if there
55 # is an empty line in the annotated file), which in turn ensures that
55 # is an empty line in the annotated file), which in turn ensures that
56 # all table rows have equal height.
56 # all table rows have equal height.
57 annotateline = '
57 annotateline = '
58 <tr class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
58 <tr class="parity{parity}{ifeq(node, originalnode, ' thisrev')}">
59 <td class="annotate parity{blockparity}">
59 <td class="annotate parity{blockparity}">
60 {if(blockhead,
60 {if(blockhead,
61 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
61 '<a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
62 {rev}
62 {rev}
63 </a>')}
63 </a>')}
64 <div class="annotate-info">
64 <div class="annotate-info">
65 <div>
65 <div>
66 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
66 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}#l{targetline}">
67 {node|short}</a>
67 {node|short}</a>
68 {desc|escape|firstline}
68 {desc|escape|firstline}
69 </div>
69 </div>
70 <div><em>{author|obfuscate}</em></div>
70 <div><em>{author|obfuscate}</em></div>
71 <div>parents: {parents%annotateparent}</div>
71 <div>parents: {parents%annotateparent}</div>
72 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
72 <a href="{url|urlescape}diff/{node|short}/{file|urlescape}{sessionvars%urlparameter}">diff</a>
73 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
73 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">changeset</a>
74 </div>
74 </div>
75 </td>
75 </td>
76 <td>
76 <td>
77 <a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>
77 <a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>
78 </td>
78 </td>
79 <td><pre>&nbsp;{line|escape}</pre></td>
79 <td><pre>&nbsp;{line|escape}</pre></td>
80 </tr>'
80 </tr>'
81 annotateparent = '
81 annotateparent = '
82 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
82 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{rev}</a>'
83 difflineplus = '<span class="plusline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
83 difflineplus = '<span class="plusline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
84 difflineminus = '<span class="minusline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
84 difflineminus = '<span class="minusline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
85 difflineat = '<span class="atline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
85 difflineat = '<span class="atline"><a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}</span>'
86 diffline = '<a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}'
86 diffline = '<a class="lineno" href="#{lineid}" id="{lineid}">{linenumber}</a>{line|escape}'
87 changesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
87 changesetlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a>'
88 changelogparent = '
88 changelogparent = '
89 <tr>
89 <tr>
90 <th class="parent">parent {rev}:</th>
90 <th class="parent">parent {rev}:</th>
91 <td class="parent">
91 <td class="parent">
92 {changesetlink}
92 {changesetlink}
93 </td>
93 </td>
94 </tr>'
94 </tr>'
95 changesetparent = '
95 changesetparent = '
96 <tr>
96 <tr>
97 <th class="parent">parent {rev}:</th>
97 <th class="parent">parent {rev}:</th>
98 <td class="parent">{changesetlink}</td>
98 <td class="parent">{changesetlink}</td>
99 </tr>'
99 </tr>'
100 changesetparentdiff = '
100 changesetparentdiff = '
101 <tr>
101 <tr>
102 <th class="parent">parent {rev}:</th>
102 <th class="parent">parent {rev}:</th>
103 <td class="parent">{changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}</td>
103 <td class="parent">{changesetlink} {ifeq(node, basenode, '(current diff)', '({difffrom})')}</td>
104 </tr>'
104 </tr>'
105 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
105 difffrom = '<a href="{url|urlescape}rev/{node|short}:{originalnode|short}{sessionvars%urlparameter}">diff</a>'
106 filerevparent = '
106 filerevparent = '
107 <tr>
107 <tr>
108 <td class="metatag">parent:</td>
108 <td class="metatag">parent:</td>
109 <td>
109 <td>
110 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
110 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
111 {rename%filerename}{node|short}
111 {rename%filerename}{node|short}
112 </a>
112 </a>
113 </td>
113 </td>
114 </tr>'
114 </tr>'
115 filerename = '{file|escape}@'
115 filerename = '{file|escape}@'
116 filelogrename = '
116 filelogrename = '
117 <tr>
117 <tr>
118 <th>base:</th>
118 <th>base:</th>
119 <td>
119 <td>
120 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
120 <a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
121 {file|escape}@{node|short}
121 {file|escape}@{node|short}
122 </a>
122 </a>
123 </td>
123 </td>
124 </tr>'
124 </tr>'
125 fileannotateparent = '
125 fileannotateparent = '
126 <tr>
126 <tr>
127 <td class="metatag">parent:</td>
127 <td class="metatag">parent:</td>
128 <td>
128 <td>
129 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
129 <a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">
130 {rename%filerename}{node|short}
130 {rename%filerename}{node|short}
131 </a>
131 </a>
132 </td>
132 </td>
133 </tr>'
133 </tr>'
134 changesetchild = '
134 changesetchild = '
135 <tr>
135 <tr>
136 <th class="child">child {rev}:</th>
136 <th class="child">child {rev}:</th>
137 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
137 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
138 </tr>'
138 </tr>'
139 changelogchild = '
139 changelogchild = '
140 <tr>
140 <tr>
141 <th class="child">child {rev}:</th>
141 <th class="child">child {rev}:</th>
142 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
142 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
143 </tr>'
143 </tr>'
144 filerevchild = '
144 filerevchild = '
145 <tr>
145 <tr>
146 <td class="metatag">child:</td>
146 <td class="metatag">child:</td>
147 <td><a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
147 <td><a href="{url|urlescape}file/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
148 </tr>'
148 </tr>'
149 fileannotatechild = '
149 fileannotatechild = '
150 <tr>
150 <tr>
151 <td class="metatag">child:</td>
151 <td class="metatag">child:</td>
152 <td><a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
152 <td><a href="{url|urlescape}annotate/{node|short}/{file|urlescape}{sessionvars%urlparameter}">{node|short}</a></td>
153 </tr>'
153 </tr>'
154 tags = tags.tmpl
154 tags = tags.tmpl
155 tagentry = '
155 tagentry = '
156 <li class="tagEntry parity{parity}">
156 <li class="tagEntry parity{parity}">
157 <tt class="node">{node}</tt>
157 <tt class="node">{node}</tt>
158 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{tag|escape}</a>
158 <a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{tag|escape}</a>
159 </li>'
159 </li>'
160 branches = branches.tmpl
160 branches = branches.tmpl
161 branchentry = '
161 branchentry = '
162 <li class="tagEntry parity{parity}">
162 <li class="tagEntry parity{parity}">
163 <tt class="node">{node}</tt>
163 <tt class="node">{node}</tt>
164 <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">{branch|escape}</a>
164 <a href="{url|urlescape}shortlog/{node|short}{sessionvars%urlparameter}" class="{status}">{branch|escape}</a>
165 </li>'
165 </li>'
166 diffblock = '<pre class="parity{parity}">{lines}</pre>'
166 diffblock = '<pre class="parity{parity}">{lines}</pre>'
167 changelogtag = '<tr><th class="tag">tag:</th><td class="tag">{tag|escape}</td></tr>'
167 changelogtag = '<tr><th class="tag">tag:</th><td class="tag">{tag|escape}</td></tr>'
168 changesettag = '<tr><th class="tag">tag:</th><td class="tag">{tag|escape}</td></tr>'
168 changesettag = '<tr><th class="tag">tag:</th><td class="tag">{tag|escape}</td></tr>'
169 obsfatesuccessors = '{if(successors, ' as ')}{join(successors, ', ')}'
169 successorlink = '<a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a> '
170 obsfatesuccessors = '{if(successors, ' as ')}{successors%successorlink}'
170 obsfateverb = '{obsfateverb(successors, markers)}'
171 obsfateverb = '{obsfateverb(successors, markers)}'
171 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
172 obsfateoperations = '{if(obsfateoperations(markers), ' using {join(obsfateoperations(markers), ', ')}')}'
172 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
173 obsfateentry = '{obsfateverb}{obsfateoperations}{obsfatesuccessors}'
173 filediffparent = '
174 filediffparent = '
174 <tr>
175 <tr>
175 <th class="parent">parent {rev}:</th>
176 <th class="parent">parent {rev}:</th>
176 <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
177 <td class="parent"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
177 </tr>'
178 </tr>'
178 filediffchild = '
179 filediffchild = '
179 <tr>
180 <tr>
180 <th class="child">child {rev}:</th>
181 <th class="child">child {rev}:</th>
181 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
182 <td class="child"><a href="{url|urlescape}rev/{node|short}{sessionvars%urlparameter}">{node|short}</a></td>
182 </tr>'
183 </tr>'
183 indexentry = '
184 indexentry = '
184 <tr class="parity{parity}">
185 <tr class="parity{parity}">
185 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
186 <td><a href="{url|urlescape}{sessionvars%urlparameter}">{name|escape}</a></td>
186 <td>{description}</td>
187 <td>{description}</td>
187 <td>{contact|obfuscate}</td>
188 <td>{contact|obfuscate}</td>
188 <td class="age">{lastchange|rfc822date}</td>
189 <td class="age">{lastchange|rfc822date}</td>
189 <td class="indexlinks">
190 <td class="indexlinks">
190 <a href="{url|urlescape}rss-log">RSS</a>
191 <a href="{url|urlescape}rss-log">RSS</a>
191 <a href="{url|urlescape}atom-log">Atom</a>
192 <a href="{url|urlescape}atom-log">Atom</a>
192 {archives%archiveentry}
193 {archives%archiveentry}
193 </td>
194 </td>
194 </tr>'
195 </tr>'
195 index = index.tmpl
196 index = index.tmpl
196 archiveentry = '<a href="{url|urlescape}archive/{symrev}{extension|urlescape}">{type|escape}</a> '
197 archiveentry = '<a href="{url|urlescape}archive/{symrev}{extension|urlescape}">{type|escape}</a> '
197 notfound = notfound.tmpl
198 notfound = notfound.tmpl
198 error = error.tmpl
199 error = error.tmpl
199 urlparameter = '{separator}{name}={value|urlescape}'
200 urlparameter = '{separator}{name}={value|urlescape}'
200 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
201 hiddenformentry = '<input type="hidden" name="{name}" value="{value|escape}" />'
201 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
202 breadcrumb = '&gt; <a href="{url|urlescape}">{name|escape}</a> '
@@ -1,1562 +1,1562 b''
1 $ cat >> $HGRCPATH << EOF
1 $ cat >> $HGRCPATH << EOF
2 > [phases]
2 > [phases]
3 > # public changeset are not obsolete
3 > # public changeset are not obsolete
4 > publish=false
4 > publish=false
5 > [ui]
5 > [ui]
6 > logtemplate="{rev}:{node|short} ({phase}{if(obsolete, ' *{obsolete}*')}{if(instabilities, ' {instabilities}')}) [{tags} {bookmarks}] {desc|firstline}{if(obsfate, " [{join(obsfate, "; ")}]")}\n"
6 > logtemplate="{rev}:{node|short} ({phase}{if(obsolete, ' *{obsolete}*')}{if(instabilities, ' {instabilities}')}) [{tags} {bookmarks}] {desc|firstline}{if(obsfate, " [{join(obsfate, "; ")}]")}\n"
7 > EOF
7 > EOF
8 $ mkcommit() {
8 $ mkcommit() {
9 > echo "$1" > "$1"
9 > echo "$1" > "$1"
10 > hg add "$1"
10 > hg add "$1"
11 > hg ci -m "add $1"
11 > hg ci -m "add $1"
12 > }
12 > }
13 $ getid() {
13 $ getid() {
14 > hg log -T "{node}\n" --hidden -r "desc('$1')"
14 > hg log -T "{node}\n" --hidden -r "desc('$1')"
15 > }
15 > }
16
16
17 $ cat > debugkeys.py <<EOF
17 $ cat > debugkeys.py <<EOF
18 > def reposetup(ui, repo):
18 > def reposetup(ui, repo):
19 > class debugkeysrepo(repo.__class__):
19 > class debugkeysrepo(repo.__class__):
20 > def listkeys(self, namespace):
20 > def listkeys(self, namespace):
21 > ui.write('listkeys %s\n' % (namespace,))
21 > ui.write('listkeys %s\n' % (namespace,))
22 > return super(debugkeysrepo, self).listkeys(namespace)
22 > return super(debugkeysrepo, self).listkeys(namespace)
23 >
23 >
24 > if repo.local():
24 > if repo.local():
25 > repo.__class__ = debugkeysrepo
25 > repo.__class__ = debugkeysrepo
26 > EOF
26 > EOF
27
27
28 $ hg init tmpa
28 $ hg init tmpa
29 $ cd tmpa
29 $ cd tmpa
30 $ mkcommit kill_me
30 $ mkcommit kill_me
31
31
32 Checking that the feature is properly disabled
32 Checking that the feature is properly disabled
33
33
34 $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
34 $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
35 abort: creating obsolete markers is not enabled on this repo
35 abort: creating obsolete markers is not enabled on this repo
36 [255]
36 [255]
37
37
38 Enabling it
38 Enabling it
39
39
40 $ cat >> $HGRCPATH << EOF
40 $ cat >> $HGRCPATH << EOF
41 > [experimental]
41 > [experimental]
42 > evolution=exchange
42 > evolution=exchange
43 > evolution.createmarkers=True
43 > evolution.createmarkers=True
44 > EOF
44 > EOF
45
45
46 Killing a single changeset without replacement
46 Killing a single changeset without replacement
47
47
48 $ hg debugobsolete 0
48 $ hg debugobsolete 0
49 abort: changeset references must be full hexadecimal node identifiers
49 abort: changeset references must be full hexadecimal node identifiers
50 [255]
50 [255]
51 $ hg debugobsolete '00'
51 $ hg debugobsolete '00'
52 abort: changeset references must be full hexadecimal node identifiers
52 abort: changeset references must be full hexadecimal node identifiers
53 [255]
53 [255]
54 $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
54 $ hg debugobsolete -d '0 0' `getid kill_me` -u babar
55 obsoleted 1 changesets
55 obsoleted 1 changesets
56 $ hg debugobsolete
56 $ hg debugobsolete
57 97b7c2d76b1845ed3eb988cd612611e72406cef0 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'babar'}
57 97b7c2d76b1845ed3eb988cd612611e72406cef0 0 (Thu Jan 01 00:00:00 1970 +0000) {'user': 'babar'}
58
58
59 (test that mercurial is not confused)
59 (test that mercurial is not confused)
60
60
61 $ hg up null --quiet # having 0 as parent prevents it to be hidden
61 $ hg up null --quiet # having 0 as parent prevents it to be hidden
62 $ hg tip
62 $ hg tip
63 -1:000000000000 (public) [tip ]
63 -1:000000000000 (public) [tip ]
64 $ hg up --hidden tip --quiet
64 $ hg up --hidden tip --quiet
65
65
66 Killing a single changeset with itself should fail
66 Killing a single changeset with itself should fail
67 (simple local safeguard)
67 (simple local safeguard)
68
68
69 $ hg debugobsolete `getid kill_me` `getid kill_me`
69 $ hg debugobsolete `getid kill_me` `getid kill_me`
70 abort: bad obsmarker input: in-marker cycle with 97b7c2d76b1845ed3eb988cd612611e72406cef0
70 abort: bad obsmarker input: in-marker cycle with 97b7c2d76b1845ed3eb988cd612611e72406cef0
71 [255]
71 [255]
72
72
73 $ cd ..
73 $ cd ..
74
74
75 Killing a single changeset with replacement
75 Killing a single changeset with replacement
76 (and testing the format option)
76 (and testing the format option)
77
77
78 $ hg init tmpb
78 $ hg init tmpb
79 $ cd tmpb
79 $ cd tmpb
80 $ mkcommit a
80 $ mkcommit a
81 $ mkcommit b
81 $ mkcommit b
82 $ mkcommit original_c
82 $ mkcommit original_c
83 $ hg up "desc('b')"
83 $ hg up "desc('b')"
84 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
84 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
85 $ mkcommit new_c
85 $ mkcommit new_c
86 created new head
86 created new head
87 $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
87 $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
88 $ hg debugobsolete --config format.obsstore-version=0 --flag 12 `getid original_c` `getid new_c` -d '121 120'
88 $ hg debugobsolete --config format.obsstore-version=0 --flag 12 `getid original_c` `getid new_c` -d '121 120'
89 obsoleted 1 changesets
89 obsoleted 1 changesets
90 $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
90 $ hg log -r 'hidden()' --template '{rev}:{node|short} {desc}\n' --hidden
91 2:245bde4270cd add original_c
91 2:245bde4270cd add original_c
92 $ hg debugrevlog -cd
92 $ hg debugrevlog -cd
93 # rev p1rev p2rev start end deltastart base p1 p2 rawsize totalsize compression heads chainlen
93 # rev p1rev p2rev start end deltastart base p1 p2 rawsize totalsize compression heads chainlen
94 0 -1 -1 0 59 0 0 0 0 58 58 0 1 0
94 0 -1 -1 0 59 0 0 0 0 58 58 0 1 0
95 1 0 -1 59 118 59 59 0 0 58 116 0 1 0
95 1 0 -1 59 118 59 59 0 0 58 116 0 1 0
96 2 1 -1 118 193 118 118 59 0 76 192 0 1 0
96 2 1 -1 118 193 118 118 59 0 76 192 0 1 0
97 3 1 -1 193 260 193 193 59 0 66 258 0 2 0
97 3 1 -1 193 260 193 193 59 0 66 258 0 2 0
98 $ hg debugobsolete
98 $ hg debugobsolete
99 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
99 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
100
100
101 (check for version number of the obsstore)
101 (check for version number of the obsstore)
102
102
103 $ dd bs=1 count=1 if=.hg/store/obsstore 2>/dev/null
103 $ dd bs=1 count=1 if=.hg/store/obsstore 2>/dev/null
104 \x00 (no-eol) (esc)
104 \x00 (no-eol) (esc)
105
105
106 do it again (it read the obsstore before adding new changeset)
106 do it again (it read the obsstore before adding new changeset)
107
107
108 $ hg up '.^'
108 $ hg up '.^'
109 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
109 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
110 $ mkcommit new_2_c
110 $ mkcommit new_2_c
111 created new head
111 created new head
112 $ hg debugobsolete -d '1337 0' `getid new_c` `getid new_2_c`
112 $ hg debugobsolete -d '1337 0' `getid new_c` `getid new_2_c`
113 obsoleted 1 changesets
113 obsoleted 1 changesets
114 $ hg debugobsolete
114 $ hg debugobsolete
115 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
115 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
116 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
116 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
117
117
118 Register two markers with a missing node
118 Register two markers with a missing node
119
119
120 $ hg up '.^'
120 $ hg up '.^'
121 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
121 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
122 $ mkcommit new_3_c
122 $ mkcommit new_3_c
123 created new head
123 created new head
124 $ hg debugobsolete -d '1338 0' `getid new_2_c` 1337133713371337133713371337133713371337
124 $ hg debugobsolete -d '1338 0' `getid new_2_c` 1337133713371337133713371337133713371337
125 obsoleted 1 changesets
125 obsoleted 1 changesets
126 $ hg debugobsolete -d '1339 0' 1337133713371337133713371337133713371337 `getid new_3_c`
126 $ hg debugobsolete -d '1339 0' 1337133713371337133713371337133713371337 `getid new_3_c`
127 $ hg debugobsolete
127 $ hg debugobsolete
128 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
128 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
129 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
129 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
130 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
130 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
131 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
131 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
132
132
133 Test the --index option of debugobsolete command
133 Test the --index option of debugobsolete command
134 $ hg debugobsolete --index
134 $ hg debugobsolete --index
135 0 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
135 0 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
136 1 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
136 1 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
137 2 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
137 2 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
138 3 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
138 3 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
139
139
140 Refuse pathological nullid successors
140 Refuse pathological nullid successors
141 $ hg debugobsolete -d '9001 0' 1337133713371337133713371337133713371337 0000000000000000000000000000000000000000
141 $ hg debugobsolete -d '9001 0' 1337133713371337133713371337133713371337 0000000000000000000000000000000000000000
142 transaction abort!
142 transaction abort!
143 rollback completed
143 rollback completed
144 abort: bad obsolescence marker detected: invalid successors nullid
144 abort: bad obsolescence marker detected: invalid successors nullid
145 [255]
145 [255]
146
146
147 Check that graphlog detect that a changeset is obsolete:
147 Check that graphlog detect that a changeset is obsolete:
148
148
149 $ hg log -G
149 $ hg log -G
150 @ 5:5601fb93a350 (draft) [tip ] add new_3_c
150 @ 5:5601fb93a350 (draft) [tip ] add new_3_c
151 |
151 |
152 o 1:7c3bad9141dc (draft) [ ] add b
152 o 1:7c3bad9141dc (draft) [ ] add b
153 |
153 |
154 o 0:1f0dee641bb7 (draft) [ ] add a
154 o 0:1f0dee641bb7 (draft) [ ] add a
155
155
156
156
157 check that heads does not report them
157 check that heads does not report them
158
158
159 $ hg heads
159 $ hg heads
160 5:5601fb93a350 (draft) [tip ] add new_3_c
160 5:5601fb93a350 (draft) [tip ] add new_3_c
161 $ hg heads --hidden
161 $ hg heads --hidden
162 5:5601fb93a350 (draft) [tip ] add new_3_c
162 5:5601fb93a350 (draft) [tip ] add new_3_c
163 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
163 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
164 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
164 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
165 2:245bde4270cd (draft *obsolete*) [ ] add original_c [rewritten as 3:cdbce2fbb163]
165 2:245bde4270cd (draft *obsolete*) [ ] add original_c [rewritten as 3:cdbce2fbb163]
166
166
167
167
168 check that summary does not report them
168 check that summary does not report them
169
169
170 $ hg init ../sink
170 $ hg init ../sink
171 $ echo '[paths]' >> .hg/hgrc
171 $ echo '[paths]' >> .hg/hgrc
172 $ echo 'default=../sink' >> .hg/hgrc
172 $ echo 'default=../sink' >> .hg/hgrc
173 $ hg summary --remote
173 $ hg summary --remote
174 parent: 5:5601fb93a350 tip
174 parent: 5:5601fb93a350 tip
175 add new_3_c
175 add new_3_c
176 branch: default
176 branch: default
177 commit: (clean)
177 commit: (clean)
178 update: (current)
178 update: (current)
179 phases: 3 draft
179 phases: 3 draft
180 remote: 3 outgoing
180 remote: 3 outgoing
181
181
182 $ hg summary --remote --hidden
182 $ hg summary --remote --hidden
183 parent: 5:5601fb93a350 tip
183 parent: 5:5601fb93a350 tip
184 add new_3_c
184 add new_3_c
185 branch: default
185 branch: default
186 commit: (clean)
186 commit: (clean)
187 update: 3 new changesets, 4 branch heads (merge)
187 update: 3 new changesets, 4 branch heads (merge)
188 phases: 6 draft
188 phases: 6 draft
189 remote: 3 outgoing
189 remote: 3 outgoing
190
190
191 check that various commands work well with filtering
191 check that various commands work well with filtering
192
192
193 $ hg tip
193 $ hg tip
194 5:5601fb93a350 (draft) [tip ] add new_3_c
194 5:5601fb93a350 (draft) [tip ] add new_3_c
195 $ hg log -r 6
195 $ hg log -r 6
196 abort: unknown revision '6'!
196 abort: unknown revision '6'!
197 [255]
197 [255]
198 $ hg log -r 4
198 $ hg log -r 4
199 abort: hidden revision '4'!
199 abort: hidden revision '4'!
200 (use --hidden to access hidden revisions)
200 (use --hidden to access hidden revisions)
201 [255]
201 [255]
202 $ hg debugrevspec 'rev(6)'
202 $ hg debugrevspec 'rev(6)'
203 $ hg debugrevspec 'rev(4)'
203 $ hg debugrevspec 'rev(4)'
204 $ hg debugrevspec 'null'
204 $ hg debugrevspec 'null'
205 -1
205 -1
206
206
207 Check that public changeset are not accounted as obsolete:
207 Check that public changeset are not accounted as obsolete:
208
208
209 $ hg --hidden phase --public 2
209 $ hg --hidden phase --public 2
210 $ hg log -G
210 $ hg log -G
211 @ 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c
211 @ 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c
212 |
212 |
213 | o 2:245bde4270cd (public) [ ] add original_c
213 | o 2:245bde4270cd (public) [ ] add original_c
214 |/
214 |/
215 o 1:7c3bad9141dc (public) [ ] add b
215 o 1:7c3bad9141dc (public) [ ] add b
216 |
216 |
217 o 0:1f0dee641bb7 (public) [ ] add a
217 o 0:1f0dee641bb7 (public) [ ] add a
218
218
219
219
220 And that bumped changeset are detected
220 And that bumped changeset are detected
221 --------------------------------------
221 --------------------------------------
222
222
223 If we didn't filtered obsolete changesets out, 3 and 4 would show up too. Also
223 If we didn't filtered obsolete changesets out, 3 and 4 would show up too. Also
224 note that the bumped changeset (5:5601fb93a350) is not a direct successor of
224 note that the bumped changeset (5:5601fb93a350) is not a direct successor of
225 the public changeset
225 the public changeset
226
226
227 $ hg log --hidden -r 'phasedivergent()'
227 $ hg log --hidden -r 'phasedivergent()'
228 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c
228 5:5601fb93a350 (draft phase-divergent) [tip ] add new_3_c
229
229
230 And that we can't push bumped changeset
230 And that we can't push bumped changeset
231
231
232 $ hg push ../tmpa -r 0 --force #(make repo related)
232 $ hg push ../tmpa -r 0 --force #(make repo related)
233 pushing to ../tmpa
233 pushing to ../tmpa
234 searching for changes
234 searching for changes
235 warning: repository is unrelated
235 warning: repository is unrelated
236 adding changesets
236 adding changesets
237 adding manifests
237 adding manifests
238 adding file changes
238 adding file changes
239 added 1 changesets with 1 changes to 1 files (+1 heads)
239 added 1 changesets with 1 changes to 1 files (+1 heads)
240 $ hg push ../tmpa
240 $ hg push ../tmpa
241 pushing to ../tmpa
241 pushing to ../tmpa
242 searching for changes
242 searching for changes
243 abort: push includes phase-divergent changeset: 5601fb93a350!
243 abort: push includes phase-divergent changeset: 5601fb93a350!
244 [255]
244 [255]
245
245
246 Fixing "bumped" situation
246 Fixing "bumped" situation
247 We need to create a clone of 5 and add a special marker with a flag
247 We need to create a clone of 5 and add a special marker with a flag
248
248
249 $ hg summary
249 $ hg summary
250 parent: 5:5601fb93a350 tip (phase-divergent)
250 parent: 5:5601fb93a350 tip (phase-divergent)
251 add new_3_c
251 add new_3_c
252 branch: default
252 branch: default
253 commit: (clean)
253 commit: (clean)
254 update: 1 new changesets, 2 branch heads (merge)
254 update: 1 new changesets, 2 branch heads (merge)
255 phases: 1 draft
255 phases: 1 draft
256 phase-divergent: 1 changesets
256 phase-divergent: 1 changesets
257 $ hg up '5^'
257 $ hg up '5^'
258 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
258 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
259 $ hg revert -ar 5
259 $ hg revert -ar 5
260 adding new_3_c
260 adding new_3_c
261 $ hg ci -m 'add n3w_3_c'
261 $ hg ci -m 'add n3w_3_c'
262 created new head
262 created new head
263 $ hg debugobsolete -d '1338 0' --flags 1 `getid new_3_c` `getid n3w_3_c`
263 $ hg debugobsolete -d '1338 0' --flags 1 `getid new_3_c` `getid n3w_3_c`
264 obsoleted 1 changesets
264 obsoleted 1 changesets
265 $ hg log -r 'phasedivergent()'
265 $ hg log -r 'phasedivergent()'
266 $ hg log -G
266 $ hg log -G
267 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
267 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
268 |
268 |
269 | o 2:245bde4270cd (public) [ ] add original_c
269 | o 2:245bde4270cd (public) [ ] add original_c
270 |/
270 |/
271 o 1:7c3bad9141dc (public) [ ] add b
271 o 1:7c3bad9141dc (public) [ ] add b
272 |
272 |
273 o 0:1f0dee641bb7 (public) [ ] add a
273 o 0:1f0dee641bb7 (public) [ ] add a
274
274
275
275
276 Basic exclusive testing
276 Basic exclusive testing
277
277
278 $ hg log -G --hidden
278 $ hg log -G --hidden
279 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
279 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
280 |
280 |
281 | x 5:5601fb93a350 (draft *obsolete*) [ ] add new_3_c [rewritten as 6:6f9641995072]
281 | x 5:5601fb93a350 (draft *obsolete*) [ ] add new_3_c [rewritten as 6:6f9641995072]
282 |/
282 |/
283 | x 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
283 | x 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
284 |/
284 |/
285 | x 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
285 | x 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
286 |/
286 |/
287 | o 2:245bde4270cd (public) [ ] add original_c
287 | o 2:245bde4270cd (public) [ ] add original_c
288 |/
288 |/
289 o 1:7c3bad9141dc (public) [ ] add b
289 o 1:7c3bad9141dc (public) [ ] add b
290 |
290 |
291 o 0:1f0dee641bb7 (public) [ ] add a
291 o 0:1f0dee641bb7 (public) [ ] add a
292
292
293 $ hg debugobsolete --rev 6f9641995072
293 $ hg debugobsolete --rev 6f9641995072
294 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
294 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
295 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
295 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
296 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
296 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
297 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
297 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
298 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
298 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
299 $ hg debugobsolete --rev 6f9641995072 --exclusive
299 $ hg debugobsolete --rev 6f9641995072 --exclusive
300 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
300 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
301 $ hg debugobsolete --rev 5601fb93a350 --hidden
301 $ hg debugobsolete --rev 5601fb93a350 --hidden
302 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
302 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
303 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
303 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
304 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
304 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
305 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
305 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
306 $ hg debugobsolete --rev 5601fb93a350 --hidden --exclusive
306 $ hg debugobsolete --rev 5601fb93a350 --hidden --exclusive
307 $ hg debugobsolete --rev 5601fb93a350+6f9641995072 --hidden --exclusive
307 $ hg debugobsolete --rev 5601fb93a350+6f9641995072 --hidden --exclusive
308 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
308 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
309 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
309 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
310 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
310 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
311
311
312 $ cd ..
312 $ cd ..
313
313
314 Revision 0 is hidden
314 Revision 0 is hidden
315 --------------------
315 --------------------
316
316
317 $ hg init rev0hidden
317 $ hg init rev0hidden
318 $ cd rev0hidden
318 $ cd rev0hidden
319
319
320 $ mkcommit kill0
320 $ mkcommit kill0
321 $ hg up -q null
321 $ hg up -q null
322 $ hg debugobsolete `getid kill0`
322 $ hg debugobsolete `getid kill0`
323 obsoleted 1 changesets
323 obsoleted 1 changesets
324 $ mkcommit a
324 $ mkcommit a
325 $ mkcommit b
325 $ mkcommit b
326
326
327 Should pick the first visible revision as "repo" node
327 Should pick the first visible revision as "repo" node
328
328
329 $ hg archive ../archive-null
329 $ hg archive ../archive-null
330 $ cat ../archive-null/.hg_archival.txt
330 $ cat ../archive-null/.hg_archival.txt
331 repo: 1f0dee641bb7258c56bd60e93edfa2405381c41e
331 repo: 1f0dee641bb7258c56bd60e93edfa2405381c41e
332 node: 7c3bad9141dcb46ff89abf5f61856facd56e476c
332 node: 7c3bad9141dcb46ff89abf5f61856facd56e476c
333 branch: default
333 branch: default
334 latesttag: null
334 latesttag: null
335 latesttagdistance: 2
335 latesttagdistance: 2
336 changessincelatesttag: 2
336 changessincelatesttag: 2
337
337
338
338
339 $ cd ..
339 $ cd ..
340
340
341 Exchange Test
341 Exchange Test
342 ============================
342 ============================
343
343
344 Destination repo does not have any data
344 Destination repo does not have any data
345 ---------------------------------------
345 ---------------------------------------
346
346
347 Simple incoming test
347 Simple incoming test
348
348
349 $ hg init tmpc
349 $ hg init tmpc
350 $ cd tmpc
350 $ cd tmpc
351 $ hg incoming ../tmpb
351 $ hg incoming ../tmpb
352 comparing with ../tmpb
352 comparing with ../tmpb
353 0:1f0dee641bb7 (public) [ ] add a
353 0:1f0dee641bb7 (public) [ ] add a
354 1:7c3bad9141dc (public) [ ] add b
354 1:7c3bad9141dc (public) [ ] add b
355 2:245bde4270cd (public) [ ] add original_c
355 2:245bde4270cd (public) [ ] add original_c
356 6:6f9641995072 (draft) [tip ] add n3w_3_c
356 6:6f9641995072 (draft) [tip ] add n3w_3_c
357
357
358 Try to pull markers
358 Try to pull markers
359 (extinct changeset are excluded but marker are pushed)
359 (extinct changeset are excluded but marker are pushed)
360
360
361 $ hg pull ../tmpb
361 $ hg pull ../tmpb
362 pulling from ../tmpb
362 pulling from ../tmpb
363 requesting all changes
363 requesting all changes
364 adding changesets
364 adding changesets
365 adding manifests
365 adding manifests
366 adding file changes
366 adding file changes
367 added 4 changesets with 4 changes to 4 files (+1 heads)
367 added 4 changesets with 4 changes to 4 files (+1 heads)
368 5 new obsolescence markers
368 5 new obsolescence markers
369 new changesets 1f0dee641bb7:6f9641995072
369 new changesets 1f0dee641bb7:6f9641995072
370 (run 'hg heads' to see heads, 'hg merge' to merge)
370 (run 'hg heads' to see heads, 'hg merge' to merge)
371 $ hg debugobsolete
371 $ hg debugobsolete
372 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
372 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
373 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
373 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
374 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
374 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
375 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
375 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
376 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
376 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
377
377
378 Rollback//Transaction support
378 Rollback//Transaction support
379
379
380 $ hg debugobsolete -d '1340 0' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
380 $ hg debugobsolete -d '1340 0' aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
381 $ hg debugobsolete
381 $ hg debugobsolete
382 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
382 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
383 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
383 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
384 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
384 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
385 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
385 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
386 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
386 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
387 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:22:20 1970 +0000) {'user': 'test'}
387 aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb 0 (Thu Jan 01 00:22:20 1970 +0000) {'user': 'test'}
388 $ hg rollback -n
388 $ hg rollback -n
389 repository tip rolled back to revision 3 (undo debugobsolete)
389 repository tip rolled back to revision 3 (undo debugobsolete)
390 $ hg rollback
390 $ hg rollback
391 repository tip rolled back to revision 3 (undo debugobsolete)
391 repository tip rolled back to revision 3 (undo debugobsolete)
392 $ hg debugobsolete
392 $ hg debugobsolete
393 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
393 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
394 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
394 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
395 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
395 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
396 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
396 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
397 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
397 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
398
398
399 $ cd ..
399 $ cd ..
400
400
401 Try to push markers
401 Try to push markers
402
402
403 $ hg init tmpd
403 $ hg init tmpd
404 $ hg -R tmpb push tmpd
404 $ hg -R tmpb push tmpd
405 pushing to tmpd
405 pushing to tmpd
406 searching for changes
406 searching for changes
407 adding changesets
407 adding changesets
408 adding manifests
408 adding manifests
409 adding file changes
409 adding file changes
410 added 4 changesets with 4 changes to 4 files (+1 heads)
410 added 4 changesets with 4 changes to 4 files (+1 heads)
411 5 new obsolescence markers
411 5 new obsolescence markers
412 $ hg -R tmpd debugobsolete | sort
412 $ hg -R tmpd debugobsolete | sort
413 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
413 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
414 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
414 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
415 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
415 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
416 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
416 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
417 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
417 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
418
418
419 Check obsolete keys are exchanged only if source has an obsolete store
419 Check obsolete keys are exchanged only if source has an obsolete store
420
420
421 $ hg init empty
421 $ hg init empty
422 $ hg --config extensions.debugkeys=debugkeys.py -R empty push tmpd
422 $ hg --config extensions.debugkeys=debugkeys.py -R empty push tmpd
423 pushing to tmpd
423 pushing to tmpd
424 listkeys phases
424 listkeys phases
425 listkeys bookmarks
425 listkeys bookmarks
426 no changes found
426 no changes found
427 listkeys phases
427 listkeys phases
428 [1]
428 [1]
429
429
430 clone support
430 clone support
431 (markers are copied and extinct changesets are included to allow hardlinks)
431 (markers are copied and extinct changesets are included to allow hardlinks)
432
432
433 $ hg clone tmpb clone-dest
433 $ hg clone tmpb clone-dest
434 updating to branch default
434 updating to branch default
435 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
435 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
436 $ hg -R clone-dest log -G --hidden
436 $ hg -R clone-dest log -G --hidden
437 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
437 @ 6:6f9641995072 (draft) [tip ] add n3w_3_c
438 |
438 |
439 | x 5:5601fb93a350 (draft *obsolete*) [ ] add new_3_c [rewritten as 6:6f9641995072]
439 | x 5:5601fb93a350 (draft *obsolete*) [ ] add new_3_c [rewritten as 6:6f9641995072]
440 |/
440 |/
441 | x 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
441 | x 4:ca819180edb9 (draft *obsolete*) [ ] add new_2_c [rewritten as 5:5601fb93a350]
442 |/
442 |/
443 | x 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
443 | x 3:cdbce2fbb163 (draft *obsolete*) [ ] add new_c [rewritten as 4:ca819180edb9]
444 |/
444 |/
445 | o 2:245bde4270cd (public) [ ] add original_c
445 | o 2:245bde4270cd (public) [ ] add original_c
446 |/
446 |/
447 o 1:7c3bad9141dc (public) [ ] add b
447 o 1:7c3bad9141dc (public) [ ] add b
448 |
448 |
449 o 0:1f0dee641bb7 (public) [ ] add a
449 o 0:1f0dee641bb7 (public) [ ] add a
450
450
451 $ hg -R clone-dest debugobsolete
451 $ hg -R clone-dest debugobsolete
452 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
452 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
453 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
453 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
454 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
454 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
455 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
455 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
456 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
456 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
457
457
458
458
459 Destination repo have existing data
459 Destination repo have existing data
460 ---------------------------------------
460 ---------------------------------------
461
461
462 On pull
462 On pull
463
463
464 $ hg init tmpe
464 $ hg init tmpe
465 $ cd tmpe
465 $ cd tmpe
466 $ hg debugobsolete -d '1339 0' 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00
466 $ hg debugobsolete -d '1339 0' 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00
467 $ hg pull ../tmpb
467 $ hg pull ../tmpb
468 pulling from ../tmpb
468 pulling from ../tmpb
469 requesting all changes
469 requesting all changes
470 adding changesets
470 adding changesets
471 adding manifests
471 adding manifests
472 adding file changes
472 adding file changes
473 added 4 changesets with 4 changes to 4 files (+1 heads)
473 added 4 changesets with 4 changes to 4 files (+1 heads)
474 5 new obsolescence markers
474 5 new obsolescence markers
475 new changesets 1f0dee641bb7:6f9641995072
475 new changesets 1f0dee641bb7:6f9641995072
476 (run 'hg heads' to see heads, 'hg merge' to merge)
476 (run 'hg heads' to see heads, 'hg merge' to merge)
477 $ hg debugobsolete
477 $ hg debugobsolete
478 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
478 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
479 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
479 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
480 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
480 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
481 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
481 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
482 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
482 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
483 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
483 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
484
484
485
485
486 On push
486 On push
487
487
488 $ hg push ../tmpc
488 $ hg push ../tmpc
489 pushing to ../tmpc
489 pushing to ../tmpc
490 searching for changes
490 searching for changes
491 no changes found
491 no changes found
492 1 new obsolescence markers
492 1 new obsolescence markers
493 [1]
493 [1]
494 $ hg -R ../tmpc debugobsolete
494 $ hg -R ../tmpc debugobsolete
495 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
495 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
496 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
496 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
497 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
497 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
498 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
498 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
499 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
499 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
500 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
500 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
501
501
502 detect outgoing obsolete and unstable
502 detect outgoing obsolete and unstable
503 ---------------------------------------
503 ---------------------------------------
504
504
505
505
506 $ hg log -G
506 $ hg log -G
507 o 3:6f9641995072 (draft) [tip ] add n3w_3_c
507 o 3:6f9641995072 (draft) [tip ] add n3w_3_c
508 |
508 |
509 | o 2:245bde4270cd (public) [ ] add original_c
509 | o 2:245bde4270cd (public) [ ] add original_c
510 |/
510 |/
511 o 1:7c3bad9141dc (public) [ ] add b
511 o 1:7c3bad9141dc (public) [ ] add b
512 |
512 |
513 o 0:1f0dee641bb7 (public) [ ] add a
513 o 0:1f0dee641bb7 (public) [ ] add a
514
514
515 $ hg up 'desc("n3w_3_c")'
515 $ hg up 'desc("n3w_3_c")'
516 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
516 3 files updated, 0 files merged, 0 files removed, 0 files unresolved
517 $ mkcommit original_d
517 $ mkcommit original_d
518 $ mkcommit original_e
518 $ mkcommit original_e
519 $ hg debugobsolete --record-parents `getid original_d` -d '0 0'
519 $ hg debugobsolete --record-parents `getid original_d` -d '0 0'
520 obsoleted 1 changesets
520 obsoleted 1 changesets
521 $ hg debugobsolete | grep `getid original_d`
521 $ hg debugobsolete | grep `getid original_d`
522 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
522 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
523 $ hg log -r 'obsolete()'
523 $ hg log -r 'obsolete()'
524 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
524 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
525 $ hg summary
525 $ hg summary
526 parent: 5:cda648ca50f5 tip (orphan)
526 parent: 5:cda648ca50f5 tip (orphan)
527 add original_e
527 add original_e
528 branch: default
528 branch: default
529 commit: (clean)
529 commit: (clean)
530 update: 1 new changesets, 2 branch heads (merge)
530 update: 1 new changesets, 2 branch heads (merge)
531 phases: 3 draft
531 phases: 3 draft
532 orphan: 1 changesets
532 orphan: 1 changesets
533 $ hg log -G -r '::orphan()'
533 $ hg log -G -r '::orphan()'
534 @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e
534 @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e
535 |
535 |
536 x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
536 x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
537 |
537 |
538 o 3:6f9641995072 (draft) [ ] add n3w_3_c
538 o 3:6f9641995072 (draft) [ ] add n3w_3_c
539 |
539 |
540 o 1:7c3bad9141dc (public) [ ] add b
540 o 1:7c3bad9141dc (public) [ ] add b
541 |
541 |
542 o 0:1f0dee641bb7 (public) [ ] add a
542 o 0:1f0dee641bb7 (public) [ ] add a
543
543
544
544
545 refuse to push obsolete changeset
545 refuse to push obsolete changeset
546
546
547 $ hg push ../tmpc/ -r 'desc("original_d")'
547 $ hg push ../tmpc/ -r 'desc("original_d")'
548 pushing to ../tmpc/
548 pushing to ../tmpc/
549 searching for changes
549 searching for changes
550 abort: push includes obsolete changeset: 94b33453f93b!
550 abort: push includes obsolete changeset: 94b33453f93b!
551 [255]
551 [255]
552
552
553 refuse to push unstable changeset
553 refuse to push unstable changeset
554
554
555 $ hg push ../tmpc/
555 $ hg push ../tmpc/
556 pushing to ../tmpc/
556 pushing to ../tmpc/
557 searching for changes
557 searching for changes
558 abort: push includes orphan changeset: cda648ca50f5!
558 abort: push includes orphan changeset: cda648ca50f5!
559 [255]
559 [255]
560
560
561 Test that extinct changeset are properly detected
561 Test that extinct changeset are properly detected
562
562
563 $ hg log -r 'extinct()'
563 $ hg log -r 'extinct()'
564
564
565 Don't try to push extinct changeset
565 Don't try to push extinct changeset
566
566
567 $ hg init ../tmpf
567 $ hg init ../tmpf
568 $ hg out ../tmpf
568 $ hg out ../tmpf
569 comparing with ../tmpf
569 comparing with ../tmpf
570 searching for changes
570 searching for changes
571 0:1f0dee641bb7 (public) [ ] add a
571 0:1f0dee641bb7 (public) [ ] add a
572 1:7c3bad9141dc (public) [ ] add b
572 1:7c3bad9141dc (public) [ ] add b
573 2:245bde4270cd (public) [ ] add original_c
573 2:245bde4270cd (public) [ ] add original_c
574 3:6f9641995072 (draft) [ ] add n3w_3_c
574 3:6f9641995072 (draft) [ ] add n3w_3_c
575 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
575 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
576 5:cda648ca50f5 (draft orphan) [tip ] add original_e
576 5:cda648ca50f5 (draft orphan) [tip ] add original_e
577 $ hg push ../tmpf -f # -f because be push unstable too
577 $ hg push ../tmpf -f # -f because be push unstable too
578 pushing to ../tmpf
578 pushing to ../tmpf
579 searching for changes
579 searching for changes
580 adding changesets
580 adding changesets
581 adding manifests
581 adding manifests
582 adding file changes
582 adding file changes
583 added 6 changesets with 6 changes to 6 files (+1 heads)
583 added 6 changesets with 6 changes to 6 files (+1 heads)
584 7 new obsolescence markers
584 7 new obsolescence markers
585
585
586 no warning displayed
586 no warning displayed
587
587
588 $ hg push ../tmpf
588 $ hg push ../tmpf
589 pushing to ../tmpf
589 pushing to ../tmpf
590 searching for changes
590 searching for changes
591 no changes found
591 no changes found
592 [1]
592 [1]
593
593
594 Do not warn about new head when the new head is a successors of a remote one
594 Do not warn about new head when the new head is a successors of a remote one
595
595
596 $ hg log -G
596 $ hg log -G
597 @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e
597 @ 5:cda648ca50f5 (draft orphan) [tip ] add original_e
598 |
598 |
599 x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
599 x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
600 |
600 |
601 o 3:6f9641995072 (draft) [ ] add n3w_3_c
601 o 3:6f9641995072 (draft) [ ] add n3w_3_c
602 |
602 |
603 | o 2:245bde4270cd (public) [ ] add original_c
603 | o 2:245bde4270cd (public) [ ] add original_c
604 |/
604 |/
605 o 1:7c3bad9141dc (public) [ ] add b
605 o 1:7c3bad9141dc (public) [ ] add b
606 |
606 |
607 o 0:1f0dee641bb7 (public) [ ] add a
607 o 0:1f0dee641bb7 (public) [ ] add a
608
608
609 $ hg up -q 'desc(n3w_3_c)'
609 $ hg up -q 'desc(n3w_3_c)'
610 $ mkcommit obsolete_e
610 $ mkcommit obsolete_e
611 created new head
611 created new head
612 $ hg debugobsolete `getid 'original_e'` `getid 'obsolete_e'` \
612 $ hg debugobsolete `getid 'original_e'` `getid 'obsolete_e'` \
613 > -u 'test <test@example.net>'
613 > -u 'test <test@example.net>'
614 obsoleted 1 changesets
614 obsoleted 1 changesets
615 $ hg outgoing ../tmpf # parasite hg outgoing testin
615 $ hg outgoing ../tmpf # parasite hg outgoing testin
616 comparing with ../tmpf
616 comparing with ../tmpf
617 searching for changes
617 searching for changes
618 6:3de5eca88c00 (draft) [tip ] add obsolete_e
618 6:3de5eca88c00 (draft) [tip ] add obsolete_e
619 $ hg push ../tmpf
619 $ hg push ../tmpf
620 pushing to ../tmpf
620 pushing to ../tmpf
621 searching for changes
621 searching for changes
622 adding changesets
622 adding changesets
623 adding manifests
623 adding manifests
624 adding file changes
624 adding file changes
625 added 1 changesets with 1 changes to 1 files (+1 heads)
625 added 1 changesets with 1 changes to 1 files (+1 heads)
626 1 new obsolescence markers
626 1 new obsolescence markers
627 obsoleted 1 changesets
627 obsoleted 1 changesets
628
628
629 test relevance computation
629 test relevance computation
630 ---------------------------------------
630 ---------------------------------------
631
631
632 Checking simple case of "marker relevance".
632 Checking simple case of "marker relevance".
633
633
634
634
635 Reminder of the repo situation
635 Reminder of the repo situation
636
636
637 $ hg log --hidden --graph
637 $ hg log --hidden --graph
638 @ 6:3de5eca88c00 (draft) [tip ] add obsolete_e
638 @ 6:3de5eca88c00 (draft) [tip ] add obsolete_e
639 |
639 |
640 | x 5:cda648ca50f5 (draft *obsolete*) [ ] add original_e [rewritten as 6:3de5eca88c00 by test <test@example.net>]
640 | x 5:cda648ca50f5 (draft *obsolete*) [ ] add original_e [rewritten as 6:3de5eca88c00 by test <test@example.net>]
641 | |
641 | |
642 | x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
642 | x 4:94b33453f93b (draft *obsolete*) [ ] add original_d [pruned]
643 |/
643 |/
644 o 3:6f9641995072 (draft) [ ] add n3w_3_c
644 o 3:6f9641995072 (draft) [ ] add n3w_3_c
645 |
645 |
646 | o 2:245bde4270cd (public) [ ] add original_c
646 | o 2:245bde4270cd (public) [ ] add original_c
647 |/
647 |/
648 o 1:7c3bad9141dc (public) [ ] add b
648 o 1:7c3bad9141dc (public) [ ] add b
649 |
649 |
650 o 0:1f0dee641bb7 (public) [ ] add a
650 o 0:1f0dee641bb7 (public) [ ] add a
651
651
652
652
653 List of all markers
653 List of all markers
654
654
655 $ hg debugobsolete
655 $ hg debugobsolete
656 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
656 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
657 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
657 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
658 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
658 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
659 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
659 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
660 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
660 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
661 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
661 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
662 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
662 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
663 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
663 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
664
664
665 List of changesets with no chain
665 List of changesets with no chain
666
666
667 $ hg debugobsolete --hidden --rev ::2
667 $ hg debugobsolete --hidden --rev ::2
668
668
669 List of changesets that are included on marker chain
669 List of changesets that are included on marker chain
670
670
671 $ hg debugobsolete --hidden --rev 6
671 $ hg debugobsolete --hidden --rev 6
672 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
672 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
673
673
674 List of changesets with a longer chain, (including a pruned children)
674 List of changesets with a longer chain, (including a pruned children)
675
675
676 $ hg debugobsolete --hidden --rev 3
676 $ hg debugobsolete --hidden --rev 3
677 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
677 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
678 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
678 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
679 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
679 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
680 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
680 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
681 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
681 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
682 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
682 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
683 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
683 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
684
684
685 List of both
685 List of both
686
686
687 $ hg debugobsolete --hidden --rev 3::6
687 $ hg debugobsolete --hidden --rev 3::6
688 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
688 1337133713371337133713371337133713371337 5601fb93a350734d935195fee37f4054c529ff39 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
689 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
689 1339133913391339133913391339133913391339 ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:19 1970 +0000) {'user': 'test'}
690 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
690 245bde4270cd1072a27757984f9cda8ba26f08ca cdbce2fbb16313928851e97e0d85413f3f7eb77f C (Thu Jan 01 00:00:01 1970 -0002) {'user': 'test'}
691 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
691 5601fb93a350734d935195fee37f4054c529ff39 6f96419950729f3671185b847352890f074f7557 1 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
692 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
692 94b33453f93bdb8d457ef9b770851a618bf413e1 0 {6f96419950729f3671185b847352890f074f7557} (Thu Jan 01 00:00:00 1970 +0000) {'user': 'test'}
693 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
693 ca819180edb99ed25ceafb3e9584ac287e240b00 1337133713371337133713371337133713371337 0 (Thu Jan 01 00:22:18 1970 +0000) {'user': 'test'}
694 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
694 cda648ca50f50482b7055c0b0c4c117bba6733d9 3de5eca88c00aa039da7399a220f4a5221faa585 0 (*) {'user': 'test <test@example.net>'} (glob)
695 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
695 cdbce2fbb16313928851e97e0d85413f3f7eb77f ca819180edb99ed25ceafb3e9584ac287e240b00 0 (Thu Jan 01 00:22:17 1970 +0000) {'user': 'test'}
696
696
697 List of all markers in JSON
697 List of all markers in JSON
698
698
699 $ hg debugobsolete -Tjson
699 $ hg debugobsolete -Tjson
700 [
700 [
701 {
701 {
702 "date": [1339.0, 0],
702 "date": [1339.0, 0],
703 "flag": 0,
703 "flag": 0,
704 "metadata": {"user": "test"},
704 "metadata": {"user": "test"},
705 "prednode": "1339133913391339133913391339133913391339",
705 "prednode": "1339133913391339133913391339133913391339",
706 "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"]
706 "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"]
707 },
707 },
708 {
708 {
709 "date": [1339.0, 0],
709 "date": [1339.0, 0],
710 "flag": 0,
710 "flag": 0,
711 "metadata": {"user": "test"},
711 "metadata": {"user": "test"},
712 "prednode": "1337133713371337133713371337133713371337",
712 "prednode": "1337133713371337133713371337133713371337",
713 "succnodes": ["5601fb93a350734d935195fee37f4054c529ff39"]
713 "succnodes": ["5601fb93a350734d935195fee37f4054c529ff39"]
714 },
714 },
715 {
715 {
716 "date": [121.0, 120],
716 "date": [121.0, 120],
717 "flag": 12,
717 "flag": 12,
718 "metadata": {"user": "test"},
718 "metadata": {"user": "test"},
719 "prednode": "245bde4270cd1072a27757984f9cda8ba26f08ca",
719 "prednode": "245bde4270cd1072a27757984f9cda8ba26f08ca",
720 "succnodes": ["cdbce2fbb16313928851e97e0d85413f3f7eb77f"]
720 "succnodes": ["cdbce2fbb16313928851e97e0d85413f3f7eb77f"]
721 },
721 },
722 {
722 {
723 "date": [1338.0, 0],
723 "date": [1338.0, 0],
724 "flag": 1,
724 "flag": 1,
725 "metadata": {"user": "test"},
725 "metadata": {"user": "test"},
726 "prednode": "5601fb93a350734d935195fee37f4054c529ff39",
726 "prednode": "5601fb93a350734d935195fee37f4054c529ff39",
727 "succnodes": ["6f96419950729f3671185b847352890f074f7557"]
727 "succnodes": ["6f96419950729f3671185b847352890f074f7557"]
728 },
728 },
729 {
729 {
730 "date": [1338.0, 0],
730 "date": [1338.0, 0],
731 "flag": 0,
731 "flag": 0,
732 "metadata": {"user": "test"},
732 "metadata": {"user": "test"},
733 "prednode": "ca819180edb99ed25ceafb3e9584ac287e240b00",
733 "prednode": "ca819180edb99ed25ceafb3e9584ac287e240b00",
734 "succnodes": ["1337133713371337133713371337133713371337"]
734 "succnodes": ["1337133713371337133713371337133713371337"]
735 },
735 },
736 {
736 {
737 "date": [1337.0, 0],
737 "date": [1337.0, 0],
738 "flag": 0,
738 "flag": 0,
739 "metadata": {"user": "test"},
739 "metadata": {"user": "test"},
740 "prednode": "cdbce2fbb16313928851e97e0d85413f3f7eb77f",
740 "prednode": "cdbce2fbb16313928851e97e0d85413f3f7eb77f",
741 "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"]
741 "succnodes": ["ca819180edb99ed25ceafb3e9584ac287e240b00"]
742 },
742 },
743 {
743 {
744 "date": [0.0, 0],
744 "date": [0.0, 0],
745 "flag": 0,
745 "flag": 0,
746 "metadata": {"user": "test"},
746 "metadata": {"user": "test"},
747 "parentnodes": ["6f96419950729f3671185b847352890f074f7557"],
747 "parentnodes": ["6f96419950729f3671185b847352890f074f7557"],
748 "prednode": "94b33453f93bdb8d457ef9b770851a618bf413e1",
748 "prednode": "94b33453f93bdb8d457ef9b770851a618bf413e1",
749 "succnodes": []
749 "succnodes": []
750 },
750 },
751 {
751 {
752 "date": *, (glob)
752 "date": *, (glob)
753 "flag": 0,
753 "flag": 0,
754 "metadata": {"user": "test <test@example.net>"},
754 "metadata": {"user": "test <test@example.net>"},
755 "prednode": "cda648ca50f50482b7055c0b0c4c117bba6733d9",
755 "prednode": "cda648ca50f50482b7055c0b0c4c117bba6733d9",
756 "succnodes": ["3de5eca88c00aa039da7399a220f4a5221faa585"]
756 "succnodes": ["3de5eca88c00aa039da7399a220f4a5221faa585"]
757 }
757 }
758 ]
758 ]
759
759
760 Template keywords
760 Template keywords
761
761
762 $ hg debugobsolete -r6 -T '{succnodes % "{node|short}"} {date|shortdate}\n'
762 $ hg debugobsolete -r6 -T '{succnodes % "{node|short}"} {date|shortdate}\n'
763 3de5eca88c00 ????-??-?? (glob)
763 3de5eca88c00 ????-??-?? (glob)
764 $ hg debugobsolete -r6 -T '{join(metadata % "{key}={value}", " ")}\n'
764 $ hg debugobsolete -r6 -T '{join(metadata % "{key}={value}", " ")}\n'
765 user=test <test@example.net>
765 user=test <test@example.net>
766 $ hg debugobsolete -r6 -T '{metadata}\n{metadata}\n'
766 $ hg debugobsolete -r6 -T '{metadata}\n{metadata}\n'
767 'user': 'test <test@example.net>'
767 'user': 'test <test@example.net>'
768 'user': 'test <test@example.net>'
768 'user': 'test <test@example.net>'
769 $ hg debugobsolete -r6 -T '{succnodes}\n{succnodes}\n'
769 $ hg debugobsolete -r6 -T '{succnodes}\n{succnodes}\n'
770 3de5eca88c00aa039da7399a220f4a5221faa585
770 3de5eca88c00aa039da7399a220f4a5221faa585
771 3de5eca88c00aa039da7399a220f4a5221faa585
771 3de5eca88c00aa039da7399a220f4a5221faa585
772 $ hg debugobsolete -r6 -T '{flag} {get(metadata, "user")}\n'
772 $ hg debugobsolete -r6 -T '{flag} {get(metadata, "user")}\n'
773 0 test <test@example.net>
773 0 test <test@example.net>
774
774
775 Test the debug output for exchange
775 Test the debug output for exchange
776 ----------------------------------
776 ----------------------------------
777
777
778 $ hg pull ../tmpb --config 'experimental.obsmarkers-exchange-debug=True' # bundle2
778 $ hg pull ../tmpb --config 'experimental.obsmarkers-exchange-debug=True' # bundle2
779 pulling from ../tmpb
779 pulling from ../tmpb
780 searching for changes
780 searching for changes
781 no changes found
781 no changes found
782 obsmarker-exchange: 346 bytes received
782 obsmarker-exchange: 346 bytes received
783
783
784 check hgweb does not explode
784 check hgweb does not explode
785 ====================================
785 ====================================
786
786
787 $ hg unbundle $TESTDIR/bundles/hgweb+obs.hg
787 $ hg unbundle $TESTDIR/bundles/hgweb+obs.hg
788 adding changesets
788 adding changesets
789 adding manifests
789 adding manifests
790 adding file changes
790 adding file changes
791 added 62 changesets with 63 changes to 9 files (+60 heads)
791 added 62 changesets with 63 changes to 9 files (+60 heads)
792 new changesets 50c51b361e60:c15e9edfca13
792 new changesets 50c51b361e60:c15e9edfca13
793 (run 'hg heads .' to see heads, 'hg merge' to merge)
793 (run 'hg heads .' to see heads, 'hg merge' to merge)
794 $ for node in `hg log -r 'desc(babar_)' --template '{node}\n'`;
794 $ for node in `hg log -r 'desc(babar_)' --template '{node}\n'`;
795 > do
795 > do
796 > hg debugobsolete $node
796 > hg debugobsolete $node
797 > done
797 > done
798 obsoleted 1 changesets
798 obsoleted 1 changesets
799 obsoleted 1 changesets
799 obsoleted 1 changesets
800 obsoleted 1 changesets
800 obsoleted 1 changesets
801 obsoleted 1 changesets
801 obsoleted 1 changesets
802 obsoleted 1 changesets
802 obsoleted 1 changesets
803 obsoleted 1 changesets
803 obsoleted 1 changesets
804 obsoleted 1 changesets
804 obsoleted 1 changesets
805 obsoleted 1 changesets
805 obsoleted 1 changesets
806 obsoleted 1 changesets
806 obsoleted 1 changesets
807 obsoleted 1 changesets
807 obsoleted 1 changesets
808 obsoleted 1 changesets
808 obsoleted 1 changesets
809 obsoleted 1 changesets
809 obsoleted 1 changesets
810 obsoleted 1 changesets
810 obsoleted 1 changesets
811 obsoleted 1 changesets
811 obsoleted 1 changesets
812 obsoleted 1 changesets
812 obsoleted 1 changesets
813 obsoleted 1 changesets
813 obsoleted 1 changesets
814 obsoleted 1 changesets
814 obsoleted 1 changesets
815 obsoleted 1 changesets
815 obsoleted 1 changesets
816 obsoleted 1 changesets
816 obsoleted 1 changesets
817 obsoleted 1 changesets
817 obsoleted 1 changesets
818 obsoleted 1 changesets
818 obsoleted 1 changesets
819 obsoleted 1 changesets
819 obsoleted 1 changesets
820 obsoleted 1 changesets
820 obsoleted 1 changesets
821 obsoleted 1 changesets
821 obsoleted 1 changesets
822 obsoleted 1 changesets
822 obsoleted 1 changesets
823 obsoleted 1 changesets
823 obsoleted 1 changesets
824 obsoleted 1 changesets
824 obsoleted 1 changesets
825 obsoleted 1 changesets
825 obsoleted 1 changesets
826 obsoleted 1 changesets
826 obsoleted 1 changesets
827 obsoleted 1 changesets
827 obsoleted 1 changesets
828 obsoleted 1 changesets
828 obsoleted 1 changesets
829 obsoleted 1 changesets
829 obsoleted 1 changesets
830 obsoleted 1 changesets
830 obsoleted 1 changesets
831 obsoleted 1 changesets
831 obsoleted 1 changesets
832 obsoleted 1 changesets
832 obsoleted 1 changesets
833 obsoleted 1 changesets
833 obsoleted 1 changesets
834 obsoleted 1 changesets
834 obsoleted 1 changesets
835 obsoleted 1 changesets
835 obsoleted 1 changesets
836 obsoleted 1 changesets
836 obsoleted 1 changesets
837 obsoleted 1 changesets
837 obsoleted 1 changesets
838 obsoleted 1 changesets
838 obsoleted 1 changesets
839 obsoleted 1 changesets
839 obsoleted 1 changesets
840 obsoleted 1 changesets
840 obsoleted 1 changesets
841 obsoleted 1 changesets
841 obsoleted 1 changesets
842 obsoleted 1 changesets
842 obsoleted 1 changesets
843 obsoleted 1 changesets
843 obsoleted 1 changesets
844 obsoleted 1 changesets
844 obsoleted 1 changesets
845 obsoleted 1 changesets
845 obsoleted 1 changesets
846 obsoleted 1 changesets
846 obsoleted 1 changesets
847 obsoleted 1 changesets
847 obsoleted 1 changesets
848 obsoleted 1 changesets
848 obsoleted 1 changesets
849 obsoleted 1 changesets
849 obsoleted 1 changesets
850 obsoleted 1 changesets
850 obsoleted 1 changesets
851 obsoleted 1 changesets
851 obsoleted 1 changesets
852 obsoleted 1 changesets
852 obsoleted 1 changesets
853 obsoleted 1 changesets
853 obsoleted 1 changesets
854 obsoleted 1 changesets
854 obsoleted 1 changesets
855 obsoleted 1 changesets
855 obsoleted 1 changesets
856 obsoleted 1 changesets
856 obsoleted 1 changesets
857 obsoleted 1 changesets
857 obsoleted 1 changesets
858 $ hg up tip
858 $ hg up tip
859 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
859 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
860
860
861 #if serve
861 #if serve
862
862
863 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
863 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
864 $ cat hg.pid >> $DAEMON_PIDS
864 $ cat hg.pid >> $DAEMON_PIDS
865
865
866 check changelog view
866 check changelog view
867
867
868 $ get-with-headers.py --headeronly localhost:$HGPORT 'shortlog/'
868 $ get-with-headers.py --headeronly localhost:$HGPORT 'shortlog/'
869 200 Script output follows
869 200 Script output follows
870
870
871 check graph view
871 check graph view
872
872
873 $ get-with-headers.py --headeronly localhost:$HGPORT 'graph'
873 $ get-with-headers.py --headeronly localhost:$HGPORT 'graph'
874 200 Script output follows
874 200 Script output follows
875
875
876 check filelog view
876 check filelog view
877
877
878 $ get-with-headers.py --headeronly localhost:$HGPORT 'log/'`hg log -r . -T "{node}"`/'babar'
878 $ get-with-headers.py --headeronly localhost:$HGPORT 'log/'`hg log -r . -T "{node}"`/'babar'
879 200 Script output follows
879 200 Script output follows
880
880
881 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/68'
881 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/68'
882 200 Script output follows
882 200 Script output follows
883 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/67'
883 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/67'
884 404 Not Found
884 404 Not Found
885 [1]
885 [1]
886
886
887 check that web.view config option:
887 check that web.view config option:
888
888
889 $ killdaemons.py hg.pid
889 $ killdaemons.py hg.pid
890 $ cat >> .hg/hgrc << EOF
890 $ cat >> .hg/hgrc << EOF
891 > [web]
891 > [web]
892 > view=all
892 > view=all
893 > EOF
893 > EOF
894 $ wait
894 $ wait
895 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
895 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
896 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/67'
896 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/67'
897 200 Script output follows
897 200 Script output follows
898 $ killdaemons.py hg.pid
898 $ killdaemons.py hg.pid
899
899
900 Checking _enable=False warning if obsolete marker exists
900 Checking _enable=False warning if obsolete marker exists
901
901
902 $ echo '[experimental]' >> $HGRCPATH
902 $ echo '[experimental]' >> $HGRCPATH
903 $ echo "evolution=" >> $HGRCPATH
903 $ echo "evolution=" >> $HGRCPATH
904 $ hg log -r tip
904 $ hg log -r tip
905 68:c15e9edfca13 (draft) [tip ] add celestine
905 68:c15e9edfca13 (draft) [tip ] add celestine
906
906
907 reenable for later test
907 reenable for later test
908
908
909 $ echo '[experimental]' >> $HGRCPATH
909 $ echo '[experimental]' >> $HGRCPATH
910 $ echo "evolution.exchange=True" >> $HGRCPATH
910 $ echo "evolution.exchange=True" >> $HGRCPATH
911 $ echo "evolution.createmarkers=True" >> $HGRCPATH
911 $ echo "evolution.createmarkers=True" >> $HGRCPATH
912
912
913 $ rm hg.pid access.log errors.log
913 $ rm hg.pid access.log errors.log
914 #endif
914 #endif
915
915
916 Several troubles on the same changeset (create an unstable and bumped changeset)
916 Several troubles on the same changeset (create an unstable and bumped changeset)
917
917
918 $ hg debugobsolete `getid obsolete_e`
918 $ hg debugobsolete `getid obsolete_e`
919 obsoleted 1 changesets
919 obsoleted 1 changesets
920 $ hg debugobsolete `getid original_c` `getid babar`
920 $ hg debugobsolete `getid original_c` `getid babar`
921 $ hg log --config ui.logtemplate= -r 'phasedivergent() and orphan()'
921 $ hg log --config ui.logtemplate= -r 'phasedivergent() and orphan()'
922 changeset: 7:50c51b361e60
922 changeset: 7:50c51b361e60
923 user: test
923 user: test
924 date: Thu Jan 01 00:00:00 1970 +0000
924 date: Thu Jan 01 00:00:00 1970 +0000
925 instability: orphan, phase-divergent
925 instability: orphan, phase-divergent
926 summary: add babar
926 summary: add babar
927
927
928
928
929 test the "obsolete" templatekw
929 test the "obsolete" templatekw
930
930
931 $ hg log -r 'obsolete()'
931 $ hg log -r 'obsolete()'
932 6:3de5eca88c00 (draft *obsolete*) [ ] add obsolete_e [pruned]
932 6:3de5eca88c00 (draft *obsolete*) [ ] add obsolete_e [pruned]
933
933
934 test the "troubles" templatekw
934 test the "troubles" templatekw
935
935
936 $ hg log -r 'phasedivergent() and orphan()'
936 $ hg log -r 'phasedivergent() and orphan()'
937 7:50c51b361e60 (draft orphan phase-divergent) [ ] add babar
937 7:50c51b361e60 (draft orphan phase-divergent) [ ] add babar
938
938
939 test the default cmdline template
939 test the default cmdline template
940
940
941 $ hg log -T default -r 'phasedivergent()'
941 $ hg log -T default -r 'phasedivergent()'
942 changeset: 7:50c51b361e60
942 changeset: 7:50c51b361e60
943 user: test
943 user: test
944 date: Thu Jan 01 00:00:00 1970 +0000
944 date: Thu Jan 01 00:00:00 1970 +0000
945 instability: orphan, phase-divergent
945 instability: orphan, phase-divergent
946 summary: add babar
946 summary: add babar
947
947
948 $ hg log -T default -r 'obsolete()'
948 $ hg log -T default -r 'obsolete()'
949 changeset: 6:3de5eca88c00
949 changeset: 6:3de5eca88c00
950 parent: 3:6f9641995072
950 parent: 3:6f9641995072
951 user: test
951 user: test
952 date: Thu Jan 01 00:00:00 1970 +0000
952 date: Thu Jan 01 00:00:00 1970 +0000
953 obsolete: pruned
953 obsolete: pruned
954 summary: add obsolete_e
954 summary: add obsolete_e
955
955
956
956
957 test the obsolete labels
957 test the obsolete labels
958
958
959 $ hg log --config ui.logtemplate= --color=debug -r 'phasedivergent()'
959 $ hg log --config ui.logtemplate= --color=debug -r 'phasedivergent()'
960 [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60]
960 [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60]
961 [log.user|user: test]
961 [log.user|user: test]
962 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
962 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
963 [log.instability|instability: orphan, phase-divergent]
963 [log.instability|instability: orphan, phase-divergent]
964 [log.summary|summary: add babar]
964 [log.summary|summary: add babar]
965
965
966
966
967 $ hg log -T default -r 'phasedivergent()' --color=debug
967 $ hg log -T default -r 'phasedivergent()' --color=debug
968 [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60]
968 [log.changeset changeset.draft changeset.unstable instability.orphan instability.phase-divergent|changeset: 7:50c51b361e60]
969 [log.user|user: test]
969 [log.user|user: test]
970 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
970 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
971 [log.instability|instability: orphan, phase-divergent]
971 [log.instability|instability: orphan, phase-divergent]
972 [log.summary|summary: add babar]
972 [log.summary|summary: add babar]
973
973
974
974
975 $ hg log --config ui.logtemplate= --color=debug -r "obsolete()"
975 $ hg log --config ui.logtemplate= --color=debug -r "obsolete()"
976 [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00]
976 [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00]
977 [log.parent changeset.draft|parent: 3:6f9641995072]
977 [log.parent changeset.draft|parent: 3:6f9641995072]
978 [log.user|user: test]
978 [log.user|user: test]
979 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
979 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
980 [log.obsfate|obsolete: pruned]
980 [log.obsfate|obsolete: pruned]
981 [log.summary|summary: add obsolete_e]
981 [log.summary|summary: add obsolete_e]
982
982
983
983
984 $ hg log -T default -r 'obsolete()' --color=debug
984 $ hg log -T default -r 'obsolete()' --color=debug
985 [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00]
985 [log.changeset changeset.draft changeset.obsolete|changeset: 6:3de5eca88c00]
986 [log.parent changeset.draft|parent: 3:6f9641995072]
986 [log.parent changeset.draft|parent: 3:6f9641995072]
987 [log.user|user: test]
987 [log.user|user: test]
988 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
988 [log.date|date: Thu Jan 01 00:00:00 1970 +0000]
989 [log.obsfate|obsolete: pruned]
989 [log.obsfate|obsolete: pruned]
990 [log.summary|summary: add obsolete_e]
990 [log.summary|summary: add obsolete_e]
991
991
992
992
993 test summary output
993 test summary output
994
994
995 $ hg up -r 'phasedivergent() and orphan()'
995 $ hg up -r 'phasedivergent() and orphan()'
996 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
996 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
997 $ hg summary
997 $ hg summary
998 parent: 7:50c51b361e60 (orphan, phase-divergent)
998 parent: 7:50c51b361e60 (orphan, phase-divergent)
999 add babar
999 add babar
1000 branch: default
1000 branch: default
1001 commit: (clean)
1001 commit: (clean)
1002 update: 2 new changesets (update)
1002 update: 2 new changesets (update)
1003 phases: 4 draft
1003 phases: 4 draft
1004 orphan: 2 changesets
1004 orphan: 2 changesets
1005 phase-divergent: 1 changesets
1005 phase-divergent: 1 changesets
1006 $ hg up -r 'obsolete()'
1006 $ hg up -r 'obsolete()'
1007 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1007 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1008 $ hg summary
1008 $ hg summary
1009 parent: 6:3de5eca88c00 (obsolete)
1009 parent: 6:3de5eca88c00 (obsolete)
1010 add obsolete_e
1010 add obsolete_e
1011 branch: default
1011 branch: default
1012 commit: (clean)
1012 commit: (clean)
1013 update: 3 new changesets (update)
1013 update: 3 new changesets (update)
1014 phases: 4 draft
1014 phases: 4 draft
1015 orphan: 2 changesets
1015 orphan: 2 changesets
1016 phase-divergent: 1 changesets
1016 phase-divergent: 1 changesets
1017
1017
1018 #if serve
1018 #if serve
1019
1019
1020 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1020 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1021 $ cat hg.pid >> $DAEMON_PIDS
1021 $ cat hg.pid >> $DAEMON_PIDS
1022
1022
1023 check obsolete changeset
1023 check obsolete changeset
1024
1024
1025 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=paper' | grep '<span class="obsolete">'
1025 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=paper' | grep '<span class="obsolete">'
1026 <span class="phase">draft</span> <span class="obsolete">obsolete</span>
1026 <span class="phase">draft</span> <span class="obsolete">obsolete</span>
1027 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=coal' | grep '<span class="obsolete">'
1027 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=coal' | grep '<span class="obsolete">'
1028 <span class="phase">draft</span> <span class="obsolete">obsolete</span>
1028 <span class="phase">draft</span> <span class="obsolete">obsolete</span>
1029 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=gitweb' | grep '<span class="logtags">'
1029 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=gitweb' | grep '<span class="logtags">'
1030 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
1030 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
1031 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=monoblue' | grep '<span class="logtags">'
1031 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=monoblue' | grep '<span class="logtags">'
1032 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
1032 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="obsoletetag" title="obsolete">obsolete</span> </span>
1033 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=spartan' | grep 'class="obsolete"'
1033 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(obsolete())&style=spartan' | grep 'class="obsolete"'
1034 <th class="obsolete">obsolete:</th>
1034 <th class="obsolete">obsolete:</th>
1035 <td class="obsolete">pruned</td>
1035 <td class="obsolete">pruned</td>
1036
1036
1037 check an obsolete changeset that has been rewritten
1037 check an obsolete changeset that has been rewritten
1038 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=paper' | grep rewritten
1038 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=paper' | grep rewritten
1039 <td>rewritten as 6:3de5eca88c00</td>
1039 <td>rewritten as <a href="/rev/3de5eca88c00?style=paper">3de5eca88c00</a> </td>
1040 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=coal' | grep rewritten
1040 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=coal' | grep rewritten
1041 <td>rewritten as 6:3de5eca88c00</td>
1041 <td>rewritten as <a href="/rev/3de5eca88c00?style=coal">3de5eca88c00</a> </td>
1042 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=gitweb' | grep rewritten
1042 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=gitweb' | grep rewritten
1043 <tr><td>obsolete</td><td>rewritten as 6:3de5eca88c00</td></tr>
1043 <tr><td>obsolete</td><td>rewritten as <a class="list" href="/rev/3de5eca88c00?style=gitweb">3de5eca88c00</a> </td></tr>
1044 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=monoblue' | grep rewritten
1044 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=monoblue' | grep rewritten
1045 <dt>obsolete</dt><dd>rewritten as 6:3de5eca88c00</dd>
1045 <dt>obsolete</dt><dd>rewritten as <a href="/rev/3de5eca88c00?style=monoblue">3de5eca88c00</a> </dd>
1046 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=spartan' | grep rewritten
1046 $ get-with-headers.py localhost:$HGPORT 'rev/cda648ca50f5?style=spartan' | grep rewritten
1047 <td class="obsolete">rewritten as 6:3de5eca88c00</td>
1047 <td class="obsolete">rewritten as <a href="/rev/3de5eca88c00?style=spartan">3de5eca88c00</a> </td>
1048
1048
1049 check changeset with instabilities
1049 check changeset with instabilities
1050
1050
1051 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=paper' | grep '<span class="instability">'
1051 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=paper' | grep '<span class="instability">'
1052 <span class="phase">draft</span> <span class="instability">orphan</span> <span class="instability">phase-divergent</span>
1052 <span class="phase">draft</span> <span class="instability">orphan</span> <span class="instability">phase-divergent</span>
1053 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=coal' | grep '<span class="instability">'
1053 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=coal' | grep '<span class="instability">'
1054 <span class="phase">draft</span> <span class="instability">orphan</span> <span class="instability">phase-divergent</span>
1054 <span class="phase">draft</span> <span class="instability">orphan</span> <span class="instability">phase-divergent</span>
1055 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=gitweb' | grep '<span class="logtags">'
1055 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=gitweb' | grep '<span class="logtags">'
1056 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="instabilitytag" title="orphan">orphan</span> <span class="instabilitytag" title="phase-divergent">phase-divergent</span> </span>
1056 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="instabilitytag" title="orphan">orphan</span> <span class="instabilitytag" title="phase-divergent">phase-divergent</span> </span>
1057 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=monoblue' | grep '<span class="logtags">'
1057 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=monoblue' | grep '<span class="logtags">'
1058 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="instabilitytag" title="orphan">orphan</span> <span class="instabilitytag" title="phase-divergent">phase-divergent</span> </span>
1058 <span class="logtags"><span class="phasetag" title="draft">draft</span> <span class="instabilitytag" title="orphan">orphan</span> <span class="instabilitytag" title="phase-divergent">phase-divergent</span> </span>
1059 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=spartan' | grep 'class="instabilities"'
1059 $ get-with-headers.py localhost:$HGPORT 'log?rev=first(phasedivergent())&style=spartan' | grep 'class="instabilities"'
1060 <th class="instabilities">instabilities:</th>
1060 <th class="instabilities">instabilities:</th>
1061 <td class="instabilities">orphan phase-divergent </td>
1061 <td class="instabilities">orphan phase-divergent </td>
1062
1062
1063 $ killdaemons.py
1063 $ killdaemons.py
1064
1064
1065 $ rm hg.pid access.log errors.log
1065 $ rm hg.pid access.log errors.log
1066 #endif
1066 #endif
1067
1067
1068 Test incoming/outcoming with changesets obsoleted remotely, known locally
1068 Test incoming/outcoming with changesets obsoleted remotely, known locally
1069 ===============================================================================
1069 ===============================================================================
1070
1070
1071 This test issue 3805
1071 This test issue 3805
1072
1072
1073 $ hg init repo-issue3805
1073 $ hg init repo-issue3805
1074 $ cd repo-issue3805
1074 $ cd repo-issue3805
1075 $ echo "base" > base
1075 $ echo "base" > base
1076 $ hg ci -Am "base"
1076 $ hg ci -Am "base"
1077 adding base
1077 adding base
1078 $ echo "foo" > foo
1078 $ echo "foo" > foo
1079 $ hg ci -Am "A"
1079 $ hg ci -Am "A"
1080 adding foo
1080 adding foo
1081 $ hg clone . ../other-issue3805
1081 $ hg clone . ../other-issue3805
1082 updating to branch default
1082 updating to branch default
1083 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1083 2 files updated, 0 files merged, 0 files removed, 0 files unresolved
1084 $ echo "bar" >> foo
1084 $ echo "bar" >> foo
1085 $ hg ci --amend
1085 $ hg ci --amend
1086 $ cd ../other-issue3805
1086 $ cd ../other-issue3805
1087 $ hg log -G
1087 $ hg log -G
1088 @ 1:29f0c6921ddd (draft) [tip ] A
1088 @ 1:29f0c6921ddd (draft) [tip ] A
1089 |
1089 |
1090 o 0:d20a80d4def3 (draft) [ ] base
1090 o 0:d20a80d4def3 (draft) [ ] base
1091
1091
1092 $ hg log -G -R ../repo-issue3805
1092 $ hg log -G -R ../repo-issue3805
1093 @ 2:323a9c3ddd91 (draft) [tip ] A
1093 @ 2:323a9c3ddd91 (draft) [tip ] A
1094 |
1094 |
1095 o 0:d20a80d4def3 (draft) [ ] base
1095 o 0:d20a80d4def3 (draft) [ ] base
1096
1096
1097 $ hg incoming
1097 $ hg incoming
1098 comparing with $TESTTMP/tmpe/repo-issue3805
1098 comparing with $TESTTMP/tmpe/repo-issue3805
1099 searching for changes
1099 searching for changes
1100 2:323a9c3ddd91 (draft) [tip ] A
1100 2:323a9c3ddd91 (draft) [tip ] A
1101 $ hg incoming --bundle ../issue3805.hg
1101 $ hg incoming --bundle ../issue3805.hg
1102 comparing with $TESTTMP/tmpe/repo-issue3805
1102 comparing with $TESTTMP/tmpe/repo-issue3805
1103 searching for changes
1103 searching for changes
1104 2:323a9c3ddd91 (draft) [tip ] A
1104 2:323a9c3ddd91 (draft) [tip ] A
1105 $ hg outgoing
1105 $ hg outgoing
1106 comparing with $TESTTMP/tmpe/repo-issue3805
1106 comparing with $TESTTMP/tmpe/repo-issue3805
1107 searching for changes
1107 searching for changes
1108 1:29f0c6921ddd (draft) [tip ] A
1108 1:29f0c6921ddd (draft) [tip ] A
1109
1109
1110 #if serve
1110 #if serve
1111
1111
1112 $ hg serve -R ../repo-issue3805 -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1112 $ hg serve -R ../repo-issue3805 -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1113 $ cat hg.pid >> $DAEMON_PIDS
1113 $ cat hg.pid >> $DAEMON_PIDS
1114
1114
1115 $ hg incoming http://localhost:$HGPORT
1115 $ hg incoming http://localhost:$HGPORT
1116 comparing with http://localhost:$HGPORT/
1116 comparing with http://localhost:$HGPORT/
1117 searching for changes
1117 searching for changes
1118 2:323a9c3ddd91 (draft) [tip ] A
1118 2:323a9c3ddd91 (draft) [tip ] A
1119 $ hg outgoing http://localhost:$HGPORT
1119 $ hg outgoing http://localhost:$HGPORT
1120 comparing with http://localhost:$HGPORT/
1120 comparing with http://localhost:$HGPORT/
1121 searching for changes
1121 searching for changes
1122 1:29f0c6921ddd (draft) [tip ] A
1122 1:29f0c6921ddd (draft) [tip ] A
1123
1123
1124 $ killdaemons.py
1124 $ killdaemons.py
1125
1125
1126 #endif
1126 #endif
1127
1127
1128 This test issue 3814
1128 This test issue 3814
1129
1129
1130 (nothing to push but locally hidden changeset)
1130 (nothing to push but locally hidden changeset)
1131
1131
1132 $ cd ..
1132 $ cd ..
1133 $ hg init repo-issue3814
1133 $ hg init repo-issue3814
1134 $ cd repo-issue3805
1134 $ cd repo-issue3805
1135 $ hg push -r 323a9c3ddd91 ../repo-issue3814
1135 $ hg push -r 323a9c3ddd91 ../repo-issue3814
1136 pushing to ../repo-issue3814
1136 pushing to ../repo-issue3814
1137 searching for changes
1137 searching for changes
1138 adding changesets
1138 adding changesets
1139 adding manifests
1139 adding manifests
1140 adding file changes
1140 adding file changes
1141 added 2 changesets with 2 changes to 2 files
1141 added 2 changesets with 2 changes to 2 files
1142 1 new obsolescence markers
1142 1 new obsolescence markers
1143 $ hg out ../repo-issue3814
1143 $ hg out ../repo-issue3814
1144 comparing with ../repo-issue3814
1144 comparing with ../repo-issue3814
1145 searching for changes
1145 searching for changes
1146 no changes found
1146 no changes found
1147 [1]
1147 [1]
1148
1148
1149 Test that a local tag blocks a changeset from being hidden
1149 Test that a local tag blocks a changeset from being hidden
1150
1150
1151 $ hg tag -l visible -r 1 --hidden
1151 $ hg tag -l visible -r 1 --hidden
1152 $ hg log -G
1152 $ hg log -G
1153 @ 2:323a9c3ddd91 (draft) [tip ] A
1153 @ 2:323a9c3ddd91 (draft) [tip ] A
1154 |
1154 |
1155 | x 1:29f0c6921ddd (draft *obsolete*) [visible ] A [rewritten using amend as 2:323a9c3ddd91]
1155 | x 1:29f0c6921ddd (draft *obsolete*) [visible ] A [rewritten using amend as 2:323a9c3ddd91]
1156 |/
1156 |/
1157 o 0:d20a80d4def3 (draft) [ ] base
1157 o 0:d20a80d4def3 (draft) [ ] base
1158
1158
1159 Test that removing a local tag does not cause some commands to fail
1159 Test that removing a local tag does not cause some commands to fail
1160
1160
1161 $ hg tag -l -r tip tiptag
1161 $ hg tag -l -r tip tiptag
1162 $ hg tags
1162 $ hg tags
1163 tiptag 2:323a9c3ddd91
1163 tiptag 2:323a9c3ddd91
1164 tip 2:323a9c3ddd91
1164 tip 2:323a9c3ddd91
1165 visible 1:29f0c6921ddd
1165 visible 1:29f0c6921ddd
1166 $ hg --config extensions.strip= strip -r tip --no-backup
1166 $ hg --config extensions.strip= strip -r tip --no-backup
1167 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1167 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1168 $ hg tags
1168 $ hg tags
1169 visible 1:29f0c6921ddd
1169 visible 1:29f0c6921ddd
1170 tip 1:29f0c6921ddd
1170 tip 1:29f0c6921ddd
1171
1171
1172 Test bundle overlay onto hidden revision
1172 Test bundle overlay onto hidden revision
1173
1173
1174 $ cd ..
1174 $ cd ..
1175 $ hg init repo-bundleoverlay
1175 $ hg init repo-bundleoverlay
1176 $ cd repo-bundleoverlay
1176 $ cd repo-bundleoverlay
1177 $ echo "A" > foo
1177 $ echo "A" > foo
1178 $ hg ci -Am "A"
1178 $ hg ci -Am "A"
1179 adding foo
1179 adding foo
1180 $ echo "B" >> foo
1180 $ echo "B" >> foo
1181 $ hg ci -m "B"
1181 $ hg ci -m "B"
1182 $ hg up 0
1182 $ hg up 0
1183 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1183 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1184 $ echo "C" >> foo
1184 $ echo "C" >> foo
1185 $ hg ci -m "C"
1185 $ hg ci -m "C"
1186 created new head
1186 created new head
1187 $ hg log -G
1187 $ hg log -G
1188 @ 2:c186d7714947 (draft) [tip ] C
1188 @ 2:c186d7714947 (draft) [tip ] C
1189 |
1189 |
1190 | o 1:44526ebb0f98 (draft) [ ] B
1190 | o 1:44526ebb0f98 (draft) [ ] B
1191 |/
1191 |/
1192 o 0:4b34ecfb0d56 (draft) [ ] A
1192 o 0:4b34ecfb0d56 (draft) [ ] A
1193
1193
1194
1194
1195 $ hg clone -r1 . ../other-bundleoverlay
1195 $ hg clone -r1 . ../other-bundleoverlay
1196 adding changesets
1196 adding changesets
1197 adding manifests
1197 adding manifests
1198 adding file changes
1198 adding file changes
1199 added 2 changesets with 2 changes to 1 files
1199 added 2 changesets with 2 changes to 1 files
1200 new changesets 4b34ecfb0d56:44526ebb0f98
1200 new changesets 4b34ecfb0d56:44526ebb0f98
1201 updating to branch default
1201 updating to branch default
1202 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1202 1 files updated, 0 files merged, 0 files removed, 0 files unresolved
1203 $ cd ../other-bundleoverlay
1203 $ cd ../other-bundleoverlay
1204 $ echo "B+" >> foo
1204 $ echo "B+" >> foo
1205 $ hg ci --amend -m "B+"
1205 $ hg ci --amend -m "B+"
1206 $ hg log -G --hidden
1206 $ hg log -G --hidden
1207 @ 2:b7d587542d40 (draft) [tip ] B+
1207 @ 2:b7d587542d40 (draft) [tip ] B+
1208 |
1208 |
1209 | x 1:44526ebb0f98 (draft *obsolete*) [ ] B [rewritten using amend as 2:b7d587542d40]
1209 | x 1:44526ebb0f98 (draft *obsolete*) [ ] B [rewritten using amend as 2:b7d587542d40]
1210 |/
1210 |/
1211 o 0:4b34ecfb0d56 (draft) [ ] A
1211 o 0:4b34ecfb0d56 (draft) [ ] A
1212
1212
1213
1213
1214 $ hg incoming ../repo-bundleoverlay --bundle ../bundleoverlay.hg
1214 $ hg incoming ../repo-bundleoverlay --bundle ../bundleoverlay.hg
1215 comparing with ../repo-bundleoverlay
1215 comparing with ../repo-bundleoverlay
1216 searching for changes
1216 searching for changes
1217 1:44526ebb0f98 (draft) [ ] B
1217 1:44526ebb0f98 (draft) [ ] B
1218 2:c186d7714947 (draft) [tip ] C
1218 2:c186d7714947 (draft) [tip ] C
1219 $ hg log -G -R ../bundleoverlay.hg
1219 $ hg log -G -R ../bundleoverlay.hg
1220 o 3:c186d7714947 (draft) [tip ] C
1220 o 3:c186d7714947 (draft) [tip ] C
1221 |
1221 |
1222 | @ 2:b7d587542d40 (draft) [ ] B+
1222 | @ 2:b7d587542d40 (draft) [ ] B+
1223 |/
1223 |/
1224 o 0:4b34ecfb0d56 (draft) [ ] A
1224 o 0:4b34ecfb0d56 (draft) [ ] A
1225
1225
1226
1226
1227 #if serve
1227 #if serve
1228
1228
1229 Test issue 4506
1229 Test issue 4506
1230
1230
1231 $ cd ..
1231 $ cd ..
1232 $ hg init repo-issue4506
1232 $ hg init repo-issue4506
1233 $ cd repo-issue4506
1233 $ cd repo-issue4506
1234 $ echo "0" > foo
1234 $ echo "0" > foo
1235 $ hg add foo
1235 $ hg add foo
1236 $ hg ci -m "content-0"
1236 $ hg ci -m "content-0"
1237
1237
1238 $ hg up null
1238 $ hg up null
1239 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1239 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1240 $ echo "1" > bar
1240 $ echo "1" > bar
1241 $ hg add bar
1241 $ hg add bar
1242 $ hg ci -m "content-1"
1242 $ hg ci -m "content-1"
1243 created new head
1243 created new head
1244 $ hg up 0
1244 $ hg up 0
1245 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1245 1 files updated, 0 files merged, 1 files removed, 0 files unresolved
1246 $ hg graft 1
1246 $ hg graft 1
1247 grafting 1:1c9eddb02162 "content-1" (tip)
1247 grafting 1:1c9eddb02162 "content-1" (tip)
1248
1248
1249 $ hg debugobsolete `hg log -r1 -T'{node}'` `hg log -r2 -T'{node}'`
1249 $ hg debugobsolete `hg log -r1 -T'{node}'` `hg log -r2 -T'{node}'`
1250 obsoleted 1 changesets
1250 obsoleted 1 changesets
1251
1251
1252 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1252 $ hg serve -n test -p $HGPORT -d --pid-file=hg.pid -A access.log -E errors.log
1253 $ cat hg.pid >> $DAEMON_PIDS
1253 $ cat hg.pid >> $DAEMON_PIDS
1254
1254
1255 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/1'
1255 $ get-with-headers.py --headeronly localhost:$HGPORT 'rev/1'
1256 404 Not Found
1256 404 Not Found
1257 [1]
1257 [1]
1258 $ get-with-headers.py --headeronly localhost:$HGPORT 'file/tip/bar'
1258 $ get-with-headers.py --headeronly localhost:$HGPORT 'file/tip/bar'
1259 200 Script output follows
1259 200 Script output follows
1260 $ get-with-headers.py --headeronly localhost:$HGPORT 'annotate/tip/bar'
1260 $ get-with-headers.py --headeronly localhost:$HGPORT 'annotate/tip/bar'
1261 200 Script output follows
1261 200 Script output follows
1262
1262
1263 $ killdaemons.py
1263 $ killdaemons.py
1264
1264
1265 #endif
1265 #endif
1266
1266
1267 Test heads computation on pending index changes with obsolescence markers
1267 Test heads computation on pending index changes with obsolescence markers
1268 $ cd ..
1268 $ cd ..
1269 $ cat >$TESTTMP/test_extension.py << EOF
1269 $ cat >$TESTTMP/test_extension.py << EOF
1270 > from __future__ import absolute_import
1270 > from __future__ import absolute_import
1271 > from mercurial.i18n import _
1271 > from mercurial.i18n import _
1272 > from mercurial import cmdutil, registrar
1272 > from mercurial import cmdutil, registrar
1273 >
1273 >
1274 > cmdtable = {}
1274 > cmdtable = {}
1275 > command = registrar.command(cmdtable)
1275 > command = registrar.command(cmdtable)
1276 > @command(b"amendtransient",[], _('hg amendtransient [rev]'))
1276 > @command(b"amendtransient",[], _('hg amendtransient [rev]'))
1277 > def amend(ui, repo, *pats, **opts):
1277 > def amend(ui, repo, *pats, **opts):
1278 > opts['message'] = 'Test'
1278 > opts['message'] = 'Test'
1279 > opts['logfile'] = None
1279 > opts['logfile'] = None
1280 > cmdutil.amend(ui, repo, repo['.'], {}, pats, opts)
1280 > cmdutil.amend(ui, repo, repo['.'], {}, pats, opts)
1281 > ui.write('%s\n' % repo.changelog.headrevs())
1281 > ui.write('%s\n' % repo.changelog.headrevs())
1282 > EOF
1282 > EOF
1283 $ cat >> $HGRCPATH << EOF
1283 $ cat >> $HGRCPATH << EOF
1284 > [extensions]
1284 > [extensions]
1285 > testextension=$TESTTMP/test_extension.py
1285 > testextension=$TESTTMP/test_extension.py
1286 > EOF
1286 > EOF
1287 $ hg init repo-issue-nativerevs-pending-changes
1287 $ hg init repo-issue-nativerevs-pending-changes
1288 $ cd repo-issue-nativerevs-pending-changes
1288 $ cd repo-issue-nativerevs-pending-changes
1289 $ mkcommit a
1289 $ mkcommit a
1290 $ mkcommit b
1290 $ mkcommit b
1291 $ hg up ".^"
1291 $ hg up ".^"
1292 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1292 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1293 $ echo aa > a
1293 $ echo aa > a
1294 $ hg amendtransient
1294 $ hg amendtransient
1295 [1, 2]
1295 [1, 2]
1296
1296
1297 Test cache consistency for the visible filter
1297 Test cache consistency for the visible filter
1298 1) We want to make sure that the cached filtered revs are invalidated when
1298 1) We want to make sure that the cached filtered revs are invalidated when
1299 bookmarks change
1299 bookmarks change
1300 $ cd ..
1300 $ cd ..
1301 $ cat >$TESTTMP/test_extension.py << EOF
1301 $ cat >$TESTTMP/test_extension.py << EOF
1302 > from __future__ import absolute_import, print_function
1302 > from __future__ import absolute_import, print_function
1303 > import weakref
1303 > import weakref
1304 > from mercurial import (
1304 > from mercurial import (
1305 > bookmarks,
1305 > bookmarks,
1306 > cmdutil,
1306 > cmdutil,
1307 > extensions,
1307 > extensions,
1308 > repoview,
1308 > repoview,
1309 > )
1309 > )
1310 > def _bookmarkchanged(orig, bkmstoreinst, *args, **kwargs):
1310 > def _bookmarkchanged(orig, bkmstoreinst, *args, **kwargs):
1311 > reporef = weakref.ref(bkmstoreinst._repo)
1311 > reporef = weakref.ref(bkmstoreinst._repo)
1312 > def trhook(tr):
1312 > def trhook(tr):
1313 > repo = reporef()
1313 > repo = reporef()
1314 > hidden1 = repoview.computehidden(repo)
1314 > hidden1 = repoview.computehidden(repo)
1315 > hidden = repoview.filterrevs(repo, 'visible')
1315 > hidden = repoview.filterrevs(repo, 'visible')
1316 > if sorted(hidden1) != sorted(hidden):
1316 > if sorted(hidden1) != sorted(hidden):
1317 > print("cache inconsistency")
1317 > print("cache inconsistency")
1318 > bkmstoreinst._repo.currenttransaction().addpostclose('test_extension', trhook)
1318 > bkmstoreinst._repo.currenttransaction().addpostclose('test_extension', trhook)
1319 > orig(bkmstoreinst, *args, **kwargs)
1319 > orig(bkmstoreinst, *args, **kwargs)
1320 > def extsetup(ui):
1320 > def extsetup(ui):
1321 > extensions.wrapfunction(bookmarks.bmstore, '_recordchange',
1321 > extensions.wrapfunction(bookmarks.bmstore, '_recordchange',
1322 > _bookmarkchanged)
1322 > _bookmarkchanged)
1323 > EOF
1323 > EOF
1324
1324
1325 $ hg init repo-cache-inconsistency
1325 $ hg init repo-cache-inconsistency
1326 $ cd repo-issue-nativerevs-pending-changes
1326 $ cd repo-issue-nativerevs-pending-changes
1327 $ mkcommit a
1327 $ mkcommit a
1328 a already tracked!
1328 a already tracked!
1329 $ mkcommit b
1329 $ mkcommit b
1330 $ hg id
1330 $ hg id
1331 13bedc178fce tip
1331 13bedc178fce tip
1332 $ echo "hello" > b
1332 $ echo "hello" > b
1333 $ hg commit --amend -m "message"
1333 $ hg commit --amend -m "message"
1334 $ hg book bookb -r 13bedc178fce --hidden
1334 $ hg book bookb -r 13bedc178fce --hidden
1335 $ hg log -r 13bedc178fce
1335 $ hg log -r 13bedc178fce
1336 4:13bedc178fce (draft *obsolete*) [ bookb] add b [rewritten using amend as 5:a9b1f8652753]
1336 4:13bedc178fce (draft *obsolete*) [ bookb] add b [rewritten using amend as 5:a9b1f8652753]
1337 $ hg book -d bookb
1337 $ hg book -d bookb
1338 $ hg log -r 13bedc178fce
1338 $ hg log -r 13bedc178fce
1339 abort: hidden revision '13bedc178fce'!
1339 abort: hidden revision '13bedc178fce'!
1340 (use --hidden to access hidden revisions)
1340 (use --hidden to access hidden revisions)
1341 [255]
1341 [255]
1342
1342
1343 Empty out the test extension, as it isn't compatible with later parts
1343 Empty out the test extension, as it isn't compatible with later parts
1344 of the test.
1344 of the test.
1345 $ echo > $TESTTMP/test_extension.py
1345 $ echo > $TESTTMP/test_extension.py
1346
1346
1347 Test ability to pull changeset with locally applying obsolescence markers
1347 Test ability to pull changeset with locally applying obsolescence markers
1348 (issue4945)
1348 (issue4945)
1349
1349
1350 $ cd ..
1350 $ cd ..
1351 $ hg init issue4845
1351 $ hg init issue4845
1352 $ cd issue4845
1352 $ cd issue4845
1353
1353
1354 $ echo foo > f0
1354 $ echo foo > f0
1355 $ hg add f0
1355 $ hg add f0
1356 $ hg ci -m '0'
1356 $ hg ci -m '0'
1357 $ echo foo > f1
1357 $ echo foo > f1
1358 $ hg add f1
1358 $ hg add f1
1359 $ hg ci -m '1'
1359 $ hg ci -m '1'
1360 $ echo foo > f2
1360 $ echo foo > f2
1361 $ hg add f2
1361 $ hg add f2
1362 $ hg ci -m '2'
1362 $ hg ci -m '2'
1363
1363
1364 $ echo bar > f2
1364 $ echo bar > f2
1365 $ hg commit --amend --config experimental.evolution.createmarkers=True
1365 $ hg commit --amend --config experimental.evolution.createmarkers=True
1366 $ hg log -G
1366 $ hg log -G
1367 @ 3:b0551702f918 (draft) [tip ] 2
1367 @ 3:b0551702f918 (draft) [tip ] 2
1368 |
1368 |
1369 o 1:e016b03fd86f (draft) [ ] 1
1369 o 1:e016b03fd86f (draft) [ ] 1
1370 |
1370 |
1371 o 0:a78f55e5508c (draft) [ ] 0
1371 o 0:a78f55e5508c (draft) [ ] 0
1372
1372
1373 $ hg log -G --hidden
1373 $ hg log -G --hidden
1374 @ 3:b0551702f918 (draft) [tip ] 2
1374 @ 3:b0551702f918 (draft) [tip ] 2
1375 |
1375 |
1376 | x 2:e008cf283490 (draft *obsolete*) [ ] 2 [rewritten using amend as 3:b0551702f918]
1376 | x 2:e008cf283490 (draft *obsolete*) [ ] 2 [rewritten using amend as 3:b0551702f918]
1377 |/
1377 |/
1378 o 1:e016b03fd86f (draft) [ ] 1
1378 o 1:e016b03fd86f (draft) [ ] 1
1379 |
1379 |
1380 o 0:a78f55e5508c (draft) [ ] 0
1380 o 0:a78f55e5508c (draft) [ ] 0
1381
1381
1382
1382
1383 $ hg strip --hidden -r 2 --config extensions.strip= --config devel.strip-obsmarkers=no
1383 $ hg strip --hidden -r 2 --config extensions.strip= --config devel.strip-obsmarkers=no
1384 saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e008cf283490-ede36964-backup.hg
1384 saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e008cf283490-ede36964-backup.hg
1385 $ hg debugobsolete
1385 $ hg debugobsolete
1386 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1386 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1387 $ hg log -G
1387 $ hg log -G
1388 @ 2:b0551702f918 (draft) [tip ] 2
1388 @ 2:b0551702f918 (draft) [tip ] 2
1389 |
1389 |
1390 o 1:e016b03fd86f (draft) [ ] 1
1390 o 1:e016b03fd86f (draft) [ ] 1
1391 |
1391 |
1392 o 0:a78f55e5508c (draft) [ ] 0
1392 o 0:a78f55e5508c (draft) [ ] 0
1393
1393
1394 $ hg log -G --hidden
1394 $ hg log -G --hidden
1395 @ 2:b0551702f918 (draft) [tip ] 2
1395 @ 2:b0551702f918 (draft) [tip ] 2
1396 |
1396 |
1397 o 1:e016b03fd86f (draft) [ ] 1
1397 o 1:e016b03fd86f (draft) [ ] 1
1398 |
1398 |
1399 o 0:a78f55e5508c (draft) [ ] 0
1399 o 0:a78f55e5508c (draft) [ ] 0
1400
1400
1401 $ hg debugbundle .hg/strip-backup/e008cf283490-*-backup.hg
1401 $ hg debugbundle .hg/strip-backup/e008cf283490-*-backup.hg
1402 Stream params: {Compression: BZ}
1402 Stream params: {Compression: BZ}
1403 changegroup -- {nbchanges: 1, version: 02}
1403 changegroup -- {nbchanges: 1, version: 02}
1404 e008cf2834908e5d6b0f792a9d4b0e2272260fb8
1404 e008cf2834908e5d6b0f792a9d4b0e2272260fb8
1405 phase-heads -- {}
1405 phase-heads -- {}
1406 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 draft
1406 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 draft
1407
1407
1408 $ hg pull .hg/strip-backup/e008cf283490-*-backup.hg
1408 $ hg pull .hg/strip-backup/e008cf283490-*-backup.hg
1409 pulling from .hg/strip-backup/e008cf283490-ede36964-backup.hg
1409 pulling from .hg/strip-backup/e008cf283490-ede36964-backup.hg
1410 searching for changes
1410 searching for changes
1411 no changes found
1411 no changes found
1412 $ hg debugobsolete
1412 $ hg debugobsolete
1413 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1413 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1414 $ hg log -G
1414 $ hg log -G
1415 @ 2:b0551702f918 (draft) [tip ] 2
1415 @ 2:b0551702f918 (draft) [tip ] 2
1416 |
1416 |
1417 o 1:e016b03fd86f (draft) [ ] 1
1417 o 1:e016b03fd86f (draft) [ ] 1
1418 |
1418 |
1419 o 0:a78f55e5508c (draft) [ ] 0
1419 o 0:a78f55e5508c (draft) [ ] 0
1420
1420
1421 $ hg log -G --hidden
1421 $ hg log -G --hidden
1422 @ 2:b0551702f918 (draft) [tip ] 2
1422 @ 2:b0551702f918 (draft) [tip ] 2
1423 |
1423 |
1424 o 1:e016b03fd86f (draft) [ ] 1
1424 o 1:e016b03fd86f (draft) [ ] 1
1425 |
1425 |
1426 o 0:a78f55e5508c (draft) [ ] 0
1426 o 0:a78f55e5508c (draft) [ ] 0
1427
1427
1428
1428
1429 Testing that strip remove markers:
1429 Testing that strip remove markers:
1430
1430
1431 $ hg strip -r 1 --config extensions.strip=
1431 $ hg strip -r 1 --config extensions.strip=
1432 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1432 0 files updated, 0 files merged, 2 files removed, 0 files unresolved
1433 saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e016b03fd86f-65ede734-backup.hg
1433 saved backup bundle to $TESTTMP/tmpe/issue4845/.hg/strip-backup/e016b03fd86f-65ede734-backup.hg
1434 $ hg debugobsolete
1434 $ hg debugobsolete
1435 $ hg log -G
1435 $ hg log -G
1436 @ 0:a78f55e5508c (draft) [tip ] 0
1436 @ 0:a78f55e5508c (draft) [tip ] 0
1437
1437
1438 $ hg log -G --hidden
1438 $ hg log -G --hidden
1439 @ 0:a78f55e5508c (draft) [tip ] 0
1439 @ 0:a78f55e5508c (draft) [tip ] 0
1440
1440
1441 $ hg debugbundle .hg/strip-backup/e016b03fd86f-*-backup.hg
1441 $ hg debugbundle .hg/strip-backup/e016b03fd86f-*-backup.hg
1442 Stream params: {Compression: BZ}
1442 Stream params: {Compression: BZ}
1443 changegroup -- {nbchanges: 2, version: 02}
1443 changegroup -- {nbchanges: 2, version: 02}
1444 e016b03fd86fcccc54817d120b90b751aaf367d6
1444 e016b03fd86fcccc54817d120b90b751aaf367d6
1445 b0551702f918510f01ae838ab03a463054c67b46
1445 b0551702f918510f01ae838ab03a463054c67b46
1446 obsmarkers -- {}
1446 obsmarkers -- {}
1447 version: 1 (92 bytes)
1447 version: 1 (92 bytes)
1448 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1448 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1449 phase-heads -- {}
1449 phase-heads -- {}
1450 b0551702f918510f01ae838ab03a463054c67b46 draft
1450 b0551702f918510f01ae838ab03a463054c67b46 draft
1451
1451
1452 $ hg unbundle .hg/strip-backup/e016b03fd86f-*-backup.hg
1452 $ hg unbundle .hg/strip-backup/e016b03fd86f-*-backup.hg
1453 adding changesets
1453 adding changesets
1454 adding manifests
1454 adding manifests
1455 adding file changes
1455 adding file changes
1456 added 2 changesets with 2 changes to 2 files
1456 added 2 changesets with 2 changes to 2 files
1457 1 new obsolescence markers
1457 1 new obsolescence markers
1458 new changesets e016b03fd86f:b0551702f918
1458 new changesets e016b03fd86f:b0551702f918
1459 (run 'hg update' to get a working copy)
1459 (run 'hg update' to get a working copy)
1460 $ hg debugobsolete | sort
1460 $ hg debugobsolete | sort
1461 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1461 e008cf2834908e5d6b0f792a9d4b0e2272260fb8 b0551702f918510f01ae838ab03a463054c67b46 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '8', 'operation': 'amend', 'user': 'test'}
1462 $ hg log -G
1462 $ hg log -G
1463 o 2:b0551702f918 (draft) [tip ] 2
1463 o 2:b0551702f918 (draft) [tip ] 2
1464 |
1464 |
1465 o 1:e016b03fd86f (draft) [ ] 1
1465 o 1:e016b03fd86f (draft) [ ] 1
1466 |
1466 |
1467 @ 0:a78f55e5508c (draft) [ ] 0
1467 @ 0:a78f55e5508c (draft) [ ] 0
1468
1468
1469 $ hg log -G --hidden
1469 $ hg log -G --hidden
1470 o 2:b0551702f918 (draft) [tip ] 2
1470 o 2:b0551702f918 (draft) [tip ] 2
1471 |
1471 |
1472 o 1:e016b03fd86f (draft) [ ] 1
1472 o 1:e016b03fd86f (draft) [ ] 1
1473 |
1473 |
1474 @ 0:a78f55e5508c (draft) [ ] 0
1474 @ 0:a78f55e5508c (draft) [ ] 0
1475
1475
1476 Test that 'hg debugobsolete --index --rev' can show indices of obsmarkers when
1476 Test that 'hg debugobsolete --index --rev' can show indices of obsmarkers when
1477 only a subset of those are displayed (because of --rev option)
1477 only a subset of those are displayed (because of --rev option)
1478 $ hg init doindexrev
1478 $ hg init doindexrev
1479 $ cd doindexrev
1479 $ cd doindexrev
1480 $ echo a > a
1480 $ echo a > a
1481 $ hg ci -Am a
1481 $ hg ci -Am a
1482 adding a
1482 adding a
1483 $ hg ci --amend -m aa
1483 $ hg ci --amend -m aa
1484 $ echo b > b
1484 $ echo b > b
1485 $ hg ci -Am b
1485 $ hg ci -Am b
1486 adding b
1486 adding b
1487 $ hg ci --amend -m bb
1487 $ hg ci --amend -m bb
1488 $ echo c > c
1488 $ echo c > c
1489 $ hg ci -Am c
1489 $ hg ci -Am c
1490 adding c
1490 adding c
1491 $ hg ci --amend -m cc
1491 $ hg ci --amend -m cc
1492 $ echo d > d
1492 $ echo d > d
1493 $ hg ci -Am d
1493 $ hg ci -Am d
1494 adding d
1494 adding d
1495 $ hg ci --amend -m dd --config experimental.evolution.track-operation=1
1495 $ hg ci --amend -m dd --config experimental.evolution.track-operation=1
1496 $ hg debugobsolete --index --rev "3+7"
1496 $ hg debugobsolete --index --rev "3+7"
1497 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1497 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1498 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1498 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1499 $ hg debugobsolete --index --rev "3+7" -Tjson
1499 $ hg debugobsolete --index --rev "3+7" -Tjson
1500 [
1500 [
1501 {
1501 {
1502 "date": [0.0, 0],
1502 "date": [0.0, 0],
1503 "flag": 0,
1503 "flag": 0,
1504 "index": 1,
1504 "index": 1,
1505 "metadata": {"ef1": "1", "operation": "amend", "user": "test"},
1505 "metadata": {"ef1": "1", "operation": "amend", "user": "test"},
1506 "prednode": "6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1",
1506 "prednode": "6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1",
1507 "succnodes": ["d27fb9b066076fd921277a4b9e8b9cb48c95bc6a"]
1507 "succnodes": ["d27fb9b066076fd921277a4b9e8b9cb48c95bc6a"]
1508 },
1508 },
1509 {
1509 {
1510 "date": [0.0, 0],
1510 "date": [0.0, 0],
1511 "flag": 0,
1511 "flag": 0,
1512 "index": 3,
1512 "index": 3,
1513 "metadata": {"ef1": "1", "operation": "amend", "user": "test"},
1513 "metadata": {"ef1": "1", "operation": "amend", "user": "test"},
1514 "prednode": "4715cf767440ed891755448016c2b8cf70760c30",
1514 "prednode": "4715cf767440ed891755448016c2b8cf70760c30",
1515 "succnodes": ["7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d"]
1515 "succnodes": ["7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d"]
1516 }
1516 }
1517 ]
1517 ]
1518
1518
1519 Test the --delete option of debugobsolete command
1519 Test the --delete option of debugobsolete command
1520 $ hg debugobsolete --index
1520 $ hg debugobsolete --index
1521 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b f9bd49731b0b175e42992a3c8fa6c678b2bc11f1 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1521 0 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b f9bd49731b0b175e42992a3c8fa6c678b2bc11f1 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1522 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1522 1 6fdef60fcbabbd3d50e9b9cbc2a240724b91a5e1 d27fb9b066076fd921277a4b9e8b9cb48c95bc6a 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1523 2 1ab51af8f9b41ef8c7f6f3312d4706d870b1fb74 29346082e4a9e27042b62d2da0e2de211c027621 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1523 2 1ab51af8f9b41ef8c7f6f3312d4706d870b1fb74 29346082e4a9e27042b62d2da0e2de211c027621 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1524 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1524 3 4715cf767440ed891755448016c2b8cf70760c30 7ae79c5d60f049c7b0dd02f5f25b9d60aaf7b36d 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1525 $ hg debugobsolete --delete 1 --delete 3
1525 $ hg debugobsolete --delete 1 --delete 3
1526 deleted 2 obsolescence markers
1526 deleted 2 obsolescence markers
1527 $ hg debugobsolete
1527 $ hg debugobsolete
1528 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b f9bd49731b0b175e42992a3c8fa6c678b2bc11f1 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1528 cb9a9f314b8b07ba71012fcdbc544b5a4d82ff5b f9bd49731b0b175e42992a3c8fa6c678b2bc11f1 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1529 1ab51af8f9b41ef8c7f6f3312d4706d870b1fb74 29346082e4a9e27042b62d2da0e2de211c027621 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1529 1ab51af8f9b41ef8c7f6f3312d4706d870b1fb74 29346082e4a9e27042b62d2da0e2de211c027621 0 (Thu Jan 01 00:00:00 1970 +0000) {'ef1': '1', 'operation': 'amend', 'user': 'test'}
1530
1530
1531 Test adding changeset after obsmarkers affecting it
1531 Test adding changeset after obsmarkers affecting it
1532 (eg: during pull, or unbundle)
1532 (eg: during pull, or unbundle)
1533
1533
1534 $ mkcommit e
1534 $ mkcommit e
1535 $ hg bundle -r . --base .~1 ../bundle-2.hg
1535 $ hg bundle -r . --base .~1 ../bundle-2.hg
1536 1 changesets found
1536 1 changesets found
1537 $ getid .
1537 $ getid .
1538 $ hg --config extensions.strip= strip -r .
1538 $ hg --config extensions.strip= strip -r .
1539 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1539 0 files updated, 0 files merged, 1 files removed, 0 files unresolved
1540 saved backup bundle to $TESTTMP/tmpe/issue4845/doindexrev/.hg/strip-backup/9bc153528424-ee80edd4-backup.hg
1540 saved backup bundle to $TESTTMP/tmpe/issue4845/doindexrev/.hg/strip-backup/9bc153528424-ee80edd4-backup.hg
1541 $ hg debugobsolete 9bc153528424ea266d13e57f9ff0d799dfe61e4b
1541 $ hg debugobsolete 9bc153528424ea266d13e57f9ff0d799dfe61e4b
1542 $ hg unbundle ../bundle-2.hg
1542 $ hg unbundle ../bundle-2.hg
1543 adding changesets
1543 adding changesets
1544 adding manifests
1544 adding manifests
1545 adding file changes
1545 adding file changes
1546 added 1 changesets with 1 changes to 1 files
1546 added 1 changesets with 1 changes to 1 files
1547 (run 'hg update' to get a working copy)
1547 (run 'hg update' to get a working copy)
1548 $ hg log -G
1548 $ hg log -G
1549 @ 7:7ae79c5d60f0 (draft) [tip ] dd
1549 @ 7:7ae79c5d60f0 (draft) [tip ] dd
1550 |
1550 |
1551 | o 6:4715cf767440 (draft) [ ] d
1551 | o 6:4715cf767440 (draft) [ ] d
1552 |/
1552 |/
1553 o 5:29346082e4a9 (draft) [ ] cc
1553 o 5:29346082e4a9 (draft) [ ] cc
1554 |
1554 |
1555 o 3:d27fb9b06607 (draft) [ ] bb
1555 o 3:d27fb9b06607 (draft) [ ] bb
1556 |
1556 |
1557 | o 2:6fdef60fcbab (draft) [ ] b
1557 | o 2:6fdef60fcbab (draft) [ ] b
1558 |/
1558 |/
1559 o 1:f9bd49731b0b (draft) [ ] aa
1559 o 1:f9bd49731b0b (draft) [ ] aa
1560
1560
1561
1561
1562 $ cd ..
1562 $ cd ..
General Comments 0
You need to be logged in to leave comments. Login now