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