Mercurial > hg
annotate mercurial/obsutil.py @ 34420:95759620d492
effectflag: detect when meta changed
Store in effect flag when the meta changed between the predecessor and its
successors. We blacklisted some known meta that would always changed when
another flag change. For example rebase would always add a meta rebase-source
while the effect flag parents will already detect this situation.
It can happens with various hg commands.
Differential Revision: https://phab.mercurial-scm.org/D540
author | Boris Feld <boris.feld@octobus.net> |
---|---|
date | Thu, 06 Jul 2017 14:58:44 +0200 |
parents | fa26f5891e68 |
children | 187bc224554a |
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 |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
10 import re |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
11 |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
12 from . import ( |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
13 phases, |
33731
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
14 util |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
15 ) |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
16 |
33148
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
17 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
|
18 """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
|
19 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
20 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
|
21 # 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
|
22 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
|
23 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
|
24 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
|
25 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
26 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
|
27 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
|
28 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
29 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
|
30 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
|
31 return False |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
32 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
|
33 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
34 def precnode(self): |
33731
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
35 msg = ("'marker.precnode' is deprecated, " |
33857
833f70277f0e
obsmarker: fix precnode deprecation
Boris Feld <boris.feld@octobus.net>
parents:
33735
diff
changeset
|
36 "use 'marker.prednode'") |
33731
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
37 util.nouideprecwarn(msg, '4.4') |
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
38 return self.prednode() |
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
39 |
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
40 def prednode(self): |
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
41 """Predecessor changeset node identifier""" |
33148
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
42 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
|
43 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
44 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
|
45 """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
|
46 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
|
47 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
48 def parentnodes(self): |
33731
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
49 """Parents of the predecessors (None if not recorded)""" |
33148
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
50 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
|
51 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
52 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
|
53 """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
|
54 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
|
55 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
56 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
|
57 """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
|
58 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
|
59 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
60 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
|
61 """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
|
62 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
|
63 |
33149
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
64 def getmarkers(repo, nodes=None, exclusive=False): |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
65 """returns markers known in a repository |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
66 |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
67 If <nodes> is specified, only markers "relevant" to those nodes are are |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
68 returned""" |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
69 if nodes is None: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
70 rawmarkers = repo.obsstore |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
71 elif exclusive: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
72 rawmarkers = exclusivemarkers(repo, nodes) |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
73 else: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
74 rawmarkers = repo.obsstore.relevantmarkers(nodes) |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
75 |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
76 for markerdata in rawmarkers: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
77 yield marker(repo, markerdata) |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
78 |
32879
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
79 def closestpredecessors(repo, nodeid): |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
80 """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
|
81 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
82 This function respect the repoview filtering, filtered revision will be |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
83 considered missing. |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
84 """ |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
85 |
33733
d5acd967f95a
obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents:
33731
diff
changeset
|
86 precursors = repo.obsstore.predecessors |
32879
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
87 stack = [nodeid] |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
88 seen = set(stack) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
89 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
90 while stack: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
91 current = stack.pop() |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
92 currentpreccs = precursors.get(current, ()) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
93 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
94 for prec in currentpreccs: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
95 precnodeid = prec[0] |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
96 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
97 # Basic cycle protection |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
98 if precnodeid in seen: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
99 continue |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
100 seen.add(precnodeid) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
101 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
102 if precnodeid in repo: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
103 yield precnodeid |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
104 else: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
105 stack.append(precnodeid) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
106 |
33735
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
107 def allprecursors(*args, **kwargs): |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
108 """ (DEPRECATED) |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
109 """ |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
110 msg = ("'obsutil.allprecursors' is deprecated, " |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
111 "use 'obsutil.allpredecessors'") |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
112 util.nouideprecwarn(msg, '4.4') |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
113 |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
114 return allpredecessors(*args, **kwargs) |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
115 |
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
116 def allpredecessors(obsstore, nodes, ignoreflags=0): |
33144
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
117 """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
|
118 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
119 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
|
120 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
121 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
|
122 initial nodes too.""" |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
123 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
124 remaining = set(nodes) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
125 seen = set(remaining) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
126 while remaining: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
127 current = remaining.pop() |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
128 yield current |
33733
d5acd967f95a
obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents:
33731
diff
changeset
|
129 for mark in obsstore.predecessors.get(current, ()): |
33144
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
130 # 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
|
131 if mark[2] & ignoreflags: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
132 continue |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
133 suc = mark[0] |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
134 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
|
135 seen.add(suc) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
136 remaining.add(suc) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
137 |
33145
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
138 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
|
139 """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
|
140 |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
141 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
|
142 |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
143 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
|
144 initial nodes too.""" |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
145 remaining = set(nodes) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
146 seen = set(remaining) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
147 while remaining: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
148 current = remaining.pop() |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
149 yield current |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
150 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
|
151 # 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
|
152 if mark[2] & ignoreflags: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
153 continue |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
154 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
|
155 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
|
156 seen.add(suc) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
157 remaining.add(suc) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
158 |
33143
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
159 def _filterprunes(markers): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
160 """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
|
161 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
|
162 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
163 def exclusivemarkers(repo, nodes): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
164 """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
|
165 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
166 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
|
167 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
|
168 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
|
169 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
|
170 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
|
171 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
172 For example: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
173 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
174 # (A0 rewritten as A1) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
175 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
176 # 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
|
177 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
178 or |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
179 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
180 # (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
|
181 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
182 # <-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
|
183 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
184 or |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
185 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
186 # (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
|
187 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
188 # <-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
|
189 # / |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
190 # <-1- A0 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
191 # \ |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
192 # <-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
|
193 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
194 # in addition: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
195 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
196 # 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
|
197 # 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
|
198 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
199 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
|
200 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
201 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
|
202 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
|
203 "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
|
204 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
|
205 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
206 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
|
207 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
|
208 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
|
209 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
|
210 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
|
211 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
|
212 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
|
213 the pruned changesets. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
214 """ |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
215 # 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
|
216 # 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
|
217 unfi = repo.unfiltered() |
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 # 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
|
220 nm = unfi.changelog.nodemap |
33733
d5acd967f95a
obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents:
33731
diff
changeset
|
221 precursorsmarkers = unfi.obsstore.predecessors |
33143
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
222 successormarkers = unfi.obsstore.successors |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
223 childrenmarkers = unfi.obsstore.children |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
224 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
225 # 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
|
226 exclmarkers = set() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
227 # 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
|
228 nodes = set(nodes) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
229 # 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
|
230 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
231 # 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
|
232 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
|
233 stack.sort() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
234 # nodes already stacked |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
235 seennodes = set(stack) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
236 while stack: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
237 current = stack.pop() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
238 # fetch precursors markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
239 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
|
240 # 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
|
241 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
|
242 if not mark[1]: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
243 markers.append(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
244 # 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
|
245 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
|
246 if not mark[1]: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
247 markers.append(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
248 # traverse the markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
249 for mark in markers: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
250 if mark in exclmarkers: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
251 # markers already selected |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
252 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
253 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
254 # 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
|
255 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
256 # (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
|
257 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
|
258 exclmarkers.add(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
259 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
260 # 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
|
261 prec = mark[0] |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
262 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
263 # 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
|
264 if prec in seennodes: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
265 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
266 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
267 # 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
|
268 known = prec in nm |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
269 # 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
|
270 # stop here. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
271 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
|
272 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
273 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
274 # 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
|
275 # 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
|
276 # 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
|
277 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
|
278 if precmarkers.issubset(exclmarkers): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
279 seennodes.add(prec) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
280 stack.append(prec) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
281 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
282 return exclmarkers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
283 |
33146
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
284 def foreground(repo, nodes): |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
285 """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
|
286 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
287 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
|
288 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
|
289 augmented with obsolescence information. |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
290 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
291 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
|
292 """ |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
293 repo = repo.unfiltered() |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
294 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
|
295 if repo.obsstore: |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
296 # 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
|
297 # 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
|
298 nm = repo.changelog.nodemap |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
299 plen = -1 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
300 # 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
|
301 while len(foreground) != plen: |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
302 plen = len(foreground) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
303 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
|
304 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
|
305 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
|
306 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
|
307 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
|
308 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
|
309 |
34413
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
310 # logic around storing and using effect flags |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
311 EFFECTFLAGFIELD = "ef1" |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
312 |
34415
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
313 DESCCHANGED = 1 << 0 # action changed the description |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
314 METACHANGED = 1 << 1 # action change the meta |
34419
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
315 PARENTCHANGED = 1 << 2 # action change the parent |
34416
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
316 USERCHANGED = 1 << 4 # the user changed |
34417
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
317 DATECHANGED = 1 << 5 # the date changed |
34418
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
318 BRANCHCHANGED = 1 << 6 # the branch changed |
34415
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
319 |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
320 METABLACKLIST = [ |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
321 re.compile('^branch$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
322 re.compile('^.*-source$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
323 re.compile('^.*_source$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
324 re.compile('^source$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
325 ] |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
326 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
327 def metanotblacklisted(metaitem): |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
328 """ Check that the key of a meta item (extrakey, extravalue) does not |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
329 match at least one of the blacklist pattern |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
330 """ |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
331 metakey = metaitem[0] |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
332 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
333 return not any(pattern.match(metakey) for pattern in METABLACKLIST) |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
334 |
34413
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
335 def geteffectflag(relation): |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
336 """ From an obs-marker relation, compute what changed between the |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
337 predecessor and the successor. |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
338 """ |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
339 effects = 0 |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
340 |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
341 source = relation[0] |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
342 |
34415
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
343 for changectx in relation[1]: |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
344 # Check if description has changed |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
345 if changectx.description() != source.description(): |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
346 effects |= DESCCHANGED |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
347 |
34416
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
348 # Check if user has changed |
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
349 if changectx.user() != source.user(): |
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
350 effects |= USERCHANGED |
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
351 |
34417
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
352 # Check if date has changed |
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
353 if changectx.date() != source.date(): |
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
354 effects |= DATECHANGED |
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
355 |
34418
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
356 # Check if branch has changed |
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
357 if changectx.branch() != source.branch(): |
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
358 effects |= BRANCHCHANGED |
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
359 |
34419
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
360 # Check if at least one of the parent has changed |
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
361 if changectx.parents() != source.parents(): |
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
362 effects |= PARENTCHANGED |
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
363 |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
364 # Check if other meta has changed |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
365 changeextra = changectx.extra().items() |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
366 ctxmeta = filter(metanotblacklisted, changeextra) |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
367 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
368 sourceextra = source.extra().items() |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
369 srcmeta = filter(metanotblacklisted, sourceextra) |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
370 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
371 if ctxmeta != srcmeta: |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
372 effects |= METACHANGED |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
373 |
34413
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
374 return effects |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
375 |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
376 def getobsoleted(repo, tr): |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
377 """return the set of pre-existing revisions obsoleted by a transaction""" |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
378 torev = repo.unfiltered().changelog.nodemap.get |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
379 phase = repo._phasecache.phase |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
380 succsmarkers = repo.obsstore.successors.get |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
381 public = phases.public |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
382 addedmarkers = tr.changes.get('obsmarkers') |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
383 addedrevs = tr.changes.get('revs') |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
384 seenrevs = set(addedrevs) |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
385 obsoleted = set() |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
386 for mark in addedmarkers: |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
387 node = mark[0] |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
388 rev = torev(node) |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
389 if rev is None or rev in seenrevs: |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
390 continue |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
391 seenrevs.add(rev) |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
392 if phase(repo, rev) == public: |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
393 continue |
33713
888f24810ea2
obsutil: defend against succsmarkers() returning None
Augie Fackler <augie@google.com>
parents:
33274
diff
changeset
|
394 if set(succsmarkers(node) or []).issubset(addedmarkers): |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
395 obsoleted.add(rev) |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
396 return obsoleted |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
397 |
33909
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
398 class _succs(list): |
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
399 """small class to represent a successors with some metadata about it""" |
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
400 |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
401 def __init__(self, *args, **kwargs): |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
402 super(_succs, self).__init__(*args, **kwargs) |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
403 self.markers = set() |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
404 |
33910
dba493981284
obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents:
33909
diff
changeset
|
405 def copy(self): |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
406 new = _succs(self) |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
407 new.markers = self.markers.copy() |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
408 return new |
33910
dba493981284
obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents:
33909
diff
changeset
|
409 |
33941
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
410 @util.propertycache |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
411 def _set(self): |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
412 # immutable |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
413 return set(self) |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
414 |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
415 def canmerge(self, other): |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
416 return self._set.issubset(other._set) |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
417 |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
418 def successorssets(repo, initialnode, closest=False, cache=None): |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
419 """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
|
420 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
421 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
|
422 A. It succeeds A as a consistent whole, each revision being only a partial |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
423 replacement. By default, the successors set contains non-obsolete |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
424 changesets only, walking the obsolescence graph until reaching a leaf. If |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
425 'closest' is set to True, closest successors-sets are return (the |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
426 obsolescence walk stops on known changesets). |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
427 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
428 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
|
429 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
|
430 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
|
431 (see below). |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
432 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
433 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
|
434 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
|
435 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
|
436 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
|
437 [(A',)] or [], respectively. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
438 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
439 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
|
440 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
|
441 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
|
442 (A'')]. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
443 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
444 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
|
445 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
|
446 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
|
447 |
33272
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
448 Finally, final successors unknown locally are considered to be pruned |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
449 (pruned: obsoleted without any successors). (Final: successors not affected |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
450 by markers). |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
451 |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
452 The 'closest' mode respect the repoview filtering. For example, without |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
453 filter it will stop at the first locally known changeset, with 'visible' |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
454 filter it will stop on visible changesets). |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
455 |
33272
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
456 The optional `cache` parameter is a dictionary that may contains |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
457 precomputed successors sets. It is meant to reuse the computation of a |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
458 previous call to `successorssets` when multiple calls are made at the same |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
459 time. The cache dictionary is updated in place. The caller is responsible |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
460 for its life span. Code that makes multiple calls to `successorssets` |
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
461 *should* use this cache mechanism or risk a performance hit. |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
462 |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
463 Since results are different depending of the 'closest' most, the same cache |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
464 cannot be reused for both mode. |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
465 """ |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
466 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
467 succmarkers = repo.obsstore.successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
468 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
469 # 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
|
470 toproceed = [initialnode] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
471 # 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
|
472 # 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
|
473 stackedset = set(toproceed) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
474 if cache is None: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
475 cache = {} |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
476 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
477 # 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
|
478 # successors sets |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
479 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
480 # def successorssets(x): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
481 # successors = directsuccessors(x) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
482 # ss = [[]] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
483 # 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
|
484 # # 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
|
485 # 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
|
486 # return ss |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
487 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
488 # 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
|
489 # - 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
|
490 # - 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
|
491 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
492 # 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
|
493 # 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
|
494 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
495 # 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
|
496 # 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
|
497 # loop. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
498 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
499 # 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
|
500 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
501 # 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
|
502 # 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
|
503 while toproceed: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
504 # 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
|
505 # 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
|
506 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
507 # 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
|
508 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
509 # 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
|
510 # -> mission accomplished, pop it from the stack. |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
511 # 2) Stop the walk: |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
512 # default case: Node is not obsolete |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
513 # closest case: Node is known at this repo filter level |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
514 # -> the node is its own successors sets. Add it to the cache. |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
515 # 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
|
516 # -> 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
|
517 # 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
|
518 # -> 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
|
519 # cache. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
520 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
521 current = toproceed[-1] |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
522 |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
523 # case 2 condition is a bit hairy because of closest, |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
524 # we compute it on its own |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
525 case2condition = ((current not in succmarkers) |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
526 or (closest and current != initialnode |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
527 and current in repo)) |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
528 |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
529 if current in cache: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
530 # 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
|
531 stackedset.remove(toproceed.pop()) |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
532 elif case2condition: |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
533 # case (2): end of walk. |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
534 if current in repo: |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
535 # We have a valid successors. |
33909
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
536 cache[current] = [_succs((current,))] |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
537 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
538 # 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
|
539 # 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
|
540 cache[current] = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
541 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
542 # cases (3) and (4) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
543 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
544 # 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
|
545 # from case (4): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
546 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
547 # 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
|
548 # 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
|
549 # 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
|
550 # loop. (case 3) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
551 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
552 # 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
|
553 # 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
|
554 # 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
|
555 # 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
|
556 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
557 # 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
|
558 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
559 # 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
|
560 # in phase 2 itself. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
561 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
562 # 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
|
563 # - 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
|
564 # 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
|
565 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
566 # 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
|
567 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
568 # - 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
|
569 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
570 # 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
|
571 # 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
|
572 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
573 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
|
574 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
|
575 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
|
576 if suc in stackedset: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
577 # cycle breaking |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
578 cache[suc] = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
579 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
580 # 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
|
581 # 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
|
582 # `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
|
583 # iteration. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
584 toproceed.append(suc) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
585 stackedset.add(suc) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
586 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
587 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
588 continue |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
589 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
590 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
591 # 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
|
592 # successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
593 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
594 # 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
|
595 # 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
|
596 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
597 # 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
|
598 # 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
|
599 # markers. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
600 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
601 # 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
|
602 # 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
|
603 # 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
|
604 # 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
|
605 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
606 # 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
|
607 # 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
|
608 # another one. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
609 succssets = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
610 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
|
611 # successors sets contributed by this marker |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
612 base = _succs() |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
613 base.markers.add(mark) |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
614 markss = [base] |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
615 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
|
616 # 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
|
617 productresult = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
618 for prefix in markss: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
619 for suffix in cache[suc]: |
33910
dba493981284
obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents:
33909
diff
changeset
|
620 newss = prefix.copy() |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
621 newss.markers.update(suffix.markers) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
622 for part in suffix: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
623 # 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
|
624 # first entry wins. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
625 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
|
626 newss.append(part) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
627 productresult.append(newss) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
628 markss = productresult |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
629 succssets.extend(markss) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
630 # remove duplicated and subset |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
631 seen = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
632 final = [] |
33942
54c21114e41d
obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents:
33941
diff
changeset
|
633 candidates = sorted((s for s in succssets if s), |
54c21114e41d
obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents:
33941
diff
changeset
|
634 key=len, reverse=True) |
54c21114e41d
obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents:
33941
diff
changeset
|
635 for cand in candidates: |
33941
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
636 for seensuccs in seen: |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
637 if cand.canmerge(seensuccs): |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
638 seensuccs.markers.update(cand.markers) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
639 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
640 else: |
33941
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
641 final.append(cand) |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
642 seen.append(cand) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
643 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
|
644 cache[current] = final |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
645 return cache[initialnode] |
33912
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
646 |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
647 def successorsandmarkers(repo, ctx): |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
648 """compute the raw data needed for computing obsfate |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
649 Returns a list of dict, one dict per successors set |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
650 """ |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
651 if not ctx.obsolete(): |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
652 return None |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
653 |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
654 ssets = successorssets(repo, ctx.node(), closest=True) |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
655 |
33996
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
656 # closestsuccessors returns an empty list for pruned revisions, remap it |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
657 # into a list containing an empty list for future processing |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
658 if ssets == []: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
659 ssets = [[]] |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
660 |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
661 # Try to recover pruned markers |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
662 succsmap = repo.obsstore.successors |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
663 fullsuccessorsets = [] # successor set + markers |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
664 for sset in ssets: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
665 if sset: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
666 fullsuccessorsets.append(sset) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
667 else: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
668 # successorsset return an empty set() when ctx or one of its |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
669 # successors is pruned. |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
670 # In this case, walk the obs-markers tree again starting with ctx |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
671 # and find the relevant pruning obs-makers, the ones without |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
672 # successors. |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
673 # Having these markers allow us to compute some information about |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
674 # its fate, like who pruned this changeset and when. |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
675 |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
676 # XXX we do not catch all prune markers (eg rewritten then pruned) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
677 # (fix me later) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
678 foundany = False |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
679 for mark in succsmap.get(ctx.node(), ()): |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
680 if not mark[1]: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
681 foundany = True |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
682 sset = _succs() |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
683 sset.markers.add(mark) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
684 fullsuccessorsets.append(sset) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
685 if not foundany: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
686 fullsuccessorsets.append(_succs()) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
687 |
33912
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
688 values = [] |
33996
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
689 for sset in fullsuccessorsets: |
33912
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
690 values.append({'successors': sset, 'markers': sset.markers}) |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
691 |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
692 return values |
33993
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
693 |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
694 def successorsetverb(successorset): |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
695 """ Return the verb summarizing the successorset |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
696 """ |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
697 if not successorset: |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
698 verb = 'pruned' |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
699 elif len(successorset) == 1: |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
700 verb = 'rewritten' |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
701 else: |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
702 verb = 'split' |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
703 return verb |
33994
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
704 |
33995
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
705 def markersdates(markers): |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
706 """returns the list of dates for a list of markers |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
707 """ |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
708 return [m[4] for m in markers] |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
709 |
33994
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
710 def markersusers(markers): |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
711 """ Returns a sorted list of markers users without duplicates |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
712 """ |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
713 markersmeta = [dict(m[3]) for m in markers] |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
714 users = set(meta.get('user') for meta in markersmeta if meta.get('user')) |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
715 |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
716 return sorted(users) |
34287
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
717 |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
718 def markersoperations(markers): |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
719 """ Returns a sorted list of markers operations without duplicates |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
720 """ |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
721 markersmeta = [dict(m[3]) for m in markers] |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
722 operations = set(meta.get('operation') for meta in markersmeta |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
723 if meta.get('operation')) |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
724 |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
725 return sorted(operations) |