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