annotate hgext3rd/evolve/templatekw.py @ 2926:1abafae41fe2

evolve: use registrar.templatekeyword to register template keyword functions Now, using registrar.templatekeyword of Mercurial directly in evolve extension should be safe enough. because it has been available since Mercurial 3.8, and minimum Mercurial version for evolve extension is 3.8, too. BTW, this also fixes an issue of "hg help templates" output that template keywords "precursors" and "successors" are not displayed as same as others, because they do not have ":KEYWORD:" prefix in their docstring.
author FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
date Mon, 07 Aug 2017 23:22:41 +0900
parents dfad30be866c
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 (
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
18 cmdutil,
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
19 templatekw,
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
20 node,
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
21 util
1823
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
22 )
649d7a574c3f evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 1822
diff changeset
23
2041
3b6550261614 exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 2032
diff changeset
24 eh = exthelper.exthelper()
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
25
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
26 ### template keywords
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
27 # XXX it does not handle troubles well :-/
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
28
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
29 @eh.templatekw('obsolete')
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
30 def obsoletekw(repo, ctx, templ, **args):
2926
1abafae41fe2 evolve: use registrar.templatekeyword to register template keyword functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2840
diff changeset
31 """String. Whether the changeset is ``obsolete``.
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
32 """
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
33 if ctx.obsolete():
1732
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
34 return 'obsolete'
f4047fba5e90 templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents: 1729
diff changeset
35 return ''
491
6989d8fe4ed2 merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 490
diff changeset
36
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
37 @eh.templatekw('troubles')
2271
1af1b0debd4b template: pass all mapping data to showlist()
Yuya Nishihara <yuya@tcha.org>
parents: 2245
diff changeset
38 def showtroubles(**args):
2926
1abafae41fe2 evolve: use registrar.templatekeyword to register template keyword functions
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 2840
diff changeset
39 """List of strings. Evolution troubles affecting the changeset
1399
9ff6d9240f16 template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 949
diff changeset
40 (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
41 ctx = args['ctx']
2272
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
42 try:
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
43 # specify plural= explicitly to trigger TypeError on hg < 4.2
2837
cec8609bb396 context: troubles was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2832
diff changeset
44 return templatekw.showlist('trouble', ctx.instabilities(), args,
2272
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
45 plural='troubles')
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
46 except TypeError:
2837
cec8609bb396 context: troubles was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2832
diff changeset
47 return templatekw.showlist('trouble', ctx.instabilities(), plural='troubles',
2272
eb47d436cdc3 template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents: 2271
diff changeset
48 **args)
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
49
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
50 def closestprecursors(repo, nodeid):
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
51 """ 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
52 """
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
53
2840
dfad30be866c context: precursors was deprecated
Boris Feld <boris.feld@octobus.net>
parents: 2837
diff changeset
54 precursors = repo.obsstore.predecessors
2486
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
55 stack = [nodeid]
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
56
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
57 while stack:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
58 current = stack.pop()
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
59 currentpreccs = precursors.get(current, ())
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
60
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
61 for prec in currentpreccs:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
62 precnodeid = prec[0]
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
63
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
64 if precnodeid in repo:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
65 yield precnodeid
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
66 else:
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
67 stack.append(precnodeid)
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
68
cd4290f923b7 template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents: 2485
diff changeset
69 @eh.templatekw("precursors")
2500
2092007af205 template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents: 2494
diff changeset
70 def shownextvisibleprecursors(repo, ctx, **args):
2600
e987b403d047 template: fix precursors documentation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2599
diff changeset
71 """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
72 """
2500
2092007af205 template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents: 2494
diff changeset
73 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
74 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
75
2526
f4acfbb36191 template: fix precursors template for older mercurial version
Boris Feld <boris.feld@octobus.net>
parents: 2502
diff changeset
76 # <= 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
77 # 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
78 #
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
79 # 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
80 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
81 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
82 lambda d: d['precursor'][:12])
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
83
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
84 def closestsuccessors(repo, nodeid):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
85 """ returns the closest visible successors sets instead.
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 return directsuccessorssets(repo, nodeid)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
88
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
89 @eh.templatekw("successors")
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
90 def shownextvisiblesuccessors(repo, ctx, templ, **args):
2601
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
91 """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
92
20c1e035101b template: update successors doc
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2600
diff changeset
93 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
94 ctx2 while also diverged into ctx3"""
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
95 if not ctx.obsolete():
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
96 return ''
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
97
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
98 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
99 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
100
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
101 data = []
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
102 gen = []
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
103 for ss in ssets:
2602
31d3be16e65c template: use hex-node in successors
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2601
diff changeset
104 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
105 gen.append(subgen)
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
106 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
107 lambda d: "%s" % d["successor"])
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
108 data.append(h)
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
109
2502
d5db7464676d template: update successors template output
Boris Feld <boris.feld@octobus.net>
parents: 2500
diff changeset
110 gen = ', '.join(gen)
2528
8ac4ceac5d96 template: fix successors and precursors templates
Boris Feld <boris.feld@octobus.net>
parents: 2526
diff changeset
111 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
112 lambda d: d["successorset"])
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
113
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
114 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
115 """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
116 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
117 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
118 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
119 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
120
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
121 def obsfatedefaulttempl(ui):
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
122 """ 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
123 """
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
124 # Prepare templates
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
125 verbtempl = '{verb}'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
126 usertempl = '{if(users, " by {join(users, ", ")}")}'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
127 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
128 datetempleq = ' (at {min_date|isodate})'
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
129 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
130 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
131
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
132 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
133 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
134 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
135 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
136 % (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
137
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
138 # Assemble them
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
139 return {
2629
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
140 'obsfate_quiet': verbtempl + succtempl,
2832
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2690
diff changeset
141 'obsfate': verbtempl + succtempl + optionalusertempl,
07b9fcf8b6d3 output: update obsfate / obslog output order
Boris Feld <boris.feld@octobus.net>
parents: 2690
diff changeset
142 'obsfate_verbose': verbtempl + succtempl + usertempl + datetempl,
2591
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
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
145 def obsfatedata(repo, ctx):
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
146 """compute the raw data needed for computing obsfate
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
147 Returns a list of dict
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
148 """
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
149 if not ctx.obsolete():
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
150 return None
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
151
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
152 successorssets, pathcache = closestsuccessors(repo, ctx.node())
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
153
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
154 # 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
155 # 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
156 if successorssets == []:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
157 successorssets = [[]]
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
158
2611
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
159 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
160 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
161 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
162 if sset:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
163 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
164 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
165 else:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
166 # 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
167 # (fix me later)
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
168 foundany = False
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
169 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
170 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
171 foundany = True
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
172 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
173 if not foundany:
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
174 fullsuccessorsets.append(([], []))
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
175
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
176 values = []
45f5dbb24684 obsfate: display more data about direct prune markers
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2610
diff changeset
177 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
178 raw = obshistory.preparesuccessorset(sset, rawmarkers)
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
179 values.append(raw)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
180
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
181 return values
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
182
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
183 def obsfatelineprinter(obsfateline, ui):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
184 quiet = ui.quiet
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
185 verbose = ui.verbose
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
186 normal = not verbose and not quiet
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
187
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
188 # Build the line step by step
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
189 line = []
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
190
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
191 # Verb
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
192 line.append(obsfateline['verb'])
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
193
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
194 # Users
2690
5d839e1f0ce9 template: handle lack of "users" in the obsfate data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 2688
diff changeset
195 if (verbose or normal) and 'users' in obsfateline:
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
196 users = obsfateline['users']
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
197
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
198 if normal:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
199 username = _getusername(ui)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
200 users = [user for user in users if user != username]
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
201
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
202 if users:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
203 line.append(" by %s" % ",".join(users))
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
204
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
205 # Successors
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
206 successors = obsfateline["successors"]
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
207
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
208 if successors:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
209 fmtsuccessors = map(lambda s: s[:12], successors)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
210 line.append(" as %s" % ", ".join(fmtsuccessors))
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
211
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
212 # Date
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
213 if verbose:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
214 min_date = obsfateline['min_date']
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
215 max_date = obsfateline['max_date']
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
216
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
217 if min_date == max_date:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
218 fmtmin_date = util.datestr(min_date, '%Y-%m-%d %H:%M %1%2')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
219 line.append(" (at %s)" % fmtmin_date)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
220 else:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
221 fmtmin_date = util.datestr(min_date, '%Y-%m-%d %H:%M %1%2')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
222 fmtmax_date = util.datestr(max_date, '%Y-%m-%d %H:%M %1%2')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
223 line.append(" (between %s and %s)" % (fmtmin_date, fmtmax_date))
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
224
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
225 return "".join(line)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
226
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
227 def obsfateprinter(obsfate, ui, prefix=""):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
228 lines = []
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
229 for raw in obsfate:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
230 lines.append(obsfatelineprinter(raw, ui))
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
231
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
232 if prefix:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
233 lines = [prefix + line for line in lines]
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
234
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
235 return "\n".join(lines)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
236
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
237 @eh.templatekw("obsfate")
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
238 def showobsfate(repo, ctx, **args):
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
239 # Get the needed obsfate data
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
240 values = obsfatedata(repo, ctx)
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
241
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
242 if values is None:
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
243 return ''
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
244
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
245 # Format each successorset successors list
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
246 for raw in values:
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
247 # As we can't do something like
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
248 # "{join(map(nodeshort, successors), ', '}" in template, manually
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
249 # 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
250 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
251
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
252 makemap = lambda x: {'successor': x}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
253 joinfmt = lambda d: "%s" % d['successor']
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
254 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
255 joinfmt)
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
256
2685
008f7cd1fcbe obsfate: refactor obsfate data computing
Boris Feld <boris.feld@octobus.net>
parents: 2629
diff changeset
257 # And then format them
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
258 # 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
259 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
260
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
261 if repo.ui.quiet:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
262 name = "obsfate_quiet"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
263 elif repo.ui.verbose:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
264 name = "obsfate_verbose"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
265 elif repo.ui.debugflag:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
266 name = "obsfate_debug"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
267 else:
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
268 name = "obsfate"
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
269
2629
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
270 # Format a single value
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
271 def fmt(d):
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
272 nargs = args.copy()
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
273 nargs.update(d[name])
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
274 return args['templ'](name, **nargs)
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
275
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
276 # Generate a good enough string representation using templater
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
277 gen = []
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
278 for d in values:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
279 chunk = fmt({name: d})
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
280 chunkstr = []
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
281
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
282 # Empty the generator
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
283 try:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
284 while True:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
285 chunkstr.append(chunk.next())
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
286 except StopIteration:
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
287 pass
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
288
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
289 gen.append("".join(chunkstr))
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
290 gen = "; ".join(gen)
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
291
9c0f6b85c28f obsfate: improve obsfate output
Boris Feld <boris.feld@octobus.net>
parents: 2613
diff changeset
292 return templatekw._hybrid(gen, values, lambda x: {name: x}, fmt)
2489
84a8219a2f9a template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2487
diff changeset
293
2688
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
294 # Check if we can hook directly on the changeset_printer
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
295 if util.safehasattr(cmdutil.changeset_printer, '_exthook'):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
296 @eh.wrapfunction(cmdutil.changeset_printer, '_exthook')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
297 def exthook(original, self, ctx):
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
298 # Call potential other extensions
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
299 original(self, ctx)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
300
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
301 obsfate = obsfatedata(self.repo, ctx)
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
302 if obsfate is None:
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
303 return ""
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
304
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
305 output = obsfateprinter(obsfate, self.ui, prefix="obsolete: ")
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
306
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
307 self.ui.write(output, label='log.obsfate')
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
308 self.ui.write("\n")
b6e50897b94e obsfate: override the default log output
Boris Feld <boris.feld@octobus.net>
parents: 2685
diff changeset
309
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
310 # 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
311
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
312 def directsuccessorssets(repo, initialnode, cache=None):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
313 """return set of all direct successors of initial nodes
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
314 """
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
315
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
316 succmarkers = repo.obsstore.successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
317
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
318 # Stack of nodes we search successors sets for
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
319 toproceed = [initialnode]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
320 # set version of above list for fast loop detection
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
321 # element added to "toproceed" must be added here
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
322 stackedset = set(toproceed)
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
323
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
324 pathscache = {}
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
325
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
326 if cache is None:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
327 cache = {}
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
328 while toproceed:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
329 current = toproceed[-1]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
330 if current in cache:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
331 stackedset.remove(toproceed.pop())
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
332 elif current != initialnode and current in repo:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
333 # We have a valid direct successors.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
334 cache[current] = [(current,)]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
335 elif current not in succmarkers:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
336 if current in repo:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
337 # We have a valid last successors.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
338 cache[current] = [(current,)]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
339 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
340 # Final obsolete version is unknown locally.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
341 # Do not count that as a valid successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
342 cache[current] = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
343 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
344 for mark in sorted(succmarkers[current]):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
345 for suc in mark[1]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
346 if suc not in cache:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
347 if suc in stackedset:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
348 # cycle breaking
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
349 cache[suc] = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
350 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
351 # case (3) If we have not computed successors sets
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
352 # 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
353 # `toproceed` stack and stop all work for this
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
354 # iteration.
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
355 pathscache.setdefault(suc, []).append((current, mark))
2487
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
356 toproceed.append(suc)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
357 stackedset.add(suc)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
358 break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
359 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
360 continue
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
361 break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
362 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
363 succssets = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
364 for mark in sorted(succmarkers[current]):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
365 # successors sets contributed by this marker
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
366 markss = [[]]
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
367 for suc in mark[1]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
368 # cardinal product with previous successors
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
369 productresult = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
370 for prefix in markss:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
371 for suffix in cache[suc]:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
372 newss = list(prefix)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
373 for part in suffix:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
374 # do not duplicated entry in successors set
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
375 # first entry wins.
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
376 if part not in newss:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
377 newss.append(part)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
378 productresult.append(newss)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
379 markss = productresult
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
380 succssets.extend(markss)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
381 # remove duplicated and subset
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
382 seen = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
383 final = []
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
384 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
385 key=lambda x: len(x[1]), reverse=True)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
386 for setversion, listversion in candidate:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
387 for seenset in seen:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
388 if setversion.issubset(seenset):
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
389 break
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
390 else:
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
391 final.append(listversion)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
392 seen.append(setversion)
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
393 final.reverse() # put small successors set first
590da9c523ae template: add successors template
Boris Feld <boris.feld@octobus.net>
parents: 2486
diff changeset
394 cache[current] = final
2591
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
395
1991935fb603 obsfate: add a new obsfate template
Boris Feld <boris.feld@octobus.net>
parents: 2528
diff changeset
396 return cache[initialnode], pathscache