author | Boris Feld <boris.feld@octobus.net> |
Mon, 29 May 2017 12:15:47 +0200 | |
changeset 2500 | 2092007af205 |
parent 2494 | 17bc96b54255 |
child 2502 | d5db7464676d |
permissions | -rw-r--r-- |
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 ( |
e6ecd35e99ec
refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents:
2481
diff
changeset
|
12 |
exthelper, |
2489
84a8219a2f9a
template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents:
2487
diff
changeset
|
13 |
obshistory |
2485
e6ecd35e99ec
refactor: extract templates into a new file
Boris Feld <boris.feld@octobus.net>
parents:
2481
diff
changeset
|
14 |
) |
617
469befc27b26
detect incompatibility with future mercurial 2.5
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
616
diff
changeset
|
15 |
|
1823
649d7a574c3f
evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1822
diff
changeset
|
16 |
from mercurial import ( |
649d7a574c3f
evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1822
diff
changeset
|
17 |
templatekw, |
2486
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
18 |
node, |
1823
649d7a574c3f
evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1822
diff
changeset
|
19 |
) |
649d7a574c3f
evolve: cleanup imports
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
1822
diff
changeset
|
20 |
|
2041
3b6550261614
exthelper: extract into its own submodule
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
2032
diff
changeset
|
21 |
eh = exthelper.exthelper() |
491
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
490
diff
changeset
|
22 |
|
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
490
diff
changeset
|
23 |
### template keywords |
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
490
diff
changeset
|
24 |
# XXX it does not handle troubles well :-/ |
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 |
@eh.templatekw('obsolete') |
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
490
diff
changeset
|
27 |
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
|
28 |
""":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
|
29 |
""" |
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
490
diff
changeset
|
30 |
if ctx.obsolete(): |
1732
f4047fba5e90
templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents:
1729
diff
changeset
|
31 |
return 'obsolete' |
f4047fba5e90
templates: change {obsolete} to emit only "obsolete" or ""
Martin von Zweigbergk <martinvonz@google.com>
parents:
1729
diff
changeset
|
32 |
return '' |
491
6989d8fe4ed2
merge evolve and obsolete
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
490
diff
changeset
|
33 |
|
1399
9ff6d9240f16
template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
949
diff
changeset
|
34 |
@eh.templatekw('troubles') |
2271
1af1b0debd4b
template: pass all mapping data to showlist()
Yuya Nishihara <yuya@tcha.org>
parents:
2245
diff
changeset
|
35 |
def showtroubles(**args): |
1399
9ff6d9240f16
template: add a troubles keyword
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
949
diff
changeset
|
36 |
""":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
|
37 |
(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
|
38 |
ctx = args['ctx'] |
2272
eb47d436cdc3
template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents:
2271
diff
changeset
|
39 |
try: |
eb47d436cdc3
template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents:
2271
diff
changeset
|
40 |
# 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
|
41 |
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
|
42 |
plural='troubles') |
eb47d436cdc3
template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents:
2271
diff
changeset
|
43 |
except TypeError: |
eb47d436cdc3
template: adapt to new showlist() API introduced by hg e5eab0fe69ee
Yuya Nishihara <yuya@tcha.org>
parents:
2271
diff
changeset
|
44 |
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
|
45 |
**args) |
2486
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
46 |
|
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
47 |
def closestprecursors(repo, nodeid): |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
48 |
""" 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
|
49 |
""" |
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 |
precursors = repo.obsstore.precursors |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
52 |
stack = [nodeid] |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
53 |
|
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
54 |
while stack: |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
55 |
current = stack.pop() |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
56 |
currentpreccs = precursors.get(current, ()) |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
57 |
|
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
58 |
for prec in currentpreccs: |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
59 |
precnodeid = prec[0] |
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 |
if precnodeid in repo: |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
62 |
yield precnodeid |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
63 |
else: |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
64 |
stack.append(precnodeid) |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
65 |
|
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
66 |
@eh.templatekw("precursors") |
2500
2092007af205
template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents:
2494
diff
changeset
|
67 |
def shownextvisibleprecursors(repo, ctx, **args): |
2486
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
68 |
"""Returns a string containing the list if the closest successors |
cd4290f923b7
template: add precursors template
Boris Feld <boris.feld@octobus.net>
parents:
2485
diff
changeset
|
69 |
displayed |
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())) |
2092007af205
template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents:
2494
diff
changeset
|
72 |
return templatekw._hybrid(None, precursors, lambda x: {'precursor': x}, |
2092007af205
template: update precursors template output
Boris Feld <boris.feld@octobus.net>
parents:
2494
diff
changeset
|
73 |
lambda d: "%s" % node.short(d['precursor'])) |
2487
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
74 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
75 |
def closestsuccessors(repo, nodeid): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
76 |
""" returns the closest visible successors sets instead. |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
77 |
""" |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
78 |
return directsuccessorssets(repo, nodeid) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
79 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
80 |
@eh.templatekw("successors") |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
81 |
def shownextvisiblesuccessors(repo, ctx, templ, **args): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
82 |
"""Returns a string of sets of successors for a changectx in this format: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
83 |
[ctx1, ctx2], [ctx3] if ctx has been splitted into ctx1 and ctx2 while |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
84 |
also diverged into ctx3""" |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
85 |
if not ctx.obsolete(): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
86 |
return '' |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
87 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
88 |
ssets = closestsuccessors(repo, ctx.node()) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
89 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
90 |
final = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
91 |
for ss in ssets: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
92 |
final.append('[%s]' % ', '.join(map(node.short, ss))) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
93 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
94 |
return ', '.join(final) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
95 |
|
2494
17bc96b54255
refactoring: rename obsfate template to obsfate_quiet
Boris Feld <boris.feld@octobus.net>
parents:
2490
diff
changeset
|
96 |
@eh.templatekw("obsfate_quiet") |
17bc96b54255
refactoring: rename obsfate template to obsfate_quiet
Boris Feld <boris.feld@octobus.net>
parents:
2490
diff
changeset
|
97 |
def showobsfate_quiet(repo, ctx, templ, **args): |
2489
84a8219a2f9a
template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents:
2487
diff
changeset
|
98 |
if not ctx.obsolete(): |
84a8219a2f9a
template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents:
2487
diff
changeset
|
99 |
return '' |
84a8219a2f9a
template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents:
2487
diff
changeset
|
100 |
|
84a8219a2f9a
template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents:
2487
diff
changeset
|
101 |
successorssets = closestsuccessors(repo, ctx.node()) |
2490
94f171534918
template: update obsfate to be more human friendly
Boris Feld <boris.feld@octobus.net>
parents:
2489
diff
changeset
|
102 |
return obshistory._humanizedobsfate(*obshistory._getobsfateandsuccs(repo, ctx, successorssets)) |
2489
84a8219a2f9a
template: add the obsfate template
Boris Feld <boris.feld@octobus.net>
parents:
2487
diff
changeset
|
103 |
|
2487
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
104 |
# 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
|
105 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
106 |
def directsuccessorssets(repo, initialnode, cache=None): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
107 |
"""return set of all direct successors of initial nodes |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
108 |
""" |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
109 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
110 |
succmarkers = repo.obsstore.successors |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
111 |
|
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
112 |
# Stack of nodes we search successors sets for |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
113 |
toproceed = [initialnode] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
114 |
# set version of above list for fast loop detection |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
115 |
# element added to "toproceed" must be added here |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
116 |
stackedset = set(toproceed) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
117 |
if cache is None: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
118 |
cache = {} |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
119 |
while toproceed: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
120 |
current = toproceed[-1] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
121 |
if current in cache: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
122 |
stackedset.remove(toproceed.pop()) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
123 |
elif current != initialnode and current in repo: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
124 |
# We have a valid direct successors. |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
125 |
cache[current] = [(current,)] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
126 |
elif current not in succmarkers: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
127 |
if current in repo: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
128 |
# We have a valid last successors. |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
129 |
cache[current] = [(current,)] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
130 |
else: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
131 |
# Final obsolete version is unknown locally. |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
132 |
# Do not count that as a valid successors |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
133 |
cache[current] = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
134 |
else: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
135 |
for mark in sorted(succmarkers[current]): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
136 |
for suc in mark[1]: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
137 |
if suc not in cache: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
138 |
if suc in stackedset: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
139 |
# cycle breaking |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
140 |
cache[suc] = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
141 |
else: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
142 |
# case (3) If we have not computed successors sets |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
143 |
# 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
|
144 |
# `toproceed` stack and stop all work for this |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
145 |
# iteration. |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
146 |
toproceed.append(suc) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
147 |
stackedset.add(suc) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
148 |
break |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
149 |
else: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
150 |
continue |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
151 |
break |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
152 |
else: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
153 |
succssets = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
154 |
for mark in sorted(succmarkers[current]): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
155 |
# successors sets contributed by this marker |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
156 |
markss = [[]] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
157 |
for suc in mark[1]: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
158 |
# cardinal product with previous successors |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
159 |
productresult = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
160 |
for prefix in markss: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
161 |
for suffix in cache[suc]: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
162 |
newss = list(prefix) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
163 |
for part in suffix: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
164 |
# do not duplicated entry in successors set |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
165 |
# first entry wins. |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
166 |
if part not in newss: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
167 |
newss.append(part) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
168 |
productresult.append(newss) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
169 |
markss = productresult |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
170 |
succssets.extend(markss) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
171 |
# remove duplicated and subset |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
172 |
seen = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
173 |
final = [] |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
174 |
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
|
175 |
key=lambda x: len(x[1]), reverse=True) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
176 |
for setversion, listversion in candidate: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
177 |
for seenset in seen: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
178 |
if setversion.issubset(seenset): |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
179 |
break |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
180 |
else: |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
181 |
final.append(listversion) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
182 |
seen.append(setversion) |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
183 |
final.reverse() # put small successors set first |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
184 |
cache[current] = final |
590da9c523ae
template: add successors template
Boris Feld <boris.feld@octobus.net>
parents:
2486
diff
changeset
|
185 |
return cache[initialnode] |