annotate mercurial/obsutil.py @ 43169:3941e7063d03

py3: call SMTP.has_extn() with an str Passing a bytes on Python 3 always returns False, thus starttls is not properly detected.
author Denis Laxalde <denis@laxalde.org>
date Thu, 10 Oct 2019 21:00:13 +0200
parents 8ff1ecfadcd1
children c8f1e8412db4 e513e87b0476
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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,
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
18 pycompat,
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
19 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
20 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
21 from .utils import dateutil
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
22
36953
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
23 ### obsolescence marker flag
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
24
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
25 ## bumpedfix flag
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
26 #
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
27 # 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
28 # "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
29 #
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
30 # o A' (bumped)
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
31 # |`:
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
32 # | o A
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
33 # |/
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
34 # o Z
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
35 #
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
36 # 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
37 # 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
38 # 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
39 #
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
40 # o Ad
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
41 # |`:
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
42 # | x A'
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
43 # |'|
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
44 # o | A
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
45 # |/
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
46 # o Z
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
47 #
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
48 # 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
49 # 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
50 # 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
51 # 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
52 # "bumped" here.
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
53 bumpedfix = 1
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
54 usingsha256 = 2
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
55
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
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
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
98
33149
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
99 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
100 """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
101
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
102 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
103 returned"""
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
104 if nodes is None:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
105 rawmarkers = repo.obsstore
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
106 elif exclusive:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
107 rawmarkers = exclusivemarkers(repo, nodes)
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
108 else:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
109 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
110
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
111 for markerdata in rawmarkers:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
112 yield marker(repo, markerdata)
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
113
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
114
32879
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
115 def closestpredecessors(repo, nodeid):
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
116 """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
117
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
118 This function respect the repoview filtering, filtered revision will be
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
119 considered missing.
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
120 """
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
121
33733
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33731
diff changeset
122 precursors = repo.obsstore.predecessors
32879
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
123 stack = [nodeid]
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
124 seen = set(stack)
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
125
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
126 while stack:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
127 current = stack.pop()
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
128 currentpreccs = precursors.get(current, ())
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
129
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
130 for prec in currentpreccs:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
131 precnodeid = prec[0]
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
132
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
133 # Basic cycle protection
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
134 if precnodeid in seen:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
135 continue
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
136 seen.add(precnodeid)
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
137
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
138 if precnodeid in repo:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
139 yield precnodeid
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
140 else:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
141 stack.append(precnodeid)
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
142
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
143
33735
e6d8ee3c9ec3 obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
144 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
145 """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
146
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
147 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
148
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
149 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
150 initial nodes too."""
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
151
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
152 remaining = set(nodes)
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
153 seen = set(remaining)
40461
c7618901584d obsutil: prefetch method in allpredecessors loop
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
154 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
155 while remaining:
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
156 current = remaining.pop()
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
157 yield current
40461
c7618901584d obsutil: prefetch method in allpredecessors loop
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
158 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
159 # 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
160 if mark[2] & ignoreflags:
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
161 continue
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
162 suc = mark[0]
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
163 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
164 seen.add(suc)
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
165 remaining.add(suc)
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33143
diff changeset
166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
167
33145
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
168 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
169 """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
170
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
171 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
172
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
173 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
174 initial nodes too."""
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
175 remaining = set(nodes)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
176 seen = set(remaining)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
177 while remaining:
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
178 current = remaining.pop()
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
179 yield current
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
180 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
181 # 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
182 if mark[2] & ignoreflags:
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
183 continue
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
184 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
185 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
186 seen.add(suc)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
187 remaining.add(suc)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33144
diff changeset
188
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
189
33143
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
190 def _filterprunes(markers):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
191 """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
192 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
193
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
194
33143
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
195 def exclusivemarkers(repo, nodes):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
196 """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
197
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
198 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
199 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
200 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
201 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
202 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
203
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
204 For example:
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 A1)
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 # 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
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 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
213 #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
214 # <-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
215
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
216 or
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 # (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
219 #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
220 # <-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
221 # /
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
222 # <-1- A0
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
223 # \
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
224 # <-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
225 #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
226 # in addition:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
227 #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
228 # 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
229 # 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
230
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
231 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
232
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
233 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
234 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
235 "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
236 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
237
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
238 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
239 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
240 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
241 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
242 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
243 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
244 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
245 the pruned changesets.
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
246 """
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
247 # 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
248 # 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
249 unfi = repo.unfiltered()
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 # 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
252 nm = unfi.changelog.nodemap
33733
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33731
diff changeset
253 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
254 successormarkers = unfi.obsstore.successors
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
255 childrenmarkers = unfi.obsstore.children
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 # 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
258 exclmarkers = set()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
259 # 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
260 nodes = set(nodes)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
261 # 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
262 #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
263 # 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
264 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
265 stack.sort()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
266 # nodes already stacked
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
267 seennodes = set(stack)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
268 while stack:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
269 current = stack.pop()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
270 # fetch precursors markers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
271 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
272 # 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
273 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
274 if not mark[1]:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
275 markers.append(mark)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
276 # 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
277 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
278 if not mark[1]:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
279 markers.append(mark)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
280 # traverse the markers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
281 for mark in markers:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
282 if mark in exclmarkers:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
283 # markers already selected
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
284 continue
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 # 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
287 #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
288 # (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
289 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
290 exclmarkers.add(mark)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
291
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
292 # 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
293 prec = mark[0]
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
294
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
295 # 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
296 if prec in seennodes:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
297 continue
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
298
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
299 # 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
300 known = prec in nm
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
301 # 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
302 # stop here.
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
303 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
304 continue
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
305
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
306 # 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
307 # 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
308 # 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
309 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
310 if precmarkers.issubset(exclmarkers):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
311 seennodes.add(prec)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
312 stack.append(prec)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
313
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
314 return exclmarkers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33142
diff changeset
315
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
316
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
317 def foreground(repo, nodes):
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
318 """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
319
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
320 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
321 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
322 augmented with obsolescence information.
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
323
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
324 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
325 """
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
326 repo = repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
327 foreground = set(repo.set(b'%ln::', nodes))
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
328 if repo.obsstore:
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
329 # 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
330 # 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
331 nm = repo.changelog.nodemap
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
332 plen = -1
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
333 # 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
334 while len(foreground) != plen:
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
335 plen = len(foreground)
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
336 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
337 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
338 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
339 known = (n for n in succs if n in nm)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
340 foreground = set(repo.set(b'%ln::', known))
33146
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33145
diff changeset
341 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
342
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
343
34422
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
344 # effectflag field
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
345 #
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
346 # 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
347 # changeset and its successor(s).
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
348 #
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
349 # 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
350 # 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
351 # 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
352 # 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
353 # 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
354 #
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
355 # The effect-flag is placed behind an experimental flag
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
356 # `effect-flags` set to off by default.
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
357 #
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
358
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
359 EFFECTFLAGFIELD = b"ef1"
34413
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34287
diff changeset
360
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
361 DESCCHANGED = 1 << 0 # action changed the description
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
362 METACHANGED = 1 << 1 # action change the meta
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
363 DIFFCHANGED = 1 << 3 # action change diff introduced by the changeset
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
364 PARENTCHANGED = 1 << 2 # action change the parent
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
365 USERCHANGED = 1 << 4 # the user changed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
366 DATECHANGED = 1 << 5 # the date changed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
367 BRANCHCHANGED = 1 << 6 # the branch changed
34415
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34413
diff changeset
368
34420
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
369 METABLACKLIST = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
370 re.compile(b'^branch$'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
371 re.compile(b'^.*-source$'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
372 re.compile(b'^.*_source$'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
373 re.compile(b'^source$'),
34420
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
374 ]
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
375
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
376
34420
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
377 def metanotblacklisted(metaitem):
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
378 """ 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
379 match at least one of the blacklist pattern
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
380 """
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
381 metakey = metaitem[0]
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
382
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
383 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
384
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
385
34421
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
386 def _prepare_hunk(hunk):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
387 """Drop all information but the username and patch"""
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
388 cleanhunk = []
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
389 for line in hunk.splitlines():
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
390 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
391 if line.startswith(b'@@'):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
392 line = b'@@\n'
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
393 cleanhunk.append(line)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
394 return cleanhunk
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
395
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
396
34421
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
397 def _getdifflines(iterdiff):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
398 """return a cleaned up lines"""
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
399 lines = next(iterdiff, None)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
400
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
401 if lines is None:
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
402 return lines
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
403
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
404 return _prepare_hunk(lines)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
405
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
406
34421
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
407 def _cmpdiff(leftctx, rightctx):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
408 """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
409
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
410 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
411 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
412 diffopts = diffutil.diffallopts(leftctx.repo().ui, {b'git': True})
41713
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
413
34421
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
414 # 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
415 # with an unfiltered repository to safely compute the diff
41713
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
416
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
417 # leftctx and rightctx can be from different repository views in case of
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
418 # hgsubversion, do don't try to access them from same repository
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
419 # rightctx.repo() and leftctx.repo() are not always the same
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
420 leftunfi = leftctx._repo.unfiltered()[leftctx.rev()]
38568
f65e6095c5ac obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38519
diff changeset
421 leftdiff = leftunfi.diff(opts=diffopts)
41713
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
422 rightunfi = rightctx._repo.unfiltered()[rightctx.rev()]
38568
f65e6095c5ac obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38519
diff changeset
423 rightdiff = rightunfi.diff(opts=diffopts)
34421
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
424
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
425 left, right = (0, 0)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
426 while None not in (left, right):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
427 left = _getdifflines(leftdiff)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
428 right = _getdifflines(rightdiff)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
429
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
430 if left != right:
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
431 return False
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
432 return True
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
433
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
434
39920
bae6f1418a95 obsolete: explicitly pass relation items to effectflag computation
Boris Feld <boris.feld@octobus.net>
parents: 39325
diff changeset
435 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
436 """ 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
437 predecessor and the successor.
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34287
diff changeset
438 """
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34287
diff changeset
439 effects = 0
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34287
diff changeset
440
39920
bae6f1418a95 obsolete: explicitly pass relation items to effectflag computation
Boris Feld <boris.feld@octobus.net>
parents: 39325
diff changeset
441 for changectx in successors:
34415
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34413
diff changeset
442 # Check if description has changed
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34413
diff changeset
443 if changectx.description() != source.description():
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34413
diff changeset
444 effects |= DESCCHANGED
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34413
diff changeset
445
34416
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34415
diff changeset
446 # Check if user has changed
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34415
diff changeset
447 if changectx.user() != source.user():
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34415
diff changeset
448 effects |= USERCHANGED
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34415
diff changeset
449
34417
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
450 # Check if date has changed
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
451 if changectx.date() != source.date():
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
452 effects |= DATECHANGED
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
453
34418
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
454 # Check if branch has changed
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
455 if changectx.branch() != source.branch():
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
456 effects |= BRANCHCHANGED
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
457
34419
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
458 # 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
459 if changectx.parents() != source.parents():
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
460 effects |= PARENTCHANGED
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
461
34420
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
462 # Check if other meta has changed
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
463 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
464 ctxmeta = list(filter(metanotblacklisted, changeextra))
34420
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
465
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
466 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
467 srcmeta = list(filter(metanotblacklisted, sourceextra))
34420
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
468
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
469 if ctxmeta != srcmeta:
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
470 effects |= METACHANGED
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
471
34421
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
472 # Check if the diff has changed
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
473 if not _cmpdiff(source, changectx):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
474 effects |= DIFFCHANGED
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
475
34413
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34287
diff changeset
476 return effects
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34287
diff changeset
477
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
478
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
479 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
480 """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
481 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
482 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
483 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
484 public = phases.public
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
485 addedmarkers = tr.changes[b'obsmarkers']
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
486 origrepolen = tr.changes[b'origrepolen']
35308
137a08d82232 transaction: build changes['revs'] as range instead of a set
Joerg Sonnenberger <joerg@bec.de>
parents: 35010
diff changeset
487 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
488 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
489 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
490 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
491 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
492 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
493 continue
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
494 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
495 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
496 continue
33713
888f24810ea2 obsutil: defend against succsmarkers() returning None
Augie Fackler <augie@google.com>
parents: 33274
diff changeset
497 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
498 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
499 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
500
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
501
33909
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33857
diff changeset
502 class _succs(list):
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33857
diff changeset
503 """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
504
33911
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
505 def __init__(self, *args, **kwargs):
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
506 super(_succs, self).__init__(*args, **kwargs)
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
507 self.markers = set()
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
508
33910
dba493981284 obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents: 33909
diff changeset
509 def copy(self):
33911
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
510 new = _succs(self)
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
511 new.markers = self.markers.copy()
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
512 return new
33910
dba493981284 obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents: 33909
diff changeset
513
33941
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
514 @util.propertycache
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
515 def _set(self):
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
516 # immutable
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
517 return set(self)
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
518
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
519 def canmerge(self, other):
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
520 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
521
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
522
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
523 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
524 """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
525
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
526 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
527 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
528 replacement. By default, the successors set contains non-obsolete
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
529 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
530 '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
531 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
532
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
533 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
534 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
535 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
536 (see below).
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
537
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
538 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
539 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
540 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
541 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
542 [(A',)] or [], respectively.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
543
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
544 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
545 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
546 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
547 (A'')].
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
548
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
549 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
550 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
551 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
552
33272
df90f4d6c609 obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
553 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
554 (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
555 by markers).
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
556
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
557 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
558 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
559 filter it will stop on visible changesets).
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
560
33272
df90f4d6c609 obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
561 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
562 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
563 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
564 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
565 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
566 *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
567
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
568 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
569 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
570 """
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
571
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
572 succmarkers = repo.obsstore.successors
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 # 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
575 toproceed = [initialnode]
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
576 # 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
577 # 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
578 stackedset = set(toproceed)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
579 if cache is None:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
580 cache = {}
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
581
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
582 # 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
583 # successors sets
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 # def successorssets(x):
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
586 # successors = directsuccessors(x)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
587 # ss = [[]]
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
588 # 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
589 # # 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
590 # 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
591 # return ss
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 # 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
594 # - 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
595 # - 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
596 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
597 # 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
598 # 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
599 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
600 # 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
601 # 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
602 # loop.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
603 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
604 # 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
605 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
606 # 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
607 # 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
608 while toproceed:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
609 # 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
610 # 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
611 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
612 # 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
613 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
614 # 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
615 # -> mission accomplished, pop it from the stack.
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
616 # 2) Stop the walk:
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
617 # default case: Node is not obsolete
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
618 # 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
619 # -> 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
620 # 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
621 # -> 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
622 # 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
623 # -> 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
624 # cache.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
625 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
626 current = toproceed[-1]
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
627
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
628 # 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
629 # we compute it on its own
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
630 case2condition = (current not in succmarkers) or (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
631 closest and current != initialnode and current in repo
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
632 )
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
633
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
634 if current in cache:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
635 # 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
636 stackedset.remove(toproceed.pop())
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
637 elif case2condition:
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
638 # 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
639 if current in repo:
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
640 # We have a valid successors.
33909
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33857
diff changeset
641 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
642 else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
643 # 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
644 # 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
645 cache[current] = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
646 else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
647 # cases (3) and (4)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
648 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
649 # 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
650 # from case (4):
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 # 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
653 # 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
654 # 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
655 # loop. (case 3)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
656 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
657 # 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
658 # 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
659 # 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
660 # 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
661 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
662 # 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
663 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
664 # 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
665 # in phase 2 itself.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
666 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
667 # 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
668 # - 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
669 # 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
670 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
671 # 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
672 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
673 # - 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
674 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
675 # 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
676 # 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
677 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
678 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
679 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
680 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
681 if suc in stackedset:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
682 # cycle breaking
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
683 cache[suc] = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
684 else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
685 # 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
686 # 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
687 # `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
688 # iteration.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
689 toproceed.append(suc)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
690 stackedset.add(suc)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
691 break
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
692 else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
693 continue
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
694 break
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
695 else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
696 # 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
697 # successors
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
698 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
699 # 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
700 # 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
701 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
702 # 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
703 # 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
704 # markers.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
705 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
706 # 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
707 # 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
708 # 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
709 # 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
710 #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
711 # 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
712 # 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
713 # another one.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
714 succssets = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
715 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
716 # successors sets contributed by this marker
33911
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
717 base = _succs()
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
718 base.markers.add(mark)
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
719 markss = [base]
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
720 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
721 # 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
722 productresult = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
723 for prefix in markss:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
724 for suffix in cache[suc]:
33910
dba493981284 obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents: 33909
diff changeset
725 newss = prefix.copy()
33911
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33910
diff changeset
726 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
727 for part in suffix:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
728 # 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
729 # first entry wins.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
730 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
731 newss.append(part)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
732 productresult.append(newss)
41152
191fac9ff9d3 obsutil: fix the issue5686
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 40528
diff changeset
733 if productresult:
191fac9ff9d3 obsutil: fix the issue5686
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 40528
diff changeset
734 markss = productresult
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
735 succssets.extend(markss)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
736 # remove duplicated and subset
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
737 seen = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
738 final = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
739 candidates = sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
740 (s for s in succssets if s), key=len, reverse=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
741 )
33942
54c21114e41d obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents: 33941
diff changeset
742 for cand in candidates:
33941
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
743 for seensuccs in seen:
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
744 if cand.canmerge(seensuccs):
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
745 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
746 break
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
747 else:
33941
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
748 final.append(cand)
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33912
diff changeset
749 seen.append(cand)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
750 final.reverse() # put small successors set first
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
751 cache[current] = final
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32879
diff changeset
752 return cache[initialnode]
33912
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
753
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
754
33912
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
755 def successorsandmarkers(repo, ctx):
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
756 """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
757 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
758 """
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
759 if not ctx.obsolete():
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
760 return None
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
761
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
762 ssets = successorssets(repo, ctx.node(), closest=True)
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
763
33996
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
764 # 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
765 # 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
766 if ssets == []:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
767 ssets = [[]]
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
768
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
769 # Try to recover pruned markers
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
770 succsmap = repo.obsstore.successors
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
771 fullsuccessorsets = [] # successor set + markers
33996
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
772 for sset in ssets:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
773 if sset:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
774 fullsuccessorsets.append(sset)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
775 else:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
776 # 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
777 # successors is pruned.
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
778 # 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
779 # 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
780 # successors.
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
781 # 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
782 # 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
783
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
784 # 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
785 # (fix me later)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
786 foundany = False
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
787 for mark in succsmap.get(ctx.node(), ()):
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
788 if not mark[1]:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
789 foundany = True
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
790 sset = _succs()
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
791 sset.markers.add(mark)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
792 fullsuccessorsets.append(sset)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
793 if not foundany:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
794 fullsuccessorsets.append(_succs())
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
795
33912
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
796 values = []
33996
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 33995
diff changeset
797 for sset in fullsuccessorsets:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
798 values.append({b'successors': sset, b'markers': sset.markers})
33912
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
799
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33911
diff changeset
800 return values
33993
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33942
diff changeset
801
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
802
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
803 def _getobsfate(successorssets):
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
804 """ 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
805 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
806 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
807 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
808 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
809 - pruned
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
810 - diverged
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
811 - superseded
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
812 - superseded_split
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
813 """
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
814
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
815 if len(successorssets) == 0:
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
816 # The commit has been pruned
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
817 return b'pruned'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
818 elif len(successorssets) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
819 return b'diverged'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
820 else:
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
821 # 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
822 successors = successorssets[0]
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
823
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
824 if len(successors) == 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
825 return b'superseded'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
826 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
827 return b'superseded_split'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
828
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
829
35010
b81ad5b78a81 obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents: 34873
diff changeset
830 def obsfateverb(successorset, markers):
b81ad5b78a81 obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents: 34873
diff changeset
831 """ 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
832 information from the markers
33993
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33942
diff changeset
833 """
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33942
diff changeset
834 if not successorset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
835 verb = b'pruned'
33993
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33942
diff changeset
836 elif len(successorset) == 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
837 verb = b'rewritten'
33993
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33942
diff changeset
838 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
839 verb = b'split'
33993
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33942
diff changeset
840 return verb
33994
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 33993
diff changeset
841
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
842
33995
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 33994
diff changeset
843 def markersdates(markers):
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 33994
diff changeset
844 """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
845 """
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 33994
diff changeset
846 return [m[4] for m in markers]
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 33994
diff changeset
847
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
848
33994
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 33993
diff changeset
849 def markersusers(markers):
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 33993
diff changeset
850 """ 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
851 """
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 33993
diff changeset
852 markersmeta = [dict(m[3]) for m in markers]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
853 users = set(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
854 encoding.tolocal(meta[b'user'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
855 for meta in markersmeta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
856 if meta.get(b'user')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
857 )
33994
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 33993
diff changeset
858
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 33993
diff changeset
859 return sorted(users)
34287
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33996
diff changeset
860
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
861
34287
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33996
diff changeset
862 def markersoperations(markers):
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33996
diff changeset
863 """ 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
864 """
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33996
diff changeset
865 markersmeta = [dict(m[3]) for m in markers]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
866 operations = set(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
867 meta.get(b'operation') for meta in markersmeta if meta.get(b'operation')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
868 )
34287
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33996
diff changeset
869
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 33996
diff changeset
870 return sorted(operations)
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
871
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
872
37328
11d51e518808 obsutil: make obsfateprinter() less dependent on templater
Yuya Nishihara <yuya@tcha.org>
parents: 36954
diff changeset
873 def obsfateprinter(ui, repo, successors, markers, formatctx):
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
874 """ 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
875 related function defined in obsutil
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
876 """
34850
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
877 quiet = ui.quiet
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
878 verbose = ui.verbose
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
879 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
880
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
881 line = []
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
882
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
883 # Verb
35010
b81ad5b78a81 obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents: 34873
diff changeset
884 line.append(obsfateverb(successors, markers))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
885
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
886 # Operations
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
887 operations = markersoperations(markers)
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
888 if operations:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
889 line.append(b" using %s" % b", ".join(operations))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
890
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
891 # Successors
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
892 if successors:
37328
11d51e518808 obsutil: make obsfateprinter() less dependent on templater
Yuya Nishihara <yuya@tcha.org>
parents: 36954
diff changeset
893 fmtsuccessors = [formatctx(repo[succ]) for succ in successors]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
894 line.append(b" as %s" % b", ".join(fmtsuccessors))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
895
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
896 # Users
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
897 users = markersusers(markers)
34850
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
898 # 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
899 # information
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
900 if not verbose:
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
901 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
902 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
903 users = None
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
904
34850
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
905 if (verbose or normal) and users:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
906 line.append(b" by %s" % b", ".join(users))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
907
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
908 # Date
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
909 dates = markersdates(markers)
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
910
34873
aa849cf5d089 obsfate: fix obsfate_printer with empty date list
Boris Feld <boris.feld@octobus.net>
parents: 34851
diff changeset
911 if dates and verbose:
34851
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
912 min_date = min(dates)
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
913 max_date = max(dates)
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
914
34851
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
915 if min_date == max_date:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
916 fmtmin_date = dateutil.datestr(min_date, b'%Y-%m-%d %H:%M %1%2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
917 line.append(b" (at %s)" % fmtmin_date)
34851
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
918 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
919 fmtmin_date = dateutil.datestr(min_date, b'%Y-%m-%d %H:%M %1%2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
920 fmtmax_date = dateutil.datestr(max_date, b'%Y-%m-%d %H:%M %1%2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
921 line.append(b" (between %s and %s)" % (fmtmin_date, fmtmax_date))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
922
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
923 return b"".join(line)
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
924
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
925
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
926 filteredmsgtable = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
927 b"pruned": _(b"hidden revision '%s' is pruned"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
928 b"diverged": _(b"hidden revision '%s' has diverged"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
929 b"superseded": _(b"hidden revision '%s' was rewritten as: %s"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
930 b"superseded_split": _(b"hidden revision '%s' was split as: %s"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
931 b"superseded_split_several": _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
932 b"hidden revision '%s' was split as: %s and %d more"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
933 ),
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
934 }
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
935
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
936
35610
22c42bfbe7ab visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net>
parents: 35609
diff changeset
937 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
938 """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
939 """
35610
22c42bfbe7ab visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net>
parents: 35609
diff changeset
940 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
941 fate = _getobsfate(successors)
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
942
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
943 # Be more precise in case the revision is superseded
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
944 if fate == b'pruned':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
945 return filteredmsgtable[b'pruned'] % changeid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
946 elif fate == b'diverged':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
947 return filteredmsgtable[b'diverged'] % changeid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
948 elif fate == b'superseded':
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
949 single_successor = nodemod.short(successors[0][0])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
950 return filteredmsgtable[b'superseded'] % (changeid, single_successor)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
951 elif fate == b'superseded_split':
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
952
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
953 succs = []
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
954 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
955 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
956
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
957 if len(succs) <= 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
958 fmtsuccs = b', '.join(succs)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
959 return filteredmsgtable[b'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
960 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
961 firstsuccessors = b', '.join(succs[:2])
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
962 remainingnumber = len(succs) - 2
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35308
diff changeset
963
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
964 args = (changeid, firstsuccessors, remainingnumber)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
965 return filteredmsgtable[b'superseded_split_several'] % args
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
966
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
967
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
968 def divergentsets(repo, ctx):
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
969 """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
970 cache = {}
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
971 base = {}
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
972 for n in allpredecessors(repo.obsstore, [ctx.node()]):
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
973 if n == ctx.node():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
974 # 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
975 continue
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
976 nsuccsets = successorssets(repo, n, cache)
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
977 for nsuccset in nsuccsets:
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
978 if ctx.node() in nsuccset:
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
979 # we are only interested in *other* successor sets
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
980 continue
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
981 if tuple(nsuccset) in base:
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
982 # 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
983 continue
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
984 base[tuple(nsuccset)] = n
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
985 return [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
986 {b'divergentnodes': divset, b'commonpredecessor': b}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
987 for divset, b in pycompat.iteritems(base)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
988 ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
989
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
990
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
991 def whyunstable(repo, ctx):
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
992 result = []
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
993 if ctx.orphan():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
994 for parent in ctx.parents():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
995 kind = None
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
996 if parent.orphan():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
997 kind = b'orphan'
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
998 elif parent.obsolete():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
999 kind = b'obsolete'
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1000 if kind is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1001 result.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1002 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1003 b'instability': b'orphan',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1004 b'reason': b'%s parent' % kind,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1005 b'node': parent.hex(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1006 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1007 )
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1008 if ctx.phasedivergent():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1009 predecessors = allpredecessors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1010 repo.obsstore, [ctx.node()], ignoreflags=bumpedfix
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1011 )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1012 immutable = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1013 repo[p] for p in predecessors if p in repo and not repo[p].mutable()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1014 ]
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1015 for predecessor in immutable:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1016 result.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1017 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1018 b'instability': b'phase-divergent',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1019 b'reason': b'immutable predecessor',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1020 b'node': predecessor.hex(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1021 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1022 )
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1023 if ctx.contentdivergent():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1024 dsets = divergentsets(repo, ctx)
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1025 for dset in dsets:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1026 divnodes = [repo[n] for n in dset[b'divergentnodes']]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1027 result.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1028 {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1029 b'instability': b'content-divergent',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1030 b'divergentnodes': divnodes,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1031 b'reason': b'predecessor',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
1032 b'node': nodemod.hex(dset[b'commonpredecessor']),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1033 }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41713
diff changeset
1034 )
36954
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
1035 return result