Mercurial > public > mercurial-scm > hg
annotate mercurial/obsutil.py @ 33148:4e30168d7939
obsutil: move the 'marker' class to the new modules
We have a new 'obsutil' module now. We move high level utility there to bring
'obsolete.py' back to a more reasonable size.
author | Pierre-Yves David <pierre-yves.david@octobus.net> |
---|---|
date | Tue, 27 Jun 2017 01:51:40 +0200 |
parents | 7017567ebdf2 |
children | a14e2e7f7d1f |
rev | line source |
---|---|
32879
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
1 # obsutil.py - utility functions for obsolescence |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
2 # |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
3 # Copyright 2017 Boris Feld <boris.feld@octobus.net> |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
4 # |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
6 # GNU General Public License version 2 or any later version. |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
7 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
8 from __future__ import absolute_import |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
9 |
33148
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
10 class marker(object): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
11 """Wrap obsolete marker raw data""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
12 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
13 def __init__(self, repo, data): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
14 # the repo argument will be used to create changectx in later version |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
15 self._repo = repo |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
16 self._data = data |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
17 self._decodedmeta = None |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
18 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
19 def __hash__(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
20 return hash(self._data) |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
21 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
22 def __eq__(self, other): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
23 if type(other) != type(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
24 return False |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
25 return self._data == other._data |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
26 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
27 def precnode(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
28 """Precursor changeset node identifier""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
29 return self._data[0] |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
30 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
31 def succnodes(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
32 """List of successor changesets node identifiers""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
33 return self._data[1] |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
34 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
35 def parentnodes(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
36 """Parents of the precursors (None if not recorded)""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
37 return self._data[5] |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
38 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
39 def metadata(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
40 """Decoded metadata dictionary""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
41 return dict(self._data[3]) |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
42 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
43 def date(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
44 """Creation date as (unixtime, offset)""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
45 return self._data[4] |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
46 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
47 def flags(self): |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
48 """The flags field of the marker""" |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
49 return self._data[2] |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
50 |
32879
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
51 def closestpredecessors(repo, nodeid): |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
52 """yield the list of next predecessors pointing on visible changectx nodes |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
53 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
54 This function respect the repoview filtering, filtered revision will be |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
55 considered missing. |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
56 """ |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
57 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
58 precursors = repo.obsstore.precursors |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
59 stack = [nodeid] |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
60 seen = set(stack) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
61 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
62 while stack: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
63 current = stack.pop() |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
64 currentpreccs = precursors.get(current, ()) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
65 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
66 for prec in currentpreccs: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
67 precnodeid = prec[0] |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
68 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
69 # Basic cycle protection |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
70 if precnodeid in seen: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
71 continue |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
72 seen.add(precnodeid) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
73 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
74 if precnodeid in repo: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
75 yield precnodeid |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
76 else: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
77 stack.append(precnodeid) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
78 |
33144
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
79 def allprecursors(obsstore, nodes, ignoreflags=0): |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
80 """Yield node for every precursors of <nodes>. |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
81 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
82 Some precursors may be unknown locally. |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
83 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
84 This is a linear yield unsuited to detecting folded changesets. It includes |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
85 initial nodes too.""" |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
86 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
87 remaining = set(nodes) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
88 seen = set(remaining) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
89 while remaining: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
90 current = remaining.pop() |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
91 yield current |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
92 for mark in obsstore.precursors.get(current, ()): |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
93 # ignore marker flagged with specified flag |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
94 if mark[2] & ignoreflags: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
95 continue |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
96 suc = mark[0] |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
97 if suc not in seen: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
98 seen.add(suc) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
99 remaining.add(suc) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
100 |
33145
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
101 def allsuccessors(obsstore, nodes, ignoreflags=0): |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
102 """Yield node for every successor of <nodes>. |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
103 |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
104 Some successors may be unknown locally. |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
105 |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
106 This is a linear yield unsuited to detecting split changesets. It includes |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
107 initial nodes too.""" |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
108 remaining = set(nodes) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
109 seen = set(remaining) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
110 while remaining: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
111 current = remaining.pop() |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
112 yield current |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
113 for mark in obsstore.successors.get(current, ()): |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
114 # ignore marker flagged with specified flag |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
115 if mark[2] & ignoreflags: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
116 continue |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
117 for suc in mark[1]: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
118 if suc not in seen: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
119 seen.add(suc) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
120 remaining.add(suc) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
121 |
33143
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
122 def _filterprunes(markers): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
123 """return a set with no prune markers""" |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
124 return set(m for m in markers if m[1]) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
125 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
126 def exclusivemarkers(repo, nodes): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
127 """set of markers relevant to "nodes" but no other locally-known nodes |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
128 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
129 This function compute the set of markers "exclusive" to a locally-known |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
130 node. This means we walk the markers starting from <nodes> until we reach a |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
131 locally-known precursors outside of <nodes>. Element of <nodes> with |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
132 locally-known successors outside of <nodes> are ignored (since their |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
133 precursors markers are also relevant to these successors). |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
134 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
135 For example: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
136 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
137 # (A0 rewritten as A1) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
138 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
139 # A0 <-1- A1 # Marker "1" is exclusive to A1 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
140 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
141 or |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
142 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
143 # (A0 rewritten as AX; AX rewritten as A1; AX is unkown locally) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
144 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
145 # <-1- A0 <-2- AX <-3- A1 # Marker "2,3" are exclusive to A1 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
146 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
147 or |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
148 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
149 # (A0 has unknown precursors, A0 rewritten as A1 and A2 (divergence)) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
150 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
151 # <-2- A1 # Marker "2" is exclusive to A0,A1 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
152 # / |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
153 # <-1- A0 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
154 # \ |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
155 # <-3- A2 # Marker "3" is exclusive to A0,A2 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
156 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
157 # in addition: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
158 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
159 # Markers "2,3" are exclusive to A1,A2 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
160 # Markers "1,2,3" are exclusive to A0,A1,A2 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
161 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
162 See test/test-obsolete-bundle-strip.t for more examples. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
163 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
164 An example usage is strip. When stripping a changeset, we also want to |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
165 strip the markers exclusive to this changeset. Otherwise we would have |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
166 "dangling"" obsolescence markers from its precursors: Obsolescence markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
167 marking a node as obsolete without any successors available locally. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
168 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
169 As for relevant markers, the prune markers for children will be followed. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
170 Of course, they will only be followed if the pruned children is |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
171 locally-known. Since the prune markers are relevant to the pruned node. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
172 However, while prune markers are considered relevant to the parent of the |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
173 pruned changesets, prune markers for locally-known changeset (with no |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
174 successors) are considered exclusive to the pruned nodes. This allows |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
175 to strip the prune markers (with the rest of the exclusive chain) alongside |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
176 the pruned changesets. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
177 """ |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
178 # running on a filtered repository would be dangerous as markers could be |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
179 # reported as exclusive when they are relevant for other filtered nodes. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
180 unfi = repo.unfiltered() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
181 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
182 # shortcut to various useful item |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
183 nm = unfi.changelog.nodemap |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
184 precursorsmarkers = unfi.obsstore.precursors |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
185 successormarkers = unfi.obsstore.successors |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
186 childrenmarkers = unfi.obsstore.children |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
187 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
188 # exclusive markers (return of the function) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
189 exclmarkers = set() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
190 # we need fast membership testing |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
191 nodes = set(nodes) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
192 # looking for head in the obshistory |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
193 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
194 # XXX we are ignoring all issues in regard with cycle for now. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
195 stack = [n for n in nodes if not _filterprunes(successormarkers.get(n, ()))] |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
196 stack.sort() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
197 # nodes already stacked |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
198 seennodes = set(stack) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
199 while stack: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
200 current = stack.pop() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
201 # fetch precursors markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
202 markers = list(precursorsmarkers.get(current, ())) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
203 # extend the list with prune markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
204 for mark in successormarkers.get(current, ()): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
205 if not mark[1]: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
206 markers.append(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
207 # and markers from children (looking for prune) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
208 for mark in childrenmarkers.get(current, ()): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
209 if not mark[1]: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
210 markers.append(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
211 # traverse the markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
212 for mark in markers: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
213 if mark in exclmarkers: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
214 # markers already selected |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
215 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
216 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
217 # If the markers is about the current node, select it |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
218 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
219 # (this delay the addition of markers from children) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
220 if mark[1] or mark[0] == current: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
221 exclmarkers.add(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
222 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
223 # should we keep traversing through the precursors? |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
224 prec = mark[0] |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
225 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
226 # nodes in the stack or already processed |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
227 if prec in seennodes: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
228 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
229 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
230 # is this a locally known node ? |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
231 known = prec in nm |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
232 # if locally-known and not in the <nodes> set the traversal |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
233 # stop here. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
234 if known and prec not in nodes: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
235 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
236 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
237 # do not keep going if there are unselected markers pointing to this |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
238 # nodes. If we end up traversing these unselected markers later the |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
239 # node will be taken care of at that point. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
240 precmarkers = _filterprunes(successormarkers.get(prec)) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
241 if precmarkers.issubset(exclmarkers): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
242 seennodes.add(prec) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
243 stack.append(prec) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
244 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
245 return exclmarkers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
246 |
33146
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
247 def foreground(repo, nodes): |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
248 """return all nodes in the "foreground" of other node |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
249 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
250 The foreground of a revision is anything reachable using parent -> children |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
251 or precursor -> successor relation. It is very similar to "descendant" but |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
252 augmented with obsolescence information. |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
253 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
254 Beware that possible obsolescence cycle may result if complex situation. |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
255 """ |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
256 repo = repo.unfiltered() |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
257 foreground = set(repo.set('%ln::', nodes)) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
258 if repo.obsstore: |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
259 # We only need this complicated logic if there is obsolescence |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
260 # XXX will probably deserve an optimised revset. |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
261 nm = repo.changelog.nodemap |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
262 plen = -1 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
263 # compute the whole set of successors or descendants |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
264 while len(foreground) != plen: |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
265 plen = len(foreground) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
266 succs = set(c.node() for c in foreground) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
267 mutable = [c.node() for c in foreground if c.mutable()] |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
268 succs.update(allsuccessors(repo.obsstore, mutable)) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
269 known = (n for n in succs if n in nm) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
270 foreground = set(repo.set('%ln::', known)) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
271 return set(c.node() for c in foreground) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
272 |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
273 def successorssets(repo, initialnode, cache=None): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
274 """Return set of all latest successors of initial nodes |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
275 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
276 The successors set of a changeset A are the group of revisions that succeed |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
277 A. It succeeds A as a consistent whole, each revision being only a partial |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
278 replacement. The successors set contains non-obsolete changesets only. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
279 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
280 This function returns the full list of successor sets which is why it |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
281 returns a list of tuples and not just a single tuple. Each tuple is a valid |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
282 successors set. Note that (A,) may be a valid successors set for changeset A |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
283 (see below). |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
284 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
285 In most cases, a changeset A will have a single element (e.g. the changeset |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
286 A is replaced by A') in its successors set. Though, it is also common for a |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
287 changeset A to have no elements in its successor set (e.g. the changeset |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
288 has been pruned). Therefore, the returned list of successors sets will be |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
289 [(A',)] or [], respectively. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
290 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
291 When a changeset A is split into A' and B', however, it will result in a |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
292 successors set containing more than a single element, i.e. [(A',B')]. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
293 Divergent changesets will result in multiple successors sets, i.e. [(A',), |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
294 (A'')]. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
295 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
296 If a changeset A is not obsolete, then it will conceptually have no |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
297 successors set. To distinguish this from a pruned changeset, the successor |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
298 set will contain itself only, i.e. [(A,)]. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
299 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
300 Finally, successors unknown locally are considered to be pruned (obsoleted |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
301 without any successors). |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
302 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
303 The optional `cache` parameter is a dictionary that may contain precomputed |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
304 successors sets. It is meant to reuse the computation of a previous call to |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
305 `successorssets` when multiple calls are made at the same time. The cache |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
306 dictionary is updated in place. The caller is responsible for its life |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
307 span. Code that makes multiple calls to `successorssets` *must* use this |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
308 cache mechanism or suffer terrible performance. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
309 """ |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
310 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
311 succmarkers = repo.obsstore.successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
312 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
313 # Stack of nodes we search successors sets for |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
314 toproceed = [initialnode] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
315 # set version of above list for fast loop detection |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
316 # element added to "toproceed" must be added here |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
317 stackedset = set(toproceed) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
318 if cache is None: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
319 cache = {} |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
320 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
321 # This while loop is the flattened version of a recursive search for |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
322 # successors sets |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
323 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
324 # def successorssets(x): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
325 # successors = directsuccessors(x) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
326 # ss = [[]] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
327 # for succ in directsuccessors(x): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
328 # # product as in itertools cartesian product |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
329 # ss = product(ss, successorssets(succ)) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
330 # return ss |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
331 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
332 # But we can not use plain recursive calls here: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
333 # - that would blow the python call stack |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
334 # - obsolescence markers may have cycles, we need to handle them. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
335 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
336 # The `toproceed` list act as our call stack. Every node we search |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
337 # successors set for are stacked there. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
338 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
339 # The `stackedset` is set version of this stack used to check if a node is |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
340 # already stacked. This check is used to detect cycles and prevent infinite |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
341 # loop. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
342 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
343 # successors set of all nodes are stored in the `cache` dictionary. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
344 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
345 # After this while loop ends we use the cache to return the successors sets |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
346 # for the node requested by the caller. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
347 while toproceed: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
348 # Every iteration tries to compute the successors sets of the topmost |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
349 # node of the stack: CURRENT. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
350 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
351 # There are four possible outcomes: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
352 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
353 # 1) We already know the successors sets of CURRENT: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
354 # -> mission accomplished, pop it from the stack. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
355 # 2) Node is not obsolete: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
356 # -> the node is its own successors sets. Add it to the cache. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
357 # 3) We do not know successors set of direct successors of CURRENT: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
358 # -> We add those successors to the stack. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
359 # 4) We know successors sets of all direct successors of CURRENT: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
360 # -> We can compute CURRENT successors set and add it to the |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
361 # cache. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
362 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
363 current = toproceed[-1] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
364 if current in cache: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
365 # case (1): We already know the successors sets |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
366 stackedset.remove(toproceed.pop()) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
367 elif current not in succmarkers: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
368 # case (2): The node is not obsolete. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
369 if current in repo: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
370 # We have a valid last successors. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
371 cache[current] = [(current,)] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
372 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
373 # Final obsolete version is unknown locally. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
374 # Do not count that as a valid successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
375 cache[current] = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
376 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
377 # cases (3) and (4) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
378 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
379 # We proceed in two phases. Phase 1 aims to distinguish case (3) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
380 # from case (4): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
381 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
382 # For each direct successors of CURRENT, we check whether its |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
383 # successors sets are known. If they are not, we stack the |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
384 # unknown node and proceed to the next iteration of the while |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
385 # loop. (case 3) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
386 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
387 # During this step, we may detect obsolescence cycles: a node |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
388 # with unknown successors sets but already in the call stack. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
389 # In such a situation, we arbitrary set the successors sets of |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
390 # the node to nothing (node pruned) to break the cycle. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
391 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
392 # If no break was encountered we proceed to phase 2. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
393 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
394 # Phase 2 computes successors sets of CURRENT (case 4); see details |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
395 # in phase 2 itself. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
396 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
397 # Note the two levels of iteration in each phase. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
398 # - The first one handles obsolescence markers using CURRENT as |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
399 # precursor (successors markers of CURRENT). |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
400 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
401 # Having multiple entry here means divergence. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
402 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
403 # - The second one handles successors defined in each marker. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
404 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
405 # Having none means pruned node, multiple successors means split, |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
406 # single successors are standard replacement. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
407 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
408 for mark in sorted(succmarkers[current]): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
409 for suc in mark[1]: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
410 if suc not in cache: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
411 if suc in stackedset: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
412 # cycle breaking |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
413 cache[suc] = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
414 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
415 # case (3) If we have not computed successors sets |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
416 # of one of those successors we add it to the |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
417 # `toproceed` stack and stop all work for this |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
418 # iteration. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
419 toproceed.append(suc) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
420 stackedset.add(suc) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
421 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
422 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
423 continue |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
424 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
425 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
426 # case (4): we know all successors sets of all direct |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
427 # successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
428 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
429 # Successors set contributed by each marker depends on the |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
430 # successors sets of all its "successors" node. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
431 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
432 # Each different marker is a divergence in the obsolescence |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
433 # history. It contributes successors sets distinct from other |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
434 # markers. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
435 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
436 # Within a marker, a successor may have divergent successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
437 # sets. In such a case, the marker will contribute multiple |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
438 # divergent successors sets. If multiple successors have |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
439 # divergent successors sets, a Cartesian product is used. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
440 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
441 # At the end we post-process successors sets to remove |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
442 # duplicated entry and successors set that are strict subset of |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
443 # another one. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
444 succssets = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
445 for mark in sorted(succmarkers[current]): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
446 # successors sets contributed by this marker |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
447 markss = [[]] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
448 for suc in mark[1]: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
449 # cardinal product with previous successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
450 productresult = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
451 for prefix in markss: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
452 for suffix in cache[suc]: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
453 newss = list(prefix) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
454 for part in suffix: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
455 # do not duplicated entry in successors set |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
456 # first entry wins. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
457 if part not in newss: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
458 newss.append(part) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
459 productresult.append(newss) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
460 markss = productresult |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
461 succssets.extend(markss) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
462 # remove duplicated and subset |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
463 seen = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
464 final = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
465 candidate = sorted(((set(s), s) for s in succssets if s), |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
466 key=lambda x: len(x[1]), reverse=True) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
467 for setversion, listversion in candidate: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
468 for seenset in seen: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
469 if setversion.issubset(seenset): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
470 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
471 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
472 final.append(listversion) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
473 seen.append(setversion) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
474 final.reverse() # put small successors set first |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
475 cache[current] = final |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
476 return cache[initialnode] |