annotate mercurial/utils/storageutil.py @ 49609:31b4675ca998 stable

emitrevision: if we need to compute a delta on the fly, try p1 or p2 first Falling back to `prev` does not yield any real value on modern storage and result in pathological changes to be created on the other side. Doing a delta against a parent will likely be smaller (helping the network) and will be safer to apply on the client (helping future pulls by Triggering intermediate snapshop where they will be needed by later deltas).
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Thu, 24 Nov 2022 04:04:19 +0100
parents bb2c663c840f
children f463eb675e85
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
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
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
9 import re
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
10 import struct
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
11
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
12 from ..i18n import _
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
13 from ..node import (
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
14 bin,
40005
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
15 nullrev,
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
16 sha1nodeconstants,
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
17 )
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
18 from .. import (
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
19 dagop,
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
20 error,
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
21 mdiff,
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
22 )
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
23 from ..interfaces import repository
46728
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46725
diff changeset
24 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
25 from ..utils import hashutil
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
26
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
27 _nullhash = hashutil.sha1(sha1nodeconstants.nullid)
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
28
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47055
diff changeset
29 # 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
30 # 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
31 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
32
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
33
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
34 def hashrevisionsha1(text, p1, p2):
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
35 """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
36
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
37 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
38 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
39 content in the revision graph.
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
40 """
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
41 # 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
42 if p2 == sha1nodeconstants.nullid:
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
43 # 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
44 s = _nullhash.copy()
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
45 s.update(p1)
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
46 else:
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
47 # none of the parent nodes are nullid
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
48 if p1 < p2:
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
49 a = p1
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
50 b = p2
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
51 else:
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
52 a = p2
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
53 b = p1
44060
a61287a95dc3 core: migrate uses of hashlib.sha1 to hashutil.sha1
Augie Fackler <augie@google.com>
parents: 43077
diff changeset
54 s = hashutil.sha1(a)
39882
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
55 s.update(b)
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
56 s.update(text)
f8eb71f9e3bd storageutil: new module for storage primitives (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
diff changeset
57 return s.digest()
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
58
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
59
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
60 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
61
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
62
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
63 def parsemeta(text):
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
64 """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
65
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
66 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
67 is no metadata.
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
68 """
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
69 # 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
70 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
71 return None, None
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
72 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
73 mtext = text[2:s]
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
74 meta = {}
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
75 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
76 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
77 meta[k] = v
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
78 return meta, s + 2
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
79
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
80
39883
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
81 def packmeta(meta, text):
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
82 """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
83 keys = sorted(meta)
3e896b51aa5d storageutil: move metadata parsing and packing from revlog (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39882
diff changeset
84 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
85 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
86
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
87
39884
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
88 def iscensoredtext(text):
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
89 meta = parsemeta(text)[0]
d269ddbf54f0 storageutil: move _censoredtext() from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39883
diff changeset
90 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
91
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
92
39885
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
93 def filtermetadata(text):
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
94 """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
95
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
96 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
97 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
98 """
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
99 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
100 return text
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
101
1b65fb4d43d6 storageutil: new function for extracting metadata-less content from text
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39884
diff changeset
102 offset = text.index(b'\x01\n', 2)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
103 return text[offset + 2 :]
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
104
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
105
40006
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
106 def filerevisioncopied(store, node):
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
107 """Resolve file revision copy metadata.
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
108
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
109 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
110 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
111 """
47055
d55b71393907 node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents: 46728
diff changeset
112 if store.parents(node)[0] != sha1nodeconstants.nullid:
48574
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
113 # When creating a copy or move we set filelog parents to null,
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
114 # because contents are probably unrelated and making a delta
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
115 # would not be useful.
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
116 # Conversely, if filelog p1 is non-null we know
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
117 # there is no copy metadata.
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
118 # In the presence of merges, this reasoning becomes invalid
5026a0d37526 filelog: add a comment explaining a fast path in filerevisioncopied()
Simon Sapin <simon.sapin@octobus.net>
parents: 47349
diff changeset
119 # if we reorder parents. See tests/test-issue6528.t.
40006
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
120 return False
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
121
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
122 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
123
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
124 # 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
125 # 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
126 # as a copy.
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
127 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
128 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
129
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
130 return False
1d97a332c6d9 storageutil: extract copy metadata retrieval out of filelog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40005
diff changeset
131
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
132
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
133 def filedataequivalent(store, node, filedata):
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
134 """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
135
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
136 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
137 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
138
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
139 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
140 equivalence.
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
141
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
142 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
143 of the compare.
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
144 """
40007
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 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
147 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
148 else:
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
149 revisiontext = filedata
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
150
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
151 p1, p2 = store.parents(node)
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 computednode = hashrevisionsha1(revisiontext, p1, p2)
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
154
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
155 if computednode == node:
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
156 return True
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
157
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
158 # 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
159 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
160 return filedata == b''
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
161
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
162 # 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
163 # 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
164 if store.renamed(node):
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
165 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
166
40008
1470183068b8 storageutil: invert logic of file data comparison
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40007
diff changeset
167 return False
40007
422beffd71ba storageutil: extract filelog.cmp() to a standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40006
diff changeset
168
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
169
39886
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
170 def iterrevs(storelen, start=0, stop=None):
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
171 """Iterate over revision numbers in a store."""
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
172 step = 1
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
173
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
174 if stop is not None:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
175 if start > stop:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
176 step = -1
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
177 stop += step
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
178 if stop > storelen:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
179 stop = storelen
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
180 else:
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
181 stop = storelen
d63153611ed5 storageutil: extract revision number iteration
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39885
diff changeset
182
49292
d44e3c45f0e4 py3: replace `pycompat.xrange` by `range`
Manuel Jacob <me@manueljacob.de>
parents: 48966
diff changeset
183 return range(start, stop, step)
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
184
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
185
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
186 def fileidlookup(store, fileid, identifier):
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
187 """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
188
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
189 ``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
190
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
191 ``fileid`` can be:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
192
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
193 * 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
194 * An integer revision number
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
195 * 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
196 * 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
197
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
198 ``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
199 for the store.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
200
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
201 Raises ``error.LookupError`` on failure.
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
202 """
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
203 if isinstance(fileid, int):
40004
ad8389ecd3f5 storageutil: consistently raise LookupError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40003
diff changeset
204 try:
ad8389ecd3f5 storageutil: consistently raise LookupError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40003
diff changeset
205 return store.node(fileid)
ad8389ecd3f5 storageutil: consistently raise LookupError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40003
diff changeset
206 except IndexError:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
207 raise error.LookupError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
208 b'%d' % fileid, identifier, _(b'no match found')
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
209 )
40003
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
210
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
211 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
212 try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
213 store.rev(fileid)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
214 return fileid
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
215 except error.LookupError:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
216 pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
217
45418
c4a4a49589bf storageutil: allow modern hash sizes for fileids
Joerg Sonnenberger <joerg@bec.de>
parents: 44470
diff changeset
218 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
219 try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
220 rawnode = bin(fileid)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
221 store.rev(rawnode)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
222 return rawnode
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
223 except TypeError:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
224 pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
225
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
226 try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
227 rev = int(fileid)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
228
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
229 if b'%d' % rev != fileid:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
230 raise ValueError
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
231
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
232 try:
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
233 return store.node(rev)
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
234 except (IndexError, TypeError):
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
235 pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
236 except (ValueError, OverflowError):
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
237 pass
0e8836be9541 storageutil: implement file identifier resolution method (BC)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39886
diff changeset
238
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
239 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
240
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
241
40005
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
242 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
243 """Resolve information needed to strip revisions.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
244
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
245 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
246 strip ``minlinkrev``.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
247
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
248 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
249 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
250 by that strip.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
251
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
252 ``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
253 ``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
254 ``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
255 revision.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
256 ``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
257 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
258 """
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
259 brokenrevs = set()
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
260 strippoint = tiprev + 1
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
261
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
262 heads = {}
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
263 futurelargelinkrevs = set()
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
264 for head in headrevs:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
265 headlinkrev = linkrevfn(head)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
266 heads[head] = headlinkrev
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
267 if headlinkrev >= minlinkrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
268 futurelargelinkrevs.add(headlinkrev)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
269
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
270 # 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
271 # 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
272 # 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
273 # 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
274 # So we can stop walking.
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
275 while futurelargelinkrevs:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
276 strippoint -= 1
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
277 linkrev = heads.pop(strippoint)
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 if linkrev < minlinkrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
280 brokenrevs.add(strippoint)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
281 else:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
282 futurelargelinkrevs.remove(linkrev)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
283
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
284 for p in parentrevsfn(strippoint):
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
285 if p != nullrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
286 plinkrev = linkrevfn(p)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
287 heads[p] = plinkrev
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
288 if plinkrev >= minlinkrev:
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
289 futurelargelinkrevs.add(plinkrev)
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
290
fa3dc85a747e storageutil: extract functionality for resolving strip revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40004
diff changeset
291 return strippoint, brokenrevs
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
292
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
293
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
294 def emitrevisions(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
295 store,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
296 nodes,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
297 nodesorder,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
298 resultcls,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
299 deltaparentfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
300 candeltafn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
301 rawsizefn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
302 revdifffn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
303 flagsfn=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
304 deltamode=repository.CG_DELTAMODE_STD,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
305 revisiondata=False,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
306 assumehaveparentrevisions=False,
46728
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46725
diff changeset
307 sidedata_helpers=None,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
308 ):
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
309 """Generic implementation of ifiledata.emitrevisions().
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
310
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
311 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
312 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
313
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
314 ``store``
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
315 Object conforming to ``ifilestorage`` interface.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
316
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
317 ``nodes``
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
318 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
319
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
320 ``resultcls``
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
321 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
322 constructed and returned.
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 ``deltaparentfn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
325 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
326 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
327 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
328
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
329 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
330 data.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
331
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
332 ``candeltafn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
333 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
334 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
335
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
336 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
337 each other.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
338
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
339 ``rawsizefn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
340 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
341 ``store.rawdata(rev)``.
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
342
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
343 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
344
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
345 ``revdifffn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
346 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
347 between them.
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
348
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
349 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
350 on ``store.revision()`` results.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
351
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
352 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
353 used without having to compute on.
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
354
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
355 ``flagsfn`` (optional)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
356 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
357 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
358
40495
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
359 ``deltamode``
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
360 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
361 * 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
362 * 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
363 * 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
364
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
365 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
366
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
367 ``nodesorder``
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
368 ``revisiondata``
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
369 ``assumehaveparentrevisions``
46728
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46725
diff changeset
370 ``sidedata_helpers`` (optional)
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46725
diff changeset
371 If not None, means that sidedata should be included.
47100
8bd769b5c941 sidedata: move documentation about sidedata helpers to sidedata module
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47099
diff changeset
372 See `revlogutil.sidedata.get_sidedata_helpers`.
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
373 """
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
374
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
375 fnode = store.node
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
376 frev = store.rev
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
377
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
378 if nodesorder == b'nodes':
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
379 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
380 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
381 revs = {frev(n) for n in nodes}
40011
f5d819d84461 storageutil: pass nodes into emitrevisions()
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40010
diff changeset
382 revs = dagop.linearize(revs, store.parentrevs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
383 else: # storage and default
40419
634b45317459 changegroup: restore default node ordering (issue6001)
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
384 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
385
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
386 prevrev = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
387
40495
59a870a4ad6e changegroup: refactor emitrevision to use a `deltamode` argument
Boris Feld <boris.feld@octobus.net>
parents: 40325
diff changeset
388 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
389 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
390
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
391 # 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
392 available = set()
49607
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
393 parents = []
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
394
49606
fa955e3f6aee emitrevision: add a small closure to check if a base is usable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49292
diff changeset
395 def is_usable_base(rev):
49607
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
396 """Is a delta against this revision usable over the wire"""
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
397 if rev == nullrev:
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
398 return False
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
399 # Base revision was already emitted in this group.
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
400 if rev in available:
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
401 return True
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
402 # Base revision is a parent that hasn't been emitted already.
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
403 if assumehaveparentrevisions and rev in parents:
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
404 return True
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
405 return False
49606
fa955e3f6aee emitrevision: add a small closure to check if a base is usable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49292
diff changeset
406
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
407 for rev in revs:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
408 if rev == nullrev:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
409 continue
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
410
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
411 node = fnode(rev)
49607
0bda07f34c01 emitrevision: also check the parents in the availability closure
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49606
diff changeset
412 parents[:] = p1rev, p2rev = store.parentrevs(rev)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
413
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
414 if deltaparentfn:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
415 deltaparentrev = deltaparentfn(rev)
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
416 else:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
417 deltaparentrev = nullrev
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
418
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
419 # 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
420 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
421 baserev = prevrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
422
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
423 # 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
424 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
425 baserev = nullrev
40497
968dd7e02ac5 changegroup: allow to force delta to be against p1
Boris Feld <boris.feld@octobus.net>
parents: 40495
diff changeset
426 # 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
427 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
428 baserev = p1rev
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
429
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
430 # 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
431 # 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
432 # therefore the fastest.
49608
bb2c663c840f emitrevision: simplify the fallback to computed delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49607
diff changeset
433 elif is_usable_base(deltaparentrev):
bb2c663c840f emitrevision: simplify the fallback to computed delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49607
diff changeset
434 baserev = deltaparentrev
bb2c663c840f emitrevision: simplify the fallback to computed delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49607
diff changeset
435 else:
bb2c663c840f emitrevision: simplify the fallback to computed delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49607
diff changeset
436 # No guarantee the receiver has the delta parent, or Storage has a
bb2c663c840f emitrevision: simplify the fallback to computed delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49607
diff changeset
437 # fulltext revision.
bb2c663c840f emitrevision: simplify the fallback to computed delta
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49607
diff changeset
438 #
49609
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
439 # We compute a delta on the fly to send over the wire.
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
440 #
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
441 # We start with a try against p1, which in the common case should
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
442 # be close to this revision content.
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
443 #
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
444 # note: we could optimize between p1 and p2 in merges cases.
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
445 if is_usable_base(p1rev):
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
446 baserev = p1rev
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
447 # if p1 was not an option, try p2
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
448 elif is_usable_base(p2rev):
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
449 baserev = p2rev
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
450 # Send delta against prev in despair
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
451 #
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
452 # using the closest available ancestors first might be better?
31b4675ca998 emitrevision: if we need to compute a delta on the fly, try p1 or p2 first
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 49608
diff changeset
453 elif prevrev is not None:
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
454 baserev = prevrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
455 else:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
456 baserev = nullrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
457
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
458 # 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
459 # reason. Reset to fulltext.
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
460 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
461 baserev = nullrev
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
462
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
463 revision = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
464 delta = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
465 baserevisionsize = None
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
466
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
467 if revisiondata:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
468 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
469 try:
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
470 revision = store.rawdata(node)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
471 except error.CensoredNodeError as e:
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
472 revision = e.tombstone
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
473
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
474 if baserev != nullrev:
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
475 if rawsizefn:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
476 baserevisionsize = rawsizefn(baserev)
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
477 else:
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
478 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
479
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
480 elif (
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
481 baserev == nullrev and deltamode != repository.CG_DELTAMODE_PREV
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
482 ):
42797
aeb2be20b33b rawdata: update callers in storageutils
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 40512
diff changeset
483 revision = store.rawdata(node)
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
484 available.add(rev)
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
485 else:
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
486 if revdifffn:
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
487 delta = revdifffn(baserev, rev)
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
488 else:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
489 delta = mdiff.textdiff(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
490 store.rawdata(baserev), store.rawdata(rev)
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
491 )
40010
631c6f5058b9 storageutil: make all callables optional
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40009
diff changeset
492
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
493 available.add(rev)
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
494
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47055
diff changeset
495 serialized_sidedata = None
47095
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47094
diff changeset
496 sidedata_flags = (0, 0)
46728
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46725
diff changeset
497 if sidedata_helpers:
47349
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
498 try:
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
499 old_sidedata = store.sidedata(rev)
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
500 except error.CensoredNodeError:
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
501 # skip any potential sidedata of the censored revision
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
502 sidedata = {}
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
503 else:
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
504 sidedata, sidedata_flags = sidedatamod.run_sidedata_helpers(
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
505 store=store,
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
506 sidedata_helpers=sidedata_helpers,
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
507 sidedata=old_sidedata,
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
508 rev=rev,
24ea3ef35238 censor: do not process sidedata of censored revision while bundling
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 47100
diff changeset
509 )
47094
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47055
diff changeset
510 if sidedata:
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47055
diff changeset
511 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
512
119790e1c67c cg4: introduce protocol flag to signify the presence of sidedata
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47055
diff changeset
513 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
514 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
515 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
516 # 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
517 protocol_flags |= CG_FLAG_SIDEDATA
47095
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47094
diff changeset
518 # Computers and removers can return flags to add and/or remove
223b47235d1c sidedata: enable sidedata computers to optionally rewrite flags
Rapha?l Gom?s <rgomes@octobus.net>
parents: 47094
diff changeset
519 flags = flags | sidedata_flags[0] & ~sidedata_flags[1]
46728
45f0d5297698 changegroupv4: add sidedata helpers
Rapha?l Gom?s <rgomes@octobus.net>
parents: 46725
diff changeset
520
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
521 yield resultcls(
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
522 node=node,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
523 p1node=fnode(p1rev),
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
524 p2node=fnode(p2rev),
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
525 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
526 flags=flags,
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
527 baserevisionsize=baserevisionsize,
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
528 revision=revision,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
529 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
530 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
531 protocol_flags=protocol_flags,
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
532 )
40009
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
533
842ffcf1d42f storageutil: extract most of emitrevisions() to standalone function
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40008
diff changeset
534 prevrev = rev
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
535
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
536
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
537 def deltaiscensored(delta, baserev, baselenfn):
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
538 """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
539
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
540 ``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
541 ``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
542 length of the revision fulltext.
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
543
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
544 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
545 revision.
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
546 """
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
547 # 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
548 # 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
549 # "\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
550 # 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
551 # delta for this prefix.
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
552 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
553 if len(delta) <= hlen:
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
554 return False
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 oldlen = baselenfn(baserev)
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
557 newlen = len(delta) - hlen
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
558 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
559 return False
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
560
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
561 add = b"\1\ncensored:"
40325
b0fbd1792e2d storageutil: extract most of peek_censored from revlog
Gregory Szorc <gregory.szorc@gmail.com>
parents: 40321
diff changeset
562 addlen = len(add)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 42823
diff changeset
563 return newlen >= addlen and delta[hlen : hlen + addlen] == add