Mercurial > hg
annotate mercurial/obsutil.py @ 41247:a89b20a49c13
rust-cpython: using MissingAncestors from Python code
As precedently done with LazyAncestors on cpython.rs, we test for the
presence of the 'rustext' module.
incrementalmissingrevs() has two callers within the Mercurial core:
`setdiscovery.partialdiscovery` and the `only()` revset.
This move shows a significant discovery performance improvement
in cases where the baseline is slow: using perfdiscovery on the PyPy
repos, prepared with `contrib/discovery-helper <repo> 50 100`, we
get averaged medians of 403ms with the Rust version vs 742ms without
(about 45% better).
But there are still indications that performance can be worse in cases
the baseline is fast, possibly due to the conversion from Python to
Rust and back becoming the bottleneck. We could measure this on
mozilla-central in cases were the delta is just a few changesets.
This requires confirmation, but if that's the reason, then an
upcoming `partialdiscovery` fully in Rust should solve the problem.
Differential Revision: https://phab.mercurial-scm.org/D5551
author | Georges Racinet <georges.racinet@octobus.net> |
---|---|
date | Fri, 30 Nov 2018 14:35:57 +0100 |
parents | 191fac9ff9d3 |
children | 9de6c4f61608 |
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 |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
12 from .i18n import _ |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
13 from . import ( |
38588
1c93e0237a24
diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents:
38587
diff
changeset
|
14 diffutil, |
38707
6b5ca1d0aa1e
obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
38706
diff
changeset
|
15 encoding, |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
16 node as nodemod, |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
17 phases, |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
18 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
|
19 ) |
38568
f65e6095c5ac
obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
20 from .utils import ( |
f65e6095c5ac
obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
21 dateutil, |
f65e6095c5ac
obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
22 ) |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
23 |
36953
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
24 ### obsolescence marker flag |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
25 |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
26 ## bumpedfix flag |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
27 # |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
28 # When a changeset A' succeed to a changeset A which became public, we call A' |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
29 # "bumped" because it's a successors of a public changesets |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
30 # |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
31 # o A' (bumped) |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
32 # |`: |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
33 # | o A |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
34 # |/ |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
35 # o Z |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
36 # |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
37 # The way to solve this situation is to create a new changeset Ad as children |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
38 # of A. This changeset have the same content than A'. So the diff from A to A' |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
39 # is the same than the diff from A to Ad. Ad is marked as a successors of A' |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
40 # |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
41 # o Ad |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
42 # |`: |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
43 # | x A' |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
44 # |'| |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
45 # o | A |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
46 # |/ |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
47 # o Z |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
48 # |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
49 # But by transitivity Ad is also a successors of A. To avoid having Ad marked |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
50 # as bumped too, we add the `bumpedfix` flag to the marker. <A', (Ad,)>. |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
51 # This flag mean that the successors express the changes between the public and |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
52 # bumped version and fix the situation, breaking the transitivity of |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
53 # "bumped" here. |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
54 bumpedfix = 1 |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
55 usingsha256 = 2 |
b9bbcf9ffac1
obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents:
36607
diff
changeset
|
56 |
33148
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
57 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
|
58 """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
|
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 __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
|
61 # 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
|
62 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
|
63 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
|
64 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
|
65 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
66 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
|
67 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
|
68 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
69 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
|
70 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
|
71 return False |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
72 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
|
73 |
33731
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
74 def prednode(self): |
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
75 """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
|
76 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
|
77 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
78 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
|
79 """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
|
80 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
|
81 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
82 def parentnodes(self): |
33731
2cb442bc1a76
obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents:
33713
diff
changeset
|
83 """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
|
84 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
|
85 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
86 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
|
87 """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
|
88 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
|
89 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
90 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
|
91 """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
|
92 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
|
93 |
4e30168d7939
obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33146
diff
changeset
|
94 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
|
95 """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
|
96 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
|
97 |
33149
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
98 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
|
99 """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
|
100 |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
101 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
|
102 returned""" |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
103 if nodes is None: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
104 rawmarkers = repo.obsstore |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
105 elif exclusive: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
106 rawmarkers = exclusivemarkers(repo, nodes) |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
107 else: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
108 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
|
109 |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
110 for markerdata in rawmarkers: |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
111 yield marker(repo, markerdata) |
a14e2e7f7d1f
obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33148
diff
changeset
|
112 |
32879
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
113 def closestpredecessors(repo, nodeid): |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
114 """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
|
115 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
116 This function respect the repoview filtering, filtered revision will be |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
117 considered missing. |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
118 """ |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
119 |
33733
d5acd967f95a
obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents:
33731
diff
changeset
|
120 precursors = repo.obsstore.predecessors |
32879
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
121 stack = [nodeid] |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
122 seen = set(stack) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
123 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
124 while stack: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
125 current = stack.pop() |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
126 currentpreccs = precursors.get(current, ()) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
127 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
128 for prec in currentpreccs: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
129 precnodeid = prec[0] |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
130 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
131 # Basic cycle protection |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
132 if precnodeid in seen: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
133 continue |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
134 seen.add(precnodeid) |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
135 |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
136 if precnodeid in repo: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
137 yield precnodeid |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
138 else: |
1858fc2327ef
template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff
changeset
|
139 stack.append(precnodeid) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
140 |
33735
e6d8ee3c9ec3
obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents:
33733
diff
changeset
|
141 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
|
142 """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
|
143 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
144 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
|
145 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
146 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
|
147 initial nodes too.""" |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
148 |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
149 remaining = set(nodes) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
150 seen = set(remaining) |
40461
c7618901584d
obsutil: prefetch method in allpredecessors loop
Boris Feld <boris.feld@octobus.net>
parents:
39920
diff
changeset
|
151 prec = obsstore.predecessors.get |
33144
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
152 while remaining: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
153 current = remaining.pop() |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
154 yield current |
40461
c7618901584d
obsutil: prefetch method in allpredecessors loop
Boris Feld <boris.feld@octobus.net>
parents:
39920
diff
changeset
|
155 for mark in prec(current, ()): |
33144
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
156 # 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
|
157 if mark[2] & ignoreflags: |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
158 continue |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
159 suc = mark[0] |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
160 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
|
161 seen.add(suc) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
162 remaining.add(suc) |
d0e5bf12f314
obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33143
diff
changeset
|
163 |
33145
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
164 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
|
165 """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
|
166 |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
167 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
|
168 |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
169 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
|
170 initial nodes too.""" |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
171 remaining = set(nodes) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
172 seen = set(remaining) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
173 while remaining: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
174 current = remaining.pop() |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
175 yield current |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
176 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
|
177 # 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
|
178 if mark[2] & ignoreflags: |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
179 continue |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
180 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
|
181 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
|
182 seen.add(suc) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
183 remaining.add(suc) |
0a370b93cca2
obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33144
diff
changeset
|
184 |
33143
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
185 def _filterprunes(markers): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
186 """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
|
187 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
|
188 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
189 def exclusivemarkers(repo, nodes): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
190 """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
|
191 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
192 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
|
193 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
|
194 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
|
195 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
|
196 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
|
197 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
198 For example: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
199 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
200 # (A0 rewritten as A1) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
201 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
202 # 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
|
203 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
204 or |
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 # (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
|
207 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
208 # <-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
|
209 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
210 or |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
211 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
212 # (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
|
213 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
214 # <-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
|
215 # / |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
216 # <-1- A0 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
217 # \ |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
218 # <-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
|
219 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
220 # in addition: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
221 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
222 # 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
|
223 # 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
|
224 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
225 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
|
226 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
227 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
|
228 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
|
229 "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
|
230 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
|
231 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
232 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
|
233 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
|
234 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
|
235 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
|
236 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
|
237 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
|
238 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
|
239 the pruned changesets. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
240 """ |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
241 # 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
|
242 # 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
|
243 unfi = repo.unfiltered() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
244 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
245 # 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
|
246 nm = unfi.changelog.nodemap |
33733
d5acd967f95a
obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents:
33731
diff
changeset
|
247 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
|
248 successormarkers = unfi.obsstore.successors |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
249 childrenmarkers = unfi.obsstore.children |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
250 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
251 # 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
|
252 exclmarkers = set() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
253 # 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
|
254 nodes = set(nodes) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
255 # 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
|
256 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
257 # 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
|
258 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
|
259 stack.sort() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
260 # nodes already stacked |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
261 seennodes = set(stack) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
262 while stack: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
263 current = stack.pop() |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
264 # fetch precursors markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
265 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
|
266 # 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
|
267 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
|
268 if not mark[1]: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
269 markers.append(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
270 # 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
|
271 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
|
272 if not mark[1]: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
273 markers.append(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
274 # traverse the markers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
275 for mark in markers: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
276 if mark in exclmarkers: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
277 # markers already selected |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
278 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
279 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
280 # 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
|
281 # |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
282 # (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
|
283 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
|
284 exclmarkers.add(mark) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
285 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
286 # 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
|
287 prec = mark[0] |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
288 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
289 # 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
|
290 if prec in seennodes: |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
291 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
292 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
293 # 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
|
294 known = prec in nm |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
295 # 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
|
296 # stop here. |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
297 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
|
298 continue |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
299 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
300 # 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
|
301 # 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
|
302 # 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
|
303 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
|
304 if precmarkers.issubset(exclmarkers): |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
305 seennodes.add(prec) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
306 stack.append(prec) |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
307 |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
308 return exclmarkers |
d09ae850296d
obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33142
diff
changeset
|
309 |
33146
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
310 def foreground(repo, nodes): |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
311 """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
|
312 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
313 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
|
314 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
|
315 augmented with obsolescence information. |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
316 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
317 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
|
318 """ |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
319 repo = repo.unfiltered() |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
320 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
|
321 if repo.obsstore: |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
322 # 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
|
323 # 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
|
324 nm = repo.changelog.nodemap |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
325 plen = -1 |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
326 # 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
|
327 while len(foreground) != plen: |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
328 plen = len(foreground) |
7017567ebdf2
obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33145
diff
changeset
|
329 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
|
330 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
|
331 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
|
332 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
|
333 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
|
334 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
|
335 |
34422
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
336 # effectflag field |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
337 # |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
338 # Effect-flag is a 1-byte bit field used to store what changed between a |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
339 # changeset and its successor(s). |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
340 # |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
341 # The effect flag is stored in obs-markers metadata while we iterate on the |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
342 # information design. That's why we have the EFFECTFLAGFIELD. If we come up |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
343 # with an incompatible design for effect flag, we can store a new design under |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
344 # another field name so we don't break readers. We plan to extend the existing |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
345 # obsmarkers bit-field when the effect flag design will be stabilized. |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
346 # |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
347 # The effect-flag is placed behind an experimental flag |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
348 # `effect-flags` set to off by default. |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
349 # |
2fd06499dc8e
effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents:
34421
diff
changeset
|
350 |
34413
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
351 EFFECTFLAGFIELD = "ef1" |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
352 |
34415
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
353 DESCCHANGED = 1 << 0 # action changed the description |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
354 METACHANGED = 1 << 1 # action change the meta |
34421
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
355 DIFFCHANGED = 1 << 3 # action change diff introduced by the changeset |
34419
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
356 PARENTCHANGED = 1 << 2 # action change the parent |
34416
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
357 USERCHANGED = 1 << 4 # the user changed |
34417
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
358 DATECHANGED = 1 << 5 # the date changed |
34418
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
359 BRANCHCHANGED = 1 << 6 # the branch changed |
34415
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
360 |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
361 METABLACKLIST = [ |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
362 re.compile('^branch$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
363 re.compile('^.*-source$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
364 re.compile('^.*_source$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
365 re.compile('^source$'), |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
366 ] |
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 def metanotblacklisted(metaitem): |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
369 """ 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
|
370 match at least one of the blacklist pattern |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
371 """ |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
372 metakey = metaitem[0] |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
373 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
374 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
|
375 |
34421
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
376 def _prepare_hunk(hunk): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
377 """Drop all information but the username and patch""" |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
378 cleanhunk = [] |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
379 for line in hunk.splitlines(): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
380 if line.startswith(b'# User') or not line.startswith(b'#'): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
381 if line.startswith(b'@@'): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
382 line = b'@@\n' |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
383 cleanhunk.append(line) |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
384 return cleanhunk |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
385 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
386 def _getdifflines(iterdiff): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
387 """return a cleaned up lines""" |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
388 lines = next(iterdiff, None) |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
389 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
390 if lines is None: |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
391 return lines |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
392 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
393 return _prepare_hunk(lines) |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
394 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
395 def _cmpdiff(leftctx, rightctx): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
396 """return True if both ctx introduce the "same diff" |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
397 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
398 This is a first and basic implementation, with many shortcoming. |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
399 """ |
40528
520514af2d93
obsutil: clarify the access to "repo"
Boris Feld <boris.feld@octobus.net>
parents:
40461
diff
changeset
|
400 # lefctx.repo() and rightctx.repo() are the same here |
520514af2d93
obsutil: clarify the access to "repo"
Boris Feld <boris.feld@octobus.net>
parents:
40461
diff
changeset
|
401 repo = leftctx.repo() |
520514af2d93
obsutil: clarify the access to "repo"
Boris Feld <boris.feld@octobus.net>
parents:
40461
diff
changeset
|
402 diffopts = diffutil.diffallopts(repo.ui, {'git': True}) |
34421
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
403 # Leftctx or right ctx might be filtered, so we need to use the contexts |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
404 # with an unfiltered repository to safely compute the diff |
40528
520514af2d93
obsutil: clarify the access to "repo"
Boris Feld <boris.feld@octobus.net>
parents:
40461
diff
changeset
|
405 leftunfi = repo.unfiltered()[leftctx.rev()] |
38568
f65e6095c5ac
obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
406 leftdiff = leftunfi.diff(opts=diffopts) |
40528
520514af2d93
obsutil: clarify the access to "repo"
Boris Feld <boris.feld@octobus.net>
parents:
40461
diff
changeset
|
407 rightunfi = repo.unfiltered()[rightctx.rev()] |
38568
f65e6095c5ac
obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents:
38519
diff
changeset
|
408 rightdiff = rightunfi.diff(opts=diffopts) |
34421
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
409 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
410 left, right = (0, 0) |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
411 while None not in (left, right): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
412 left = _getdifflines(leftdiff) |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
413 right = _getdifflines(rightdiff) |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
414 |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
415 if left != right: |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
416 return False |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
417 return True |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
418 |
39920
bae6f1418a95
obsolete: explicitly pass relation items to effectflag computation
Boris Feld <boris.feld@octobus.net>
parents:
39325
diff
changeset
|
419 def geteffectflag(source, successors): |
34413
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
420 """ 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
|
421 predecessor and the successor. |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
422 """ |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
423 effects = 0 |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
424 |
39920
bae6f1418a95
obsolete: explicitly pass relation items to effectflag computation
Boris Feld <boris.feld@octobus.net>
parents:
39325
diff
changeset
|
425 for changectx in successors: |
34415
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
426 # Check if description has changed |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
427 if changectx.description() != source.description(): |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
428 effects |= DESCCHANGED |
51aadc0d0da2
effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents:
34413
diff
changeset
|
429 |
34416
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
430 # Check if user has changed |
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
431 if changectx.user() != source.user(): |
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
432 effects |= USERCHANGED |
55ef17ec8e59
effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents:
34415
diff
changeset
|
433 |
34417
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
434 # Check if date has changed |
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
435 if changectx.date() != source.date(): |
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
436 effects |= DATECHANGED |
54af8de9bd09
effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents:
34416
diff
changeset
|
437 |
34418
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
438 # Check if branch has changed |
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
439 if changectx.branch() != source.branch(): |
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
440 effects |= BRANCHCHANGED |
57980af73cfa
effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents:
34417
diff
changeset
|
441 |
34419
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
442 # 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
|
443 if changectx.parents() != source.parents(): |
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
444 effects |= PARENTCHANGED |
fa26f5891e68
effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents:
34418
diff
changeset
|
445 |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
446 # Check if other meta has changed |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
447 changeextra = changectx.extra().items() |
35875
c0a6733f7e7a
obsutil: work around filter() being a generator in Python 3
Augie Fackler <augie@google.com>
parents:
35610
diff
changeset
|
448 ctxmeta = list(filter(metanotblacklisted, changeextra)) |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
449 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
450 sourceextra = source.extra().items() |
35875
c0a6733f7e7a
obsutil: work around filter() being a generator in Python 3
Augie Fackler <augie@google.com>
parents:
35610
diff
changeset
|
451 srcmeta = list(filter(metanotblacklisted, sourceextra)) |
34420
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
452 |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
453 if ctxmeta != srcmeta: |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
454 effects |= METACHANGED |
95759620d492
effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents:
34419
diff
changeset
|
455 |
34421
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
456 # Check if the diff has changed |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
457 if not _cmpdiff(source, changectx): |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
458 effects |= DIFFCHANGED |
187bc224554a
effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents:
34420
diff
changeset
|
459 |
34413
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
460 return effects |
014d467f9d08
effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents:
34287
diff
changeset
|
461 |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
462 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
|
463 """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
|
464 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
|
465 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
|
466 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
|
467 public = phases.public |
39325
93175cba7edd
obsutil: make sure "addedmarkers" is not None in getobsoleted()
Martin von Zweigbergk <martinvonz@google.com>
parents:
39301
diff
changeset
|
468 addedmarkers = tr.changes['obsmarkers'] |
39301
5763216ba311
transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
39300
diff
changeset
|
469 origrepolen = tr.changes['origrepolen'] |
35308
137a08d82232
transaction: build changes['revs'] as range instead of a set
Joerg Sonnenberger <joerg@bec.de>
parents:
35010
diff
changeset
|
470 seenrevs = set() |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
471 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
|
472 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
|
473 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
|
474 rev = torev(node) |
39301
5763216ba311
transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents:
39300
diff
changeset
|
475 if rev is None or rev in seenrevs or rev >= origrepolen: |
33252
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
476 continue |
53b3a1968aa6
obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
33149
diff
changeset
|
477 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
|
478 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
|
479 continue |
33713
888f24810ea2
obsutil: defend against succsmarkers() returning None
Augie Fackler <augie@google.com>
parents:
33274
diff
changeset
|
480 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
|
481 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
|
482 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
|
483 |
33909
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
484 class _succs(list): |
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
485 """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
|
486 |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
487 def __init__(self, *args, **kwargs): |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
488 super(_succs, self).__init__(*args, **kwargs) |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
489 self.markers = set() |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
490 |
33910
dba493981284
obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents:
33909
diff
changeset
|
491 def copy(self): |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
492 new = _succs(self) |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
493 new.markers = self.markers.copy() |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
494 return new |
33910
dba493981284
obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents:
33909
diff
changeset
|
495 |
33941
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
496 @util.propertycache |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
497 def _set(self): |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
498 # immutable |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
499 return set(self) |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
500 |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
501 def canmerge(self, other): |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
502 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
|
503 |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
504 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
|
505 """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
|
506 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
507 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
|
508 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
|
509 replacement. By default, the successors set contains non-obsolete |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
510 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
|
511 '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
|
512 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
|
513 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
514 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
|
515 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
|
516 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
|
517 (see below). |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
518 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
519 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
|
520 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
|
521 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
|
522 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
|
523 [(A',)] or [], respectively. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
524 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
525 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
|
526 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
|
527 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
|
528 (A'')]. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
529 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
530 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
|
531 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
|
532 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
|
533 |
33272
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
534 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
|
535 (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
|
536 by markers). |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
537 |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
538 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
|
539 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
|
540 filter it will stop on visible changesets). |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
541 |
33272
df90f4d6c609
obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents:
33252
diff
changeset
|
542 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
|
543 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
|
544 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
|
545 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
|
546 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
|
547 *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
|
548 |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
549 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
|
550 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
|
551 """ |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
552 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
553 succmarkers = repo.obsstore.successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
554 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
555 # 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
|
556 toproceed = [initialnode] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
557 # 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
|
558 # 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
|
559 stackedset = set(toproceed) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
560 if cache is None: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
561 cache = {} |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
562 |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
563 # 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
|
564 # successors sets |
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 # def successorssets(x): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
567 # successors = directsuccessors(x) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
568 # ss = [[]] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
569 # 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
|
570 # # 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
|
571 # 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
|
572 # return ss |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
573 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
574 # 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
|
575 # - 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
|
576 # - 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
|
577 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
578 # 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
|
579 # 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
|
580 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
581 # 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
|
582 # 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
|
583 # loop. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
584 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
585 # 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
|
586 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
587 # 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
|
588 # 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
|
589 while toproceed: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
590 # 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
|
591 # 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
|
592 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
593 # 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
|
594 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
595 # 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
|
596 # -> mission accomplished, pop it from the stack. |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
597 # 2) Stop the walk: |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
598 # default case: Node is not obsolete |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
599 # 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
|
600 # -> 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
|
601 # 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
|
602 # -> 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
|
603 # 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
|
604 # -> 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
|
605 # cache. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
606 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
607 current = toproceed[-1] |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
608 |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
609 # 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
|
610 # we compute it on its own |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
611 case2condition = ((current not in succmarkers) |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
612 or (closest and current != initialnode |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
613 and current in repo)) |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
614 |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
615 if current in cache: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
616 # 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
|
617 stackedset.remove(toproceed.pop()) |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
618 elif case2condition: |
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
619 # 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
|
620 if current in repo: |
33274
68f3e819d41d
obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents:
33272
diff
changeset
|
621 # We have a valid successors. |
33909
84f72072bde6
obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents:
33857
diff
changeset
|
622 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
|
623 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
624 # 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
|
625 # 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
|
626 cache[current] = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
627 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
628 # cases (3) and (4) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
629 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
630 # 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
|
631 # from case (4): |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
632 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
633 # 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
|
634 # 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
|
635 # 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
|
636 # loop. (case 3) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
637 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
638 # 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
|
639 # 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
|
640 # 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
|
641 # 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
|
642 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
643 # 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
|
644 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
645 # 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
|
646 # in phase 2 itself. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
647 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
648 # 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
|
649 # - 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
|
650 # 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
|
651 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
652 # 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
|
653 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
654 # - 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
|
655 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
656 # 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
|
657 # 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
|
658 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
659 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
|
660 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
|
661 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
|
662 if suc in stackedset: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
663 # cycle breaking |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
664 cache[suc] = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
665 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
666 # 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
|
667 # 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
|
668 # `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
|
669 # iteration. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
670 toproceed.append(suc) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
671 stackedset.add(suc) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
672 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
673 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
674 continue |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
675 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
676 else: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
677 # 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
|
678 # successors |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
679 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
680 # 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
|
681 # 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
|
682 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
683 # 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
|
684 # 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
|
685 # markers. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
686 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
687 # 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
|
688 # 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
|
689 # 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
|
690 # 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
|
691 # |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
692 # 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
|
693 # 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
|
694 # another one. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
695 succssets = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
696 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
|
697 # successors sets contributed by this marker |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
698 base = _succs() |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
699 base.markers.add(mark) |
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
700 markss = [base] |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
701 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
|
702 # 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
|
703 productresult = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
704 for prefix in markss: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
705 for suffix in cache[suc]: |
33910
dba493981284
obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents:
33909
diff
changeset
|
706 newss = prefix.copy() |
33911
34e10e09afa5
obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents:
33910
diff
changeset
|
707 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
|
708 for part in suffix: |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
709 # 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
|
710 # first entry wins. |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
711 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
|
712 newss.append(part) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
713 productresult.append(newss) |
41152
191fac9ff9d3
obsutil: fix the issue5686
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
40528
diff
changeset
|
714 if productresult: |
191fac9ff9d3
obsutil: fix the issue5686
Sushil khanchi <sushilkhanchi97@gmail.com>
parents:
40528
diff
changeset
|
715 markss = productresult |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
716 succssets.extend(markss) |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
717 # remove duplicated and subset |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
718 seen = [] |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
719 final = [] |
33942
54c21114e41d
obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents:
33941
diff
changeset
|
720 candidates = sorted((s for s in succssets if s), |
54c21114e41d
obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents:
33941
diff
changeset
|
721 key=len, reverse=True) |
54c21114e41d
obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents:
33941
diff
changeset
|
722 for cand in candidates: |
33941
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
723 for seensuccs in seen: |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
724 if cand.canmerge(seensuccs): |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
725 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
|
726 break |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
727 else: |
33941
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
728 final.append(cand) |
c0bbaefc2c5a
obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents:
33912
diff
changeset
|
729 seen.append(cand) |
33142
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
730 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
|
731 cache[current] = final |
4f49810a1011
obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
32879
diff
changeset
|
732 return cache[initialnode] |
33912
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
733 |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
734 def successorsandmarkers(repo, ctx): |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
735 """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
|
736 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
|
737 """ |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
738 if not ctx.obsolete(): |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
739 return None |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
740 |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
741 ssets = successorssets(repo, ctx.node(), closest=True) |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
742 |
33996
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
743 # 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
|
744 # 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
|
745 if ssets == []: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
746 ssets = [[]] |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
747 |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
748 # Try to recover pruned markers |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
749 succsmap = repo.obsstore.successors |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
750 fullsuccessorsets = [] # successor set + markers |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
751 for sset in ssets: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
752 if sset: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
753 fullsuccessorsets.append(sset) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
754 else: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
755 # 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
|
756 # successors is pruned. |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
757 # 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
|
758 # 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
|
759 # successors. |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
760 # 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
|
761 # 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
|
762 |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
763 # 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
|
764 # (fix me later) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
765 foundany = False |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
766 for mark in succsmap.get(ctx.node(), ()): |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
767 if not mark[1]: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
768 foundany = True |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
769 sset = _succs() |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
770 sset.markers.add(mark) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
771 fullsuccessorsets.append(sset) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
772 if not foundany: |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
773 fullsuccessorsets.append(_succs()) |
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
774 |
33912
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
775 values = [] |
33996
98fa777cd7a1
template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents:
33995
diff
changeset
|
776 for sset in fullsuccessorsets: |
33912
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
777 values.append({'successors': sset, 'markers': sset.markers}) |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
778 |
e278d6d2d7d2
template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents:
33911
diff
changeset
|
779 return values |
33993
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
780 |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
781 def _getobsfate(successorssets): |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
782 """ Compute a changeset obsolescence fate based on its successorssets. |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
783 Successors can be the tipmost ones or the immediate ones. This function |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
784 return values are not meant to be shown directly to users, it is meant to |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
785 be used by internal functions only. |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
786 Returns one fate from the following values: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
787 - pruned |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
788 - diverged |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
789 - superseded |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
790 - superseded_split |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
791 """ |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
792 |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
793 if len(successorssets) == 0: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
794 # The commit has been pruned |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
795 return 'pruned' |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
796 elif len(successorssets) > 1: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
797 return 'diverged' |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
798 else: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
799 # No divergence, only one set of successors |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
800 successors = successorssets[0] |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
801 |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
802 if len(successors) == 1: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
803 return 'superseded' |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
804 else: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
805 return 'superseded_split' |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
806 |
35010
b81ad5b78a81
obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents:
34873
diff
changeset
|
807 def obsfateverb(successorset, markers): |
b81ad5b78a81
obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents:
34873
diff
changeset
|
808 """ Return the verb summarizing the successorset and potentially using |
b81ad5b78a81
obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents:
34873
diff
changeset
|
809 information from the markers |
33993
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
810 """ |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
811 if not successorset: |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
812 verb = 'pruned' |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
813 elif len(successorset) == 1: |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
814 verb = 'rewritten' |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
815 else: |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
816 verb = 'split' |
3d0f8918351b
template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents:
33942
diff
changeset
|
817 return verb |
33994
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
818 |
33995
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
819 def markersdates(markers): |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
820 """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
|
821 """ |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
822 return [m[4] for m in markers] |
c35c0f54f420
template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents:
33994
diff
changeset
|
823 |
33994
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
824 def markersusers(markers): |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
825 """ 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
|
826 """ |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
827 markersmeta = [dict(m[3]) for m in markers] |
38707
6b5ca1d0aa1e
obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
38706
diff
changeset
|
828 users = set(encoding.tolocal(meta['user']) for meta in markersmeta |
6b5ca1d0aa1e
obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents:
38706
diff
changeset
|
829 if meta.get('user')) |
33994
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
830 |
38f08eaba6b0
template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents:
33993
diff
changeset
|
831 return sorted(users) |
34287
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
832 |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
833 def markersoperations(markers): |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
834 """ 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
|
835 """ |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
836 markersmeta = [dict(m[3]) for m in markers] |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
837 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
|
838 if meta.get('operation')) |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
839 |
7cdc8c5a481a
templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents:
33996
diff
changeset
|
840 return sorted(operations) |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
841 |
37328
11d51e518808
obsutil: make obsfateprinter() less dependent on templater
Yuya Nishihara <yuya@tcha.org>
parents:
36954
diff
changeset
|
842 def obsfateprinter(ui, repo, successors, markers, formatctx): |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
843 """ Build a obsfate string for a single successorset using all obsfate |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
844 related function defined in obsutil |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
845 """ |
34850
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
846 quiet = ui.quiet |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
847 verbose = ui.verbose |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
848 normal = not verbose and not quiet |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
849 |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
850 line = [] |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
851 |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
852 # Verb |
35010
b81ad5b78a81
obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents:
34873
diff
changeset
|
853 line.append(obsfateverb(successors, markers)) |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
854 |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
855 # Operations |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
856 operations = markersoperations(markers) |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
857 if operations: |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
858 line.append(" using %s" % ", ".join(operations)) |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
859 |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
860 # Successors |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
861 if successors: |
37328
11d51e518808
obsutil: make obsfateprinter() less dependent on templater
Yuya Nishihara <yuya@tcha.org>
parents:
36954
diff
changeset
|
862 fmtsuccessors = [formatctx(repo[succ]) for succ in successors] |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
863 line.append(" as %s" % ", ".join(fmtsuccessors)) |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
864 |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
865 # Users |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
866 users = markersusers(markers) |
34850
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
867 # Filter out current user in not verbose mode to reduce amount of |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
868 # information |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
869 if not verbose: |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
870 currentuser = ui.username(acceptempty=True) |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
871 if len(users) == 1 and currentuser in users: |
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
872 users = None |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
873 |
34850
62a4ccf9784a
obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents:
34847
diff
changeset
|
874 if (verbose or normal) and users: |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
875 line.append(" by %s" % ", ".join(users)) |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
876 |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
877 # Date |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
878 dates = markersdates(markers) |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
879 |
34873
aa849cf5d089
obsfate: fix obsfate_printer with empty date list
Boris Feld <boris.feld@octobus.net>
parents:
34851
diff
changeset
|
880 if dates and verbose: |
34851
6f53a53245a2
obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents:
34850
diff
changeset
|
881 min_date = min(dates) |
6f53a53245a2
obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents:
34850
diff
changeset
|
882 max_date = max(dates) |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
883 |
34851
6f53a53245a2
obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents:
34850
diff
changeset
|
884 if min_date == max_date: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
35893
diff
changeset
|
885 fmtmin_date = dateutil.datestr(min_date, '%Y-%m-%d %H:%M %1%2') |
34851
6f53a53245a2
obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents:
34850
diff
changeset
|
886 line.append(" (at %s)" % fmtmin_date) |
6f53a53245a2
obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents:
34850
diff
changeset
|
887 else: |
36607
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
35893
diff
changeset
|
888 fmtmin_date = dateutil.datestr(min_date, '%Y-%m-%d %H:%M %1%2') |
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
35893
diff
changeset
|
889 fmtmax_date = dateutil.datestr(max_date, '%Y-%m-%d %H:%M %1%2') |
34851
6f53a53245a2
obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents:
34850
diff
changeset
|
890 line.append(" (between %s and %s)" % (fmtmin_date, fmtmax_date)) |
34847
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
891 |
e27f1f04c2cf
templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents:
34422
diff
changeset
|
892 return "".join(line) |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
893 |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
894 |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
895 filteredmsgtable = { |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
896 "pruned": _("hidden revision '%s' is pruned"), |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
897 "diverged": _("hidden revision '%s' has diverged"), |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
898 "superseded": _("hidden revision '%s' was rewritten as: %s"), |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
899 "superseded_split": _("hidden revision '%s' was split as: %s"), |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
900 "superseded_split_several": _("hidden revision '%s' was split as: %s and " |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
901 "%d more"), |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
902 } |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
903 |
35610
22c42bfbe7ab
visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net>
parents:
35609
diff
changeset
|
904 def _getfilteredreason(repo, changeid, ctx): |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
905 """return a human-friendly string on why a obsolete changeset is hidden |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
906 """ |
35610
22c42bfbe7ab
visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net>
parents:
35609
diff
changeset
|
907 successors = successorssets(repo, ctx.node()) |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
908 fate = _getobsfate(successors) |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
909 |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
910 # Be more precise in case the revision is superseded |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
911 if fate == 'pruned': |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
912 return filteredmsgtable['pruned'] % changeid |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
913 elif fate == 'diverged': |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
914 return filteredmsgtable['diverged'] % changeid |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
915 elif fate == 'superseded': |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
916 single_successor = nodemod.short(successors[0][0]) |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
917 return filteredmsgtable['superseded'] % (changeid, single_successor) |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
918 elif fate == 'superseded_split': |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
919 |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
920 succs = [] |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
921 for node_id in successors[0]: |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
922 succs.append(nodemod.short(node_id)) |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
923 |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
924 if len(succs) <= 2: |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
925 fmtsuccs = ', '.join(succs) |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
926 return filteredmsgtable['superseded_split'] % (changeid, fmtsuccs) |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
927 else: |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
928 firstsuccessors = ', '.join(succs[:2]) |
35571
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
929 remainingnumber = len(succs) - 2 |
265cd9e19d26
visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents:
35308
diff
changeset
|
930 |
35609
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
931 args = (changeid, firstsuccessors, remainingnumber) |
c026547454dd
visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents:
35571
diff
changeset
|
932 return filteredmsgtable['superseded_split_several'] % args |
36954
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
933 |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
934 def divergentsets(repo, ctx): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
935 """Compute sets of commits divergent with a given one""" |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
936 cache = {} |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
937 base = {} |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
938 for n in allpredecessors(repo.obsstore, [ctx.node()]): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
939 if n == ctx.node(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
940 # a node can't be a base for divergence with itself |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
941 continue |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
942 nsuccsets = successorssets(repo, n, cache) |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
943 for nsuccset in nsuccsets: |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
944 if ctx.node() in nsuccset: |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
945 # we are only interested in *other* successor sets |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
946 continue |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
947 if tuple(nsuccset) in base: |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
948 # we already know the latest base for this divergency |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
949 continue |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
950 base[tuple(nsuccset)] = n |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
951 return [{'divergentnodes': divset, 'commonpredecessor': b} |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
952 for divset, b in base.iteritems()] |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
953 |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
954 def whyunstable(repo, ctx): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
955 result = [] |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
956 if ctx.orphan(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
957 for parent in ctx.parents(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
958 kind = None |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
959 if parent.orphan(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
960 kind = 'orphan' |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
961 elif parent.obsolete(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
962 kind = 'obsolete' |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
963 if kind is not None: |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
964 result.append({'instability': 'orphan', |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
965 'reason': '%s parent' % kind, |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
966 'node': parent.hex()}) |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
967 if ctx.phasedivergent(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
968 predecessors = allpredecessors(repo.obsstore, [ctx.node()], |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
969 ignoreflags=bumpedfix) |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
970 immutable = [repo[p] for p in predecessors |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
971 if p in repo and not repo[p].mutable()] |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
972 for predecessor in immutable: |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
973 result.append({'instability': 'phase-divergent', |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
974 'reason': 'immutable predecessor', |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
975 'node': predecessor.hex()}) |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
976 if ctx.contentdivergent(): |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
977 dsets = divergentsets(repo, ctx) |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
978 for dset in dsets: |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
979 divnodes = [repo[n] for n in dset['divergentnodes']] |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
980 result.append({'instability': 'content-divergent', |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
981 'divergentnodes': divnodes, |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
982 'reason': 'predecessor', |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
983 'node': nodemod.hex(dset['commonpredecessor'])}) |
efc4fb344c05
debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents:
36953
diff
changeset
|
984 return result |