mercurial/obsolete.py
author Gregory Szorc <gregory.szorc@gmail.com>
Mon, 21 Feb 2022 13:08:28 -0700
changeset 48946 642e31cb55f0
parent 48913 f254fc73d956
child 49176 3cd3aaba5b03
permissions -rw-r--r--
py3: use class X: instead of class X(object): The inheritance from object is implied in Python 3. So this should be equivalent. This change was generated via an automated search and replace. So there may have been some accidental changes. Differential Revision: https://phab.mercurial-scm.org/D12352
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     1
# obsolete.py - obsolete markers handling
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     2
#
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     3
# Copyright 2012 Pierre-Yves David <pierre-yves.david@ens-lyon.org>
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     4
#                Logilab SA        <contact@logilab.fr>
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     5
#
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     6
# This software may be used and distributed according to the terms of the
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     7
# GNU General Public License version 2 or any later version.
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
     8
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
     9
"""Obsolete marker handling
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    10
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    11
An obsolete marker maps an old changeset to a list of new
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    12
changesets. If the list of new changesets is empty, the old changeset
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    13
is said to be "killed". Otherwise, the old changeset is being
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    14
"replaced" by the new changesets.
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    15
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    16
Obsolete markers can be used to record and distribute changeset graph
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    17
transformations performed by history rewrite operations, and help
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    18
building new tools to reconcile conflicting rewrite actions. To
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    19
facilitate conflict resolution, markers include various annotations
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    20
besides old and news changeset identifiers, such as creation date or
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    21
author name.
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    22
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
    23
The old obsoleted changeset is called a "predecessor" and possible
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    24
replacements are called "successors". Markers that used changeset X as
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
    25
a predecessor are called "successor markers of X" because they hold
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    26
information about the successors of X. Markers that use changeset Y as
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
    27
a successors are call "predecessor markers of Y" because they hold
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
    28
information about the predecessors of Y.
17776
072812e9f570 obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17775
diff changeset
    29
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    30
Examples:
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    31
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    32
- When changeset A is replaced by changeset A', one marker is stored:
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    33
21166
bf2891877378 obsolete: fix one-element tuple in module docstring
Martin Geisler <martin@geisler.net>
parents: 21165
diff changeset
    34
    (A, (A',))
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    35
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    36
- When changesets A and B are folded into a new changeset C, two markers are
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    37
  stored:
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    38
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    39
    (A, (C,)) and (B, (C,))
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    40
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    41
- When changeset A is simply "pruned" from the graph, a marker is created:
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    42
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    43
    (A, ())
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    44
29894
02c150850e16 obsolete: fix minor module documentation issues
liscju <piotr.listkiewicz@gmail.com>
parents: 29389
diff changeset
    45
- When changeset A is split into B and C, a single marker is used:
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    46
29894
02c150850e16 obsolete: fix minor module documentation issues
liscju <piotr.listkiewicz@gmail.com>
parents: 29389
diff changeset
    47
    (A, (B, C))
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    48
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    49
  We use a single marker to distinguish the "split" case from the "divergence"
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    50
  case. If two independent operations rewrite the same changeset A in to A' and
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    51
  A'', we have an error case: divergent rewriting. We can detect it because
17775
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    52
  two markers will be created independently:
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    53
13744acc4ad7 obsolete: add example of marker usage in the documentation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17774
diff changeset
    54
  (A, (B,)) and (A, (C,))
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    55
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    56
Format
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    57
------
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    58
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    59
Markers are stored in an append-only file stored in
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    60
'.hg/store/obsstore'.
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    61
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    62
The file starts with a version header:
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    63
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    64
- 1 unsigned byte: version number, starting at zero.
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    65
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
    66
The header is followed by the markers. Marker format depend of the version. See
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
    67
comment associated with each format for details.
21164
2efcef493aa2 obsolete: fix language and grammar in module docstring
Martin Geisler <martin@geisler.net>
parents: 21098
diff changeset
    68
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    69
"""
27332
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    70
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    71
import errno
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    72
import struct
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    73
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    74
from .i18n import _
43089
c59eb1560c44 py3: manually import getattr where it is needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 43077
diff changeset
    75
from .pycompat import getattr
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    76
from .node import (
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    77
    bin,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    78
    hex,
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
    79
)
27332
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    80
from . import (
38707
6b5ca1d0aa1e obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38157
diff changeset
    81
    encoding,
27332
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    82
    error,
33142
4f49810a1011 obsutil: move 'successorssets' to the new modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33130
diff changeset
    83
    obsutil,
27332
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    84
    phases,
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32354
diff changeset
    85
    policy,
38708
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
    86
    pycompat,
27332
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    87
    util,
04f346b8768f obsolete: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 26684
diff changeset
    88
)
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43558
diff changeset
    89
from .utils import (
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43558
diff changeset
    90
    dateutil,
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43558
diff changeset
    91
    hashutil,
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43558
diff changeset
    92
)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    93
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43240
diff changeset
    94
parsers = policy.importmod('parsers')
32372
df448de7cf3b parsers: switch to policy importer
Yuya Nishihara <yuya@tcha.org>
parents: 32354
diff changeset
    95
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    96
_pack = struct.pack
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
    97
_unpack = struct.unpack
23498
ac910b1f5658 obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23497
diff changeset
    98
_calcsize = struct.calcsize
24046
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
    99
propertycache = util.propertycache
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   100
22951
6c86c673dde6 obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents: 22950
diff changeset
   101
# Options for obsolescence
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   102
createmarkersopt = b'createmarkers'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   103
allowunstableopt = b'allowunstable'
47020
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
   104
allowdivergenceopt = b'allowdivergence'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   105
exchangeopt = b'exchange'
22951
6c86c673dde6 obsolete: add createmarkers option
Durham Goode <durham@fb.com>
parents: 22950
diff changeset
   106
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   107
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   108
def _getoptionvalue(repo, option):
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   109
    """Returns True if the given repository has the given obsolete option
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   110
    enabled.
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   111
    """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   112
    configkey = b'evolution.%s' % option
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   113
    newconfig = repo.ui.configbool(b'experimental', configkey)
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   114
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   115
    # Return the value only if defined
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   116
    if newconfig is not None:
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   117
        return newconfig
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   118
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   119
    # Fallback on generic option
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   120
    try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   121
        return repo.ui.configbool(b'experimental', b'evolution')
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   122
    except (error.ConfigError, AttributeError):
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   123
        # Fallback on old-fashion config
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   124
        # inconsistent config: experimental.evolution
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   125
        result = set(repo.ui.configlist(b'experimental', b'evolution'))
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   126
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   127
        if b'all' in result:
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   128
            return True
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   129
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   130
        # Temporary hack for next check
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   131
        newconfig = repo.ui.config(b'experimental', b'evolution.createmarkers')
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   132
        if newconfig:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   133
            result.add(b'createmarkers')
34864
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   134
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   135
        return option in result
fec79a3f250f config: update evolution-related config
Boris Feld <boris.feld@octobus.net>
parents: 34863
diff changeset
   136
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   137
37131
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   138
def getoptions(repo):
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   139
    """Returns dicts showing state of obsolescence features."""
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   140
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   141
    createmarkersvalue = _getoptionvalue(repo, createmarkersopt)
47795
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   142
    if createmarkersvalue:
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   143
        unstablevalue = _getoptionvalue(repo, allowunstableopt)
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   144
        divergencevalue = _getoptionvalue(repo, allowdivergenceopt)
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   145
        exchangevalue = _getoptionvalue(repo, exchangeopt)
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   146
    else:
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   147
        # if we cannot create obsolescence markers, we shouldn't exchange them
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   148
        # or perform operations that lead to instability or divergence
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   149
        unstablevalue = False
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   150
        divergencevalue = False
b1e1559f5a45 obsolete: disable other evolution config options if createmarkers is off
Anton Shestakov <av6@dwimlabs.net>
parents: 47020
diff changeset
   151
        exchangevalue = False
37131
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   152
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   153
    return {
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   154
        createmarkersopt: createmarkersvalue,
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   155
        allowunstableopt: unstablevalue,
47020
ba6881c6a178 rewriteutil: check for divergence
Martin von Zweigbergk <martinvonz@google.com>
parents: 47012
diff changeset
   156
        allowdivergenceopt: divergencevalue,
37131
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   157
        exchangeopt: exchangevalue,
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   158
    }
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   159
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   160
32333
566cfe9cbbb9 obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32327
diff changeset
   161
def isenabled(repo, option):
566cfe9cbbb9 obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32327
diff changeset
   162
    """Returns True if the given repository has the given obsolete option
566cfe9cbbb9 obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32327
diff changeset
   163
    enabled.
566cfe9cbbb9 obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32327
diff changeset
   164
    """
37131
d30810d09d6f obsolete: refactor function for getting obsolete options
Gregory Szorc <gregory.szorc@gmail.com>
parents: 37017
diff changeset
   165
    return getoptions(repo)[option]
32333
566cfe9cbbb9 obsolete: move the 'isenabled' function at the top of the file
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32327
diff changeset
   166
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   167
37017
98c14e857e71 obsolete: add a note that explains creating aliases for marker flags
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
   168
# Creating aliases for marker flags because evolve extension looks for
98c14e857e71 obsolete: add a note that explains creating aliases for marker flags
Anton Shestakov <av6@dwimlabs.net>
parents: 36953
diff changeset
   169
# bumpedfix in obsolete.py
36953
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
   170
bumpedfix = obsutil.bumpedfix
b9bbcf9ffac1 obsolete: move marker flags to obsutil
Anton Shestakov <av6@dwimlabs.net>
parents: 36607
diff changeset
   171
usingsha256 = obsutil.usingsha256
17831
70b08df24fef obsolete: add a flag that allows fixing "bumped" changeset
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17828
diff changeset
   172
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   173
## Parsing and writing of version "0"
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   174
#
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   175
# The header is followed by the markers. Each marker is made of:
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   176
#
22849
fd759142c6e5 obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22848
diff changeset
   177
# - 1 uint8 : number of new changesets "N", can be zero.
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   178
#
22849
fd759142c6e5 obsolete: use uint## in the format documention
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22848
diff changeset
   179
# - 1 uint32: metadata size "M" in bytes.
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   180
#
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   181
# - 1 byte: a bit field. It is reserved for flags used in common
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   182
#   obsolete marker operations, to avoid repeated decoding of metadata
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   183
#   entries.
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   184
#
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   185
# - 20 bytes: obsoleted changeset identifier.
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   186
#
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   187
# - N*20 bytes: new changesets identifiers.
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   188
#
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   189
# - M bytes: metadata as a sequence of nul-terminated strings. Each
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   190
#   string contains a key and a value, separated by a colon ':', without
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   191
#   additional encoding. Keys cannot contain '\0' or ':' and values
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   192
#   cannot contain '\0'.
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   193
_fm0version = 0
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   194
_fm0fixed = b'>BIB20s'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   195
_fm0node = b'20s'
23498
ac910b1f5658 obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23497
diff changeset
   196
_fm0fsize = _calcsize(_fm0fixed)
ac910b1f5658 obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23497
diff changeset
   197
_fm0fnodesize = _calcsize(_fm0node)
22334
f2c3cfc30e9c obsolete: move _encodemarkers next to _readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22333
diff changeset
   198
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   199
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   200
def _fm0readmarkers(data, off, stop):
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   201
    # Loop on markers
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   202
    while off < stop:
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   203
        # read fixed part
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   204
        cur = data[off : off + _fm0fsize]
22327
f737631a9f0a obsolete: rename all _fm to _fm0
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22326
diff changeset
   205
        off += _fm0fsize
22685
753515d9e274 obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22614
diff changeset
   206
        numsuc, mdsize, flags, pre = _unpack(_fm0fixed, cur)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   207
        # read replacement
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   208
        sucs = ()
22685
753515d9e274 obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22614
diff changeset
   209
        if numsuc:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   210
            s = _fm0fnodesize * numsuc
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   211
            cur = data[off : off + s]
22685
753515d9e274 obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22614
diff changeset
   212
            sucs = _unpack(_fm0node * numsuc, cur)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   213
            off += s
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   214
        # read metadata
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   215
        # (metadata will be decoded on demand)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   216
        metadata = data[off : off + mdsize]
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   217
        if len(metadata) != mdsize:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   218
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   219
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   220
                    b'parsing obsolete marker: metadata is too '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   221
                    b'short, %d bytes expected, got %d'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   222
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   223
                % (mdsize, len(metadata))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   224
            )
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   225
        off += mdsize
22847
37460ee2003c obsolete: _rename decodemeta to _fm0decodemeta
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22846
diff changeset
   226
        metadata = _fm0decodemeta(metadata)
22222
883e8b6bd461 obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22221
diff changeset
   227
        try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   228
            when, offset = metadata.pop(b'date', b'0 0').split(b' ')
22309
a65697c3f20e obsolete: avoid slow, generic date parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22274
diff changeset
   229
            date = float(when), int(offset)
a65697c3f20e obsolete: avoid slow, generic date parsing
Gregory Szorc <gregory.szorc@gmail.com>
parents: 22274
diff changeset
   230
        except ValueError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   231
            date = (0.0, 0)
22258
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   232
        parents = None
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   233
        if b'p2' in metadata:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   234
            parents = (metadata.pop(b'p1', None), metadata.pop(b'p2', None))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   235
        elif b'p1' in metadata:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   236
            parents = (metadata.pop(b'p1', None),)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   237
        elif b'p0' in metadata:
22258
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   238
            parents = ()
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   239
        if parents is not None:
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   240
            try:
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   241
                parents = tuple(bin(p) for p in parents)
22258
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   242
                # if parent content is not a nodeid, drop the data
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   243
                for p in parents:
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   244
                    if len(p) != 20:
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   245
                        parents = None
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   246
                        break
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   247
            except TypeError:
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   248
                # if content cannot be translated to nodeid drop the data.
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   249
                parents = None
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   250
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   251
        metadata = tuple(sorted(metadata.items()))
22222
883e8b6bd461 obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22221
diff changeset
   252
22258
cf414981978a obsstore: also store the 'parents' field on disk
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22257
diff changeset
   253
        yield (pre, sucs, flags, metadata, date, parents)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   254
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   255
22330
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   256
def _fm0encodeonemarker(marker):
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   257
    pre, sucs, flags, metadata, date, parents = marker
22850
b078e4dc9f9a obsstore: add a flag for sha256 hashes
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22849
diff changeset
   258
    if flags & usingsha256:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   259
        raise error.Abort(_(b'cannot handle sha256 with old obsstore format'))
22845
ef880e28e56a obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22685
diff changeset
   260
    metadata = dict(metadata)
23002
2920a96f5839 obsstore: record data as floating point in fm0 format
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22954
diff changeset
   261
    time, tz = date
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   262
    metadata[b'date'] = b'%r %i' % (time, tz)
22330
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   263
    if parents is not None:
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   264
        if not parents:
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   265
            # mark that we explicitly recorded no parents
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   266
            metadata[b'p0'] = b''
32278
7c3ef55dedbe obsolete: use 2 argument form of enumerate()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32201
diff changeset
   267
        for i, p in enumerate(parents, 1):
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   268
            metadata[b'p%i' % i] = hex(p)
22846
b1efc4893da4 obsolete: _rename encodemeta to _fm0encodemeta
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22845
diff changeset
   269
    metadata = _fm0encodemeta(metadata)
22685
753515d9e274 obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22614
diff changeset
   270
    numsuc = len(sucs)
753515d9e274 obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22614
diff changeset
   271
    format = _fm0fixed + (_fm0node * numsuc)
753515d9e274 obsolete: replace "nb" notation with "num" (for "number")
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22614
diff changeset
   272
    data = [numsuc, len(metadata), flags, pre]
22330
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   273
    data.extend(sucs)
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   274
    return _pack(format, *data) + metadata
e74f8a65252d obsolete: move _fm0encodeonemarker next to _fm0readmarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22329
diff changeset
   275
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   276
22848
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   277
def _fm0encodemeta(meta):
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   278
    """Return encoded metadata string to string mapping.
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   279
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   280
    Assume no ':' in key and no '\0' in both key and value."""
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   281
    for key, value in meta.items():
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   282
        if b':' in key or b'\0' in key:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   283
            raise ValueError(b"':' and '\0' are forbidden in metadata key'")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   284
        if b'\0' in value:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   285
            raise ValueError(b"':' is forbidden in metadata value'")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   286
    return b'\0'.join([b'%s:%s' % (k, meta[k]) for k in sorted(meta)])
22848
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   287
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   288
22848
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   289
def _fm0decodemeta(data):
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   290
    """Return string to string dictionary from encoded version."""
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   291
    d = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   292
    for l in data.split(b'\0'):
22848
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   293
        if l:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   294
            key, value = l.split(b':', 1)
22848
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   295
            d[key] = value
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   296
    return d
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   297
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   298
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   299
## Parsing and writing of version "1"
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   300
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   301
# The header is followed by the markers. Each marker is made of:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   302
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   303
# - uint32: total size of the marker (including this field)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   304
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   305
# - float64: date in seconds since epoch
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   306
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   307
# - int16: timezone offset in minutes
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   308
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   309
# - uint16: a bit field. It is reserved for flags used in common
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   310
#   obsolete marker operations, to avoid repeated decoding of metadata
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   311
#   entries.
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   312
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   313
# - uint8: number of successors "N", can be zero.
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   314
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   315
# - uint8: number of parents "P", can be zero.
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   316
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   317
#     0: parents data stored but no parent,
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   318
#     1: one parent stored,
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   319
#     2: two parents stored,
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   320
#     3: no parent data stored
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   321
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   322
# - uint8: number of metadata entries M
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   323
#
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   324
# - 20 or 32 bytes: predecessor changeset identifier.
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   325
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   326
# - N*(20 or 32) bytes: successors changesets identifiers.
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   327
#
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   328
# - P*(20 or 32) bytes: parents of the predecessors changesets.
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   329
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   330
# - M*(uint8, uint8): size of all metadata entries (key and value)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   331
#
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   332
# - remaining bytes: the metadata, each (key, value) pair after the other.
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   333
_fm1version = 1
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   334
_fm1fixed = b'>IdhHBBB'
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   335
_fm1nodesha1 = b'20s'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   336
_fm1nodesha256 = b'32s'
23499
b46876c94a93 obsstore: cache size computation for fm1 node
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23498
diff changeset
   337
_fm1nodesha1size = _calcsize(_fm1nodesha1)
b46876c94a93 obsstore: cache size computation for fm1 node
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23498
diff changeset
   338
_fm1nodesha256size = _calcsize(_fm1nodesha256)
23498
ac910b1f5658 obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23497
diff changeset
   339
_fm1fsize = _calcsize(_fm1fixed)
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   340
_fm1parentnone = 3
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   341
_fm1parentshift = 14
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   342
_fm1parentmask = _fm1parentnone << _fm1parentshift
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   343
_fm1metapair = b'BB'
33670
e5f8c7baa729 obsolete: reuse _fm1metapair for computing _fm1metapairsize
Augie Fackler <augie@google.com>
parents: 33504
diff changeset
   344
_fm1metapairsize = _calcsize(_fm1metapair)
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   345
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   346
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   347
def _fm1purereadmarkers(data, off, stop):
23803
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   348
    # make some global constants local for performance
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   349
    noneflag = _fm1parentnone
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   350
    sha2flag = usingsha256
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   351
    sha1size = _fm1nodesha1size
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   352
    sha2size = _fm1nodesha256size
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   353
    sha1fmt = _fm1nodesha1
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   354
    sha2fmt = _fm1nodesha256
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   355
    metasize = _fm1metapairsize
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   356
    metafmt = _fm1metapair
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   357
    fsize = _fm1fsize
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   358
    unpack = _unpack
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   359
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   360
    # Loop on markers
25211
22f4ce49044d util: drop the 'unpacker' helper
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 25149
diff changeset
   361
    ufixed = struct.Struct(_fm1fixed).unpack
24018
26d6a6a78c1d obsolete: use parsers.fm1readmarker if it exists for a ~38% perf win
Augie Fackler <augie@google.com>
parents: 24014
diff changeset
   362
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   363
    while off < stop:
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   364
        # read fixed part
23803
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   365
        o1 = off + fsize
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   366
        t, secs, tz, flags, numsuc, numpar, nummeta = ufixed(data[off:o1])
23792
db3bc2bcb689 readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents: 23791
diff changeset
   367
23803
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   368
        if flags & sha2flag:
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   369
            nodefmt = sha2fmt
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   370
            nodesize = sha2size
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   371
        else:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   372
            nodefmt = sha1fmt
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   373
            nodesize = sha1size
23805
345042e024dc readmarkers: add a SHA256 fixme note
Matt Mackall <mpm@selenic.com>
parents: 23804
diff changeset
   374
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   375
        (prec,) = unpack(nodefmt, data[o1 : o1 + nodesize])
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   376
        o1 += nodesize
23792
db3bc2bcb689 readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents: 23791
diff changeset
   377
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   378
        # read 0 or more successors
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   379
        if numsuc == 1:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   380
            o2 = o1 + nodesize
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   381
            sucs = (data[o1:o2],)
23801
20b5701cd90a readmarkers: read node reading into node length conditional
Matt Mackall <mpm@selenic.com>
parents: 23800
diff changeset
   382
        else:
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   383
            o2 = o1 + nodesize * numsuc
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   384
            sucs = unpack(nodefmt * numsuc, data[o1:o2])
23792
db3bc2bcb689 readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents: 23791
diff changeset
   385
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   386
        # read parents
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   387
        if numpar == noneflag:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   388
            o3 = o2
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   389
            parents = None
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   390
        elif numpar == 1:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   391
            o3 = o2 + nodesize
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   392
            parents = (data[o2:o3],)
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   393
        else:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   394
            o3 = o2 + nodesize * numpar
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   395
            parents = unpack(nodefmt * numpar, data[o2:o3])
23792
db3bc2bcb689 readmarkers: add some whitespace
Matt Mackall <mpm@selenic.com>
parents: 23791
diff changeset
   396
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   397
        # read metadata
23803
2763edaba857 readmarkers: promote global constants to locals for performance
Matt Mackall <mpm@selenic.com>
parents: 23802
diff changeset
   398
        off = o3 + metasize * nummeta
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   399
        metapairsize = unpack(b'>' + (metafmt * nummeta), data[o3:off])
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   400
        metadata = []
38783
e7aa113b14f7 global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 38708
diff changeset
   401
        for idx in pycompat.xrange(0, len(metapairsize), 2):
23798
86d2a0c41f44 readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents: 23797
diff changeset
   402
            o1 = off + metapairsize[idx]
86d2a0c41f44 readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents: 23797
diff changeset
   403
            o2 = o1 + metapairsize[idx + 1]
86d2a0c41f44 readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents: 23797
diff changeset
   404
            metadata.append((data[off:o1], data[o1:o2]))
86d2a0c41f44 readmarkers: streamline offset tracking
Matt Mackall <mpm@selenic.com>
parents: 23797
diff changeset
   405
            off = o2
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   406
23800
83f361a21d31 readmarkers: drop a temporary
Matt Mackall <mpm@selenic.com>
parents: 23799
diff changeset
   407
        yield (prec, sucs, flags, tuple(metadata), (secs, tz * 60), parents)
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   408
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   409
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   410
def _fm1encodeonemarker(marker):
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   411
    pre, sucs, flags, metadata, date, parents = marker
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   412
    # determine node size
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   413
    _fm1node = _fm1nodesha1
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   414
    if flags & usingsha256:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   415
        _fm1node = _fm1nodesha256
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   416
    numsuc = len(sucs)
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   417
    numextranodes = 1 + numsuc
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   418
    if parents is None:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   419
        numpar = _fm1parentnone
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   420
    else:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   421
        numpar = len(parents)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   422
        numextranodes += numpar
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   423
    formatnodes = _fm1node * numextranodes
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   424
    formatmeta = _fm1metapair * len(metadata)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   425
    format = _fm1fixed + formatnodes + formatmeta
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   426
    # tz is stored in minutes so we divide by 60
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   427
    tz = date[1] // 60
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   428
    data = [None, date[0], tz, flags, numsuc, numpar, len(metadata), pre]
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   429
    data.extend(sucs)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   430
    if parents is not None:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   431
        data.extend(parents)
23498
ac910b1f5658 obsstore: prefetch struct.calcsize
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23497
diff changeset
   432
    totalsize = _calcsize(format)
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   433
    for key, value in metadata:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   434
        lk = len(key)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   435
        lv = len(value)
34407
b6692ba7d5b0 obsmarker: crash more helpfully when metadata fields are >255bytes (issue5681)
Simon Whitaker <swhitaker@fb.com>
parents: 34388
diff changeset
   436
        if lk > 255:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   437
            msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   438
                b'obsstore metadata key cannot be longer than 255 bytes'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   439
                b' (key "%s" is %u bytes)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   440
            ) % (key, lk)
34407
b6692ba7d5b0 obsmarker: crash more helpfully when metadata fields are >255bytes (issue5681)
Simon Whitaker <swhitaker@fb.com>
parents: 34388
diff changeset
   441
            raise error.ProgrammingError(msg)
b6692ba7d5b0 obsmarker: crash more helpfully when metadata fields are >255bytes (issue5681)
Simon Whitaker <swhitaker@fb.com>
parents: 34388
diff changeset
   442
        if lv > 255:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   443
            msg = (
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   444
                b'obsstore metadata value cannot be longer than 255 bytes'
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   445
                b' (value "%s" for key "%s" is %u bytes)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   446
            ) % (value, key, lv)
34407
b6692ba7d5b0 obsmarker: crash more helpfully when metadata fields are >255bytes (issue5681)
Simon Whitaker <swhitaker@fb.com>
parents: 34388
diff changeset
   447
            raise error.ProgrammingError(msg)
22851
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   448
        data.append(lk)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   449
        data.append(lv)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   450
        totalsize += lk + lv
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   451
    data[0] = totalsize
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   452
    data = [_pack(format, *data)]
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   453
    for key, value in metadata:
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   454
        data.append(key)
974389427e5f obsolete: introduce a new binary encoding for obsmarkers (version 1)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22850
diff changeset
   455
        data.append(value)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   456
    return b''.join(data)
22848
72100c1d53d4 obsolete: gather _fm0 meta encoding with other _fm0 code
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22847
diff changeset
   457
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   458
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   459
def _fm1readmarkers(data, off, stop):
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24018
diff changeset
   460
    native = getattr(parsers, 'fm1readmarkers', None)
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24018
diff changeset
   461
    if not native:
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   462
        return _fm1purereadmarkers(data, off, stop)
24019
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24018
diff changeset
   463
    return native(data, off, stop)
26fbf07482b2 _fm1readmarkers: generate list in C
Martin von Zweigbergk <martinvonz@google.com>
parents: 24018
diff changeset
   464
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   465
22331
b130b241718e obsolete: support for any known obsstore format when reading or writing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22330
diff changeset
   466
# mapping to read/write various marker formats
b130b241718e obsolete: support for any known obsstore format when reading or writing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22330
diff changeset
   467
# <version> -> (decoder, encoder)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   468
formats = {
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   469
    _fm0version: (_fm0readmarkers, _fm0encodeonemarker),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   470
    _fm1version: (_fm1readmarkers, _fm1encodeonemarker),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   471
}
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   472
22331
b130b241718e obsolete: support for any known obsstore format when reading or writing
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22330
diff changeset
   473
32689
9933410bf763 obsstore: move marker version reading to a separate function
Jun Wu <quark@fb.com>
parents: 32688
diff changeset
   474
def _readmarkerversion(data):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   475
    return _unpack(b'>B', data[0:1])[0]
32689
9933410bf763 obsstore: move marker version reading to a separate function
Jun Wu <quark@fb.com>
parents: 32688
diff changeset
   476
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   477
23497
5817f71c2336 obsstore: disable garbage collection during initialization (issue4456)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23002
diff changeset
   478
@util.nogc
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   479
def _readmarkers(data, off=None, stop=None):
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   480
    """Read and enumerate markers from raw data"""
32689
9933410bf763 obsstore: move marker version reading to a separate function
Jun Wu <quark@fb.com>
parents: 32688
diff changeset
   481
    diskversion = _readmarkerversion(data)
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   482
    if not off:
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   483
        off = 1  # skip 1 byte version number
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   484
    if stop is None:
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   485
        stop = len(data)
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   486
    if diskversion not in formats:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   487
        msg = _(b'parsing obsolete marker: unknown version %r') % diskversion
32596
19df975eb555 obsolete: raise richer exception on unknown version
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32488
diff changeset
   488
        raise error.UnknownVersion(msg, version=diskversion)
33504
5d3ba4395288 obsstore: let read marker API take a range of offsets
Jun Wu <quark@fb.com>
parents: 33499
diff changeset
   489
    return diskversion, formats[diskversion][0](data, off, stop)
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   490
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   491
32692
9576974a3b6d obsstore: move header encoding to a separate function
Jun Wu <quark@fb.com>
parents: 32691
diff changeset
   492
def encodeheader(version=_fm0version):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   493
    return _pack(b'>B', version)
32692
9576974a3b6d obsstore: move header encoding to a separate function
Jun Wu <quark@fb.com>
parents: 32691
diff changeset
   494
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   495
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   496
def encodemarkers(markers, addheader=False, version=_fm0version):
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   497
    # Kept separate from flushmarkers(), it will be reused for
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   498
    # markers exchange.
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   499
    encodeone = formats[version][1]
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   500
    if addheader:
32692
9576974a3b6d obsstore: move header encoding to a separate function
Jun Wu <quark@fb.com>
parents: 32691
diff changeset
   501
        yield encodeheader(version)
22612
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   502
    for marker in markers:
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   503
        yield encodeone(marker)
fdfa40ee75cf obsolete: gather all contents related to format version 0 in a single place
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22507
diff changeset
   504
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   505
24044
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   506
@util.nogc
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   507
def _addsuccessors(successors, markers):
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   508
    for mark in markers:
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   509
        successors.setdefault(mark[0], set()).add(mark)
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   510
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   511
24044
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   512
@util.nogc
33732
32d4f815c4f4 obsolete: rename _addprecursors into _addpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33719
diff changeset
   513
def _addpredecessors(predecessors, markers):
24044
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   514
    for mark in markers:
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   515
        for suc in mark[1]:
33732
32d4f815c4f4 obsolete: rename _addprecursors into _addpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33719
diff changeset
   516
            predecessors.setdefault(suc, set()).add(mark)
24044
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   517
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   518
24044
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   519
@util.nogc
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   520
def _addchildren(children, markers):
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   521
    for mark in markers:
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   522
        parents = mark[5]
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   523
        if parents is not None:
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   524
            for p in parents:
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   525
                children.setdefault(p, set()).add(mark)
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   526
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   527
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46780
diff changeset
   528
def _checkinvalidmarkers(repo, markers):
23973
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   529
    """search for marker with invalid data and raise error if needed
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   530
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   531
    Exist as a separated function to allow the evolve extension for a more
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   532
    subtle handling.
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   533
    """
24045
43061f96e40e obsolete: pass only new markers to _checkinvalidmarkers()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24044
diff changeset
   534
    for mark in markers:
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46780
diff changeset
   535
        if repo.nullid in mark[1]:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   536
            raise error.Abort(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   537
                _(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   538
                    b'bad obsolescence marker detected: '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   539
                    b'invalid successors nullid'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   540
                )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   541
            )
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   542
23973
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   543
48946
642e31cb55f0 py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48913
diff changeset
   544
class obsstore:
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   545
    """Store obsolete markers
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   546
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   547
    Markers can be accessed with two mappings:
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   548
    - predecessors[x] -> set(markers on predecessors edges of x)
17776
072812e9f570 obsolete: flip `obstore.successors` and `obsolete.precursors`
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17775
diff changeset
   549
    - successors[x] -> set(markers on successors edges of x)
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   550
    - children[x]   -> set(markers on predecessors edges of children(x)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   551
    """
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   552
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   553
    fields = (b'prec', b'succs', b'flag', b'meta', b'date', b'parents')
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   554
    # prec:    nodeid, predecessors changesets
22254
b8a0e8176693 obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22253
diff changeset
   555
    # succs:   tuple of nodeid, successor changesets (0-N length)
b8a0e8176693 obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22253
diff changeset
   556
    # flag:    integer, flag field carrying modifier for the markers (see doc)
38707
6b5ca1d0aa1e obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38157
diff changeset
   557
    # meta:    binary blob in UTF-8, encoded metadata dictionary
22254
b8a0e8176693 obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22253
diff changeset
   558
    # date:    (float, int) tuple, date of marker creation
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   559
    # parents: (tuple of nodeid) or None, parents of predecessors
22254
b8a0e8176693 obsstore: add a `parents` field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22253
diff changeset
   560
    #          None is used when no data has been recorded
22221
e75b1a3c1dbc obsstore: add fields attribute to track each field in a marker
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22219
diff changeset
   561
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46113
diff changeset
   562
    def __init__(self, repo, svfs, defaultformat=_fm1version, readonly=False):
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   563
        # caches for various obsolescence related cache
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   564
        self.caches = {}
25669
8d94861842e5 obsolete: replace references to 'sopener' with 'svfs'
Siddharth Agarwal <sid0@fb.com>
parents: 25412
diff changeset
   565
        self.svfs = svfs
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46113
diff changeset
   566
        self.repo = repo
32691
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   567
        self._defaultformat = defaultformat
22950
bb8278b289ee obsolete: add readonly flag to obstore constructor
Durham Goode <durham@fb.com>
parents: 22949
diff changeset
   568
        self._readonly = readonly
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   569
17073
3a79a5682af1 obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents: 17072
diff changeset
   570
    def __iter__(self):
3a79a5682af1 obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents: 17072
diff changeset
   571
        return iter(self._all)
3a79a5682af1 obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents: 17072
diff changeset
   572
20585
f3c8db3d6d66 obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20584
diff changeset
   573
    def __len__(self):
f3c8db3d6d66 obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20584
diff changeset
   574
        return len(self._all)
f3c8db3d6d66 obsstore: add a __len__ method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20584
diff changeset
   575
17075
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   576
    def __nonzero__(self):
48789
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   577
        from . import statichttprepo
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   578
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   579
        if isinstance(self.repo, statichttprepo.statichttprepository):
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   580
            # If repo is accessed via static HTTP, then we can't use os.stat()
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   581
            # to just peek at the file size.
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   582
            return len(self._data) > 1
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43240
diff changeset
   583
        if not self._cached('_all'):
26310
61efe9ef6ad4 obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents: 26309
diff changeset
   584
            try:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   585
                return self.svfs.stat(b'obsstore').st_size > 1
26310
61efe9ef6ad4 obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents: 26309
diff changeset
   586
            except OSError as inst:
48789
ef50a62eec40 obsolete: don't use os.stat in repo.obsstore.__nonzero__ if it's static HTTP
Anton Shestakov <av6@dwimlabs.net>
parents: 48723
diff changeset
   587
                if inst.errno != errno.ENOENT:
26310
61efe9ef6ad4 obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents: 26309
diff changeset
   588
                    raise
61efe9ef6ad4 obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents: 26309
diff changeset
   589
                # just build an empty _all list if no obsstore exists, which
61efe9ef6ad4 obsstore: fast path to check if obsstore is empty
Yuya Nishihara <yuya@tcha.org>
parents: 26309
diff changeset
   590
                # avoids further stat() syscalls
17075
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   591
        return bool(self._all)
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   592
31476
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31018
diff changeset
   593
    __bool__ = __nonzero__
413b44003462 py3: add __bool__ to every class defining __nonzero__
Gregory Szorc <gregory.szorc@gmail.com>
parents: 31018
diff changeset
   594
26684
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   595
    @property
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   596
    def readonly(self):
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   597
        """True if marker creation is disabled
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   598
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   599
        Remove me in the future when obsolete marker is always on."""
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   600
        return self._readonly
74ff350c208c obsstore: make the readonly attribute accessible
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 26587
diff changeset
   601
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   602
    def create(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   603
        self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   604
        transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   605
        prec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   606
        succs=(),
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   607
        flag=0,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   608
        parents=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   609
        date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   610
        metadata=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   611
        ui=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   612
    ):
17071
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   613
        """obsolete: add a new obsolete marker
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   614
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   615
        * ensuring it is hashable
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   616
        * check mandatory metadata
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   617
        * encode metadata
20516
3af218cf2007 obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
   618
3af218cf2007 obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
   619
        If you are a human writing code creating marker you want to use the
3af218cf2007 obsstore: update create docstring to point to the coder friendly function
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20476
diff changeset
   620
        `createmarkers` function in this module instead.
20584
224a058f7cd1 obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20549
diff changeset
   621
224a058f7cd1 obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20549
diff changeset
   622
        return True if a new marker have been added, False if the markers
224a058f7cd1 obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20549
diff changeset
   623
        already existed (no op).
17071
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   624
        """
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   625
        flag = int(flag)
17071
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   626
        if metadata is None:
11f26e2669aa command: creation of obsolete marker
Pierre-Yves.David@ens-lyon.org
parents: 17070
diff changeset
   627
            metadata = {}
22222
883e8b6bd461 obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22221
diff changeset
   628
        if date is None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   629
            if b'date' in metadata:
22222
883e8b6bd461 obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22221
diff changeset
   630
                # as a courtesy for out-of-tree extensions
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   631
                date = dateutil.parsedate(metadata.pop(b'date'))
32411
08d02c1d7e67 devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents: 32387
diff changeset
   632
            elif ui is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   633
                date = ui.configdate(b'devel', b'default-date')
32411
08d02c1d7e67 devel: use default-date config field when creating obsmarkers
Boris Feld <boris.feld@octobus.net>
parents: 32387
diff changeset
   634
                if date is None:
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36423
diff changeset
   635
                    date = dateutil.makedate()
22222
883e8b6bd461 obsmarker: add `date` as an explicit field
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22221
diff changeset
   636
            else:
36607
c6061cadb400 util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents: 36423
diff changeset
   637
                date = dateutil.makedate()
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   638
        if flag & usingsha256:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   639
            if len(prec) != 32:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   640
                raise ValueError(prec)
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   641
            for succ in succs:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   642
                if len(succ) != 32:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   643
                    raise ValueError(succ)
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   644
        else:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   645
            if len(prec) != 20:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   646
                raise ValueError(prec)
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   647
            for succ in succs:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   648
                if len(succ) != 20:
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   649
                    raise ValueError(succ)
22177
a56038e6a3c9 obsstore.create: add a simple safeguard against cyclic markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 21166
diff changeset
   650
        if prec in succs:
40164
fee616937ef3 obsolete: convert error string to a sysstr
Augie Fackler <augie@google.com>
parents: 40081
diff changeset
   651
            raise ValueError(
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
   652
                'in-marker cycle with %s' % pycompat.sysstr(hex(prec))
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   653
            )
22845
ef880e28e56a obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22685
diff changeset
   654
48913
f254fc73d956 global: bulk replace simple pycompat.iteritems(x) with x.items()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 48875
diff changeset
   655
        metadata = tuple(sorted(metadata.items()))
38708
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   656
        for k, v in metadata:
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   657
            try:
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   658
                # might be better to reject non-ASCII keys
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   659
                k.decode('utf-8')
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   660
                v.decode('utf-8')
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   661
            except UnicodeDecodeError:
ff1182d166a2 obsolete: explode if metadata contains invalid UTF-8 sequence (API)
Yuya Nishihara <yuya@tcha.org>
parents: 38707
diff changeset
   662
                raise error.ProgrammingError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   663
                    b'obsstore metadata must be valid UTF-8 sequence '
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   664
                    b'(key = %r, value = %r)'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   665
                    % (pycompat.bytestr(k), pycompat.bytestr(v))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   666
                )
22845
ef880e28e56a obsolete: store metadata as a tuple of (key, value) pairs (API)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22685
diff changeset
   667
45463
145cfe84d3e4 obsstore: refactor v1 logic to fix 32 byte hash support
Joerg Sonnenberger <joerg@bec.de>
parents: 44452
diff changeset
   668
        marker = (bytes(prec), tuple(succs), flag, metadata, date, parents)
20584
224a058f7cd1 obsstore: `create` method return True if a marker is actually added
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20549
diff changeset
   669
        return bool(self.add(transaction, [marker]))
17220
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   670
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   671
    def add(self, transaction, markers):
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   672
        """Add new markers to the store
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   673
17220
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   674
        Take care of filtering duplicate.
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   675
        Return the number of new marker."""
22950
bb8278b289ee obsolete: add readonly flag to obstore constructor
Durham Goode <durham@fb.com>
parents: 22949
diff changeset
   676
        if self._readonly:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   677
            raise error.Abort(
43117
8ff1ecfadcd1 cleanup: join string literals that are already on one line
Martin von Zweigbergk <martinvonz@google.com>
parents: 43106
diff changeset
   678
                _(b'creating obsolete markers is not enabled on this repo')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   679
            )
32774
5ffb138d7b1a obsstore: do not load all markers to detect duplication
Jun Wu <quark@fb.com>
parents: 32729
diff changeset
   680
        known = set()
5ffb138d7b1a obsstore: do not load all markers to detect duplication
Jun Wu <quark@fb.com>
parents: 32729
diff changeset
   681
        getsuccessors = self.successors.get
20030
5931489b65e0 obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20028
diff changeset
   682
        new = []
5931489b65e0 obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20028
diff changeset
   683
        for m in markers:
32774
5ffb138d7b1a obsstore: do not load all markers to detect duplication
Jun Wu <quark@fb.com>
parents: 32729
diff changeset
   684
            if m not in getsuccessors(m[0], ()) and m not in known:
20030
5931489b65e0 obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20028
diff changeset
   685
                known.add(m)
5931489b65e0 obsolete: do not accept duplicated marker during exchange
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20028
diff changeset
   686
                new.append(m)
17220
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   687
        if new:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   688
            f = self.svfs(b'obsstore', b'ab')
17124
f1b7683f3f95 obsolete: move obsolete markers read/write logic to obsstore object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17117
diff changeset
   689
            try:
17126
8fa8717b47b6 obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17125
diff changeset
   690
                offset = f.tell()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   691
                transaction.add(b'obsstore', offset)
17219
494a970f68de obsolete: refactor writemarkers to only encode them
Pierre-Yves.David@ens-lyon.org
parents: 17213
diff changeset
   692
                # offset == 0: new file - add the version header
33479
8b48dad66be4 obsstore: keep self._data updated with _addmarkers
Jun Wu <quark@fb.com>
parents: 33273
diff changeset
   693
                data = b''.join(encodemarkers(new, offset == 0, self._version))
8b48dad66be4 obsstore: keep self._data updated with _addmarkers
Jun Wu <quark@fb.com>
parents: 33273
diff changeset
   694
                f.write(data)
17126
8fa8717b47b6 obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17125
diff changeset
   695
            finally:
8fa8717b47b6 obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17125
diff changeset
   696
                # XXX: f.close() == filecache invalidation == obsstore rebuilt.
8fa8717b47b6 obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17125
diff changeset
   697
                # call 'filecacheentry.refresh()'  here
17124
f1b7683f3f95 obsolete: move obsolete markers read/write logic to obsstore object
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17117
diff changeset
   698
                f.close()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   699
            addedmarkers = transaction.changes.get(b'obsmarkers')
33251
a5cb2e4460de transaction: track new obsmarkers in the 'changes' mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33244
diff changeset
   700
            if addedmarkers is not None:
a5cb2e4460de transaction: track new obsmarkers in the 'changes' mapping
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33244
diff changeset
   701
                addedmarkers.update(new)
33479
8b48dad66be4 obsstore: keep self._data updated with _addmarkers
Jun Wu <quark@fb.com>
parents: 33273
diff changeset
   702
            self._addmarkers(new, data)
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   703
            # new marker *may* have changed several set. invalidate the cache.
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   704
            self.caches.clear()
22339
9680da73cfe0 obsmarker: record the number of new markers in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22335
diff changeset
   705
        # records the number of new markers for the transaction hooks
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   706
        previous = int(transaction.hookargs.get(b'new_obsmarkers', b'0'))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   707
        transaction.hookargs[b'new_obsmarkers'] = b'%d' % (previous + len(new))
17220
bdac214a4705 obsolete: obsstore.add now takes a list of markers.
Pierre-Yves.David@ens-lyon.org
parents: 17219
diff changeset
   708
        return len(new)
17126
8fa8717b47b6 obsolete: write obsolete marker inside a transaction
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17125
diff changeset
   709
17524
a736e1e15e46 spelling: transaction
timeless@mozdev.org
parents: 17516
diff changeset
   710
    def mergemarkers(self, transaction, data):
22325
3363f2d36015 obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22309
diff changeset
   711
        """merge a binary stream of markers inside the obsstore
3363f2d36015 obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22309
diff changeset
   712
3363f2d36015 obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22309
diff changeset
   713
        Returns the number of new markers added."""
22332
13e22358e9d2 obsolete: have _readmarkers return the format version
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22331
diff changeset
   714
        version, markers = _readmarkers(data)
22325
3363f2d36015 obsstore: have the `mergemarkers` method return the number of new markers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22309
diff changeset
   715
        return self.add(transaction, markers)
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   716
24046
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   717
    @propertycache
32690
3fad59faba8a obsstore: separate marker parsing from obsstore reading
Jun Wu <quark@fb.com>
parents: 32689
diff changeset
   718
    def _data(self):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   719
        return self.svfs.tryread(b'obsstore')
32690
3fad59faba8a obsstore: separate marker parsing from obsstore reading
Jun Wu <quark@fb.com>
parents: 32689
diff changeset
   720
3fad59faba8a obsstore: separate marker parsing from obsstore reading
Jun Wu <quark@fb.com>
parents: 32689
diff changeset
   721
    @propertycache
32691
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   722
    def _version(self):
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   723
        if len(self._data) >= 1:
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   724
            return _readmarkerversion(self._data)
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   725
        else:
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   726
            return self._defaultformat
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   727
5d8dd6c90af9 obsstore: move _version to a propertycache
Jun Wu <quark@fb.com>
parents: 32690
diff changeset
   728
    @propertycache
26309
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   729
    def _all(self):
32690
3fad59faba8a obsstore: separate marker parsing from obsstore reading
Jun Wu <quark@fb.com>
parents: 32689
diff changeset
   730
        data = self._data
26309
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   731
        if not data:
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   732
            return []
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   733
        self._version, markers = _readmarkers(data)
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   734
        markers = list(markers)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46780
diff changeset
   735
        _checkinvalidmarkers(self.repo, markers)
26309
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   736
        return markers
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   737
44918682093f obsstore: delay loading markers from obsstore file
Yuya Nishihara <yuya@tcha.org>
parents: 26308
diff changeset
   738
    @propertycache
24046
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   739
    def successors(self):
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   740
        successors = {}
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   741
        _addsuccessors(successors, self._all)
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   742
        return successors
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   743
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   744
    @propertycache
33733
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33732
diff changeset
   745
    def predecessors(self):
33732
32d4f815c4f4 obsolete: rename _addprecursors into _addpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33719
diff changeset
   746
        predecessors = {}
32d4f815c4f4 obsolete: rename _addprecursors into _addpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33719
diff changeset
   747
        _addpredecessors(predecessors, self._all)
32d4f815c4f4 obsolete: rename _addprecursors into _addpredecessors
Boris Feld <boris.feld@octobus.net>
parents: 33719
diff changeset
   748
        return predecessors
24046
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   749
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   750
    @propertycache
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   751
    def children(self):
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   752
        children = {}
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   753
        _addchildren(children, self._all)
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   754
        return children
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   755
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   756
    def _cached(self, attr):
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   757
        return attr in self.__dict__
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   758
33479
8b48dad66be4 obsstore: keep self._data updated with _addmarkers
Jun Wu <quark@fb.com>
parents: 33273
diff changeset
   759
    def _addmarkers(self, markers, rawdata):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   760
        markers = list(markers)  # to allow repeated iteration
33479
8b48dad66be4 obsstore: keep self._data updated with _addmarkers
Jun Wu <quark@fb.com>
parents: 33273
diff changeset
   761
        self._data = self._data + rawdata
24044
e0e6dd806b23 obsolete: extract helpers from _load()
Martin von Zweigbergk <martinvonz@google.com>
parents: 24019
diff changeset
   762
        self._all.extend(markers)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43240
diff changeset
   763
        if self._cached('successors'):
24046
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   764
            _addsuccessors(self.successors, markers)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43240
diff changeset
   765
        if self._cached('predecessors'):
33733
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33732
diff changeset
   766
            _addpredecessors(self.predecessors, markers)
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43240
diff changeset
   767
        if self._cached('children'):
24046
6e1d9f9932a9 obsolete: populate successors, precursors, children lazily
Martin von Zweigbergk <martinvonz@google.com>
parents: 24045
diff changeset
   768
            _addchildren(self.children, markers)
47012
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46780
diff changeset
   769
        _checkinvalidmarkers(self.repo, markers)
23973
18d431147cc1 obsstore: make the invalid markers check wrap-able
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23805
diff changeset
   770
22271
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   771
    def relevantmarkers(self, nodes):
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   772
        """return a set of all obsolescence markers relevant to a set of nodes.
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   773
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   774
        "relevant" to a set of nodes mean:
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   775
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   776
        - marker that use this changeset as successor
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   777
        - prune marker of direct children on this changeset
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   778
        - recursive application of the two rules on predecessors of these
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   779
          markers
22271
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   780
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   781
        It is a set so you cannot rely on order."""
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   782
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   783
        pendingnodes = set(nodes)
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   784
        seenmarkers = set()
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   785
        seennodes = set(pendingnodes)
33733
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33732
diff changeset
   786
        precursorsmarkers = self.predecessors
32488
176d1a0ce385 obsolete: fix relevant-obsmarkers computation on pruned changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32411
diff changeset
   787
        succsmarkers = self.successors
22271
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   788
        children = self.children
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   789
        while pendingnodes:
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   790
            direct = set()
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   791
            for current in pendingnodes:
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   792
                direct.update(precursorsmarkers.get(current, ()))
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   793
                pruned = [m for m in children.get(current, ()) if not m[1]]
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   794
                direct.update(pruned)
32488
176d1a0ce385 obsolete: fix relevant-obsmarkers computation on pruned changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32411
diff changeset
   795
                pruned = [m for m in succsmarkers.get(current, ()) if not m[1]]
176d1a0ce385 obsolete: fix relevant-obsmarkers computation on pruned changeset
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32411
diff changeset
   796
                direct.update(pruned)
22271
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   797
            direct -= seenmarkers
42057
566daffc607d cleanup: use set literals where possible
Martin von Zweigbergk <martinvonz@google.com>
parents: 40462
diff changeset
   798
            pendingnodes = {m[0] for m in direct}
22271
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   799
            seenmarkers |= direct
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   800
            pendingnodes -= seennodes
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   801
            seennodes |= pendingnodes
8c69262df82d obsstore: add relevantmarkers method
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22270
diff changeset
   802
        return seenmarkers
17070
ad0d6c2b3279 obsolete: introduction of obsolete markers
Pierre-Yves.David@ens-lyon.org
parents:
diff changeset
   803
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   804
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   805
def makestore(ui, repo):
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   806
    """Create an obsstore instance from a repo."""
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   807
    # read default format for new obsstore.
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   808
    # developer config: format.obsstore-version
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   809
    defaultformat = ui.configint(b'format', b'obsstore-version')
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   810
    # rely on obsstore class default when possible.
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   811
    kwargs = {}
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   812
    if defaultformat is not None:
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43240
diff changeset
   813
        kwargs['defaultformat'] = defaultformat
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   814
    readonly = not isenabled(repo, createmarkersopt)
46780
6266d19556ad node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46113
diff changeset
   815
    store = obsstore(repo, repo.svfs, readonly=readonly, **kwargs)
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   816
    if store and readonly:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   817
        ui.warn(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   818
            _(b'obsolete feature not enabled but %i markers found!\n')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   819
            % len(list(store))
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   820
        )
32729
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   821
    return store
c8177792fef6 obsolete: move obsstore creation logic from localrepo
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32692
diff changeset
   822
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   823
22345
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   824
def commonversion(versions):
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   825
    """Return the newest version listed in both versions and our local formats.
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   826
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   827
    Returns None if no common version exists.
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   828
    """
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   829
    versions.sort(reverse=True)
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   830
    # search for highest version known on both side
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   831
    for v in versions:
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   832
        if v in formats:
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   833
            return v
cf7014c5f087 obsolete: add a `commonversion` function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22339
diff changeset
   834
    return None
17295
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   835
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   836
17295
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   837
# arbitrary picked to fit into 8K limit from HTTP server
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   838
# you have to take in account:
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   839
# - the version header
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   840
# - the base85 encoding
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   841
_maxpayload = 5300
17075
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   842
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   843
20599
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   844
def _pushkeyescape(markers):
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   845
    """encode markers into a dict suitable for pushkey exchange
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   846
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20599
diff changeset
   847
    - binary data is base85 encoded
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20599
diff changeset
   848
    - split in chunks smaller than 5300 bytes"""
17295
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   849
    keys = {}
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   850
    parts = []
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   851
    currentlen = _maxpayload * 2  # ensure we create a new part
20599
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   852
    for marker in markers:
22329
ed37aa74d208 obsolete: rename _encodeonemarker to _fm0encodeonemarkers
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 22328
diff changeset
   853
        nextdata = _fm0encodeonemarker(marker)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   854
        if len(nextdata) + currentlen > _maxpayload:
17295
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   855
            currentpart = []
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   856
            currentlen = 0
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   857
            parts.append(currentpart)
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   858
        currentpart.append(nextdata)
17304
0368fc55d572 obsolete: properly increment currentlen when building pushkey payload
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17298
diff changeset
   859
        currentlen += len(nextdata)
17295
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   860
    for idx, part in enumerate(reversed(parts)):
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   861
        data = b''.join([_pack(b'>B', _fm0version)] + part)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   862
        keys[b'dump%i' % idx] = util.b85encode(data)
17295
1f08ecc7febb pushkey: splits obsolete marker exchange into multiple keys
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17253
diff changeset
   863
    return keys
17073
3a79a5682af1 obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents: 17072
diff changeset
   864
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   865
20599
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   866
def listmarkers(repo):
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   867
    """List markers over pushkey"""
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   868
    if not repo.obsstore:
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   869
        return {}
25118
e632a2429982 obsolete: sort obsmarkers during exchange
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24928
diff changeset
   870
    return _pushkeyescape(sorted(repo.obsstore))
20599
dad29624b056 obsolete: extract encoding of marker for pushkey from the list key function
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 20585
diff changeset
   871
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   872
17075
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   873
def pushmarker(repo, key, old, new):
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   874
    """Push markers over pushkey"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   875
    if not key.startswith(b'dump'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   876
        repo.ui.warn(_(b'unknown key: %r') % key)
32822
e65ff29dbeb0 pushkey: use False/True for return values from push functions
Martin von Zweigbergk <martinvonz@google.com>
parents: 32774
diff changeset
   877
        return False
17075
28ed1c4511ce obsolete: exchange obsolete marker over pushkey
Pierre-Yves.David@ens-lyon.org
parents: 17073
diff changeset
   878
    if old:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   879
        repo.ui.warn(_(b'unexpected old value for %r') % key)
32822
e65ff29dbeb0 pushkey: use False/True for return values from push functions
Martin von Zweigbergk <martinvonz@google.com>
parents: 32774
diff changeset
   880
        return False
32201
4462a981e8df base85: proxy through util module
Yuya Nishihara <yuya@tcha.org>
parents: 31476
diff changeset
   881
    data = util.b85decode(new)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   882
    with repo.lock(), repo.transaction(b'pushkey: obsolete markers') as tr:
35574
09285733ad71 obsolete: use context manager for transaction in pushmarker()
Martin von Zweigbergk <martinvonz@google.com>
parents: 35573
diff changeset
   883
        repo.obsstore.mergemarkers(tr, data)
09285733ad71 obsolete: use context manager for transaction in pushmarker()
Martin von Zweigbergk <martinvonz@google.com>
parents: 35573
diff changeset
   884
        repo.invalidatevolatilesets()
09285733ad71 obsolete: use context manager for transaction in pushmarker()
Martin von Zweigbergk <martinvonz@google.com>
parents: 35573
diff changeset
   885
        return True
17073
3a79a5682af1 obsolete: add easy way to iterate over obsolete marker object
Pierre-Yves.David@ens-lyon.org
parents: 17072
diff changeset
   886
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   887
17828
9495be4126ef obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17827
diff changeset
   888
# mapping of 'set-name' -> <function to compute this set>
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   889
cachefuncs = {}
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   890
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   891
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   892
def cachefor(name):
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   893
    """Decorator to register a function as computing the cache for a set"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   894
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   895
    def decorator(func):
32884
9d472b219fb0 obsolete: use ProgrammingError over assert for volatile set registration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32822
diff changeset
   896
        if name in cachefuncs:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   897
            msg = b"duplicated registration for volatileset '%s' (existing: %r)"
32884
9d472b219fb0 obsolete: use ProgrammingError over assert for volatile set registration
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 32822
diff changeset
   898
            raise error.ProgrammingError(msg % (name, cachefuncs[name]))
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   899
        cachefuncs[name] = func
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   900
        return func
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   901
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   902
    return decorator
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   903
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   904
17825
3cc06457f15e obsolete: rename `getobscache` into `getrevs`
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17776
diff changeset
   905
def getrevs(repo, name):
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   906
    """Return the set of revision that belong to the <name> set
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   907
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   908
    Such access may compute the set and cache it for future use"""
18001
e02feadd15ea clfilter: unfilter computation of obsolescence related computation
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17831
diff changeset
   909
    repo = repo.unfiltered()
43240
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   910
    with util.timedcm('getrevs %s', name):
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   911
        if not repo.obsstore:
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   912
            return frozenset()
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   913
        if name not in repo.obsstore.caches:
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   914
            repo.obsstore.caches[name] = cachefuncs[name](repo)
4353942be294 tracing: add a couple of trace points on obsolete and repoview
Augie Fackler <augie@google.com>
parents: 43117
diff changeset
   915
        return repo.obsstore.caches[name]
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   916
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   917
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   918
# To be simple we need to invalidate obsolescence cache when:
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   919
#
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   920
# - new changeset is added:
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   921
# - public phase is changed
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   922
# - obsolescence marker are added
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   923
# - strip is used a repo
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   924
def clearobscaches(repo):
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   925
    """Remove all obsolescence related cache from a repo
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   926
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   927
    This remove all cache in obsstore is the obsstore already exist on the
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   928
    repo.
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   929
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   930
    (We could be smarter here given the exact event that trigger the cache
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   931
    clearing)"""
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   932
    # only clear cache is there is obsstore data in this repo
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   933
    if b'obsstore' in repo._filecache:
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   934
        repo.obsstore.caches.clear()
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   935
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   936
33129
765c6ab07a88 obsolete: provide a small function to retrieve all mutable revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32884
diff changeset
   937
def _mutablerevs(repo):
765c6ab07a88 obsolete: provide a small function to retrieve all mutable revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32884
diff changeset
   938
    """the set of mutable revision in the repository"""
38157
02f992ac26e9 phases: define an official tuple of mutable phases
Boris Feld <boris.feld@octobus.net>
parents: 37131
diff changeset
   939
    return repo._phasecache.getrevset(repo, phases.mutablephases)
33129
765c6ab07a88 obsolete: provide a small function to retrieve all mutable revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32884
diff changeset
   940
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   941
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   942
@cachefor(b'obsolete')
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   943
def _computeobsoleteset(repo):
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   944
    """the set of obsolete revisions"""
27784
432242f41d9f obsolete: make _computeobsoleteset much faster
Laurent Charignon <lc2817@columbia.edu>
parents: 27332
diff changeset
   945
    getnode = repo.changelog.node
33129
765c6ab07a88 obsolete: provide a small function to retrieve all mutable revisions
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32884
diff changeset
   946
    notpublic = _mutablerevs(repo)
32688
2c1400d43fd2 obsstore: minor optimization for the obsolete revset
Jun Wu <quark@fb.com>
parents: 32627
diff changeset
   947
    isobs = repo.obsstore.successors.__contains__
48723
27fe84a8dd60 obsolete: always return frozensets from obsolete.getrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 48695
diff changeset
   948
    return frozenset(r for r in notpublic if isobs(getnode(r)))
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   949
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   950
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   951
@cachefor(b'orphan')
33777
d4b7496f7d0b obsolete: rename unstable volatile set into orphan volatile set
Boris Feld <boris.feld@octobus.net>
parents: 33772
diff changeset
   952
def _computeorphanset(repo):
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   953
    """the set of non obsolete revisions with obsolete parents"""
33130
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   954
    pfunc = repo.changelog.parentrevs
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   955
    mutable = _mutablerevs(repo)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   956
    obsolete = getrevs(repo, b'obsolete')
33130
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   957
    others = mutable - obsolete
24928
876a2ebfbf4f obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents: 24927
diff changeset
   958
    unstable = set()
33130
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   959
    for r in sorted(others):
24928
876a2ebfbf4f obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents: 24927
diff changeset
   960
        # A rev is unstable if one of its parent is obsolete or unstable
876a2ebfbf4f obsolete: speed up unstable computation
Laurent Charignon <lcharignon@fb.com>
parents: 24927
diff changeset
   961
        # this works since we traverse following growing rev order
33130
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   962
        for p in pfunc(r):
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   963
            if p in obsolete or p in unstable:
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   964
                unstable.add(r)
31ab1912678a obsolete: skip 'changectx' usage in unstable computation
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 33129
diff changeset
   965
                break
48723
27fe84a8dd60 obsolete: always return frozensets from obsolete.getrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 48695
diff changeset
   966
    return frozenset(unstable)
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   967
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   968
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   969
@cachefor(b'suspended')
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   970
def _computesuspendedset(repo):
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   971
    """the set of obsolete parents with non obsolete descendants"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   972
    suspended = repo.changelog.ancestors(getrevs(repo, b'orphan'))
48723
27fe84a8dd60 obsolete: always return frozensets from obsolete.getrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 48695
diff changeset
   973
    return frozenset(r for r in getrevs(repo, b'obsolete') if r in suspended)
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   974
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   975
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   976
@cachefor(b'extinct')
17469
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   977
def _computeextinctset(repo):
fb72eec7efd8 obsolete: introduce caches for all meaningful sets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17429
diff changeset
   978
    """the set of obsolete parents without non obsolete descendants"""
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   979
    return getrevs(repo, b'obsolete') - getrevs(repo, b'suspended')
17474
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
   980
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   981
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   982
@cachefor(b'phasedivergent')
33779
9fa874fb34e1 obsolete: rename bumped volatile set into phasedivergent volatile set
Boris Feld <boris.feld@octobus.net>
parents: 33778
diff changeset
   983
def _computephasedivergentset(repo):
17828
9495be4126ef obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17827
diff changeset
   984
    """the set of revs trying to obsolete public revisions"""
20207
cd62532c62a1 obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20206
diff changeset
   985
    bumped = set()
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20599
diff changeset
   986
    # util function (avoid attribute lookup in the loop)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   987
    phase = repo._phasecache.phase  # would be faster to grab the full list
20207
cd62532c62a1 obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20206
diff changeset
   988
    public = phases.public
cd62532c62a1 obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20206
diff changeset
   989
    cl = repo.changelog
43558
1542773ffa5d index: use `index.get_rev` in `obsolete._computephasedivergentset`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43506
diff changeset
   990
    torev = cl.index.get_rev
35136
82680919d75e obsolete: drop usage of changectx in '_computephasedivergentset'
Boris Feld <boris.feld@octobus.net>
parents: 34902
diff changeset
   991
    tonode = cl.node
40462
6e2a24550b7e obsolete: prefetch the repo.obsstore used in phasedivergence loop
Boris Feld <boris.feld@octobus.net>
parents: 40255
diff changeset
   992
    obsstore = repo.obsstore
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   993
    for rev in repo.revs(b'(not public()) and (not obsolete())'):
20207
cd62532c62a1 obsolete: order of magnitude speedup in _computebumpedset
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 20206
diff changeset
   994
        # We only evaluate mutable, non-obsolete revision
35136
82680919d75e obsolete: drop usage of changectx in '_computephasedivergentset'
Boris Feld <boris.feld@octobus.net>
parents: 34902
diff changeset
   995
        node = tonode(rev)
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
   996
        # (future) A cache of predecessors may worth if split is very common
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   997
        for pnode in obsutil.allpredecessors(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   998
            obsstore, [node], ignoreflags=bumpedfix
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
   999
        ):
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1000
            prev = torev(pnode)  # unfiltered! but so is phasecache
24927
cd0068232ec0 obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents: 24393
diff changeset
  1001
            if (prev is not None) and (phase(repo, prev) <= public):
33734
0c3112f17610 obsolete: rename precursor into predecessor in obsolete docstrings
Boris Feld <boris.feld@octobus.net>
parents: 33733
diff changeset
  1002
                # we have a public predecessor
24927
cd0068232ec0 obsolete: speed up computation of bumped revset
Laurent Charignon <lcharignon@fb.com>
parents: 24393
diff changeset
  1003
                bumped.add(rev)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1004
                break  # Next draft!
48723
27fe84a8dd60 obsolete: always return frozensets from obsolete.getrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 48695
diff changeset
  1005
    return frozenset(bumped)
17828
9495be4126ef obsolete: add the detection of bumped changeset.
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17827
diff changeset
  1006
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1007
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1008
@cachefor(b'contentdivergent')
33778
f3f06c260e9e obsolete: rename divergent volatile set into contentdivergent volatile set
Boris Feld <boris.feld@octobus.net>
parents: 33777
diff changeset
  1009
def _computecontentdivergentset(repo):
45942
89a2afe31e82 formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents: 45463
diff changeset
  1010
    """the set of rev that compete to be the final successors of some revision."""
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1011
    divergent = set()
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1012
    obsstore = repo.obsstore
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1013
    newermap = {}
35137
5cd6682b5a90 obsolete: drop usage of changectx in '_computecontentdivergentset'
Boris Feld <boris.feld@octobus.net>
parents: 35136
diff changeset
  1014
    tonode = repo.changelog.node
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1015
    for rev in repo.revs(b'(not public()) - obsolete()'):
35137
5cd6682b5a90 obsolete: drop usage of changectx in '_computecontentdivergentset'
Boris Feld <boris.feld@octobus.net>
parents: 35136
diff changeset
  1016
        node = tonode(rev)
5cd6682b5a90 obsolete: drop usage of changectx in '_computecontentdivergentset'
Boris Feld <boris.feld@octobus.net>
parents: 35136
diff changeset
  1017
        mark = obsstore.predecessors.get(node, ())
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1018
        toprocess = set(mark)
24393
77eace2a63cb obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24335
diff changeset
  1019
        seen = set()
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1020
        while toprocess:
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1021
            prec = toprocess.pop()[0]
24393
77eace2a63cb obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24335
diff changeset
  1022
            if prec in seen:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1023
                continue  # emergency cycle hanging prevention
24393
77eace2a63cb obsolete: avoid infinite loop from obs-cycle in divergence (issue4126)
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 24335
diff changeset
  1024
            seen.add(prec)
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1025
            if prec not in newermap:
33273
5724aaa99dd6 obsolete: pass cache argument of successors set explicitly
Boris Feld <boris.feld@octobus.net>
parents: 33251
diff changeset
  1026
                obsutil.successorssets(repo, prec, cache=newermap)
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1027
            newer = [n for n in newermap[prec] if n]
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1028
            if len(newer) > 1:
35137
5cd6682b5a90 obsolete: drop usage of changectx in '_computecontentdivergentset'
Boris Feld <boris.feld@octobus.net>
parents: 35136
diff changeset
  1029
                divergent.add(rev)
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1030
                break
33733
d5acd967f95a obsstore: rename precursors into predecessors
Boris Feld <boris.feld@octobus.net>
parents: 33732
diff changeset
  1031
            toprocess.update(obsstore.predecessors.get(prec, ()))
48723
27fe84a8dd60 obsolete: always return frozensets from obsolete.getrevs()
Anton Shestakov <av6@dwimlabs.net>
parents: 48695
diff changeset
  1032
    return frozenset(divergent)
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1033
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1034
40042
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1035
def makefoldid(relation, user):
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1036
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43558
diff changeset
  1037
    folddigest = hashutil.sha1(user)
40042
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1038
    for p in relation[0] + relation[1]:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1039
        folddigest.update(b'%d' % p.rev())
40042
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1040
        folddigest.update(p.node())
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1041
    # Since fold only has to compete against fold for the same successors, it
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1042
    # seems fine to use a small ID. Smaller ID save space.
46113
59fa3890d40a node: import symbols explicitly
Joerg Sonnenberger <joerg@bec.de>
parents: 45942
diff changeset
  1043
    return hex(folddigest.digest())[:8]
18070
af632936d3d9 obsolete: detect divergent changesets
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 18069
diff changeset
  1044
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1045
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1046
def createmarkers(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1047
    repo, relations, flag=0, date=None, metadata=None, operation=None
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1048
):
17474
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1049
    """Add obsolete markers between changesets in a repo
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1050
39922
6335c0de80fa obsolete: allow multiple predecessors in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
  1051
    <relations> must be an iterable of ((<old>,...), (<new>, ...)[,{metadata}])
21024
7731a2281cf0 spelling: fixes from spell checker
Mads Kiilerich <madski@unity3d.com>
parents: 20599
diff changeset
  1052
    tuple. `old` and `news` are changectx. metadata is an optional dictionary
20517
2158e8f3cbd2 createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20516
diff changeset
  1053
    containing metadata for this marker only. It is merged with the global
38707
6b5ca1d0aa1e obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38157
diff changeset
  1054
    metadata specified through the `metadata` argument of this function.
6b5ca1d0aa1e obsolete: store user name and note in UTF-8 (issue5754) (BC)
Yuya Nishihara <yuya@tcha.org>
parents: 38157
diff changeset
  1055
    Any string values in metadata must be UTF-8 bytes.
17474
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1056
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1057
    Trying to obsolete a public changeset will raise an exception.
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1058
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1059
    Current user and date are used except if specified otherwise in the
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1060
    metadata attribute.
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1061
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1062
    This function operates within a transaction of its own, but does
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1063
    not take any lock on the repo.
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1064
    """
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1065
    # prepare metadata
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1066
    if metadata is None:
f85816af6294 obsolete: add a high level function to create an obsolete marker
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 17469
diff changeset
  1067
        metadata = {}
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1068
    if b'user' not in metadata:
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1069
        luser = (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1070
            repo.ui.config(b'devel', b'user.obsmarker') or repo.ui.username()
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1071
        )
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1072
        metadata[b'user'] = encoding.fromlocal(luser)
34388
ddcef6d0b0ef obsolete: clean createmarkers part about operation
Boris Feld <boris.feld@octobus.net>
parents: 34379
diff changeset
  1073
ddcef6d0b0ef obsolete: clean createmarkers part about operation
Boris Feld <boris.feld@octobus.net>
parents: 34379
diff changeset
  1074
    # Operation metadata handling
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1075
    useoperation = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1076
        b'experimental', b'evolution.track-operation'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1077
    )
32354
f432897a9f49 obsmarker: add an experimental flag controlling "operation" recording
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 32333
diff changeset
  1078
    if useoperation and operation:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1079
        metadata[b'operation'] = operation
34388
ddcef6d0b0ef obsolete: clean createmarkers part about operation
Boris Feld <boris.feld@octobus.net>
parents: 34379
diff changeset
  1080
34413
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34407
diff changeset
  1081
    # Effect flag metadata handling
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1082
    saveeffectflag = repo.ui.configbool(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1083
        b'experimental', b'evolution.effect-flags'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1084
    )
34413
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34407
diff changeset
  1085
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1086
    with repo.transaction(b'add-obsolescence-marker') as tr:
27984
e60e13a86529 obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents: 27784
diff changeset
  1087
        markerargs = []
20517
2158e8f3cbd2 createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20516
diff changeset
  1088
        for rel in relations:
39922
6335c0de80fa obsolete: allow multiple predecessors in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
  1089
            predecessors = rel[0]
6335c0de80fa obsolete: allow multiple predecessors in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
  1090
            if not isinstance(predecessors, tuple):
6335c0de80fa obsolete: allow multiple predecessors in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
  1091
                # preserve compat with old API until all caller are migrated
6335c0de80fa obsolete: allow multiple predecessors in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
  1092
                predecessors = (predecessors,)
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 39922
diff changeset
  1093
            if len(predecessors) > 1 and len(rel[1]) != 1:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1094
                msg = b'Fold markers can only have 1 successors, not %d'
39922
6335c0de80fa obsolete: allow multiple predecessors in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39921
diff changeset
  1095
                raise error.ProgrammingError(msg % len(rel[1]))
40042
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1096
            foldid = None
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1097
            foldsize = len(predecessors)
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1098
            if 1 < foldsize:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1099
                foldid = makefoldid(rel, metadata[b'user'])
40042
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1100
            for foldidx, prec in enumerate(predecessors, 1):
39921
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1101
                sucs = rel[1]
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1102
                localmetadata = metadata.copy()
40029
e2697acd9381 cleanup: some Yoda conditions, this patch removes
Martin von Zweigbergk <martinvonz@google.com>
parents: 39922
diff changeset
  1103
                if len(rel) > 2:
39921
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1104
                    localmetadata.update(rel[2])
40042
208303a8172c obsolete: explicitly track folds inside the markers
Boris Feld <boris.feld@octobus.net>
parents: 40029
diff changeset
  1105
                if foldid is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1106
                    localmetadata[b'fold-id'] = foldid
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1107
                    localmetadata[b'fold-idx'] = b'%d' % foldidx
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1108
                    localmetadata[b'fold-size'] = b'%d' % foldsize
20517
2158e8f3cbd2 createmarkers: allow to pass metadata for a marker only
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents: 20516
diff changeset
  1109
39921
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1110
                if not prec.mutable():
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1111
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1112
                        _(b"cannot obsolete public changeset: %s") % prec,
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1113
                        hint=b"see 'hg help phases' for details",
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1114
                    )
39921
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1115
                nprec = prec.node()
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1116
                nsucs = tuple(s.node() for s in sucs)
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1117
                npare = None
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1118
                if not nsucs:
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1119
                    npare = tuple(p.node() for p in prec.parents())
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1120
                if nprec in nsucs:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1121
                    raise error.Abort(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1122
                        _(b"changeset %s cannot obsolete itself") % prec
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1123
                    )
27984
e60e13a86529 obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents: 27784
diff changeset
  1124
39921
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1125
                # Effect flag can be different by relation
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1126
                if saveeffectflag:
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1127
                    # The effect flag is saved in a versioned field name for
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1128
                    # future evolution
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1129
                    effectflag = obsutil.geteffectflag(prec, sucs)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
  1130
                    localmetadata[obsutil.EFFECTFLAGFIELD] = b"%d" % effectflag
34413
014d467f9d08 effectflag: store an empty effect flag for the moment
Boris Feld <boris.feld@octobus.net>
parents: 34407
diff changeset
  1131
39921
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1132
                # Creating the marker causes the hidden cache to become
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1133
                # invalid, which causes recomputation when we ask for
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1134
                # prec.parents() above.  Resulting in n^2 behavior.  So let's
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1135
                # prepare all of the args first, then create the markers.
99f0f052b6bf obsolete: preindent code in createmarkers
Boris Feld <boris.feld@octobus.net>
parents: 39920
diff changeset
  1136
                markerargs.append((nprec, nsucs, npare, localmetadata))
27984
e60e13a86529 obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents: 27784
diff changeset
  1137
e60e13a86529 obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents: 27784
diff changeset
  1138
        for args in markerargs:
e60e13a86529 obsolete: fix n^2 marker computation behavior
Durham Goode <durham@fb.com>
parents: 27784
diff changeset
  1139
            nprec, nsucs, npare, localmetadata = args
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1140
            repo.obsstore.create(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1141
                tr,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1142
                nprec,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1143
                nsucs,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1144
                flag,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1145
                parents=npare,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1146
                date=date,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1147
                metadata=localmetadata,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1148
                ui=repo.ui,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42217
diff changeset
  1149
            )
18101
a464deecc9dd clfilter: add a cache on repo for set of revision to filter for a given set.
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18070
diff changeset
  1150
            repo.filteredrevcache.clear()