mercurial/utils/storageutil.py
author Raphaël Gomès <rgomes@octobus.net>
Sat, 10 Apr 2021 11:27:40 +0200
changeset 47094 119790e1c67c
parent 47055 d55b71393907
child 47095 223b47235d1c
permissions -rw-r--r--
cg4: introduce protocol flag to signify the presence of sidedata We need a way of signaling whether the current revision has sidedata or not, and re-using the revision flags would waste potential revlog flags and mix two normally independent layers. In this change, we add a single byte at the start of the ch4 delta header to set potential protocol flags. We also reclaim the revlog flag for sidedata, since it is no longer used, in its place now lives the (also experimental) copytracing flag. When generating deltas, apply the `CG_FLAG_SIDEDATA` flag if there is sidedata. When applying the deltas, if said flag is present, the next chunk contains the sidedata. Differential Revision: https://phab.mercurial-scm.org/D10343
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     1
# storageutil.py - Storage functionality agnostic of backend implementation.
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     2
#
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     3
# Copyright 2018 Gregory Szorc <gregory.szorc@gmail.com>
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     4
#
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     5
# This software may be used and distributed according to the terms of the
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     6
# GNU General Public License version 2 or any later version.
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     7
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     8
from __future__ import absolute_import
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
     9
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    10
import re
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
    11
import struct
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    12
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
    13
from ..i18n import _
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    14
from ..node import (
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
    15
    bin,
40005
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
    16
    nullrev,
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
    17
    sha1nodeconstants,
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    18
)
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
    19
from .. import (
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
    20
    dagop,
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
    21
    error,
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
    22
    mdiff,
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
    23
    pycompat,
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
    24
)
42823
268662aac075 interfaces: create a new folder for interfaces and move repository.py in it
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 42797
diff changeset
    25
from ..interfaces import repository
46728
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
    26
from ..revlogutils import sidedata as sidedatamod
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
    27
from ..utils import hashutil
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    28
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
    29
_nullhash = hashutil.sha1(sha1nodeconstants.nullid)
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    30
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
    31
# revision data contains extra metadata not part of the official digest
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
    32
# Only used in changegroup >= v4.
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
    33
CG_FLAG_SIDEDATA = 1
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
    34
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
    35
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    36
def hashrevisionsha1(text, p1, p2):
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    37
    """Compute the SHA-1 for revision data and its parents.
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    38
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    39
    This hash combines both the current file contents and its history
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    40
    in a manner that makes it easy to distinguish nodes with the same
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    41
    content in the revision graph.
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    42
    """
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    43
    # As of now, if one of the parent node is null, p2 is null
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
    44
    if p2 == sha1nodeconstants.nullid:
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    45
        # deep copy of a hash is faster than creating one
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    46
        s = _nullhash.copy()
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    47
        s.update(p1)
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    48
    else:
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    49
        # none of the parent nodes are nullid
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    50
        if p1 < p2:
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    51
            a = p1
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    52
            b = p2
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    53
        else:
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    54
            a = p2
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    55
            b = p1
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
    56
        s = hashutil.sha1(a)
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    57
        s.update(b)
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    58
    s.update(text)
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
    59
    return s.digest()
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    60
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
    61
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    62
METADATA_RE = re.compile(b'\x01\n')
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    63
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
    64
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    65
def parsemeta(text):
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    66
    """Parse metadata header from revision data.
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    67
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    68
    Returns a 2-tuple of (metadata, offset), where both can be None if there
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    69
    is no metadata.
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    70
    """
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    71
    # text can be buffer, so we can't use .startswith or .index
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    72
    if text[:2] != b'\x01\n':
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    73
        return None, None
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    74
    s = METADATA_RE.search(text, 2).start()
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    75
    mtext = text[2:s]
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    76
    meta = {}
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    77
    for l in mtext.splitlines():
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    78
        k, v = l.split(b': ', 1)
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    79
        meta[k] = v
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    80
    return meta, s + 2
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    81
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
    82
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    83
def packmeta(meta, text):
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    84
    """Add metadata to fulltext to produce revision text."""
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    85
    keys = sorted(meta)
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    86
    metatext = b''.join(b'%s: %s\n' % (k, meta[k]) for k in keys)
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
    87
    return b'\x01\n%s\x01\n%s' % (metatext, text)
39884
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
    88
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
    89
39884
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
    90
def iscensoredtext(text):
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
    91
    meta = parsemeta(text)[0]
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
    92
    return meta and b'censored' in meta
39885
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
    93
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
    94
39885
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
    95
def filtermetadata(text):
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
    96
    """Extract just the revision data from source text.
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
    97
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
    98
    Returns ``text`` unless it has a metadata header, in which case we return
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
    99
    a new buffer without hte metadata.
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
   100
    """
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
   101
    if not text.startswith(b'\x01\n'):
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
   102
        return text
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
   103
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
   104
    offset = text.index(b'\x01\n', 2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   105
    return text[offset + 2 :]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   106
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   107
40006
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   108
def filerevisioncopied(store, node):
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   109
    """Resolve file revision copy metadata.
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   110
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   111
    Returns ``False`` if the file has no copy metadata. Otherwise a
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   112
    2-tuple of the source filename and node.
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   113
    """
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
   114
    if store.parents(node)[0] != sha1nodeconstants.nullid:
40006
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   115
        return False
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   116
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   117
    meta = parsemeta(store.revision(node))[0]
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   118
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   119
    # copy and copyrev occur in pairs. In rare cases due to old bugs,
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   120
    # one can occur without the other. So ensure both are present to flag
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   121
    # as a copy.
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   122
    if meta and b'copy' in meta and b'copyrev' in meta:
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   123
        return meta[b'copy'], bin(meta[b'copyrev'])
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   124
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   125
    return False
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
   126
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   127
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   128
def filedataequivalent(store, node, filedata):
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   129
    """Determines whether file data is equivalent to a stored node.
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   130
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   131
    Returns True if the passed file data would hash to the same value
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   132
    as a stored revision and False otherwise.
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   133
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   134
    When a stored revision is censored, filedata must be empty to have
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   135
    equivalence.
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   136
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   137
    When a stored revision has copy metadata, it is ignored as part
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   138
    of the compare.
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   139
    """
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   140
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   141
    if filedata.startswith(b'\x01\n'):
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   142
        revisiontext = b'\x01\n\x01\n' + filedata
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   143
    else:
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   144
        revisiontext = filedata
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   145
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   146
    p1, p2 = store.parents(node)
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   147
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   148
    computednode = hashrevisionsha1(revisiontext, p1, p2)
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   149
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   150
    if computednode == node:
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   151
        return True
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   152
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   153
    # Censored files compare against the empty file.
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   154
    if store.iscensored(store.rev(node)):
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   155
        return filedata == b''
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   156
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   157
    # Renaming a file produces a different hash, even if the data
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   158
    # remains unchanged. Check if that's the case.
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   159
    if store.renamed(node):
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   160
        return store.read(node) == filedata
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   161
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
   162
    return False
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
   163
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   164
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   165
def iterrevs(storelen, start=0, stop=None):
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   166
    """Iterate over revision numbers in a store."""
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   167
    step = 1
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   168
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   169
    if stop is not None:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   170
        if start > stop:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   171
            step = -1
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   172
        stop += step
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   173
        if stop > storelen:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   174
            stop = storelen
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   175
    else:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   176
        stop = storelen
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   177
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
   178
    return pycompat.xrange(start, stop, step)
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   179
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   180
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   181
def fileidlookup(store, fileid, identifier):
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   182
    """Resolve the file node for a value.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   183
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   184
    ``store`` is an object implementing the ``ifileindex`` interface.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   185
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   186
    ``fileid`` can be:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   187
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   188
    * A 20 or 32 byte binary node.
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   189
    * An integer revision number
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   190
    * A 40 or 64 byte hex node.
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   191
    * A bytes that can be parsed as an integer representing a revision number.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   192
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   193
    ``identifier`` is used to populate ``error.LookupError`` with an identifier
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   194
    for the store.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   195
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   196
    Raises ``error.LookupError`` on failure.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   197
    """
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   198
    if isinstance(fileid, int):
40004
ad8389ecd3f5 storageutil: consistently raise LookupError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40003
diff changeset
   199
        try:
ad8389ecd3f5 storageutil: consistently raise LookupError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40003
diff changeset
   200
            return store.node(fileid)
ad8389ecd3f5 storageutil: consistently raise LookupError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40003
diff changeset
   201
        except IndexError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   202
            raise error.LookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   203
                b'%d' % fileid, identifier, _(b'no match found')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   204
            )
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   205
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   206
    if len(fileid) in (20, 32):
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   207
        try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   208
            store.rev(fileid)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   209
            return fileid
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   210
        except error.LookupError:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   211
            pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   212
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
   213
    if len(fileid) in (40, 64):
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   214
        try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   215
            rawnode = bin(fileid)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   216
            store.rev(rawnode)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   217
            return rawnode
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   218
        except TypeError:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   219
            pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   220
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   221
    try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   222
        rev = int(fileid)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   223
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   224
        if b'%d' % rev != fileid:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   225
            raise ValueError
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   226
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   227
        try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   228
            return store.node(rev)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   229
        except (IndexError, TypeError):
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   230
            pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   231
    except (ValueError, OverflowError):
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   232
        pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
   233
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   234
    raise error.LookupError(fileid, identifier, _(b'no match found'))
40005
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   235
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   236
40005
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   237
def resolvestripinfo(minlinkrev, tiprev, headrevs, linkrevfn, parentrevsfn):
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   238
    """Resolve information needed to strip revisions.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   239
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   240
    Finds the minimum revision number that must be stripped in order to
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   241
    strip ``minlinkrev``.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   242
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   243
    Returns a 2-tuple of the minimum revision number to do that and a set
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   244
    of all revision numbers that have linkrevs that would be broken
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   245
    by that strip.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   246
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   247
    ``tiprev`` is the current tip-most revision. It is ``len(store) - 1``.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   248
    ``headrevs`` is an iterable of head revisions.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   249
    ``linkrevfn`` is a callable that receives a revision and returns a linked
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   250
    revision.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   251
    ``parentrevsfn`` is a callable that receives a revision number and returns
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   252
    an iterable of its parent revision numbers.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   253
    """
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   254
    brokenrevs = set()
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   255
    strippoint = tiprev + 1
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   256
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   257
    heads = {}
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   258
    futurelargelinkrevs = set()
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   259
    for head in headrevs:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   260
        headlinkrev = linkrevfn(head)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   261
        heads[head] = headlinkrev
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   262
        if headlinkrev >= minlinkrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   263
            futurelargelinkrevs.add(headlinkrev)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   264
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   265
    # This algorithm involves walking down the rev graph, starting at the
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   266
    # heads. Since the revs are topologically sorted according to linkrev,
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   267
    # once all head linkrevs are below the minlink, we know there are
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   268
    # no more revs that could have a linkrev greater than minlink.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   269
    # So we can stop walking.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   270
    while futurelargelinkrevs:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   271
        strippoint -= 1
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   272
        linkrev = heads.pop(strippoint)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   273
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   274
        if linkrev < minlinkrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   275
            brokenrevs.add(strippoint)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   276
        else:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   277
            futurelargelinkrevs.remove(linkrev)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   278
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   279
        for p in parentrevsfn(strippoint):
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   280
            if p != nullrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   281
                plinkrev = linkrevfn(p)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   282
                heads[p] = plinkrev
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   283
                if plinkrev >= minlinkrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   284
                    futurelargelinkrevs.add(plinkrev)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   285
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
   286
    return strippoint, brokenrevs
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   287
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   288
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   289
def emitrevisions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   290
    store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   291
    nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   292
    nodesorder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   293
    resultcls,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   294
    deltaparentfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   295
    candeltafn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   296
    rawsizefn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   297
    revdifffn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   298
    flagsfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   299
    deltamode=repository.CG_DELTAMODE_STD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   300
    revisiondata=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   301
    assumehaveparentrevisions=False,
46728
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   302
    sidedata_helpers=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   303
):
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   304
    """Generic implementation of ifiledata.emitrevisions().
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   305
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   306
    Emitting revision data is subtly complex. This function attempts to
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   307
    encapsulate all the logic for doing so in a backend-agnostic way.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   308
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   309
    ``store``
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   310
       Object conforming to ``ifilestorage`` interface.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   311
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   312
    ``nodes``
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   313
       List of revision nodes whose data to emit.
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   314
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   315
    ``resultcls``
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   316
       A type implementing the ``irevisiondelta`` interface that will be
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   317
       constructed and returned.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   318
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   319
    ``deltaparentfn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   320
       Callable receiving a revision number and returning the revision number
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   321
       of a revision that the internal delta is stored against. This delta
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   322
       will be preferred over computing a new arbitrary delta.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   323
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   324
       If not defined, a delta will always be computed from raw revision
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   325
       data.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   326
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   327
    ``candeltafn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   328
       Callable receiving a pair of revision numbers that returns a bool
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   329
       indicating whether a delta between them can be produced.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   330
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   331
       If not defined, it is assumed that any two revisions can delta with
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   332
       each other.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   333
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   334
    ``rawsizefn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   335
       Callable receiving a revision number and returning the length of the
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
   336
       ``store.rawdata(rev)``.
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   337
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
   338
       If not defined, ``len(store.rawdata(rev))`` will be called.
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   339
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   340
    ``revdifffn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   341
       Callable receiving a pair of revision numbers that returns a delta
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   342
       between them.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   343
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   344
       If not defined, a delta will be computed by invoking mdiff code
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   345
       on ``store.revision()`` results.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   346
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   347
       Defining this function allows a precomputed or stored delta to be
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   348
       used without having to compute on.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   349
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   350
    ``flagsfn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   351
       Callable receiving a revision number and returns the integer flags
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   352
       value for it. If not defined, flags value will be 0.
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   353
40495
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   354
    ``deltamode``
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   355
       constaint on delta to be sent:
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   356
       * CG_DELTAMODE_STD  - normal mode, try to reuse storage deltas,
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   357
       * CG_DELTAMODE_PREV - only delta against "prev",
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   358
       * CG_DELTAMODE_FULL - only issue full snapshot.
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   359
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   360
       Whether to send fulltext revisions instead of deltas, if allowed.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   361
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   362
    ``nodesorder``
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   363
    ``revisiondata``
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   364
    ``assumehaveparentrevisions``
46728
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   365
    ``sidedata_helpers`` (optional)
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   366
        If not None, means that sidedata should be included.
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   367
        A dictionary of revlog type to tuples of `(repo, computers, removers)`:
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   368
            * `repo` is used as an argument for computers
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   369
            * `computers` is a list of `(category, (keys, computer)` that
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   370
               compute the missing sidedata categories that were asked:
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   371
               * `category` is the sidedata category
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   372
               * `keys` are the sidedata keys to be affected
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   373
               * `computer` is the function `(repo, store, rev, sidedata)` that
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   374
                 returns a new sidedata dict.
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   375
            * `removers` will remove the keys corresponding to the categories
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   376
              that are present, but not needed.
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   377
        If both `computers` and `removers` are empty, sidedata are simply not
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   378
        transformed.
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   379
        Revlog types are `changelog`, `manifest` or `filelog`.
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   380
    """
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   381
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   382
    fnode = store.node
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   383
    frev = store.rev
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   384
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   385
    if nodesorder == b'nodes':
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   386
        revs = [frev(n) for n in nodes]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   387
    elif nodesorder == b'linear':
44470
9d2b2df2c2ba cleanup: run pyupgrade on our source tree to clean up varying things
Augie Fackler <augie@google.com>
parents: 44060
diff changeset
   388
        revs = {frev(n) for n in nodes}
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
   389
        revs = dagop.linearize(revs, store.parentrevs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   390
    else:  # storage and default
40419
634b45317459 changegroup: restore default node ordering (issue6001)
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   391
        revs = sorted(frev(n) for n in nodes)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   392
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   393
    prevrev = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   394
40495
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   395
    if deltamode == repository.CG_DELTAMODE_PREV or assumehaveparentrevisions:
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   396
        prevrev = store.parentrevs(revs[0])[0]
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   397
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   398
    # Set of revs available to delta against.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   399
    available = set()
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   400
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   401
    for rev in revs:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   402
        if rev == nullrev:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   403
            continue
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   404
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   405
        node = fnode(rev)
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   406
        p1rev, p2rev = store.parentrevs(rev)
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   407
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   408
        if deltaparentfn:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   409
            deltaparentrev = deltaparentfn(rev)
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   410
        else:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   411
            deltaparentrev = nullrev
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   412
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   413
        # Forced delta against previous mode.
40495
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   414
        if deltamode == repository.CG_DELTAMODE_PREV:
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   415
            baserev = prevrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   416
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   417
        # We're instructed to send fulltext. Honor that.
40495
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
   418
        elif deltamode == repository.CG_DELTAMODE_FULL:
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   419
            baserev = nullrev
40497
968dd7e02ac5 changegroup: allow to force delta to be against p1
Boris Feld <boris.feld@octobus.net>
parents: 40495
diff changeset
   420
        # We're instructed to use p1. Honor that
968dd7e02ac5 changegroup: allow to force delta to be against p1
Boris Feld <boris.feld@octobus.net>
parents: 40495
diff changeset
   421
        elif deltamode == repository.CG_DELTAMODE_P1:
968dd7e02ac5 changegroup: allow to force delta to be against p1
Boris Feld <boris.feld@octobus.net>
parents: 40495
diff changeset
   422
            baserev = p1rev
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   423
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   424
        # There is a delta in storage. We try to use that because it
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   425
        # amounts to effectively copying data from storage and is
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   426
        # therefore the fastest.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   427
        elif deltaparentrev != nullrev:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   428
            # Base revision was already emitted in this group. We can
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   429
            # always safely use the delta.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   430
            if deltaparentrev in available:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   431
                baserev = deltaparentrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   432
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   433
            # Base revision is a parent that hasn't been emitted already.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   434
            # Use it if we can assume the receiver has the parent revision.
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   435
            elif assumehaveparentrevisions and deltaparentrev in (p1rev, p2rev):
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   436
                baserev = deltaparentrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   437
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   438
            # No guarantee the receiver has the delta parent. Send delta
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   439
            # against last revision (if possible), which in the common case
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   440
            # should be similar enough to this revision that the delta is
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   441
            # reasonable.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   442
            elif prevrev is not None:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   443
                baserev = prevrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   444
            else:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   445
                baserev = nullrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   446
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   447
        # Storage has a fulltext revision.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   448
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   449
        # Let's use the previous revision, which is as good a guess as any.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   450
        # There is definitely room to improve this logic.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   451
        elif prevrev is not None:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   452
            baserev = prevrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   453
        else:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   454
            baserev = nullrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   455
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   456
        # But we can't actually use our chosen delta base for whatever
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   457
        # reason. Reset to fulltext.
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   458
        if baserev != nullrev and (candeltafn and not candeltafn(baserev, rev)):
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   459
            baserev = nullrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   460
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   461
        revision = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   462
        delta = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   463
        baserevisionsize = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   464
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   465
        if revisiondata:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   466
            if store.iscensored(baserev) or store.iscensored(rev):
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   467
                try:
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
   468
                    revision = store.rawdata(node)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   469
                except error.CensoredNodeError as e:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   470
                    revision = e.tombstone
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   471
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   472
                if baserev != nullrev:
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   473
                    if rawsizefn:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   474
                        baserevisionsize = rawsizefn(baserev)
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   475
                    else:
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
   476
                        baserevisionsize = len(store.rawdata(baserev))
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   477
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   478
            elif (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   479
                baserev == nullrev and deltamode != repository.CG_DELTAMODE_PREV
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   480
            ):
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
   481
                revision = store.rawdata(node)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   482
                available.add(rev)
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   483
            else:
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   484
                if revdifffn:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   485
                    delta = revdifffn(baserev, rev)
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   486
                else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   487
                    delta = mdiff.textdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   488
                        store.rawdata(baserev), store.rawdata(rev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   489
                    )
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
   490
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   491
                available.add(rev)
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   492
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   493
        serialized_sidedata = None
46728
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   494
        if sidedata_helpers:
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   495
            sidedata = store.sidedata(rev)
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   496
            sidedata = run_sidedata_helpers(
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   497
                store=store,
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   498
                sidedata_helpers=sidedata_helpers,
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   499
                sidedata=sidedata,
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   500
                rev=rev,
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   501
            )
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   502
            if sidedata:
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   503
                serialized_sidedata = sidedatamod.serialize_sidedata(sidedata)
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   504
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   505
        flags = flagsfn(rev) if flagsfn else 0
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   506
        protocol_flags = 0
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   507
        if serialized_sidedata:
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   508
            # Advertise that sidedata exists to the other side
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   509
            protocol_flags |= CG_FLAG_SIDEDATA
46728
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   510
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   511
        yield resultcls(
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   512
            node=node,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   513
            p1node=fnode(p1rev),
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   514
            p2node=fnode(p2rev),
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   515
            basenode=fnode(baserev),
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   516
            flags=flags,
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   517
            baserevisionsize=baserevisionsize,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   518
            revision=revision,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   519
            delta=delta,
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   520
            sidedata=serialized_sidedata,
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Raphaël Gomès <rgomes@octobus.net>
parents: 47055
diff changeset
   521
            protocol_flags=protocol_flags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   522
        )
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   523
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
   524
        prevrev = rev
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   525
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   526
46728
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   527
def run_sidedata_helpers(store, sidedata_helpers, sidedata, rev):
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   528
    """Returns the sidedata for the given revision after running through
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   529
    the given helpers.
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   530
    - `store`: the revlog this applies to (changelog, manifest, or filelog
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   531
      instance)
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   532
    - `sidedata_helpers`: see `storageutil.emitrevisions`
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   533
    - `sidedata`: previous sidedata at the given rev, if any
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   534
    - `rev`: affected rev of `store`
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   535
    """
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   536
    repo, sd_computers, sd_removers = sidedata_helpers
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   537
    kind = store.revlog_kind
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   538
    for _keys, sd_computer in sd_computers.get(kind, []):
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   539
        sidedata = sd_computer(repo, store, rev, sidedata)
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   540
    for keys, _computer in sd_removers.get(kind, []):
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   541
        for key in keys:
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   542
            sidedata.pop(key, None)
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   543
    return sidedata
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   544
45f0d5297698 changegroupv4: add sidedata helpers
Raphaël Gomès <rgomes@octobus.net>
parents: 46725
diff changeset
   545
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   546
def deltaiscensored(delta, baserev, baselenfn):
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   547
    """Determine if a delta represents censored revision data.
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   548
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   549
    ``baserev`` is the base revision this delta is encoded against.
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   550
    ``baselenfn`` is a callable receiving a revision number that resolves the
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   551
    length of the revision fulltext.
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   552
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   553
    Returns a bool indicating if the result of the delta represents a censored
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   554
    revision.
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   555
    """
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   556
    # Fragile heuristic: unless new file meta keys are added alphabetically
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   557
    # preceding "censored", all censored revisions are prefixed by
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   558
    # "\1\ncensored:". A delta producing such a censored revision must be a
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   559
    # full-replacement delta, so we inspect the first and only patch in the
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   560
    # delta for this prefix.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   561
    hlen = struct.calcsize(b">lll")
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   562
    if len(delta) <= hlen:
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   563
        return False
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   564
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   565
    oldlen = baselenfn(baserev)
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   566
    newlen = len(delta) - hlen
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   567
    if delta[:hlen] != mdiff.replacediffheader(oldlen, newlen):
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   568
        return False
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   569
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
   570
    add = b"\1\ncensored:"
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
   571
    addlen = len(add)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
   572
    return newlen >= addlen and delta[hlen : hlen + addlen] == add