annotate mercurial/changelog.py @ 44446:109322cd322a

tests: avoid implicit conversion of str to unicode On Python 2, str.encode('ascii') implicitly converts the string to unicode and then back to str. Since the point of this expression is to convert a bool to a str, the '%r' conversion specifier can be used instead in the format string.
author Manuel Jacob <me@manueljacob.de>
date Thu, 05 Mar 2020 18:10:19 +0100
parents 5962fd0d1045
children 897f0ce4b484
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1095
0a18374c0769 changelog: adjust imports, comment
mpm@selenic.com
parents: 1094 1089
diff changeset
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 #
4635
63b9d2deed48 Updated copyright notices and add "and others" to "hg version"
Thomas Arendsen Hein <thomas@intevation.de>
parents: 4269
diff changeset
3 # Copyright 2005-2007 Matt Mackall <mpm@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
25e572394f5c Update license to GPLv2+
Matt Mackall <mpm@selenic.com>
parents: 9677
diff changeset
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 from __future__ import absolute_import
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
9
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
10 from .i18n import _
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
11 from .node import (
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
12 bin,
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
13 hex,
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
14 nullid,
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
15 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
16 from .thirdparty import attr
25922
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
17
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
18 from . import (
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
19 copies,
25922
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
20 encoding,
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
21 error,
36228
ddeb7653b31c py3: use pycompat.bytestr to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents: 35974
diff changeset
22 pycompat,
25922
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
23 revlog,
85f442747153 changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents: 25814
diff changeset
24 )
37084
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
25 from .utils import (
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
26 dateutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
27 stringutil,
f0b6fbea00cf stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents: 36607
diff changeset
28 )
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
29
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
30 from .revlogutils import sidedata as sidedatamod
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
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
41574
b436059c1cca py3: use pycompat.bytestr() on extra values because it can be int
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41275
diff changeset
85 items = [
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
86 _string_escape(b'%s:%s' % (k, pycompat.bytestr(d[k])))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
87 for k in sorted(d)
41574
b436059c1cca py3: use pycompat.bytestr() on extra values because it can be int
Pulkit Goyal <pulkit@yandex-team.ru>
parents: 41275
diff changeset
88 ]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
89 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
90
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
91
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 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
93 """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
94 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
95
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
96
8778
c5f36402daad use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 8644
diff changeset
97 class appender(object):
7807
bd8f44638847 help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents: 7787
diff changeset
98 '''the changelog index must be updated last on disk, so we use this class
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
99 to delay writes to it'''
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
100
19899
8c3dcbbfb5de changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19898
diff changeset
101 def __init__(self, vfs, name, mode, buf):
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
102 self.data = buf
19899
8c3dcbbfb5de changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 19898
diff changeset
103 fp = vfs(name, mode)
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
104 self.fp = fp
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
105 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
106 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
107 self._end = self.size
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
108
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
109 def end(self):
30596
be520fe3a3e9 changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents: 30210
diff changeset
110 return self._end
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 tell(self):
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
113 return self.offset
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
114
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
115 def flush(self):
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
116 pass
35963
69aaad59dc02 changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35962
diff changeset
117
69aaad59dc02 changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35962
diff changeset
118 @property
69aaad59dc02 changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35962
diff changeset
119 def closed(self):
69aaad59dc02 changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35962
diff changeset
120 return self.fp.closed
69aaad59dc02 changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35962
diff changeset
121
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
122 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
123 self.fp.close()
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
124
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
125 def seek(self, offset, whence=0):
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
126 '''virtual file offset spans real file and data'''
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
127 if whence == 0:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
128 self.offset = offset
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
129 elif whence == 1:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
130 self.offset += offset
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
131 elif whence == 2:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
132 self.offset = self.end() + offset
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
133 if self.offset < self.size:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
134 self.fp.seek(self.offset)
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
135
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
136 def read(self, count=-1):
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
137 '''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
138 ret = b""
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
139 if self.offset < self.size:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
140 s = self.fp.read(count)
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
141 ret = s
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
142 self.offset += len(s)
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
143 if count > 0:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
144 count -= len(s)
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
145 if count != 0:
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
146 doff = self.offset - self.size
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
147 self.data.insert(0, b"".join(self.data))
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
148 del self.data[1:]
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
149 s = self.data[0][doff : doff + count]
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
150 self.offset += len(s)
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
151 ret += s
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
152 return ret
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
153
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
154 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
155 self.data.append(bytes(s))
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
156 self.offset += len(s)
30596
be520fe3a3e9 changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents: 30210
diff changeset
157 self._end += len(s)
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
158
35962
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
159 def __enter__(self):
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
160 self.fp.__enter__()
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
161 return self
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
162
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
163 def __exit__(self, *args):
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
164 return self.fp.__exit__(*args)
fa15a70f88de changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents: 35672
diff changeset
165
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
166
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
167 def _divertopener(opener, target):
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
168 """build an opener that writes in 'target.a' instead of 'target'"""
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
169
44055
7f67f53492f7 changelog: fix the diverted opener to accept more kwargs
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43787
diff changeset
170 def _divert(name, mode=b'r', checkambig=False, **kwargs):
9166
e6162b854ed5 changelog: move delayopener outside of class to eliminate reference cycle
Matt Mackall <mpm@selenic.com>
parents: 9165
diff changeset
171 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
172 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
173 return opener(name + b".a", mode, **kwargs)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
174
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
175 return _divert
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
e51c8ffa1ffa changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents: 34296
diff changeset
191 class _changelogrevision(object):
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()
e51c8ffa1ffa changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents: 34296
diff changeset
195 manifest = attr.ib(default=nullid)
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'')
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
204
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
205
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
206 class changelogrevision(object):
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
207 """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
208
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
209 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
210 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
211 the parsed object.
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
212 """
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 __slots__ = (
43506
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43453
diff changeset
215 '_offsets',
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43453
diff changeset
216 '_text',
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43453
diff changeset
217 '_sidedata',
9f70512ae2cf cleanup: remove pointless r-prefixes on single-quoted strings
Augie Fackler <augie@google.com>
parents: 43453
diff changeset
218 '_cpsd',
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
219 )
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
220
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
221 def __new__(cls, text, sidedata, cpsd):
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
222 if not text:
34398
e51c8ffa1ffa changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents: 34296
diff changeset
223 return _changelogrevision(extra=_defaultextra)
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
224
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
225 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
226 # 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
227 # 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
228
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
229 # format used:
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
230 # 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
231 # 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
232 # 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
233 # : 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
234 # : older versions ignore it
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
235 # 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
236 # (.*) : 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
237 #
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
238 # 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
239
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
240 nl1 = text.index(b'\n')
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
241 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
242 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
243
28493
7796473c11b3 changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28492
diff changeset
244 # 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
245 # 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
246 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
247 doublenl = nl3
28493
7796473c11b3 changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28492
diff changeset
248 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
249 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
250
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
251 self._offsets = (nl1, nl2, nl3, doublenl)
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
252 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
253 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
254 self._cpsd = cpsd
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
255
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
256 return self
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
257
28489
8939a95064f1 changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28487
diff changeset
258 @property
28490
959eadae589a changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28489
diff changeset
259 def manifest(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
260 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
261
959eadae589a changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28489
diff changeset
262 @property
28491
f57f7500a095 changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28490
diff changeset
263 def user(self):
28495
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
264 off = self._offsets
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
265 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
266
f57f7500a095 changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28490
diff changeset
267 @property
28492
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
268 def _rawdate(self):
28495
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
269 off = self._offsets
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
270 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
271 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
272
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
273 @property
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
274 def _rawextra(self):
28495
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
275 off = self._offsets
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
276 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
277 fields = dateextra.split(b' ', 2)
28492
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
278 if len(fields) != 3:
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
279 return None
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
280
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
281 return fields[2]
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
282
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
283 @property
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
284 def date(self):
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
285 raw = self._rawdate
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
286 time = float(raw[0])
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
287 # 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
288 try:
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
289 timezone = int(raw[1])
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
290 except ValueError:
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
291 timezone = 0
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
292
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
293 return time, timezone
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
294
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
295 @property
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
296 def extra(self):
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
297 raw = self._rawextra
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
298 if raw is None:
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
299 return _defaultextra
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
300
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
301 return decodeextra(raw)
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
302
837f1c437d58 changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28491
diff changeset
303 @property
28493
7796473c11b3 changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28492
diff changeset
304 def files(self):
28495
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
305 off = self._offsets
70c2f8a98276 changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28494
diff changeset
306 if off[2] == off[3]:
28493
7796473c11b3 changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28492
diff changeset
307 return []
7796473c11b3 changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28492
diff changeset
308
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
309 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
310
7796473c11b3 changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28492
diff changeset
311 @property
42407
602469a91550 context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 42406
diff changeset
312 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
313 if self._cpsd:
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
314 rawindices = self._sidedata.get(sidedatamod.SD_FILESADDED)
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
315 if not rawindices:
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
316 return []
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
317 else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
318 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
319 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
320 return None
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
321 return copies.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
322
602469a91550 context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 42406
diff changeset
323 @property
602469a91550 context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 42406
diff changeset
324 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
325 if self._cpsd:
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
326 rawindices = self._sidedata.get(sidedatamod.SD_FILESREMOVED)
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
327 if not rawindices:
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
328 return []
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
329 else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
330 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
331 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
332 return None
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
333 return copies.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
334
602469a91550 context: get filesadded() and filesremoved() from changeset if configured
Martin von Zweigbergk <martinvonz@google.com>
parents: 42406
diff changeset
335 @property
42142
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42141
diff changeset
336 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
337 if self._cpsd:
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
338 rawcopies = self._sidedata.get(sidedatamod.SD_P1COPIES)
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
339 if not rawcopies:
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
340 return {}
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
341 else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
342 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
343 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
344 return None
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
345 return copies.decodecopies(self.files, rawcopies)
42142
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42141
diff changeset
346
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42141
diff changeset
347 @property
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42141
diff changeset
348 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
349 if self._cpsd:
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
350 rawcopies = self._sidedata.get(sidedatamod.SD_P2COPIES)
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
351 if not rawcopies:
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
352 return {}
43146
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
353 else:
0171483b082f sidedatacopies: read rename information from sidedata
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43145
diff changeset
354 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
355 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
356 return None
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
357 return copies.decodecopies(self.files, rawcopies)
42142
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42141
diff changeset
358
5382d8f8530b changelog: parse copy metadata if available in extras
Martin von Zweigbergk <martinvonz@google.com>
parents: 42141
diff changeset
359 @property
28489
8939a95064f1 changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28487
diff changeset
360 def description(self):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
361 return encoding.tolocal(self._text[self._offsets[3] + 2 :])
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
362
28489
8939a95064f1 changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28487
diff changeset
363
7634
14a4337a9b9b revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents: 7633
diff changeset
364 class changelog(revlog.revlog):
32292
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
365 def __init__(self, opener, trypending=False):
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
366 """Load a changelog revlog using an opener.
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
367
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
368 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
369 ``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
370 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
371 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
372 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
373 hooks processes) accessing data before a transaction is finalized.
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
374 """
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
375 if trypending and opener.exists(b'00changelog.i.a'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
376 indexfile = b'00changelog.i.a'
32292
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
377 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
378 indexfile = b'00changelog.i'
32292
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
379
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
380 datafile = b'00changelog.d'
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
381 revlog.revlog.__init__(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
382 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
383 opener,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
384 indexfile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
385 datafile=datafile,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
386 checkambig=True,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
387 mmaplargeindex=True,
44308
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44055
diff changeset
388 persistentnodemap=opener.options.get(
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44055
diff changeset
389 b'exp-persistent-nodemap', False
5962fd0d1045 nodemap: write nodemap data on disk
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 44055
diff changeset
390 ),
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
391 )
32292
0ad0d26ff703 changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32262
diff changeset
392
41202
e7a2cc84dbc0 revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39887
diff changeset
393 if self._initempty and (self.version & 0xFFFF == revlog.REVLOGV1):
e7a2cc84dbc0 revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39887
diff changeset
394 # 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
395
32315
67026d65a4fc revlog: rename constants (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents: 32307
diff changeset
396 self.version &= ~revlog.FLAG_GENERALDELTA
14334
85c82ebc96a3 changelog: don't use generaldelta
Sune Foldager <cryo@cyanite.org>
parents: 14207
diff changeset
397 self._generaldelta = False
30155
b7a966ce89ed changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30000
diff changeset
398
b7a966ce89ed changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30000
diff changeset
399 # 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
400 # 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
401 # chains.
39232
0a5b20c107a6 repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents: 39201
diff changeset
402 self._storedeltachains = False
30155
b7a966ce89ed changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents: 30000
diff changeset
403
8644
c2ef478b2efa changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents: 8499
diff changeset
404 self._realopener = opener
c2ef478b2efa changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents: 8499
diff changeset
405 self._delayed = False
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
406 self._delaybuf = None
9163
f193b643d1b1 changelog: _delaycount -> _divert
Matt Mackall <mpm@selenic.com>
parents: 8778
diff changeset
407 self._divert = False
18231
c0c943ef4e55 clfilter: use empty frozenset intead of empty tuple
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17951
diff changeset
408 self.filteredrevs = frozenset()
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
409 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
410
23203
3872d563e01a changelog: handle writepending in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23201
diff changeset
411 def delayupdate(self, tr):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
412 """delay visibility of index updates to other readers"""
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
413
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
414 if not self._delayed:
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
415 if len(self) == 0:
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
416 self._divert = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
417 if self._realopener.exists(self.indexfile + b'.a'):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
418 self._realopener.unlink(self.indexfile + b'.a')
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
419 self.opener = _divertopener(self._realopener, self.indexfile)
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
420 else:
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
421 self._delaybuf = []
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
422 self.opener = _delayopener(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
423 self._realopener, self.indexfile, self._delaybuf
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
424 )
8644
c2ef478b2efa changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents: 8499
diff changeset
425 self._delayed = True
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
426 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
427 tr.addfinalize(b'cl-%i' % id(self), self._finalize)
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
428
23205
2d54aa5397cd changelog: rely on transaction for finalization
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23203
diff changeset
429 def _finalize(self, tr):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
430 """finalize index updates"""
8644
c2ef478b2efa changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents: 8499
diff changeset
431 self._delayed = False
9165
07f9b2f4a9aa changelog: swap opener to switch delay modes
Matt Mackall <mpm@selenic.com>
parents: 9164
diff changeset
432 self.opener = self._realopener
4269
73c918c71300 changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents: 4261
diff changeset
433 # move redirected index data back into place
9164
b0d995b6b0a6 changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents: 9163
diff changeset
434 if self._divert:
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
435 assert not self._delaybuf
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
436 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
437 nfile = self.opener.open(tmpname)
14207
c1cca38818b9 changelog: fixes leaked file handle
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents: 14004
diff changeset
438 nfile.close()
29999
003c41edc5f5 changelog: specify checkambig=True to avoid ambiguity around truncation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents: 29997
diff changeset
439 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
440 elif self._delaybuf:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
441 fp = self.opener(self.indexfile, b'a', checkambig=True)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
442 fp.write(b"".join(self._delaybuf))
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
443 fp.close()
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
444 self._delaybuf = None
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
445 self._divert = False
4269
73c918c71300 changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents: 4261
diff changeset
446 # split when we're done
35974
9ba1d0c724e2 revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents: 35963
diff changeset
447 self._enforceinlinesize(tr)
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
448
23280
b01c491af0cf transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23205
diff changeset
449 def _writepending(self, tr):
43787
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
450 """create a file containing the unfinalized state for
be8552f25cab cleanup: fix docstring formatting
Matt Harbison <matt_harbison@yahoo.com>
parents: 43506
diff changeset
451 pretxnchangegroup"""
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
452 if self._delaybuf:
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
453 # make a temporary copy of the index
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
454 fp1 = self._realopener(self.indexfile)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
455 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
456 # 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
457 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
458 # write existing data
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
459 fp2 = self._realopener(pendingfilename, b"w")
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
460 fp2.write(fp1.read())
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
461 # add pending data
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
462 fp2.write(b"".join(self._delaybuf))
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
463 fp2.close()
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
464 # 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
465 self._delaybuf = None
9164
b0d995b6b0a6 changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents: 9163
diff changeset
466 self._divert = True
23201
7e97bf6ee2d6 changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents: 23088
diff changeset
467 self.opener = _divertopener(self._realopener, self.indexfile)
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
468
9164
b0d995b6b0a6 changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents: 9163
diff changeset
469 if self._divert:
7787
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
470 return True
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
471
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
472 return False
b8d750daadde Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents: 7634
diff changeset
473
35974
9ba1d0c724e2 revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents: 35963
diff changeset
474 def _enforceinlinesize(self, tr, fp=None):
9165
07f9b2f4a9aa changelog: swap opener to switch delay modes
Matt Mackall <mpm@selenic.com>
parents: 9164
diff changeset
475 if not self._delayed:
35974
9ba1d0c724e2 revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents: 35963
diff changeset
476 revlog.revlog._enforceinlinesize(self, tr, fp)
4261
cd7b36b7869c restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents: 4258
diff changeset
477
5744
9db7fd77417d changelog: remove extract function
Matt Mackall <mpm@selenic.com>
parents: 5450
diff changeset
478 def read(self, node):
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
479 """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
480
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
481 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
482
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
483 - manifest node in binary
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
484 - author/user as a localstr
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
485 - 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
486 - list of files
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
487 - commit message as a localstr
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
488 - dict of extra metadata
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
489
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
490 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
491 ``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
492 access.
3077
ad6aecaf4eed document changelog format
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 2859
diff changeset
493 """
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
494 d, s = self._revisiondata(node)
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
495 c = changelogrevision(
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
496 d, s, self._copiesstorage == b'changeset-sidedata'
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
497 )
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
498 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
499
28487
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
500 def changelogrevision(self, nodeorrev):
98d98a645e9d changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents: 28315
diff changeset
501 """Obtain a ``changelogrevision`` for a node or revision."""
43143
037a8759eda1 sidedatacopies: get and store sidedata in the changelogrevision object
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43142
diff changeset
502 text, sidedata = self._revisiondata(nodeorrev)
43230
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
503 return changelogrevision(
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
504 text, sidedata, self._copiesstorage == b'changeset-sidedata'
e51f5d06a99c sidedatacopies: only read from copies when in this mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43147
diff changeset
505 )
0
9117c6561b0b Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff changeset
506
27439
ed003859f1d8 changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents: 26094
diff changeset
507 def readfiles(self, node):
ed003859f1d8 changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents: 26094
diff changeset
508 """
ed003859f1d8 changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents: 26094
diff changeset
509 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
510 """
ed003859f1d8 changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents: 26094
diff changeset
511 text = self.revision(node)
ed003859f1d8 changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents: 26094
diff changeset
512 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
513 return []
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
514 last = text.index(b"\n\n")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
515 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
516 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
517
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
518 def add(
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
519 self,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
520 manifest,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
521 files,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
522 desc,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
523 transaction,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
524 p1,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
525 p2,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
526 user,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
527 date=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
528 extra=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
529 p1copies=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
530 p2copies=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
531 filesadded=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
532 filesremoved=None,
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
533 ):
14379
bd23d5f28bbb changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents: 10420
diff changeset
534 # 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
535 # 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
536 # 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
537 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
538
7035
9d023ef7b467 forbid username with '\n' at the changelog level
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 6259
diff changeset
539 user = user.strip()
8424
c5b3d3e30de7 changelog: refuse to add revisions with empty usernames
Martin Geisler <mg@lazybytes.net>
parents: 7807
diff changeset
540 # 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
541 # 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
542 # 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
543 if not user:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
544 raise error.StorageError(_(b"empty username"))
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
545 if b"\n" in user:
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
546 raise error.StorageError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
547 _(b"username %r contains a newline") % pycompat.bytestr(user)
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
548 )
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8443
diff changeset
549
17810
2894d180afa1 changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 17677
diff changeset
550 desc = stripdesc(desc)
8499
fb9b83df45f3 commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents: 8443
diff changeset
551
1195
f92af8d53330 Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents: 1095
diff changeset
552 if date:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
553 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
554 else:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
555 parseddate = b"%d %d" % dateutil.makedate()
10417
58e040c51231 branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents: 10263
diff changeset
556 if extra:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
557 branch = extra.get(b"branch")
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
558 if branch in (b"default", b""):
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
559 del extra[b"branch"]
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
560 elif branch in (b".", b"null", b"tip"):
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
561 raise error.StorageError(
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
562 _(b'the name \'%s\' is reserved') % branch
43076
2372284d9457 formatting: blacken the codebase
Augie Fackler <augie@google.com>
parents: 43027
diff changeset
563 )
42426
a1f87294471f copies: also encode p[12]copies destination as index into "files" list
Martin von Zweigbergk <martinvonz@google.com>
parents: 42407
diff changeset
564 sortedfiles = sorted(files)
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
565 sidedata = None
42861
57ea0a81a65c copies: remove existing copy info from the changeset on amend (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42553
diff changeset
566 if extra is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
567 for name in (
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
568 b'p1copies',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
569 b'p2copies',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
570 b'filesadded',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
571 b'filesremoved',
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
572 ):
42861
57ea0a81a65c copies: remove existing copy info from the changeset on amend (BC)
Martin von Zweigbergk <martinvonz@google.com>
parents: 42553
diff changeset
573 extra.pop(name, None)
43027
041f042afcc5 copies: move file input processsing early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43026
diff changeset
574 if p1copies is not None:
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
575 p1copies = copies.encodecopies(sortedfiles, p1copies)
43027
041f042afcc5 copies: move file input processsing early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43026
diff changeset
576 if p2copies is not None:
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
577 p2copies = copies.encodecopies(sortedfiles, p2copies)
43027
041f042afcc5 copies: move file input processsing early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43026
diff changeset
578 if filesadded is not None:
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
579 filesadded = copies.encodefileindices(sortedfiles, filesadded)
43027
041f042afcc5 copies: move file input processsing early
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43026
diff changeset
580 if filesremoved is not None:
43147
54e943b28101 sidedatacopies: move various copies related function to the copies modules
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43146
diff changeset
581 filesremoved = copies.encodefileindices(sortedfiles, filesremoved)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
582 if self._copiesstorage == b'extra':
43026
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
583 extrasentries = p1copies, p2copies, filesadded, filesremoved
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
584 if extra is None and any(x is not None for x in extrasentries):
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
585 extra = {}
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
586 if p1copies is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
587 extra[b'p1copies'] = p1copies
43026
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
588 if p2copies is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
589 extra[b'p2copies'] = p2copies
43026
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
590 if filesadded is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
591 extra[b'filesadded'] = filesadded
43026
0b87eb2fba67 copies: prepare changelog for more copies storage mode
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 42861
diff changeset
592 if filesremoved is not None:
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
593 extra[b'filesremoved'] = filesremoved
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
594 elif self._copiesstorage == b'changeset-sidedata':
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
595 sidedata = {}
43231
30570a056fa8 sidedatacopies: only store an entry if it has values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43230
diff changeset
596 if p1copies:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
597 sidedata[sidedatamod.SD_P1COPIES] = p1copies
43231
30570a056fa8 sidedatacopies: only store an entry if it has values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43230
diff changeset
598 if p2copies:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
599 sidedata[sidedatamod.SD_P2COPIES] = p2copies
43231
30570a056fa8 sidedatacopies: only store an entry if it has values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43230
diff changeset
600 if filesadded:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
601 sidedata[sidedatamod.SD_FILESADDED] = filesadded
43231
30570a056fa8 sidedatacopies: only store an entry if it has values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43230
diff changeset
602 if filesremoved:
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
603 sidedata[sidedatamod.SD_FILESREMOVED] = filesremoved
43231
30570a056fa8 sidedatacopies: only store an entry if it has values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43230
diff changeset
604 if not sidedata:
30570a056fa8 sidedatacopies: only store an entry if it has values
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43230
diff changeset
605 sidedata = None
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
606
3233
2f35961854fb [extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents: 3232
diff changeset
607 if extra:
8443
53ff4a5af284 changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents: 8442
diff changeset
608 extra = encodeextra(extra)
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
609 parseddate = b"%s %s" % (parseddate, extra)
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
610 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
611 text = b"\n".join(l)
43142
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
612 return self.addrevision(
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
613 text, transaction, len(self), p1, p2, sidedata=sidedata
beed7ce61681 sidedatacopies: write copies information in sidedata when applicable
Pierre-Yves David <pierre-yves.david@octobus.net>
parents: 43077
diff changeset
614 )
18306
06185554e7e3 changelog: add a `branch` method, bypassing changectx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents: 18231
diff changeset
615
20185
7d4219512823 branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents: 19899
diff changeset
616 def branchinfo(self, rev):
7d4219512823 branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents: 19899
diff changeset
617 """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
618
18308
4e27b06a0fd9 changelog: please check-code and remove tabs
Mads Kiilerich <mads@kiilerich.com>
parents: 18306
diff changeset
619 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
620 just to access this is costly."""
20185
7d4219512823 branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents: 19899
diff changeset
621 extra = self.read(rev)[5]
43077
687b865b95ad formatting: byteify all mercurial/ and hgext/ string literals
Augie Fackler <augie@google.com>
parents: 43076
diff changeset
622 return encoding.tolocal(extra.get(b"branch")), b'close' in extra
39887
a3095bc47217 changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents: 39777
diff changeset
623
a3095bc47217 changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents: 39777
diff changeset
624 def _nodeduplicatecallback(self, transaction, node):
a3095bc47217 changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents: 39777
diff changeset
625 # 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
626 #
a3095bc47217 changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents: 39777
diff changeset
627 # 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
628 duplicates = transaction.changes.setdefault(b'revduplicates', [])
39887
a3095bc47217 changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents: 39777
diff changeset
629 duplicates.append(self.rev(node))