Mercurial > hg
annotate mercurial/changelog.py @ 49803:55d45d0de4e7
typing: add type hints to pycompat.bytestr
The problem with leaving pytype to its own devices here was that for functions
that returned a bytestr, pytype inferred `Union[bytes, int]`. It now accepts
that it can be treated as plain bytes.
I wasn't able to figure out the arg type for `__getitem__`- `SupportsIndex`
(which PyCharm indicated is how the superclass function is typed) got flagged:
File "/mnt/c/Users/Matt/hg/mercurial/pycompat.py", line 236, in __getitem__:
unsupported operand type(s) for item retrieval: bytestr and SupportsIndex [unsupported-operands]
Function __getitem__ on bytestr expects int
But some caller got flagged when I marked it as `int`.
There's some minor spillover problems elsewhere- pytype doesn't seem to
recognize that `bytes.startswith()` can optionally take a 3rd and 4th arg, so
those few places have the warning disabled. It also flags where the tar API is
being abused, but that would be a tricky refactor (and would require typing
extensions until py3.7 is dropped), so disable those too.
author | Matt Harbison <matt_harbison@yahoo.com> |
---|---|
date | Wed, 14 Dec 2022 01:51:33 -0500 |
parents | 642e31cb55f0 |
children | 87f0155d68aa |
rev | line source |
---|---|
1095 | 1 # changelog.py - changelog class for mercurial |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2 # |
46819
d4ba4d51f85f
contributor: change mentions of mpm to olivia
Raphaël Gomès <rgomes@octobus.net>
parents:
46780
diff
changeset
|
3 # Copyright 2005-2007 Olivia Mackall <olivia@selenic.com> |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
4 # |
8225
46293a0c7e9f
updated license to be explicit about GPL version 2
Martin Geisler <mg@lazybytes.net>
parents:
8209
diff
changeset
|
5 # This software may be used and distributed according to the terms of the |
10263 | 6 # GNU General Public License version 2 or any later version. |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 |
25922
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
8 |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
9 from .i18n import _ |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
10 from .node import ( |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
11 bin, |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
12 hex, |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
13 ) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
14 from .thirdparty import attr |
25922
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
15 |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
16 from . import ( |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
17 encoding, |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
18 error, |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44792
diff
changeset
|
19 metadata, |
36228
ddeb7653b31c
py3: use pycompat.bytestr to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
35974
diff
changeset
|
20 pycompat, |
25922
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
21 revlog, |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
22 ) |
37084
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
23 from .utils import ( |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
24 dateutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
25 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36607
diff
changeset
|
26 ) |
47072
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
27 from .revlogutils import ( |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
28 constants as revlog_constants, |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
29 flagutil, |
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
30 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
31 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
32 _defaultextra = {b'branch': b'default'} |
16267
aa6821a7b52f
changelog: micro-optimizations to changelog.read()
Matt Mackall <mpm@selenic.com>
parents:
15661
diff
changeset
|
33 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
34 |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
35 def _string_escape(text): |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
36 """ |
34133
708b5530a273
doctest: replace chr() with pycompat.bytechr()
Yuya Nishihara <yuya@tcha.org>
parents:
34132
diff
changeset
|
37 >>> from .pycompat import bytechr as chr |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34028
diff
changeset
|
38 >>> d = {b'nl': chr(10), b'bs': chr(92), b'cr': chr(13), b'nul': chr(0)} |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
39 >>> s = b"ab%(nl)scd%(bs)s%(bs)sn%(nul)s12ab%(cr)scd%(bs)s%(nl)s" % d |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
40 >>> s |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
41 'ab\\ncd\\\\\\\\n\\x0012ab\\rcd\\\\\\n' |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
42 >>> res = _string_escape(s) |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
43 >>> s == _string_unescape(res) |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
44 True |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
45 """ |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
46 # subset of the string_escape codec |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
47 text = ( |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
48 text.replace(b'\\', b'\\\\') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
49 .replace(b'\n', b'\\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
50 .replace(b'\r', b'\\r') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
51 ) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
52 return text.replace(b'\0', b'\\0') |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
53 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
54 |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
55 def _string_unescape(text): |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
56 if b'\\0' in text: |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
57 # fix up \0 without getting into trouble with \\0 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
58 text = text.replace(b'\\\\', b'\\\\\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
59 text = text.replace(b'\\0', b'\0') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
60 text = text.replace(b'\n', b'') |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
61 return stringutil.unescapestr(text) |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41831
diff
changeset
|
62 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
63 |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
64 def decodeextra(text): |
15661
20ae902c43ec
changelog: handle decoding of NULs in extra more carefully (issue3156)
Matt Mackall <mpm@selenic.com>
parents:
14643
diff
changeset
|
65 """ |
34133
708b5530a273
doctest: replace chr() with pycompat.bytechr()
Yuya Nishihara <yuya@tcha.org>
parents:
34132
diff
changeset
|
66 >>> from .pycompat import bytechr as chr |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34028
diff
changeset
|
67 >>> sorted(decodeextra(encodeextra({b'foo': b'bar', b'baz': chr(0) + b'2'}) |
34132
264872544362
doctest: replace .iteritems() with .items()
Yuya Nishihara <yuya@tcha.org>
parents:
34131
diff
changeset
|
68 ... ).items()) |
18379
e0c4f4ba624c
tests: fix doctest stability over Python versions
Mads Kiilerich <madski@unity3d.com>
parents:
18378
diff
changeset
|
69 [('baz', '\\x002'), ('branch', 'default'), ('foo', 'bar')] |
34131
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34028
diff
changeset
|
70 >>> sorted(decodeextra(encodeextra({b'foo': b'bar', |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34028
diff
changeset
|
71 ... b'baz': chr(92) + chr(0) + b'2'}) |
34132
264872544362
doctest: replace .iteritems() with .items()
Yuya Nishihara <yuya@tcha.org>
parents:
34131
diff
changeset
|
72 ... ).items()) |
18379
e0c4f4ba624c
tests: fix doctest stability over Python versions
Mads Kiilerich <madski@unity3d.com>
parents:
18378
diff
changeset
|
73 [('baz', '\\\\\\x002'), ('branch', 'default'), ('foo', 'bar')] |
15661
20ae902c43ec
changelog: handle decoding of NULs in extra more carefully (issue3156)
Matt Mackall <mpm@selenic.com>
parents:
14643
diff
changeset
|
74 """ |
16267
aa6821a7b52f
changelog: micro-optimizations to changelog.read()
Matt Mackall <mpm@selenic.com>
parents:
15661
diff
changeset
|
75 extra = _defaultextra.copy() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
76 for l in text.split(b'\0'): |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
77 if l: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
78 k, v = _string_unescape(l).split(b':', 1) |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
79 extra[k] = v |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
80 return extra |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
81 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
82 |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
83 def encodeextra(d): |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
84 # keys must be sorted to produce a deterministic changelog entry |
44604
2141427533d2
py3: require values in changelog extras to be bytes
Martin von Zweigbergk <martinvonz@google.com>
parents:
44055
diff
changeset
|
85 items = [_string_escape(b'%s:%s' % (k, d[k])) for k in sorted(d)] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
86 return b"\0".join(items) |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
87 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
88 |
17810
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
89 def stripdesc(desc): |
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
90 """strip trailing whitespace and leading and trailing empty lines""" |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
91 return b'\n'.join([l.rstrip() for l in desc.splitlines()]).strip(b'\n') |
17810
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
92 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
93 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
94 class appender: |
45942
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45728
diff
changeset
|
95 """the changelog index must be updated last on disk, so we use this class |
89a2afe31e82
formating: upgrade to black 20.8b1
Augie Fackler <raf@durin42.com>
parents:
45728
diff
changeset
|
96 to delay writes to it""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
97 |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
98 def __init__(self, vfs, name, mode, buf): |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
99 self.data = buf |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
100 fp = vfs(name, mode) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
101 self.fp = fp |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
102 self.offset = fp.tell() |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
103 self.size = vfs.fstat(fp).st_size |
30596
be520fe3a3e9
changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents:
30210
diff
changeset
|
104 self._end = self.size |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
105 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
106 def end(self): |
30596
be520fe3a3e9
changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents:
30210
diff
changeset
|
107 return self._end |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
108 |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
109 def tell(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
110 return self.offset |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
111 |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
112 def flush(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
113 pass |
35963
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35962
diff
changeset
|
114 |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35962
diff
changeset
|
115 @property |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35962
diff
changeset
|
116 def closed(self): |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35962
diff
changeset
|
117 return self.fp.closed |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35962
diff
changeset
|
118 |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
119 def close(self): |
4961
3fdd09ad6cce
fix bogus close spotted by pychecker (no close() in global scope)
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
4635
diff
changeset
|
120 self.fp.close() |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
121 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
122 def seek(self, offset, whence=0): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
123 '''virtual file offset spans real file and data''' |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
124 if whence == 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
125 self.offset = offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
126 elif whence == 1: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
127 self.offset += offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
128 elif whence == 2: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
129 self.offset = self.end() + offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
130 if self.offset < self.size: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
131 self.fp.seek(self.offset) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
132 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
133 def read(self, count=-1): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
134 '''only trick here is reads that span real file and data''' |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
135 ret = b"" |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
136 if self.offset < self.size: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
137 s = self.fp.read(count) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
138 ret = s |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
139 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
140 if count > 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
141 count -= len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
142 if count != 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
143 doff = self.offset - self.size |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
144 self.data.insert(0, b"".join(self.data)) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
145 del self.data[1:] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
146 s = self.data[0][doff : doff + count] |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
147 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
148 ret += s |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
149 return ret |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
150 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
151 def write(self, s): |
31642
addc392cc3d3
py3: use bytes() to cast to immutable bytes in changelog.appender.write()
Yuya Nishihara <yuya@tcha.org>
parents:
31484
diff
changeset
|
152 self.data.append(bytes(s)) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
153 self.offset += len(s) |
30596
be520fe3a3e9
changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents:
30210
diff
changeset
|
154 self._end += len(s) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
155 |
35962
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
156 def __enter__(self): |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
157 self.fp.__enter__() |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
158 return self |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
159 |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
160 def __exit__(self, *args): |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
161 return self.fp.__exit__(*args) |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
162 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
163 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
164 class _divertopener: |
44496
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
165 def __init__(self, opener, target): |
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
166 self._opener = opener |
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
167 self._target = target |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
168 |
44496
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
169 def __call__(self, name, mode=b'r', checkambig=False, **kwargs): |
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
170 if name != self._target: |
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
171 return self._opener(name, mode, **kwargs) |
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
172 return self._opener(name + b".a", mode, **kwargs) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
173 |
44496
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
174 def __getattr__(self, attr): |
897f0ce4b484
changelog: change the implementation of `_divertopener`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44308
diff
changeset
|
175 return getattr(self._opener, attr) |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
176 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
177 |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
178 def _delayopener(opener, target, buf): |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
179 """build an opener that stores chunks in 'buf' instead of 'target'""" |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
180 |
44055
7f67f53492f7
changelog: fix the diverted opener to accept more kwargs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43787
diff
changeset
|
181 def _delay(name, mode=b'r', checkambig=False, **kwargs): |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
182 if name != target: |
44055
7f67f53492f7
changelog: fix the diverted opener to accept more kwargs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43787
diff
changeset
|
183 return opener(name, mode, **kwargs) |
7f67f53492f7
changelog: fix the diverted opener to accept more kwargs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43787
diff
changeset
|
184 assert not kwargs |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
185 return appender(opener, name, mode, buf) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
186 |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
187 return _delay |
9166
e6162b854ed5
changelog: move delayopener outside of class to eliminate reference cycle
Matt Mackall <mpm@selenic.com>
parents:
9165
diff
changeset
|
188 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
189 |
34398
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34296
diff
changeset
|
190 @attr.s |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
191 class _changelogrevision: |
34398
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34296
diff
changeset
|
192 # Extensions might modify _defaultextra, so let the constructor below pass |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34296
diff
changeset
|
193 # it in |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34296
diff
changeset
|
194 extra = attr.ib() |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46714
diff
changeset
|
195 manifest = attr.ib() |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
196 user = attr.ib(default=b'') |
34398
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34296
diff
changeset
|
197 date = attr.ib(default=(0, 0)) |
34441
50474f0b3f1b
changelog: use a Factory for default value for files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34398
diff
changeset
|
198 files = attr.ib(default=attr.Factory(list)) |
42407
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
199 filesadded = attr.ib(default=None) |
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
200 filesremoved = attr.ib(default=None) |
42301
2a7109cc5a28
changelog: define changelogrevision.p[12]copies for null revision
Martin von Zweigbergk <martinvonz@google.com>
parents:
42300
diff
changeset
|
201 p1copies = attr.ib(default=None) |
2a7109cc5a28
changelog: define changelogrevision.p[12]copies for null revision
Martin von Zweigbergk <martinvonz@google.com>
parents:
42300
diff
changeset
|
202 p2copies = attr.ib(default=None) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
203 description = attr.ib(default=b'') |
46370
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
204 branchinfo = attr.ib(default=(_defaultextra[b'branch'], False)) |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
205 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
206 |
48946
642e31cb55f0
py3: use class X: instead of class X(object):
Gregory Szorc <gregory.szorc@gmail.com>
parents:
48875
diff
changeset
|
207 class changelogrevision: |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
208 """Holds results of a parsed changelog revision. |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
209 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
210 Changelog revisions consist of multiple pieces of data, including |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
211 the manifest node, user, and date. This object exposes a view into |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
212 the parsed object. |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
213 """ |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
214 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
215 __slots__ = ( |
43506
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43453
diff
changeset
|
216 '_offsets', |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43453
diff
changeset
|
217 '_text', |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43453
diff
changeset
|
218 '_sidedata', |
9f70512ae2cf
cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents:
43453
diff
changeset
|
219 '_cpsd', |
45570
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
220 '_changes', |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
221 ) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
222 |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46714
diff
changeset
|
223 def __new__(cls, cl, text, sidedata, cpsd): |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
224 if not text: |
47012
d55b71393907
node: replace nullid and friends with nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46819
diff
changeset
|
225 return _changelogrevision(extra=_defaultextra, manifest=cl.nullid) |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
226 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
227 self = super(changelogrevision, cls).__new__(cls) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
228 # We could return here and implement the following as an __init__. |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
229 # But doing it here is equivalent and saves an extra function call. |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
230 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
231 # format used: |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
232 # nodeid\n : manifest node in ascii |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
233 # user\n : user, no \n or \r allowed |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
234 # time tz extra\n : date (time is int or float, timezone is int) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
235 # : extra is metadata, encoded and separated by '\0' |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
236 # : older versions ignore it |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
237 # files\n\n : files modified by the cset, no \n or \r allowed |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
238 # (.*) : comment (free text, ideally utf-8) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
239 # |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
240 # changelog v0 doesn't use extra |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
241 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
242 nl1 = text.index(b'\n') |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
243 nl2 = text.index(b'\n', nl1 + 1) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
244 nl3 = text.index(b'\n', nl2 + 1) |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
245 |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
246 # The list of files may be empty. Which means nl3 is the first of the |
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
247 # double newline that precedes the description. |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
248 if text[nl3 + 1 : nl3 + 2] == b'\n': |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
249 doublenl = nl3 |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
250 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
251 doublenl = text.index(b'\n\n', nl3 + 1) |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
252 |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
253 self._offsets = (nl1, nl2, nl3, doublenl) |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
254 self._text = text |
43143
037a8759eda1
sidedatacopies: get and store sidedata in the changelogrevision object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43142
diff
changeset
|
255 self._sidedata = sidedata |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
256 self._cpsd = cpsd |
45570
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
257 self._changes = None |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
258 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
259 return self |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
260 |
28489
8939a95064f1
changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28487
diff
changeset
|
261 @property |
28490
959eadae589a
changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28489
diff
changeset
|
262 def manifest(self): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
263 return bin(self._text[0 : self._offsets[0]]) |
28490
959eadae589a
changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28489
diff
changeset
|
264 |
959eadae589a
changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28489
diff
changeset
|
265 @property |
28491
f57f7500a095
changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28490
diff
changeset
|
266 def user(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
267 off = self._offsets |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
268 return encoding.tolocal(self._text[off[0] + 1 : off[1]]) |
28491
f57f7500a095
changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28490
diff
changeset
|
269 |
f57f7500a095
changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28490
diff
changeset
|
270 @property |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
271 def _rawdate(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
272 off = self._offsets |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
273 dateextra = self._text[off[1] + 1 : off[2]] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
274 return dateextra.split(b' ', 2)[0:2] |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
275 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
276 @property |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
277 def _rawextra(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
278 off = self._offsets |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
279 dateextra = self._text[off[1] + 1 : off[2]] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
280 fields = dateextra.split(b' ', 2) |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
281 if len(fields) != 3: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
282 return None |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
283 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
284 return fields[2] |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
285 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
286 @property |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
287 def date(self): |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
288 raw = self._rawdate |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
289 time = float(raw[0]) |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
290 # Various tools did silly things with the timezone. |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
291 try: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
292 timezone = int(raw[1]) |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
293 except ValueError: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
294 timezone = 0 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
295 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
296 return time, timezone |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
297 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
298 @property |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
299 def extra(self): |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
300 raw = self._rawextra |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
301 if raw is None: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
302 return _defaultextra |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
303 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
304 return decodeextra(raw) |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
305 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
306 @property |
45570
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
307 def changes(self): |
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
308 if self._changes is not None: |
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
309 return self._changes |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
310 if self._cpsd: |
45635
9003e6524f78
changing-files: drop the now useless changelogrevision argument
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45575
diff
changeset
|
311 changes = metadata.decode_files_sidedata(self._sidedata) |
45571
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
312 else: |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
313 changes = metadata.ChangingFiles( |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
314 touched=self.files or (), |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
315 added=self.filesadded or (), |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
316 removed=self.filesremoved or (), |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
317 p1_copies=self.p1copies or {}, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
318 p2_copies=self.p2copies or {}, |
7543b5072e84
sidedata: add a `decode_files_sidedata` function
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45570
diff
changeset
|
319 ) |
45570
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
320 self._changes = changes |
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
321 return changes |
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
322 |
9a3563b46f52
changelog: add a `changes` property on `changelogrevision`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45569
diff
changeset
|
323 @property |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
324 def files(self): |
45636
053c9014fd39
changing-files: retrieve changelogrevision.files from the sidedata block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45635
diff
changeset
|
325 if self._cpsd: |
053c9014fd39
changing-files: retrieve changelogrevision.files from the sidedata block
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45635
diff
changeset
|
326 return sorted(self.changes.touched) |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
327 off = self._offsets |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
328 if off[2] == off[3]: |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
329 return [] |
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
330 |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
331 return self._text[off[2] + 1 : off[3]].split(b'\n') |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
332 |
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
333 @property |
42407
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
334 def filesadded(self): |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
335 if self._cpsd: |
45572
48c93a0b2acb
sidedata: simply read added files from the `ChangingFiles` object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45571
diff
changeset
|
336 return self.changes.added |
43146
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
337 else: |
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
338 rawindices = self.extra.get(b'filesadded') |
43145
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
339 if rawindices is None: |
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
340 return None |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44792
diff
changeset
|
341 return metadata.decodefileindices(self.files, rawindices) |
42407
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
342 |
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
343 @property |
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
344 def filesremoved(self): |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
345 if self._cpsd: |
45573
f9a67afcc33b
sidedata: simply read removed files from the `ChangingFiles` object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45572
diff
changeset
|
346 return self.changes.removed |
43146
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
347 else: |
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
348 rawindices = self.extra.get(b'filesremoved') |
43145
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
349 if rawindices is None: |
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
350 return None |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44792
diff
changeset
|
351 return metadata.decodefileindices(self.files, rawindices) |
42407
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
352 |
602469a91550
context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents:
42406
diff
changeset
|
353 @property |
42142
5382d8f8530b
changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents:
42141
diff
changeset
|
354 def p1copies(self): |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
355 if self._cpsd: |
45574
4e2238ba51a4
sidedata: simply read p1copies files from the `ChangingFiles` object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45573
diff
changeset
|
356 return self.changes.copied_from_p1 |
43146
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
357 else: |
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
358 rawcopies = self.extra.get(b'p1copies') |
43145
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
359 if rawcopies is None: |
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
360 return None |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44792
diff
changeset
|
361 return metadata.decodecopies(self.files, rawcopies) |
42142
5382d8f8530b
changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents:
42141
diff
changeset
|
362 |
5382d8f8530b
changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents:
42141
diff
changeset
|
363 @property |
5382d8f8530b
changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents:
42141
diff
changeset
|
364 def p2copies(self): |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
365 if self._cpsd: |
45575
147fb889278b
sidedata: simply read p2copies files from the `ChangingFiles` object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45574
diff
changeset
|
366 return self.changes.copied_from_p2 |
43146
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
367 else: |
0171483b082f
sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43145
diff
changeset
|
368 rawcopies = self.extra.get(b'p2copies') |
43145
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
369 if rawcopies is None: |
4296cc3c4ae1
changelog: make copies related function return None or a valid value
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43143
diff
changeset
|
370 return None |
44940
4c1d39215034
metadata: move computation related to files touched in a dedicated module
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44792
diff
changeset
|
371 return metadata.decodecopies(self.files, rawcopies) |
42142
5382d8f8530b
changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents:
42141
diff
changeset
|
372 |
5382d8f8530b
changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents:
42141
diff
changeset
|
373 @property |
28489
8939a95064f1
changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28487
diff
changeset
|
374 def description(self): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
375 return encoding.tolocal(self._text[self._offsets[3] + 2 :]) |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
376 |
46370
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
377 @property |
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
378 def branchinfo(self): |
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
379 extra = self.extra |
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
380 return encoding.tolocal(extra.get(b"branch")), b'close' in extra |
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
381 |
28489
8939a95064f1
changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28487
diff
changeset
|
382 |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
383 class changelog(revlog.revlog): |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
384 def __init__(self, opener, trypending=False, concurrencychecker=None): |
32292
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
385 """Load a changelog revlog using an opener. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
386 |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
387 If ``trypending`` is true, we attempt to load the index from a |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
388 ``00changelog.i.a`` file instead of the default ``00changelog.i``. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
389 The ``00changelog.i.a`` file contains index (and possibly inline |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
390 revision) data for a transaction that hasn't been finalized yet. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
391 It exists in a separate file to facilitate readers (such as |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
392 hooks processes) accessing data before a transaction is finalized. |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
393 |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
394 ``concurrencychecker`` will be passed to the revlog init function, see |
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
395 the documentation there. |
32292
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
396 """ |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
397 revlog.revlog.__init__( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
398 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
399 opener, |
47072
4c041c71ec01
revlog: introduce an explicit tracking of what the revlog is about
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47012
diff
changeset
|
400 target=(revlog_constants.KIND_CHANGELOG, None), |
47150
8d3c2f9d4af7
revlog: use a "radix" to address revlog
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47148
diff
changeset
|
401 radix=b'00changelog', |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
402 checkambig=True, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
403 mmaplargeindex=True, |
44792
5e3c718692bb
nodemap: drop the 'exp-' prefix for internal opener option
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44661
diff
changeset
|
404 persistentnodemap=opener.options.get(b'persistent-nodemap', False), |
46607
e9901d01d135
revlog: add a mechanism to verify expected file position before appending
Kyle Lippincott <spectral@google.com>
parents:
46509
diff
changeset
|
405 concurrencychecker=concurrencychecker, |
47240
4f38ada3fc26
revlog: move the `trypending` logic from the `changelog` to the `revlog`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47239
diff
changeset
|
406 trypending=trypending, |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
407 ) |
32292
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32262
diff
changeset
|
408 |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47073
diff
changeset
|
409 if self._initempty and (self._format_version == revlog.REVLOGV1): |
41202
e7a2cc84dbc0
revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39887
diff
changeset
|
410 # changelogs don't benefit from generaldelta. |
e7a2cc84dbc0
revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39887
diff
changeset
|
411 |
47139
f58a13c52726
revlog: split the `version` attribute into its two components
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47073
diff
changeset
|
412 self._format_flags &= ~revlog.FLAG_GENERALDELTA |
14334
85c82ebc96a3
changelog: don't use generaldelta
Sune Foldager <cryo@cyanite.org>
parents:
14207
diff
changeset
|
413 self._generaldelta = False |
30155
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30000
diff
changeset
|
414 |
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30000
diff
changeset
|
415 # Delta chains for changelogs tend to be very small because entries |
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30000
diff
changeset
|
416 # tend to be small and don't delta well with each. So disable delta |
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30000
diff
changeset
|
417 # chains. |
39232
0a5b20c107a6
repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39201
diff
changeset
|
418 self._storedeltachains = False |
30155
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30000
diff
changeset
|
419 |
8644
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
420 self._realopener = opener |
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
421 self._delayed = False |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
422 self._delaybuf = None |
9163
f193b643d1b1
changelog: _delaycount -> _divert
Matt Mackall <mpm@selenic.com>
parents:
8778
diff
changeset
|
423 self._divert = False |
45515
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
424 self._filteredrevs = frozenset() |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
425 self._filteredrevs_hashcache = {} |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
426 self._copiesstorage = opener.options.get(b'copies-storage') |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
427 |
45515
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
428 @property |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
429 def filteredrevs(self): |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
430 return self._filteredrevs |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
431 |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
432 @filteredrevs.setter |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
433 def filteredrevs(self, val): |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
434 # Ensure all updates go through this function |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
435 assert isinstance(val, frozenset) |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
436 self._filteredrevs = val |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
437 self._filteredrevs_hashcache = {} |
89f0d9f87701
branchmap: add a cache validation cache, avoid expensive re-hash on every use
Kyle Lippincott <spectral@google.com>
parents:
45325
diff
changeset
|
438 |
47239
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
439 def _write_docket(self, tr): |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
440 if not self._delayed: |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
441 super(changelog, self)._write_docket(tr) |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
442 |
23203
3872d563e01a
changelog: handle writepending in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23201
diff
changeset
|
443 def delayupdate(self, tr): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
444 """delay visibility of index updates to other readers""" |
47239
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
445 if self._docket is None and not self._delayed: |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
446 if len(self) == 0: |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
447 self._divert = True |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
448 if self._realopener.exists(self._indexfile + b'.a'): |
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
449 self._realopener.unlink(self._indexfile + b'.a') |
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
450 self.opener = _divertopener(self._realopener, self._indexfile) |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
451 else: |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
452 self._delaybuf = [] |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
453 self.opener = _delayopener( |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
454 self._realopener, self._indexfile, self._delaybuf |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
455 ) |
47425
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47385
diff
changeset
|
456 self._segmentfile.opener = self.opener |
47426
cac0e0621ceb
revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents:
47425
diff
changeset
|
457 self._segmentfile_sidedata.opener = self.opener |
8644
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
458 self._delayed = True |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
459 tr.addpending(b'cl-%i' % id(self), self._writepending) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
460 tr.addfinalize(b'cl-%i' % id(self), self._finalize) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
461 |
23205
2d54aa5397cd
changelog: rely on transaction for finalization
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23203
diff
changeset
|
462 def _finalize(self, tr): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
463 """finalize index updates""" |
8644
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
464 self._delayed = False |
9165
07f9b2f4a9aa
changelog: swap opener to switch delay modes
Matt Mackall <mpm@selenic.com>
parents:
9164
diff
changeset
|
465 self.opener = self._realopener |
47425
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47385
diff
changeset
|
466 self._segmentfile.opener = self.opener |
47426
cac0e0621ceb
revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents:
47425
diff
changeset
|
467 self._segmentfile_sidedata.opener = self.opener |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
468 # move redirected index data back into place |
47239
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
469 if self._docket is not None: |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
470 self._write_docket(tr) |
682f09857d69
revlogv2: delay the update of the changelog docket to transaction end
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47234
diff
changeset
|
471 elif self._divert: |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
472 assert not self._delaybuf |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
473 tmpname = self._indexfile + b".a" |
19898
3f92e749d381
changelog: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18587
diff
changeset
|
474 nfile = self.opener.open(tmpname) |
14207
c1cca38818b9
changelog: fixes leaked file handle
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents:
14004
diff
changeset
|
475 nfile.close() |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
476 self.opener.rename(tmpname, self._indexfile, checkambig=True) |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
477 elif self._delaybuf: |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
478 fp = self.opener(self._indexfile, b'a', checkambig=True) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
479 fp.write(b"".join(self._delaybuf)) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
480 fp.close() |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
481 self._delaybuf = None |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
482 self._divert = False |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
483 # split when we're done |
35974
9ba1d0c724e2
revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents:
35963
diff
changeset
|
484 self._enforceinlinesize(tr) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
485 |
23280
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23205
diff
changeset
|
486 def _writepending(self, tr): |
43787
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
487 """create a file containing the unfinalized state for |
be8552f25cab
cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents:
43506
diff
changeset
|
488 pretxnchangegroup""" |
47241
2219853a1503
revlogv2: track pending write in the docket and expose it to hooks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47240
diff
changeset
|
489 if self._docket: |
2219853a1503
revlogv2: track pending write in the docket and expose it to hooks
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47240
diff
changeset
|
490 return self._docket.write(tr, pending=True) |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
491 if self._delaybuf: |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
492 # make a temporary copy of the index |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
493 fp1 = self._realopener(self._indexfile) |
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
494 pendingfilename = self._indexfile + b".a" |
23292
e44399c494ab
changelog: register changelog.i.a as a temporary file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
495 # register as a temp file to ensure cleanup on failure |
e44399c494ab
changelog: register changelog.i.a as a temporary file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
496 tr.registertmp(pendingfilename) |
e44399c494ab
changelog: register changelog.i.a as a temporary file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
497 # write existing data |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
498 fp2 = self._realopener(pendingfilename, b"w") |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
499 fp2.write(fp1.read()) |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
500 # add pending data |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
501 fp2.write(b"".join(self._delaybuf)) |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
502 fp2.close() |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
503 # switch modes so finalize can simply rename |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
504 self._delaybuf = None |
9164
b0d995b6b0a6
changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents:
9163
diff
changeset
|
505 self._divert = True |
47148
a07d5cb03a85
revlog: rename `indexfile` to `_indexfile`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47145
diff
changeset
|
506 self.opener = _divertopener(self._realopener, self._indexfile) |
47425
e0a314bcbc9d
revlog: Extract low-level random-access file read caching logic
Simon Sapin <simon.sapin@octobus.net>
parents:
47385
diff
changeset
|
507 self._segmentfile.opener = self.opener |
47426
cac0e0621ceb
revlog: use file read caching for sidedata
Simon Sapin <simon.sapin@octobus.net>
parents:
47425
diff
changeset
|
508 self._segmentfile_sidedata.opener = self.opener |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
509 |
9164
b0d995b6b0a6
changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents:
9163
diff
changeset
|
510 if self._divert: |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
511 return True |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
512 |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
513 return False |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
514 |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
515 def _enforceinlinesize(self, tr): |
9165
07f9b2f4a9aa
changelog: swap opener to switch delay modes
Matt Mackall <mpm@selenic.com>
parents:
9164
diff
changeset
|
516 if not self._delayed: |
47214
906a7bcaac86
revlog: introduce a mandatory `_writing` context to update revlog content
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47150
diff
changeset
|
517 revlog.revlog._enforceinlinesize(self, tr) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
518 |
46631
230f73019e49
changelog: rename parameters to reflect semantics
Joerg Sonnenberger <joerg@bec.de>
parents:
46607
diff
changeset
|
519 def read(self, nodeorrev): |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
520 """Obtain data from a parsed changelog revision. |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
521 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
522 Returns a 6-tuple of: |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
523 |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
524 - manifest node in binary |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
525 - author/user as a localstr |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
526 - date as a 2-tuple of (time, timezone) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
527 - list of files |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
528 - commit message as a localstr |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
529 - dict of extra metadata |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
530 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
531 Unless you need to access all fields, consider calling |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
532 ``changelogrevision`` instead, as it is faster for partial object |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
533 access. |
3077
ad6aecaf4eed
document changelog format
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2859
diff
changeset
|
534 """ |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47383
diff
changeset
|
535 d = self._revisiondata(nodeorrev) |
47383
659a452ee263
revlog: use `self.sidedata` directly to construct changelogrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
536 sidedata = self.sidedata(nodeorrev) |
659a452ee263
revlog: use `self.sidedata` directly to construct changelogrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
537 copy_sd = self._copiesstorage == b'changeset-sidedata' |
659a452ee263
revlog: use `self.sidedata` directly to construct changelogrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
538 c = changelogrevision(self, d, sidedata, copy_sd) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
539 return (c.manifest, c.user, c.date, c.files, c.description, c.extra) |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
540 |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
541 def changelogrevision(self, nodeorrev): |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
542 """Obtain a ``changelogrevision`` for a node or revision.""" |
47385
9d9eb22b9b69
revlog: no longer return sidedata from `_revisiondata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47383
diff
changeset
|
543 text = self._revisiondata(nodeorrev) |
47383
659a452ee263
revlog: use `self.sidedata` directly to construct changelogrevision
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
47241
diff
changeset
|
544 sidedata = self.sidedata(nodeorrev) |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
545 return changelogrevision( |
46780
6266d19556ad
node: introduce nodeconstants class
Joerg Sonnenberger <joerg@bec.de>
parents:
46714
diff
changeset
|
546 self, text, sidedata, self._copiesstorage == b'changeset-sidedata' |
43230
e51f5d06a99c
sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43147
diff
changeset
|
547 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
548 |
46631
230f73019e49
changelog: rename parameters to reflect semantics
Joerg Sonnenberger <joerg@bec.de>
parents:
46607
diff
changeset
|
549 def readfiles(self, nodeorrev): |
27439
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
550 """ |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
551 short version of read that only returns the files modified by the cset |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
552 """ |
46631
230f73019e49
changelog: rename parameters to reflect semantics
Joerg Sonnenberger <joerg@bec.de>
parents:
46607
diff
changeset
|
553 text = self.revision(nodeorrev) |
27439
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
554 if not text: |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
555 return [] |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
556 last = text.index(b"\n\n") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
557 l = text[:last].split(b'\n') |
27439
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
558 return l[3:] |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
559 |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
560 def add( |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
561 self, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
562 manifest, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
563 files, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
564 desc, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
565 transaction, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
566 p1, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
567 p2, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
568 user, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
569 date=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
570 extra=None, |
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
571 ): |
14379
bd23d5f28bbb
changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents:
10420
diff
changeset
|
572 # Convert to UTF-8 encoded bytestrings as the very first |
bd23d5f28bbb
changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents:
10420
diff
changeset
|
573 # thing: calling any method on a localstr object will turn it |
bd23d5f28bbb
changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents:
10420
diff
changeset
|
574 # into a str object and the cached UTF-8 string is thus lost. |
bd23d5f28bbb
changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents:
10420
diff
changeset
|
575 user, desc = encoding.fromlocal(user), encoding.fromlocal(desc) |
bd23d5f28bbb
changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents:
10420
diff
changeset
|
576 |
7035
9d023ef7b467
forbid username with '\n' at the changelog level
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6259
diff
changeset
|
577 user = user.strip() |
8424
c5b3d3e30de7
changelog: refuse to add revisions with empty usernames
Martin Geisler <mg@lazybytes.net>
parents:
7807
diff
changeset
|
578 # An empty username or a username with a "\n" will make the |
c5b3d3e30de7
changelog: refuse to add revisions with empty usernames
Martin Geisler <mg@lazybytes.net>
parents:
7807
diff
changeset
|
579 # revision text contain two "\n\n" sequences -> corrupt |
c5b3d3e30de7
changelog: refuse to add revisions with empty usernames
Martin Geisler <mg@lazybytes.net>
parents:
7807
diff
changeset
|
580 # repository since read cannot unpack the revision. |
c5b3d3e30de7
changelog: refuse to add revisions with empty usernames
Martin Geisler <mg@lazybytes.net>
parents:
7807
diff
changeset
|
581 if not user: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
582 raise error.StorageError(_(b"empty username")) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
583 if b"\n" in user: |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
584 raise error.StorageError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
585 _(b"username %r contains a newline") % pycompat.bytestr(user) |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
586 ) |
8499
fb9b83df45f3
commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents:
8443
diff
changeset
|
587 |
17810
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
588 desc = stripdesc(desc) |
8499
fb9b83df45f3
commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents:
8443
diff
changeset
|
589 |
1195
f92af8d53330
Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1095
diff
changeset
|
590 if date: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
591 parseddate = b"%d %d" % dateutil.parsedate(date) |
1195
f92af8d53330
Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1095
diff
changeset
|
592 else: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
593 parseddate = b"%d %d" % dateutil.makedate() |
10417
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
594 if extra: |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
595 branch = extra.get(b"branch") |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
596 if branch in (b"default", b""): |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
597 del extra[b"branch"] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
598 elif branch in (b".", b"null", b"tip"): |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
599 raise error.StorageError( |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
600 _(b'the name \'%s\' is reserved') % branch |
43076
2372284d9457
formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents:
43027
diff
changeset
|
601 ) |
45324
6c56277317c2
commitctx: directly pass a ChangingFiles object to changelog.add
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45249
diff
changeset
|
602 sortedfiles = sorted(files.touched) |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45636
diff
changeset
|
603 flags = 0 |
43142
beed7ce61681
sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43077
diff
changeset
|
604 sidedata = None |
45249
b3040b6739ce
commitctx: extract copy information encoding into extra into commit.py
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
44940
diff
changeset
|
605 if self._copiesstorage == b'changeset-sidedata': |
45728
232c88dd89e3
changing-files: add a shorthand property to check for copy relevant info
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45672
diff
changeset
|
606 if files.has_copies_info: |
45671
2d6aea053153
copies: add a HASCOPIESINFO flag to highlight rev with useful data
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45636
diff
changeset
|
607 flags |= flagutil.REVIDX_HASCOPIESINFO |
45569
64d18e9e8508
sidedata: rename `encode_copies_sidedata` to `encode_files_sidedata`
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45515
diff
changeset
|
608 sidedata = metadata.encode_files_sidedata(files) |
42141
0e41f40b01cc
copies: add config option for writing copy metadata to file and/or changset
Martin von Zweigbergk <martinvonz@google.com>
parents:
42116
diff
changeset
|
609 |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
610 if extra: |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
611 extra = encodeextra(extra) |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
612 parseddate = b"%s %s" % (parseddate, extra) |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
613 l = [hex(manifest), user, parseddate] + sortedfiles + [b"", desc] |
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
614 text = b"\n".join(l) |
46508
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46370
diff
changeset
|
615 rev = self.addrevision( |
45672
f877b3628015
copies: return None instead of ChangingFiles when relevant
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
45671
diff
changeset
|
616 text, transaction, len(self), p1, p2, sidedata=sidedata, flags=flags |
43142
beed7ce61681
sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents:
43077
diff
changeset
|
617 ) |
46508
f7b61ad3c64a
revlog: change addrevision to return the new revision, not node
Joerg Sonnenberger <joerg@bec.de>
parents:
46370
diff
changeset
|
618 return self.node(rev) |
18306
06185554e7e3
changelog: add a `branch` method, bypassing changectx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18231
diff
changeset
|
619 |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
19899
diff
changeset
|
620 def branchinfo(self, rev): |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
19899
diff
changeset
|
621 """return the branch name and open/close state of a revision |
18306
06185554e7e3
changelog: add a `branch` method, bypassing changectx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18231
diff
changeset
|
622 |
18308
4e27b06a0fd9
changelog: please check-code and remove tabs
Mads Kiilerich <mads@kiilerich.com>
parents:
18306
diff
changeset
|
623 This function exists because creating a changectx object |
4e27b06a0fd9
changelog: please check-code and remove tabs
Mads Kiilerich <mads@kiilerich.com>
parents:
18306
diff
changeset
|
624 just to access this is costly.""" |
46370
cad17d50736c
changelog: move branchinfo to changelogrevision
Joerg Sonnenberger <joerg@bec.de>
parents:
46197
diff
changeset
|
625 return self.changelogrevision(rev).branchinfo |
39887
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39777
diff
changeset
|
626 |
46509
7a93b7b3dc2d
revlog: change addgroup callbacks to take revision numbers
Joerg Sonnenberger <joerg@bec.de>
parents:
46508
diff
changeset
|
627 def _nodeduplicatecallback(self, transaction, rev): |
39887
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39777
diff
changeset
|
628 # keep track of revisions that got "re-added", eg: unbunde of know rev. |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39777
diff
changeset
|
629 # |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39777
diff
changeset
|
630 # We track them in a list to preserve their order from the source bundle |
43077
687b865b95ad
formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents:
43076
diff
changeset
|
631 duplicates = transaction.changes.setdefault(b'revduplicates', []) |
46509
7a93b7b3dc2d
revlog: change addgroup callbacks to take revision numbers
Joerg Sonnenberger <joerg@bec.de>
parents:
46508
diff
changeset
|
632 duplicates.append(rev) |