mercurial/obsutil.py
author Pierre-Yves David <pierre-yves.david@octobus.net>
Sat, 10 Jul 2021 14:05:59 +0200
changeset 47625 7bafe40ab78a
parent 46419 d35063ebd761
child 48469 fff5942d445f
permissions -rw-r--r--
windows: use abspath in extensions We replace `os.path.abspath` with `util.abspath`. This should solve more "drive capitalization" issue on Windows. Differential Revision: https://phab.mercurial-scm.org/D11062
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
32897
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
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
    10
import re
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
    11
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
    12
from .i18n import _
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    13
from .node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    14
    hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    15
    short,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
    16
)
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
    17
from . import (
38589
1c93e0237a24 diffutil: move the module out of utils package
Yuya Nishihara <yuya@tcha.org>
parents: 38588
diff changeset
    18
    diffutil,
38707
6b5ca1d0aa1e obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38706
diff changeset
    19
    encoding,
45076
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
    20
    error,
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
    21
    phases,
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    22
    pycompat,
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
    23
    util,
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
    24
)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
    25
from .utils import dateutil
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
    26
36959
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    27
### obsolescence marker flag
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    28
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    29
## bumpedfix flag
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    30
#
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    31
# 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: 36636
diff changeset
    32
# "bumped" because it's a successors of a public changesets
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    33
#
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    34
# o    A' (bumped)
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    35
# |`:
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    36
# | o  A
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    37
# |/
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    38
# o    Z
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    39
#
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    40
# 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: 36636
diff changeset
    41
# 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: 36636
diff changeset
    42
# 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: 36636
diff changeset
    43
#
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    44
# o   Ad
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    45
# |`:
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    46
# | x A'
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    47
# |'|
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    48
# o | A
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    49
# |/
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    50
# o Z
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    51
#
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    52
# 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: 36636
diff changeset
    53
# 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: 36636
diff changeset
    54
# 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: 36636
diff changeset
    55
# bumped version and fix the situation, breaking the transitivity of
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    56
# "bumped" here.
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    57
bumpedfix = 1
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    58
usingsha256 = 2
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36636
diff changeset
    59
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
    60
33154
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    61
class marker(object):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    62
    """Wrap obsolete marker raw data"""
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    63
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    64
    def __init__(self, repo, data):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    65
        # 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: 33152
diff changeset
    66
        self._repo = repo
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    67
        self._data = data
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    68
        self._decodedmeta = None
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    69
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    70
    def __hash__(self):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    71
        return hash(self._data)
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    72
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    73
    def __eq__(self, other):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    74
        if type(other) != type(self):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    75
            return False
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    76
        return self._data == other._data
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    77
33757
2cb442bc1a76 obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents: 33739
diff changeset
    78
    def prednode(self):
2cb442bc1a76 obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents: 33739
diff changeset
    79
        """Predecessor changeset node identifier"""
33154
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    80
        return self._data[0]
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    81
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    82
    def succnodes(self):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    83
        """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: 33152
diff changeset
    84
        return self._data[1]
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    85
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    86
    def parentnodes(self):
33757
2cb442bc1a76 obsmarker: rename precnode into prednode
Boris Feld <boris.feld@octobus.net>
parents: 33739
diff changeset
    87
        """Parents of the predecessors (None if not recorded)"""
33154
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    88
        return self._data[5]
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    89
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    90
    def metadata(self):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    91
        """Decoded metadata dictionary"""
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    92
        return dict(self._data[3])
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    93
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    94
    def date(self):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    95
        """Creation date as (unixtime, offset)"""
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    96
        return self._data[4]
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    97
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    98
    def flags(self):
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
    99
        """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: 33152
diff changeset
   100
        return self._data[2]
4e30168d7939 obsutil: move the 'marker' class to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33152
diff changeset
   101
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   102
33155
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   103
def getmarkers(repo, nodes=None, exclusive=False):
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   104
    """returns markers known in a repository
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   105
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   106
    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: 33154
diff changeset
   107
    returned"""
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   108
    if nodes is None:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   109
        rawmarkers = repo.obsstore
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   110
    elif exclusive:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   111
        rawmarkers = exclusivemarkers(repo, nodes)
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   112
    else:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   113
        rawmarkers = repo.obsstore.relevantmarkers(nodes)
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   114
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   115
    for markerdata in rawmarkers:
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   116
        yield marker(repo, markerdata)
a14e2e7f7d1f obsutil: move 'getmarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33154
diff changeset
   117
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   118
43426
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   119
def sortedmarkers(markers):
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   120
    # last item of marker tuple ('parents') may be None or a tuple
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   121
    return sorted(markers, key=lambda m: m[:-1] + (m[-1] or (),))
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   122
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   123
32897
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   124
def closestpredecessors(repo, nodeid):
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   125
    """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
   126
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   127
    This function respect the repoview filtering, filtered revision will be
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   128
    considered missing.
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   129
    """
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   130
33759
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33757
diff changeset
   131
    precursors = repo.obsstore.predecessors
32897
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   132
    stack = [nodeid]
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   133
    seen = set(stack)
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   134
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   135
    while stack:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   136
        current = stack.pop()
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   137
        currentpreccs = precursors.get(current, ())
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   138
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   139
        for prec in currentpreccs:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   140
            precnodeid = prec[0]
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   141
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   142
            # Basic cycle protection
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   143
            if precnodeid in seen:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   144
                continue
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   145
            seen.add(precnodeid)
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   146
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   147
            if precnodeid in repo:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   148
                yield precnodeid
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   149
            else:
1858fc2327ef template: add predecessors template
Boris Feld <boris.feld@octobus.net>
parents:
diff changeset
   150
                stack.append(precnodeid)
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   151
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   152
33761
e6d8ee3c9ec3 obsutil: rename allprecursors into allpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33759
diff changeset
   153
def allpredecessors(obsstore, nodes, ignoreflags=0):
33150
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   154
    """Yield node for every precursors of <nodes>.
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   155
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   156
    Some precursors may be unknown locally.
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   157
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   158
    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: 33149
diff changeset
   159
    initial nodes too."""
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   160
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   161
    remaining = set(nodes)
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   162
    seen = set(remaining)
40513
c7618901584d obsutil: prefetch method in allpredecessors loop
Boris Feld <boris.feld@octobus.net>
parents: 39925
diff changeset
   163
    prec = obsstore.predecessors.get
33150
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   164
    while remaining:
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   165
        current = remaining.pop()
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   166
        yield current
40513
c7618901584d obsutil: prefetch method in allpredecessors loop
Boris Feld <boris.feld@octobus.net>
parents: 39925
diff changeset
   167
        for mark in prec(current, ()):
33150
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   168
            # ignore marker flagged with specified flag
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   169
            if mark[2] & ignoreflags:
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   170
                continue
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   171
            suc = mark[0]
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   172
            if suc not in seen:
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   173
                seen.add(suc)
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   174
                remaining.add(suc)
d0e5bf12f314 obsutil: move 'allprecursors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33149
diff changeset
   175
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   176
33151
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   177
def allsuccessors(obsstore, nodes, ignoreflags=0):
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   178
    """Yield node for every successor of <nodes>.
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   179
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   180
    Some successors may be unknown locally.
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   181
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   182
    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: 33150
diff changeset
   183
    initial nodes too."""
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   184
    remaining = set(nodes)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   185
    seen = set(remaining)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   186
    while remaining:
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   187
        current = remaining.pop()
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   188
        yield current
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   189
        for mark in obsstore.successors.get(current, ()):
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   190
            # ignore marker flagged with specified flag
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   191
            if mark[2] & ignoreflags:
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   192
                continue
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   193
            for suc in mark[1]:
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   194
                if suc not in seen:
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   195
                    seen.add(suc)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   196
                    remaining.add(suc)
0a370b93cca2 obsutil: move 'allsuccessors' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33150
diff changeset
   197
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   198
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   199
def _filterprunes(markers):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   200
    """return a set with no prune markers"""
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   201
    return {m for m in markers if m[1]}
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   202
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   203
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   204
def exclusivemarkers(repo, nodes):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   205
    """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: 33148
diff changeset
   206
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   207
    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: 33148
diff changeset
   208
    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: 33148
diff changeset
   209
    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: 33148
diff changeset
   210
    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: 33148
diff changeset
   211
    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: 33148
diff changeset
   212
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   213
    For example:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   214
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   215
        # (A0 rewritten as A1)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   216
        #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   217
        # 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: 33148
diff changeset
   218
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   219
        or
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   220
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   221
        # (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: 33148
diff changeset
   222
        #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   223
        # <-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: 33148
diff changeset
   224
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   225
        or
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   226
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   227
        # (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: 33148
diff changeset
   228
        #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   229
        #          <-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: 33148
diff changeset
   230
        #        /
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   231
        # <-1- A0
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   232
        #        \
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   233
        #         <-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: 33148
diff changeset
   234
        #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   235
        # in addition:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   236
        #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   237
        #  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: 33148
diff changeset
   238
        #  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: 33148
diff changeset
   239
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   240
        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: 33148
diff changeset
   241
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   242
    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: 33148
diff changeset
   243
    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: 33148
diff changeset
   244
    "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: 33148
diff changeset
   245
    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: 33148
diff changeset
   246
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   247
    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: 33148
diff changeset
   248
    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: 33148
diff changeset
   249
    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: 33148
diff changeset
   250
    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: 33148
diff changeset
   251
    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: 33148
diff changeset
   252
    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: 33148
diff changeset
   253
    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: 33148
diff changeset
   254
    the pruned changesets.
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   255
    """
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   256
    # 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: 33148
diff changeset
   257
    # 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: 33148
diff changeset
   258
    unfi = repo.unfiltered()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   259
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   260
    # shortcut to various useful item
43588
c8f1e8412db4 index: use `index.has_node` in `obsutil.exclusivemarkers`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   261
    has_node = unfi.changelog.index.has_node
33759
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33757
diff changeset
   262
    precursorsmarkers = unfi.obsstore.predecessors
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   263
    successormarkers = unfi.obsstore.successors
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   264
    childrenmarkers = unfi.obsstore.children
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   265
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   266
    # exclusive markers (return of the function)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   267
    exclmarkers = set()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   268
    # we need fast membership testing
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   269
    nodes = set(nodes)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   270
    # looking for head in the obshistory
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   271
    #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   272
    # 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: 33148
diff changeset
   273
    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: 33148
diff changeset
   274
    stack.sort()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   275
    # nodes already stacked
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   276
    seennodes = set(stack)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   277
    while stack:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   278
        current = stack.pop()
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   279
        # fetch precursors markers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   280
        markers = list(precursorsmarkers.get(current, ()))
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   281
        # extend the list with prune markers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   282
        for mark in successormarkers.get(current, ()):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   283
            if not mark[1]:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   284
                markers.append(mark)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   285
        # and markers from children (looking for prune)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   286
        for mark in childrenmarkers.get(current, ()):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   287
            if not mark[1]:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   288
                markers.append(mark)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   289
        # traverse the markers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   290
        for mark in markers:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   291
            if mark in exclmarkers:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   292
                # markers already selected
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   293
                continue
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   294
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   295
            # 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: 33148
diff changeset
   296
            #
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   297
            # (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: 33148
diff changeset
   298
            if mark[1] or mark[0] == current:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   299
                exclmarkers.add(mark)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   300
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   301
            # should we keep traversing through the precursors?
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   302
            prec = mark[0]
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   303
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   304
            # nodes in the stack or already processed
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   305
            if prec in seennodes:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   306
                continue
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   307
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   308
            # is this a locally known node ?
43588
c8f1e8412db4 index: use `index.has_node` in `obsutil.exclusivemarkers`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43117
diff changeset
   309
            known = has_node(prec)
33149
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   310
            # 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: 33148
diff changeset
   311
            # stop here.
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   312
            if known and prec not in nodes:
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   313
                continue
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   314
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   315
            # 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: 33148
diff changeset
   316
            # 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: 33148
diff changeset
   317
            # 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: 33148
diff changeset
   318
            precmarkers = _filterprunes(successormarkers.get(prec))
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   319
            if precmarkers.issubset(exclmarkers):
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   320
                seennodes.add(prec)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   321
                stack.append(prec)
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   322
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   323
    return exclmarkers
d09ae850296d obsutil: move 'exclusivemarkers' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33148
diff changeset
   324
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   325
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   326
def foreground(repo, nodes):
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   327
    """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: 33151
diff changeset
   328
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   329
    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: 33151
diff changeset
   330
    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: 33151
diff changeset
   331
    augmented with obsolescence information.
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   332
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   333
    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: 33151
diff changeset
   334
    """
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   335
    repo = repo.unfiltered()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   336
    foreground = set(repo.set(b'%ln::', nodes))
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   337
    if repo.obsstore:
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   338
        # 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: 33151
diff changeset
   339
        # XXX will probably deserve an optimised revset.
43589
1944aaaecabf index: use `index.has_node` in `obsutil.foreground`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43588
diff changeset
   340
        has_node = repo.changelog.index.has_node
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   341
        plen = -1
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   342
        # 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: 33151
diff changeset
   343
        while len(foreground) != plen:
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   344
            plen = len(foreground)
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   345
            succs = {c.node() for c in foreground}
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   346
            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: 33151
diff changeset
   347
            succs.update(allsuccessors(repo.obsstore, mutable))
43589
1944aaaecabf index: use `index.has_node` in `obsutil.foreground`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43588
diff changeset
   348
            known = (n for n in succs if has_node(n))
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   349
            foreground = set(repo.set(b'%ln::', known))
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   350
    return {c.node() for c in foreground}
33152
7017567ebdf2 obsutil: move 'foreground' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33151
diff changeset
   351
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   352
34423
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   353
# effectflag field
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   354
#
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   355
# 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: 34422
diff changeset
   356
# changeset and its successor(s).
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   357
#
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   358
# 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: 34422
diff changeset
   359
# 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: 34422
diff changeset
   360
# 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: 34422
diff changeset
   361
# 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: 34422
diff changeset
   362
# obsmarkers bit-field when the effect flag design will be stabilized.
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   363
#
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   364
# The effect-flag is placed behind an experimental flag
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   365
# `effect-flags` set to off by default.
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   366
#
2fd06499dc8e effectflag: document effect flag
Boris Feld <boris.feld@octobus.net>
parents: 34422
diff changeset
   367
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   368
EFFECTFLAGFIELD = b"ef1"
34414
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   369
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   370
DESCCHANGED = 1 << 0  # action changed the description
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   371
METACHANGED = 1 << 1  # action change the meta
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   372
DIFFCHANGED = 1 << 3  # action change diff introduced by the changeset
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   373
PARENTCHANGED = 1 << 2  # action change the parent
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   374
USERCHANGED = 1 << 4  # the user changed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   375
DATECHANGED = 1 << 5  # the date changed
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   376
BRANCHCHANGED = 1 << 6  # the branch changed
34416
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34414
diff changeset
   377
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   378
METABLACKLIST = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   379
    re.compile(b'^branch$'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   380
    re.compile(b'^.*-source$'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   381
    re.compile(b'^.*_source$'),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   382
    re.compile(b'^source$'),
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   383
]
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   384
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   385
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   386
def metanotblacklisted(metaitem):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   387
    """Check that the key of a meta item (extrakey, extravalue) does not
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   388
    match at least one of the blacklist pattern
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   389
    """
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   390
    metakey = metaitem[0]
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   391
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   392
    return not any(pattern.match(metakey) for pattern in METABLACKLIST)
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   393
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   394
34422
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   395
def _prepare_hunk(hunk):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   396
    """Drop all information but the username and patch"""
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   397
    cleanhunk = []
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   398
    for line in hunk.splitlines():
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   399
        if line.startswith(b'# User') or not line.startswith(b'#'):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   400
            if line.startswith(b'@@'):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   401
                line = b'@@\n'
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   402
            cleanhunk.append(line)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   403
    return cleanhunk
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   404
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   405
34422
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   406
def _getdifflines(iterdiff):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   407
    """return a cleaned up lines"""
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   408
    lines = next(iterdiff, None)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   409
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   410
    if lines is None:
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   411
        return lines
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   412
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   413
    return _prepare_hunk(lines)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   414
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   415
34422
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   416
def _cmpdiff(leftctx, rightctx):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   417
    """return True if both ctx introduce the "same diff"
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   418
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   419
    This is a first and basic implementation, with many shortcoming.
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   420
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   421
    diffopts = diffutil.diffallopts(leftctx.repo().ui, {b'git': True})
41724
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   422
34422
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   423
    # 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: 34421
diff changeset
   424
    # with an unfiltered repository to safely compute the diff
41724
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   425
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   426
    # leftctx and rightctx can be from different repository views in case of
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   427
    # hgsubversion, do don't try to access them from same repository
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   428
    # rightctx.repo() and leftctx.repo() are not always the same
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   429
    leftunfi = leftctx._repo.unfiltered()[leftctx.rev()]
38569
f65e6095c5ac obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38523
diff changeset
   430
    leftdiff = leftunfi.diff(opts=diffopts)
41724
9de6c4f61608 obsutil: don't assume leftctx and rightctx repo as same
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41152
diff changeset
   431
    rightunfi = rightctx._repo.unfiltered()[rightctx.rev()]
38569
f65e6095c5ac obsutil: pass a diffopts object to context.diff
Boris Feld <boris.feld@octobus.net>
parents: 38523
diff changeset
   432
    rightdiff = rightunfi.diff(opts=diffopts)
34422
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   433
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   434
    left, right = (0, 0)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   435
    while None not in (left, right):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   436
        left = _getdifflines(leftdiff)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   437
        right = _getdifflines(rightdiff)
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   438
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   439
        if left != right:
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   440
            return False
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   441
    return True
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   442
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   443
39925
bae6f1418a95 obsolete: explicitly pass relation items to effectflag computation
Boris Feld <boris.feld@octobus.net>
parents: 39352
diff changeset
   444
def geteffectflag(source, successors):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   445
    """From an obs-marker relation, compute what changed between the
34414
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   446
    predecessor and the successor.
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   447
    """
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   448
    effects = 0
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   449
39925
bae6f1418a95 obsolete: explicitly pass relation items to effectflag computation
Boris Feld <boris.feld@octobus.net>
parents: 39352
diff changeset
   450
    for changectx in successors:
34416
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34414
diff changeset
   451
        # Check if description has changed
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34414
diff changeset
   452
        if changectx.description() != source.description():
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34414
diff changeset
   453
            effects |= DESCCHANGED
51aadc0d0da2 effectflag: detect when description changed
Boris Feld <boris.feld@octobus.net>
parents: 34414
diff changeset
   454
34417
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
   455
        # Check if user has changed
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
   456
        if changectx.user() != source.user():
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
   457
            effects |= USERCHANGED
55ef17ec8e59 effectflag: detect when user changed
Boris Feld <boris.feld@octobus.net>
parents: 34416
diff changeset
   458
34418
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
   459
        # Check if date has changed
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
   460
        if changectx.date() != source.date():
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
   461
            effects |= DATECHANGED
54af8de9bd09 effectflag: detect when date changed
Boris Feld <boris.feld@octobus.net>
parents: 34417
diff changeset
   462
34419
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
   463
        # Check if branch has changed
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
   464
        if changectx.branch() != source.branch():
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
   465
            effects |= BRANCHCHANGED
57980af73cfa effectflag: detect when branch changed
Boris Feld <boris.feld@octobus.net>
parents: 34418
diff changeset
   466
34420
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
   467
        # Check if at least one of the parent has changed
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
   468
        if changectx.parents() != source.parents():
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
   469
            effects |= PARENTCHANGED
fa26f5891e68 effectflag: detect when parents changed
Boris Feld <boris.feld@octobus.net>
parents: 34419
diff changeset
   470
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   471
        # Check if other meta has changed
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   472
        changeextra = changectx.extra().items()
35915
c0a6733f7e7a obsutil: work around filter() being a generator in Python 3
Augie Fackler <augie@google.com>
parents: 35610
diff changeset
   473
        ctxmeta = list(filter(metanotblacklisted, changeextra))
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   474
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   475
        sourceextra = source.extra().items()
35915
c0a6733f7e7a obsutil: work around filter() being a generator in Python 3
Augie Fackler <augie@google.com>
parents: 35610
diff changeset
   476
        srcmeta = list(filter(metanotblacklisted, sourceextra))
34421
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   477
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   478
        if ctxmeta != srcmeta:
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   479
            effects |= METACHANGED
95759620d492 effectflag: detect when meta changed
Boris Feld <boris.feld@octobus.net>
parents: 34420
diff changeset
   480
34422
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   481
        # Check if the diff has changed
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   482
        if not _cmpdiff(source, changectx):
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   483
            effects |= DIFFCHANGED
187bc224554a effectflag: detect when diff changed
Boris Feld <boris.feld@octobus.net>
parents: 34421
diff changeset
   484
34414
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   485
    return effects
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34294
diff changeset
   486
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   487
45076
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   488
def getobsoleted(repo, tr=None, changes=None):
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   489
    """return the set of pre-existing revisions obsoleted by a transaction
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   490
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   491
    Either the transaction or changes item of the transaction (for hooks)
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   492
    must be provided, but not both.
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   493
    """
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   494
    if (tr is None) == (changes is None):
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   495
        e = b"exactly one of tr and changes must be provided"
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   496
        raise error.ProgrammingError(e)
43605
acaff50079ff index: use `index.get_rev` in `obsutil.getobsoleted`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43589
diff changeset
   497
    torev = repo.unfiltered().changelog.index.get_rev
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   498
    phase = repo._phasecache.phase
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   499
    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: 33155
diff changeset
   500
    public = phases.public
45076
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   501
    if changes is None:
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   502
        changes = tr.changes
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   503
    addedmarkers = changes[b'obsmarkers']
04ef381000a8 hooklib: fix detection of successors for changeset_obsoleted
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   504
    origrepolen = changes[b'origrepolen']
35317
137a08d82232 transaction: build changes['revs'] as range instead of a set
Joerg Sonnenberger <joerg@bec.de>
parents: 35049
diff changeset
   505
    seenrevs = set()
33252
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   506
    obsoleted = set()
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   507
    for mark in addedmarkers:
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   508
        node = mark[0]
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   509
        rev = torev(node)
39328
5763216ba311 transaction: remember original len(repo) instead of tracking added revs (API)
Yuya Nishihara <yuya@tcha.org>
parents: 39327
diff changeset
   510
        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: 33155
diff changeset
   511
            continue
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   512
        seenrevs.add(rev)
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   513
        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: 33155
diff changeset
   514
            continue
33739
888f24810ea2 obsutil: defend against succsmarkers() returning None
Augie Fackler <augie@google.com>
parents: 33274
diff changeset
   515
        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: 33155
diff changeset
   516
            obsoleted.add(rev)
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   517
    return obsoleted
53b3a1968aa6 obsolete: reports the number of local changeset obsoleted when unbundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33155
diff changeset
   518
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   519
33927
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33878
diff changeset
   520
class _succs(list):
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33878
diff changeset
   521
    """small class to represent a successors with some metadata about it"""
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33878
diff changeset
   522
33929
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   523
    def __init__(self, *args, **kwargs):
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   524
        super(_succs, self).__init__(*args, **kwargs)
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   525
        self.markers = set()
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   526
33928
dba493981284 obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents: 33927
diff changeset
   527
    def copy(self):
33929
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   528
        new = _succs(self)
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   529
        new.markers = self.markers.copy()
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   530
        return new
33928
dba493981284 obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents: 33927
diff changeset
   531
33959
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   532
    @util.propertycache
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   533
    def _set(self):
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   534
        # immutable
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   535
        return set(self)
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   536
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   537
    def canmerge(self, other):
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   538
        return self._set.issubset(other._set)
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   539
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   540
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   541
def successorssets(repo, initialnode, closest=False, cache=None):
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   542
    """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: 32897
diff changeset
   543
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   544
    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: 32897
diff changeset
   545
    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
   546
    replacement. By default, the successors set contains non-obsolete
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   547
    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
   548
    '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
   549
    obsolescence walk stops on known changesets).
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   550
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   551
    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: 32897
diff changeset
   552
    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: 32897
diff changeset
   553
    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: 32897
diff changeset
   554
    (see below).
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   555
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   556
    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: 32897
diff changeset
   557
    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: 32897
diff changeset
   558
    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: 32897
diff changeset
   559
    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: 32897
diff changeset
   560
    [(A',)] or [], respectively.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   561
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   562
    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: 32897
diff changeset
   563
    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: 32897
diff changeset
   564
    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: 32897
diff changeset
   565
    (A'')].
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   566
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   567
    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: 32897
diff changeset
   568
    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: 32897
diff changeset
   569
    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: 32897
diff changeset
   570
33272
df90f4d6c609 obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
   571
    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
   572
    (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
   573
    by markers).
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   574
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   575
    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
   576
    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
   577
    filter it will stop on visible changesets).
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   578
33272
df90f4d6c609 obsolete: small doc update for 'successorssets'
Boris Feld <boris.feld@octobus.net>
parents: 33252
diff changeset
   579
    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
   580
    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
   581
    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
   582
    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
   583
    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
   584
    *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
   585
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   586
    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
   587
    cannot be reused for both mode.
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   588
    """
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   589
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   590
    succmarkers = repo.obsstore.successors
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   591
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   592
    # 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: 32897
diff changeset
   593
    toproceed = [initialnode]
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   594
    # 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: 32897
diff changeset
   595
    # 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: 32897
diff changeset
   596
    stackedset = set(toproceed)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   597
    if cache is None:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   598
        cache = {}
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   599
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   600
    # 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: 32897
diff changeset
   601
    # successors sets
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   602
    #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   603
    # def successorssets(x):
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   604
    #    successors = directsuccessors(x)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   605
    #    ss = [[]]
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   606
    #    for succ in directsuccessors(x):
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   607
    #        # product as in itertools cartesian product
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   608
    #        ss = product(ss, successorssets(succ))
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   609
    #    return ss
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   610
    #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   611
    # 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: 32897
diff changeset
   612
    # - that would blow the python call stack
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   613
    # - 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: 32897
diff changeset
   614
    #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   615
    # 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: 32897
diff changeset
   616
    # successors set for are stacked there.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   617
    #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   618
    # 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: 32897
diff changeset
   619
    # 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: 32897
diff changeset
   620
    # loop.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   621
    #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   622
    # 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: 32897
diff changeset
   623
    #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   624
    # 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: 32897
diff changeset
   625
    # for the node requested by the caller.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   626
    while toproceed:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   627
        # 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: 32897
diff changeset
   628
        # node of the stack: CURRENT.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   629
        #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   630
        # There are four possible outcomes:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   631
        #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   632
        # 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: 32897
diff changeset
   633
        #    -> mission accomplished, pop it from the stack.
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   634
        # 2) Stop the walk:
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   635
        #    default case: Node is not obsolete
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   636
        #    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
   637
        #      -> the node is its own successors sets. Add it to the cache.
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   638
        # 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: 32897
diff changeset
   639
        #    -> We add those successors to the stack.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   640
        # 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: 32897
diff changeset
   641
        #    -> 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: 32897
diff changeset
   642
        #       cache.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   643
        #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   644
        current = toproceed[-1]
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   645
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   646
        # 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
   647
        # we compute it on its own
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   648
        case2condition = (current not in succmarkers) or (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   649
            closest and current != initialnode and current in repo
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   650
        )
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   651
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   652
        if current in cache:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   653
            # 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: 32897
diff changeset
   654
            stackedset.remove(toproceed.pop())
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   655
        elif case2condition:
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   656
            # case (2): end of walk.
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   657
            if current in repo:
33274
68f3e819d41d obsolete: closest divergent support
Boris Feld <boris.feld@octobus.net>
parents: 33272
diff changeset
   658
                # We have a valid successors.
33927
84f72072bde6 obsolete: introduce a _succs class
Boris Feld <boris.feld@octobus.net>
parents: 33878
diff changeset
   659
                cache[current] = [_succs((current,))]
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   660
            else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   661
                # Final obsolete version is unknown locally.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   662
                # 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: 32897
diff changeset
   663
                cache[current] = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   664
        else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   665
            # cases (3) and (4)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   666
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   667
            # 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: 32897
diff changeset
   668
            # from case (4):
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   669
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   670
            #     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: 32897
diff changeset
   671
            #     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: 32897
diff changeset
   672
            #     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: 32897
diff changeset
   673
            #     loop. (case 3)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   674
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   675
            #     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: 32897
diff changeset
   676
            #     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: 32897
diff changeset
   677
            #     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: 32897
diff changeset
   678
            #     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: 32897
diff changeset
   679
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   680
            #     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: 32897
diff changeset
   681
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   682
            # 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: 32897
diff changeset
   683
            # in phase 2 itself.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   684
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   685
            # 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: 32897
diff changeset
   686
            # - 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: 32897
diff changeset
   687
            #   precursor (successors markers of CURRENT).
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   688
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   689
            #   Having multiple entry here means divergence.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   690
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   691
            # - 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: 32897
diff changeset
   692
            #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   693
            #   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: 32897
diff changeset
   694
            #   single successors are standard replacement.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   695
            #
43426
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   696
            for mark in sortedmarkers(succmarkers[current]):
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   697
                for suc in mark[1]:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   698
                    if suc not in cache:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   699
                        if suc in stackedset:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   700
                            # cycle breaking
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   701
                            cache[suc] = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   702
                        else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   703
                            # 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: 32897
diff changeset
   704
                            # 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: 32897
diff changeset
   705
                            # `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: 32897
diff changeset
   706
                            # iteration.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   707
                            toproceed.append(suc)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   708
                            stackedset.add(suc)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   709
                            break
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   710
                else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   711
                    continue
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   712
                break
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   713
            else:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   714
                # 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: 32897
diff changeset
   715
                # successors
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   716
                #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   717
                # 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: 32897
diff changeset
   718
                # successors sets of all its "successors" node.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   719
                #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   720
                # 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: 32897
diff changeset
   721
                # 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: 32897
diff changeset
   722
                # markers.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   723
                #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   724
                # 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: 32897
diff changeset
   725
                # 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: 32897
diff changeset
   726
                # divergent successors sets. If multiple successors have
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   727
                # 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: 32897
diff changeset
   728
                #
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   729
                # 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: 32897
diff changeset
   730
                # 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: 32897
diff changeset
   731
                # another one.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   732
                succssets = []
43426
e513e87b0476 py3: fix sorting of obsolete markers in obsutil (issue6217)
Denis Laxalde <denis@laxalde.org>
parents: 43117
diff changeset
   733
                for mark in sortedmarkers(succmarkers[current]):
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   734
                    # successors sets contributed by this marker
33929
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   735
                    base = _succs()
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   736
                    base.markers.add(mark)
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   737
                    markss = [base]
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   738
                    for suc in mark[1]:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   739
                        # cardinal product with previous successors
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   740
                        productresult = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   741
                        for prefix in markss:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   742
                            for suffix in cache[suc]:
33928
dba493981284 obsolete: add an explicit '_succs.copy()' method
Boris Feld <boris.feld@octobus.net>
parents: 33927
diff changeset
   743
                                newss = prefix.copy()
33929
34e10e09afa5 obsolete: track markers in _succs
Boris Feld <boris.feld@octobus.net>
parents: 33928
diff changeset
   744
                                newss.markers.update(suffix.markers)
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   745
                                for part in suffix:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   746
                                    # do not duplicated entry in successors set
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   747
                                    # first entry wins.
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   748
                                    if part not in newss:
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   749
                                        newss.append(part)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   750
                                productresult.append(newss)
41152
191fac9ff9d3 obsutil: fix the issue5686
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 40578
diff changeset
   751
                        if productresult:
191fac9ff9d3 obsutil: fix the issue5686
Sushil khanchi <sushilkhanchi97@gmail.com>
parents: 40578
diff changeset
   752
                            markss = productresult
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   753
                    succssets.extend(markss)
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   754
                # remove duplicated and subset
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   755
                seen = []
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   756
                final = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   757
                candidates = sorted(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   758
                    (s for s in succssets if s), key=len, reverse=True
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   759
                )
33960
54c21114e41d obsolete: fix old typo
Boris Feld <boris.feld@octobus.net>
parents: 33959
diff changeset
   760
                for cand in candidates:
33959
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   761
                    for seensuccs in seen:
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   762
                        if cand.canmerge(seensuccs):
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   763
                            seensuccs.markers.update(cand.markers)
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   764
                            break
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   765
                    else:
33959
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   766
                        final.append(cand)
c0bbaefc2c5a obsolete: move merge logic on the smaller object
Boris Feld <boris.feld@octobus.net>
parents: 33930
diff changeset
   767
                        seen.append(cand)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   768
                final.reverse()  # put small successors set first
33148
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   769
                cache[current] = final
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32897
diff changeset
   770
    return cache[initialnode]
33930
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   771
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   772
33930
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   773
def successorsandmarkers(repo, ctx):
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   774
    """compute the raw data needed for computing obsfate
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   775
    Returns a list of dict, one dict per successors set
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   776
    """
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   777
    if not ctx.obsolete():
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   778
        return None
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   779
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   780
    ssets = successorssets(repo, ctx.node(), closest=True)
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   781
34014
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   782
    # closestsuccessors returns an empty list for pruned revisions, remap it
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   783
    # into a list containing an empty list for future processing
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   784
    if ssets == []:
46419
d35063ebd761 obsutil: maintain a homogenous list when computing successors
Matt Harbison <matt_harbison@yahoo.com>
parents: 46114
diff changeset
   785
        ssets = [_succs()]
34014
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   786
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   787
    # Try to recover pruned markers
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   788
    succsmap = repo.obsstore.successors
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   789
    fullsuccessorsets = []  # successor set + markers
34014
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   790
    for sset in ssets:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   791
        if sset:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   792
            fullsuccessorsets.append(sset)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   793
        else:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   794
            # 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: 34013
diff changeset
   795
            # successors is pruned.
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   796
            # 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: 34013
diff changeset
   797
            # and find the relevant pruning obs-makers, the ones without
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   798
            # successors.
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   799
            # Having these markers allow us to compute some information about
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   800
            # its fate, like who pruned this changeset and when.
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   801
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   802
            # 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: 34013
diff changeset
   803
            # (fix me later)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   804
            foundany = False
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   805
            for mark in succsmap.get(ctx.node(), ()):
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   806
                if not mark[1]:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   807
                    foundany = True
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   808
                    sset = _succs()
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   809
                    sset.markers.add(mark)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   810
                    fullsuccessorsets.append(sset)
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   811
            if not foundany:
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   812
                fullsuccessorsets.append(_succs())
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   813
33930
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   814
    values = []
34014
98fa777cd7a1 template: better prune support in obsfate
Boris Feld <boris.feld@octobus.net>
parents: 34013
diff changeset
   815
    for sset in fullsuccessorsets:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   816
        values.append({b'successors': sset, b'markers': sset.markers})
33930
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   817
e278d6d2d7d2 template: add minimal obsfate template function
Boris Feld <boris.feld@octobus.net>
parents: 33929
diff changeset
   818
    return values
34011
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33960
diff changeset
   819
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   820
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   821
def _getobsfate(successorssets):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   822
    """Compute a changeset obsolescence fate based on its successorssets.
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   823
    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: 35317
diff changeset
   824
    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: 35317
diff changeset
   825
    be used by internal functions only.
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   826
    Returns one fate from the following values:
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   827
    - pruned
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   828
    - diverged
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   829
    - superseded
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   830
    - superseded_split
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   831
    """
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   832
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   833
    if len(successorssets) == 0:
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   834
        # The commit has been pruned
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   835
        return b'pruned'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   836
    elif len(successorssets) > 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   837
        return b'diverged'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   838
    else:
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   839
        # No divergence, only one set of successors
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   840
        successors = successorssets[0]
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   841
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   842
        if len(successors) == 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   843
            return b'superseded'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   844
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   845
            return b'superseded_split'
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   846
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   847
35049
b81ad5b78a81 obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents: 34873
diff changeset
   848
def obsfateverb(successorset, markers):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   849
    """Return the verb summarizing the successorset and potentially using
35049
b81ad5b78a81 obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents: 34873
diff changeset
   850
    information from the markers
34011
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33960
diff changeset
   851
    """
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33960
diff changeset
   852
    if not successorset:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   853
        verb = b'pruned'
34011
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33960
diff changeset
   854
    elif len(successorset) == 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   855
        verb = b'rewritten'
34011
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33960
diff changeset
   856
    else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   857
        verb = b'split'
34011
3d0f8918351b template: compute verb in obsfateverb
Boris Feld <boris.feld@octobus.net>
parents: 33960
diff changeset
   858
    return verb
34012
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 34011
diff changeset
   859
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   860
34013
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 34012
diff changeset
   861
def markersdates(markers):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   862
    """returns the list of dates for a list of markers"""
34013
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 34012
diff changeset
   863
    return [m[4] for m in markers]
c35c0f54f420 template: compute dates in obsfatedate
Boris Feld <boris.feld@octobus.net>
parents: 34012
diff changeset
   864
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   865
34012
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 34011
diff changeset
   866
def markersusers(markers):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   867
    """Returns a sorted list of markers users without duplicates"""
34012
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 34011
diff changeset
   868
    markersmeta = [dict(m[3]) for m in markers]
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   869
    users = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   870
        encoding.tolocal(meta[b'user'])
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   871
        for meta in markersmeta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   872
        if meta.get(b'user')
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   873
    }
34012
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 34011
diff changeset
   874
38f08eaba6b0 template: compute user in obsfateusers
Boris Feld <boris.feld@octobus.net>
parents: 34011
diff changeset
   875
    return sorted(users)
34294
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34014
diff changeset
   876
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   877
34294
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34014
diff changeset
   878
def markersoperations(markers):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   879
    """Returns a sorted list of markers operations without duplicates"""
34294
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34014
diff changeset
   880
    markersmeta = [dict(m[3]) for m in markers]
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   881
    operations = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   882
        meta.get(b'operation') for meta in markersmeta if meta.get(b'operation')
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 43705
diff changeset
   883
    }
34294
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34014
diff changeset
   884
7cdc8c5a481a templates: introduce a obsfateoperation() function
Martin von Zweigbergk <martinvonz@google.com>
parents: 34014
diff changeset
   885
    return sorted(operations)
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   886
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   887
37328
11d51e518808 obsutil: make obsfateprinter() less dependent on templater
Yuya Nishihara <yuya@tcha.org>
parents: 36960
diff changeset
   888
def obsfateprinter(ui, repo, successors, markers, formatctx):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   889
    """Build a obsfate string for a single successorset using all obsfate
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   890
    related function defined in obsutil
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   891
    """
34850
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   892
    quiet = ui.quiet
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   893
    verbose = ui.verbose
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   894
    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
   895
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   896
    line = []
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   897
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   898
    # Verb
35049
b81ad5b78a81 obsfate: makes successorsetverb takes the markers as argument
Boris Feld <boris.feld@octobus.net>
parents: 34873
diff changeset
   899
    line.append(obsfateverb(successors, markers))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   900
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   901
    # Operations
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   902
    operations = markersoperations(markers)
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   903
    if operations:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   904
        line.append(b" using %s" % b", ".join(operations))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   905
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   906
    # Successors
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   907
    if successors:
37328
11d51e518808 obsutil: make obsfateprinter() less dependent on templater
Yuya Nishihara <yuya@tcha.org>
parents: 36960
diff changeset
   908
        fmtsuccessors = [formatctx(repo[succ]) for succ in successors]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   909
        line.append(b" as %s" % b", ".join(fmtsuccessors))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   910
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   911
    # Users
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   912
    users = markersusers(markers)
34850
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   913
    # 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
   914
    # information
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   915
    if not verbose:
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   916
        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
   917
        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
   918
            users = None
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   919
34850
62a4ccf9784a obsfate: filter out current user if not in verbose
Boris Feld <boris.feld@octobus.net>
parents: 34847
diff changeset
   920
    if (verbose or normal) and users:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   921
        line.append(b" by %s" % b", ".join(users))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   922
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   923
    # Date
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   924
    dates = markersdates(markers)
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   925
34873
aa849cf5d089 obsfate: fix obsfate_printer with empty date list
Boris Feld <boris.feld@octobus.net>
parents: 34851
diff changeset
   926
    if dates and verbose:
34851
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
   927
        min_date = min(dates)
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
   928
        max_date = max(dates)
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   929
34851
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
   930
        if min_date == max_date:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   931
            fmtmin_date = dateutil.datestr(min_date, b'%Y-%m-%d %H:%M %1%2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   932
            line.append(b" (at %s)" % fmtmin_date)
34851
6f53a53245a2 obsfate: only display date in verbose mode
Boris Feld <boris.feld@octobus.net>
parents: 34850
diff changeset
   933
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   934
            fmtmin_date = dateutil.datestr(min_date, b'%Y-%m-%d %H:%M %1%2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   935
            fmtmax_date = dateutil.datestr(max_date, b'%Y-%m-%d %H:%M %1%2')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   936
            line.append(b" (between %s and %s)" % (fmtmin_date, fmtmax_date))
34847
e27f1f04c2cf templatekw: introduce obsfate keyword
Boris Feld <boris.feld@octobus.net>
parents: 34423
diff changeset
   937
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   938
    return b"".join(line)
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   939
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
   940
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
   941
filteredmsgtable = {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   942
    b"pruned": _(b"hidden revision '%s' is pruned"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   943
    b"diverged": _(b"hidden revision '%s' has diverged"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   944
    b"superseded": _(b"hidden revision '%s' was rewritten as: %s"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   945
    b"superseded_split": _(b"hidden revision '%s' was split as: %s"),
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   946
    b"superseded_split_several": _(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   947
        b"hidden revision '%s' was split as: %s and %d more"
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   948
    ),
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
   949
}
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
   950
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   951
35610
22c42bfbe7ab visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net>
parents: 35609
diff changeset
   952
def _getfilteredreason(repo, changeid, ctx):
45957
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45076
diff changeset
   953
    """return a human-friendly string on why a obsolete changeset is hidden"""
35610
22c42bfbe7ab visibility: pass a normal repo to _getfilteredreason
Boris Feld <boris.feld@octobus.net>
parents: 35609
diff changeset
   954
    successors = successorssets(repo, ctx.node())
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   955
    fate = _getobsfate(successors)
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   956
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   957
    # Be more precise in case the revision is superseded
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   958
    if fate == b'pruned':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   959
        return filteredmsgtable[b'pruned'] % changeid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   960
    elif fate == b'diverged':
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   961
        return filteredmsgtable[b'diverged'] % changeid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   962
    elif fate == b'superseded':
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
   963
        single_successor = short(successors[0][0])
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   964
        return filteredmsgtable[b'superseded'] % (changeid, single_successor)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   965
    elif fate == b'superseded_split':
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   966
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   967
        succs = []
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   968
        for node_id in successors[0]:
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
   969
            succs.append(short(node_id))
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   970
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   971
        if len(succs) <= 2:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   972
            fmtsuccs = b', '.join(succs)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   973
            return filteredmsgtable[b'superseded_split'] % (changeid, fmtsuccs)
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   974
        else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   975
            firstsuccessors = b', '.join(succs[:2])
35571
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   976
            remainingnumber = len(succs) - 2
265cd9e19d26 visibility: improve the message when accessing filtered obsolete rev
Boris Feld <boris.feld@octobus.net>
parents: 35317
diff changeset
   977
35609
c026547454dd visibility: make the filtered message translatable
Boris Feld <boris.feld@octobus.net>
parents: 35571
diff changeset
   978
            args = (changeid, firstsuccessors, remainingnumber)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   979
            return filteredmsgtable[b'superseded_split_several'] % args
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   980
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   981
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   982
def divergentsets(repo, ctx):
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   983
    """Compute sets of commits divergent with a given one"""
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   984
    cache = {}
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   985
    base = {}
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   986
    for n in allpredecessors(repo.obsstore, [ctx.node()]):
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   987
        if n == ctx.node():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   988
            # a node can't be a base for divergence with itself
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   989
            continue
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   990
        nsuccsets = successorssets(repo, n, cache)
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   991
        for nsuccset in nsuccsets:
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   992
            if ctx.node() in nsuccset:
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   993
                # we are only interested in *other* successor sets
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   994
                continue
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   995
            if tuple(nsuccset) in base:
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   996
                # we already know the latest base for this divergency
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   997
                continue
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
   998
            base[tuple(nsuccset)] = n
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
   999
    return [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1000
        {b'divergentnodes': divset, b'commonpredecessor': b}
43106
d783f945a701 py3: finish porting iteritems() to pycompat and remove source transformer
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
  1001
        for divset, b in pycompat.iteritems(base)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1002
    ]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1003
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1004
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1005
def whyunstable(repo, ctx):
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1006
    result = []
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1007
    if ctx.orphan():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1008
        for parent in ctx.parents():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1009
            kind = None
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1010
            if parent.orphan():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1011
                kind = b'orphan'
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1012
            elif parent.obsolete():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1013
                kind = b'obsolete'
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1014
            if kind is not None:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1015
                result.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1016
                    {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1017
                        b'instability': b'orphan',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1018
                        b'reason': b'%s parent' % kind,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1019
                        b'node': parent.hex(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1020
                    }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1021
                )
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1022
    if ctx.phasedivergent():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1023
        predecessors = allpredecessors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1024
            repo.obsstore, [ctx.node()], ignoreflags=bumpedfix
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1025
        )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1026
        immutable = [
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1027
            repo[p] for p in predecessors if p in repo and not repo[p].mutable()
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1028
        ]
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1029
        for predecessor in immutable:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1030
            result.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1031
                {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1032
                    b'instability': b'phase-divergent',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1033
                    b'reason': b'immutable predecessor',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1034
                    b'node': predecessor.hex(),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1035
                }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1036
            )
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1037
    if ctx.contentdivergent():
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1038
        dsets = divergentsets(repo, ctx)
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1039
        for dset in dsets:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1040
            divnodes = [repo[n] for n in dset[b'divergentnodes']]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1041
            result.append(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1042
                {
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1043
                    b'instability': b'content-divergent',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1044
                    b'divergentnodes': divnodes,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1045
                    b'reason': b'predecessor',
46114
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45957
diff changeset
  1046
                    b'node': hex(dset[b'commonpredecessor']),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1047
                }
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 41724
diff changeset
  1048
            )
36960
efc4fb344c05 debug: add debugwhyunstable that explains instabilities
Anton Shestakov <av6@dwimlabs.net>
parents: 36959
diff changeset
  1049
    return result