annotate hgext3rd/evolve/templatekw.py @ 2617:da0d3d4171cb mercurial-3.9

test-compat: merge with mercurial-4.0
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Fri, 16 Jun 2017 19:48:10 +0200
parents 22c05418ca71 feabbaa01ff0
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
1 # Copyright 2011 Peter Arrenbrecht <peter.arrenbrecht@gmail.com>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
2 # Logilab SA <contact@logilab.fr>
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
3 # Pierre-Yves David <pierre-yves.david@ens-lyon.org>
519
9825c7da5b54 ensure all file have a copyright notice
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 517
diff changeset
4 # Patrick Mezard <patrick@mezard.eu>
81
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
5 #
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
6 # This software may be used and distributed according to the terms of the
5cec25ce019c Basic kill command
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
diff changeset
7 # GNU General Public License version 2 or any later version.
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
8 """evolve templates
2032
dd7e092a854a flake8: update the code sources to fixes a horde of pyflake warnings
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2024
diff changeset
9 """
2049
b81d3775006b evolve: move extension metadata in their own module
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2048
diff changeset
10
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
11 from . import (
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
12 error,
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
13 exthelper,
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
14 obshistory
2485
e6ecd35e99ec refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents: 2481
diff changeset
15 )
617
469befc27b26 detect incompatibility with future mercurial 2.5
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 616
diff changeset
16
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
17 from mercurial import (
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
18 templatekw,
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
19 node,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
20 )
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
21
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
22 eh = exthelper.exthelper()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
23
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
24 ### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
25 # XXX it does not handle troubles well :-/
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
26
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
27 @eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
28 def obsoletekw(repo, ctx, templ, **args):
1732
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
29 """:obsolete: String. Whether the changeset is ``obsolete``.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
30 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
31 if ctx.obsolete():
1732
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
32 return 'obsolete'
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
33 return ''
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
34
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
35 @eh.templatekw('troubles')
2271
1af1b0debd4b template: pass all mapping data to showlist()
Yuya Nishihara <yuya@tcha.org>
parents: 2245
diff changeset
36 def showtroubles(**args):
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
37 """:troubles: List of strings. Evolution troubles affecting the changeset
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
38 (zero or more of "unstable", "divergent" or "bumped")."""
2271
1af1b0debd4b template: pass all mapping data to showlist()
Yuya Nishihara <yuya@tcha.org>
parents: 2245
diff changeset
39 ctx = args['ctx']
2272
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
40 try:
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
41 # specify plural= explicitly to trigger TypeError on hg < 4.2
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
42 return templatekw.showlist('trouble', ctx.troubles(), args,
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
43 plural='troubles')
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
44 except TypeError:
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
45 return templatekw.showlist('trouble', ctx.troubles(), plural='troubles',
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
46 **args)
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
47
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
48 def closestprecursors(repo, nodeid):
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
49 """ Yield the list of next precursors pointing on visible changectx nodes
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
50 """
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
51
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
52 precursors = repo.obsstore.precursors
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
53 stack = [nodeid]
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
54
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
55 while stack:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
56 current = stack.pop()
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
57 currentpreccs = precursors.get(current, ())
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
58
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
59 for prec in currentpreccs:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
60 precnodeid = prec[0]
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
61
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
62 if precnodeid in repo:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
63 yield precnodeid
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
64 else:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
65 stack.append(precnodeid)
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
66
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
67 @eh.templatekw("precursors")
2500
2092007af205 template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents: 2494
diff changeset
68 def shownextvisibleprecursors(repo, ctx, **args):
2600
e987b403d047 template: fix precursors documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2599
diff changeset
69 """Returns a string containing the list of the closest precursors
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
70 """
2500
2092007af205 template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents: 2494
diff changeset
71 precursors = sorted(closestprecursors(repo, ctx.node()))
2599
df4a1b02308f template: used hex-node for the precursors underlying data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2591
diff changeset
72 precursors = [node.hex(p) for p in precursors]
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
73
2526
f4acfbb36191 template: fix precursors template for older mercurial version
Boris Feld <boris.feld@octobus.net>
parents: 2502
diff changeset
74 # <= hg-4.1 requires an explicite gen.
f4acfbb36191 template: fix precursors template for older mercurial version
Boris Feld <boris.feld@octobus.net>
parents: 2502
diff changeset
75 # we can use None once the support is dropped
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
76 #
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
77 # They also requires an iterator instead of an iterable.
2599
df4a1b02308f template: used hex-node for the precursors underlying data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2591
diff changeset
78 gen = iter(" ".join(p[:12] for p in precursors))
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
79 return templatekw._hybrid(gen.__iter__(), precursors, lambda x: {'precursor': x},
2599
df4a1b02308f template: used hex-node for the precursors underlying data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2591
diff changeset
80 lambda d: d['precursor'][:12])
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
81
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
82 def closestsuccessors(repo, nodeid):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
83 """ returns the closest visible successors sets instead.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
84 """
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
85 return directsuccessorssets(repo, nodeid)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
86
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
87 @eh.templatekw("successors")
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
88 def shownextvisiblesuccessors(repo, ctx, templ, **args):
2601
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
89 """Returns a string of sets of successors for a changectx
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
90
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
91 Format used is: [ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
92 ctx2 while also diverged into ctx3"""
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
93 if not ctx.obsolete():
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
94 return ''
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
95
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
96 ssets, _ = closestsuccessors(repo, ctx.node())
2602
31d3be16e65c template: use hex-node in successors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2601
diff changeset
97 ssets = [[node.hex(n) for n in ss] for ss in ssets]
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
98
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
99 data = []
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
100 gen = []
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
101 for ss in ssets:
2602
31d3be16e65c template: use hex-node in successors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2601
diff changeset
102 subgen = '[%s]' % ', '.join(n[:12] for n in ss)
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
103 gen.append(subgen)
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
104 h = templatekw._hybrid(iter(subgen), ss, lambda x: {'successor': x},
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
105 lambda d: "%s" % d["successor"])
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
106 data.append(h)
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
107
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
108 gen = ', '.join(gen)
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
109 return templatekw._hybrid(iter(gen), data, lambda x: {'successorset': x},
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
110 lambda d: d["successorset"])
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
111
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
112 def _getusername(ui):
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
113 """the default username in the config or None"""
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
114 try:
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
115 return ui.username()
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
116 except error.Abort: # no easy way to avoid ui raising Abort here :-/
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
117 return None
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
118
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
119 def obsfatedefaulttempl(ui):
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
120 """ Returns a dict with the default templates for obs fate
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
121 """
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
122 # Prepare templates
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
123 verbtempl = '{verb}'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
124 usertempl = '{if(users, " by {join(users, ", ")}")}'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
125 succtempl = '{if(successors, " as ")}{successors}' # Bypass if limitation
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
126 datetempleq = ' (at {min_date|isodate})'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
127 datetemplnoteq = ' (between {min_date|isodate} and {max_date|isodate})'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
128 datetempl = '{if(max_date, "{ifeq(min_date, max_date, "%s", "%s")}")}' % (datetempleq, datetemplnoteq)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
129 newline = '\n'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
130
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
131 optionalusertempl = usertempl
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
132 username = _getusername(ui)
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
133 if username is not None:
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
134 optionalusertempl = ('{ifeq(join(users, "\0"), "%s", "", "%s")}'
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
135 % (username, usertempl))
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
136
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
137 # Assemble them
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
138 return {
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
139 'obsfate_quiet': verbtempl + succtempl + newline,
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
140 'obsfate': verbtempl + optionalusertempl + succtempl + newline,
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
141 'obsfate_verbose': verbtempl + usertempl + succtempl + datetempl + newline
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
142 }
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
143
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
144 @eh.templatekw("obsfate")
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
145 def showobsfate(repo, ctx, **args):
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
146 if not ctx.obsolete():
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
147 return ''
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
148
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
149 successorssets, pathcache = closestsuccessors(repo, ctx.node())
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
150
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
151 # closestsuccessors returns an empty list for pruned revisions, remap it
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
152 # into a list containing en empty list for future processing
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
153 if successorssets == []:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
154 successorssets = [[]]
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
155
2611
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
156 succsmap = repo.obsstore.successors
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
157 fullsuccessorsets = [] # successor set + markers
2605
7d9608219362 obsfate: rename 'successorsset' to 'sset' in the loop
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2603
diff changeset
158 for sset in successorssets:
2611
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
159 if sset:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
160 markers = obshistory.successorsetallmarkers(sset, pathcache)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
161 fullsuccessorsets.append((sset, markers))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
162 else:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
163 # XXX we do not catch all prune markers (eg rewritten then pruned)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
164 # (fix me later)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
165 foundany = False
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
166 for mark in succsmap.get(ctx.node(), ()):
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
167 if not mark[1]:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
168 foundany = True
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
169 fullsuccessorsets.append((sset, [mark]))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
170 if not foundany:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
171 fullsuccessorsets.append(([], []))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
172
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
173 values = []
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
174 for sset, rawmarkers in fullsuccessorsets:
2610
ee37ab3de5f7 obsfate: split markers fetch from successor set annotation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2608
diff changeset
175 raw = obshistory.preparesuccessorset(sset, rawmarkers)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
176
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
177 # As we can't do something like
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
178 # "{join(map(nodeshort, successors), ', '}" in template, manually
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
179 # create a correct textual representation
2603
23f1c3b9052f template: use hex successors in obsfate
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2602
diff changeset
180 gen = ', '.join(n[:12] for n in raw['successors'])
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
181
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
182 makemap = lambda x: {'successor': x}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
183 joinfmt = lambda d: "%s" % d['successor']
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
184 raw['successors'] = templatekw._hybrid(gen, raw['successors'], makemap,
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
185 joinfmt)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
186
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
187 values.append(raw)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
188
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
189 # Insert default obsfate templates
2612
fd35b428edfc obsfate: by default only display the username if differ from the current one
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2611
diff changeset
190 args['templ'].cache.update(obsfatedefaulttempl(repo.ui))
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
191
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
192 if repo.ui.quiet:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
193 name = "obsfate_quiet"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
194 elif repo.ui.verbose:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
195 name = "obsfate_verbose"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
196 elif repo.ui.debugflag:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
197 name = "obsfate_debug"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
198 else:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
199 name = "obsfate"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
200
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
201 return templatekw.showlist(name, values, args, separator=' + ')
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
202
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
203 # copy from mercurial.obsolete with a small change to stop at first known changeset.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
204
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
205 def directsuccessorssets(repo, initialnode, cache=None):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
206 """return set of all direct successors of initial nodes
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
207 """
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
208
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
209 succmarkers = repo.obsstore.successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
210
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
211 # Stack of nodes we search successors sets for
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
212 toproceed = [initialnode]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
213 # set version of above list for fast loop detection
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
214 # element added to "toproceed" must be added here
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
215 stackedset = set(toproceed)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
216
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
217 pathscache = {}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
218
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
219 if cache is None:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
220 cache = {}
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
221 while toproceed:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
222 current = toproceed[-1]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
223 if current in cache:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
224 stackedset.remove(toproceed.pop())
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
225 elif current != initialnode and current in repo:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
226 # We have a valid direct successors.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
227 cache[current] = [(current,)]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
228 elif current not in succmarkers:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
229 if current in repo:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
230 # We have a valid last successors.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
231 cache[current] = [(current,)]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
232 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
233 # Final obsolete version is unknown locally.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
234 # Do not count that as a valid successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
235 cache[current] = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
236 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
237 for mark in sorted(succmarkers[current]):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
238 for suc in mark[1]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
239 if suc not in cache:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
240 if suc in stackedset:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
241 # cycle breaking
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
242 cache[suc] = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
243 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
244 # case (3) If we have not computed successors sets
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
245 # of one of those successors we add it to the
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
246 # `toproceed` stack and stop all work for this
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
247 # iteration.
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
248 pathscache.setdefault(suc, []).append((current, mark))
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
249 toproceed.append(suc)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
250 stackedset.add(suc)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
251 break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
252 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
253 continue
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
254 break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
255 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
256 succssets = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
257 for mark in sorted(succmarkers[current]):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
258 # successors sets contributed by this marker
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
259 markss = [[]]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
260 for suc in mark[1]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
261 # cardinal product with previous successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
262 productresult = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
263 for prefix in markss:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
264 for suffix in cache[suc]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
265 newss = list(prefix)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
266 for part in suffix:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
267 # do not duplicated entry in successors set
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
268 # first entry wins.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
269 if part not in newss:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
270 newss.append(part)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
271 productresult.append(newss)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
272 markss = productresult
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
273 succssets.extend(markss)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
274 # remove duplicated and subset
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
275 seen = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
276 final = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
277 candidate = sorted(((set(s), s) for s in succssets if s),
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
278 key=lambda x: len(x[1]), reverse=True)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
279 for setversion, listversion in candidate:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
280 for seenset in seen:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
281 if setversion.issubset(seenset):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
282 break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
283 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
284 final.append(listversion)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
285 seen.append(setversion)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
286 final.reverse() # put small successors set first
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
287 cache[current] = final
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
288
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
289 return cache[initialnode], pathscache