Mercurial > hg-stable
annotate mercurial/changelog.py @ 42116:caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
We use our own _string_escape() to encode the "extras" field. Then we
use codecs.escape_decode() to escape it. But there's also a little
workaround for dealing with escaped text that looks like octal numbers
since the fix for
https://bz.mercurial-scm.org/show_bug.cgi?id=3156. This patch extracts
the call to codecs.escape_decode() along with the fix for octal
numbers and puts it in a _string_unescape(). It also updates the test
to check for the octal-number case from the aforementioned bug.
As you may have suspected, I want to be able to reuse this new
function later.
Differential Revision: https://phab.mercurial-scm.org/D6184
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Sun, 24 Mar 2019 23:47:01 -0700 |
parents | ae189674bdad |
children | 0e41f40b01cc |
rev | line source |
---|---|
1095 | 1 # changelog.py - changelog class for mercurial |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
2 # |
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 | 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 ) |
34399
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
16 from .thirdparty import ( |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
17 attr, |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
18 ) |
25922
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
19 |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
20 from . import ( |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
21 encoding, |
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
22 error, |
36266
ddeb7653b31c
py3: use pycompat.bytestr to convert str to bytes
Pulkit Goyal <7895pulkit@gmail.com>
parents:
36013
diff
changeset
|
23 pycompat, |
25922
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
24 revlog, |
41772
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
25 util, |
25922
85f442747153
changelog: use absolute_import
Gregory Szorc <gregory.szorc@gmail.com>
parents:
25814
diff
changeset
|
26 ) |
37087
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
27 from .utils import ( |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
28 dateutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
29 stringutil, |
f0b6fbea00cf
stringutil: bulk-replace call sites to point to new module
Yuya Nishihara <yuya@tcha.org>
parents:
36636
diff
changeset
|
30 ) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
31 |
16267
aa6821a7b52f
changelog: micro-optimizations to changelog.read()
Matt Mackall <mpm@selenic.com>
parents:
15661
diff
changeset
|
32 _defaultextra = {'branch': 'default'} |
aa6821a7b52f
changelog: micro-optimizations to changelog.read()
Matt Mackall <mpm@selenic.com>
parents:
15661
diff
changeset
|
33 |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
34 def _string_escape(text): |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
35 """ |
34148
708b5530a273
doctest: replace chr() with pycompat.bytechr()
Yuya Nishihara <yuya@tcha.org>
parents:
34147
diff
changeset
|
36 >>> from .pycompat import bytechr as chr |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34045
diff
changeset
|
37 >>> 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:
41836
diff
changeset
|
38 >>> 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
|
39 >>> s |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
40 'ab\\ncd\\\\\\\\n\\x0012ab\\rcd\\\\\\n' |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
41 >>> res = _string_escape(s) |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
42 >>> s == _string_unescape(res) |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
43 True |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
44 """ |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
45 # subset of the string_escape codec |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
46 text = text.replace('\\', '\\\\').replace('\n', '\\n').replace('\r', '\\r') |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
47 return text.replace('\0', '\\0') |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
48 |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
49 def _string_unescape(text): |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
50 if '\\0' in text: |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
51 # fix up \0 without getting into trouble with \\0 |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
52 text = text.replace('\\\\', '\\\\\n') |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
53 text = text.replace('\\0', '\0') |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
54 text = text.replace('\n', '') |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
55 return stringutil.unescapestr(text) |
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
56 |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
57 def decodeextra(text): |
15661
20ae902c43ec
changelog: handle decoding of NULs in extra more carefully (issue3156)
Matt Mackall <mpm@selenic.com>
parents:
14643
diff
changeset
|
58 """ |
34148
708b5530a273
doctest: replace chr() with pycompat.bytechr()
Yuya Nishihara <yuya@tcha.org>
parents:
34147
diff
changeset
|
59 >>> from .pycompat import bytechr as chr |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34045
diff
changeset
|
60 >>> sorted(decodeextra(encodeextra({b'foo': b'bar', b'baz': chr(0) + b'2'}) |
34147
264872544362
doctest: replace .iteritems() with .items()
Yuya Nishihara <yuya@tcha.org>
parents:
34146
diff
changeset
|
61 ... ).items()) |
18379
e0c4f4ba624c
tests: fix doctest stability over Python versions
Mads Kiilerich <madski@unity3d.com>
parents:
18378
diff
changeset
|
62 [('baz', '\\x002'), ('branch', 'default'), ('foo', 'bar')] |
34146
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34045
diff
changeset
|
63 >>> sorted(decodeextra(encodeextra({b'foo': b'bar', |
0fa781320203
doctest: bulk-replace string literals with b'' for Python 3
Yuya Nishihara <yuya@tcha.org>
parents:
34045
diff
changeset
|
64 ... b'baz': chr(92) + chr(0) + b'2'}) |
34147
264872544362
doctest: replace .iteritems() with .items()
Yuya Nishihara <yuya@tcha.org>
parents:
34146
diff
changeset
|
65 ... ).items()) |
18379
e0c4f4ba624c
tests: fix doctest stability over Python versions
Mads Kiilerich <madski@unity3d.com>
parents:
18378
diff
changeset
|
66 [('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
|
67 """ |
16267
aa6821a7b52f
changelog: micro-optimizations to changelog.read()
Matt Mackall <mpm@selenic.com>
parents:
15661
diff
changeset
|
68 extra = _defaultextra.copy() |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
69 for l in text.split('\0'): |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
70 if l: |
42116
caa067ee21dc
changelog: extract a _string_unescape() to mirror _string_escape()
Martin von Zweigbergk <martinvonz@google.com>
parents:
41836
diff
changeset
|
71 k, v = _string_unescape(l).split(':', 1) |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
72 extra[k] = v |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
73 return extra |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
74 |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
75 def encodeextra(d): |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
76 # keys must be sorted to produce a deterministic changelog entry |
41588
b436059c1cca
py3: use pycompat.bytestr() on extra values because it can be int
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41275
diff
changeset
|
77 items = [ |
b436059c1cca
py3: use pycompat.bytestr() on extra values because it can be int
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41275
diff
changeset
|
78 _string_escape('%s:%s' % (k, pycompat.bytestr(d[k]))) |
b436059c1cca
py3: use pycompat.bytestr() on extra values because it can be int
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41275
diff
changeset
|
79 for k in sorted(d) |
b436059c1cca
py3: use pycompat.bytestr() on extra values because it can be int
Pulkit Goyal <pulkit@yandex-team.ru>
parents:
41275
diff
changeset
|
80 ] |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
81 return "\0".join(items) |
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
82 |
17810
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
83 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
|
84 """strip trailing whitespace and leading and trailing empty lines""" |
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
85 return '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n') |
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
86 |
8778
c5f36402daad
use new style classes
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
8644
diff
changeset
|
87 class appender(object): |
7807
bd8f44638847
help: miscellaneous language fixes
timeless <timeless@gmail.com>
parents:
7787
diff
changeset
|
88 '''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
|
89 to delay writes to it''' |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
90 def __init__(self, vfs, name, mode, buf): |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
91 self.data = buf |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
92 fp = vfs(name, mode) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
93 self.fp = fp |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
94 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
|
95 self.size = vfs.fstat(fp).st_size |
30601
be520fe3a3e9
changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents:
30210
diff
changeset
|
96 self._end = self.size |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
97 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
98 def end(self): |
30601
be520fe3a3e9
changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents:
30210
diff
changeset
|
99 return self._end |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
100 def tell(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
101 return self.offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
102 def flush(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
103 pass |
36002
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
36001
diff
changeset
|
104 |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
36001
diff
changeset
|
105 @property |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
36001
diff
changeset
|
106 def closed(self): |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
36001
diff
changeset
|
107 return self.fp.closed |
69aaad59dc02
changelog: add the missing 'closed' property on 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
36001
diff
changeset
|
108 |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
109 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
|
110 self.fp.close() |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
111 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
112 def seek(self, offset, whence=0): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
113 '''virtual file offset spans real file and data''' |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
114 if whence == 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
115 self.offset = offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
116 elif whence == 1: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
117 self.offset += offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
118 elif whence == 2: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
119 self.offset = self.end() + offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
120 if self.offset < self.size: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
121 self.fp.seek(self.offset) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
122 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
123 def read(self, count=-1): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
124 '''only trick here is reads that span real file and data''' |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
125 ret = "" |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
126 if self.offset < self.size: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
127 s = self.fp.read(count) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
128 ret = s |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
129 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
130 if count > 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
131 count -= len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
132 if count != 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
133 doff = self.offset - self.size |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
134 self.data.insert(0, "".join(self.data)) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
135 del self.data[1:] |
10282
08a0f04b56bd
many, many trivial check-code fixups
Matt Mackall <mpm@selenic.com>
parents:
10263
diff
changeset
|
136 s = self.data[0][doff:doff + count] |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
137 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
138 ret += s |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
139 return ret |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
140 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
141 def write(self, s): |
31647
addc392cc3d3
py3: use bytes() to cast to immutable bytes in changelog.appender.write()
Yuya Nishihara <yuya@tcha.org>
parents:
31491
diff
changeset
|
142 self.data.append(bytes(s)) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
143 self.offset += len(s) |
30601
be520fe3a3e9
changelog: keep track of file end in appender (issue5444)
Durham Goode <durham@fb.com>
parents:
30210
diff
changeset
|
144 self._end += len(s) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
145 |
36001
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
146 def __enter__(self): |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
147 self.fp.__enter__() |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
148 return self |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
149 |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
150 def __exit__(self, *args): |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
151 return self.fp.__exit__(*args) |
fa15a70f88de
changelog: implement context manager method for 'appender' object
Boris Feld <boris.feld@octobus.net>
parents:
35672
diff
changeset
|
152 |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
153 def _divertopener(opener, target): |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
154 """build an opener that writes in 'target.a' instead of 'target'""" |
30001
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29710
diff
changeset
|
155 def _divert(name, mode='r', checkambig=False): |
9166
e6162b854ed5
changelog: move delayopener outside of class to eliminate reference cycle
Matt Mackall <mpm@selenic.com>
parents:
9165
diff
changeset
|
156 if name != target: |
e6162b854ed5
changelog: move delayopener outside of class to eliminate reference cycle
Matt Mackall <mpm@selenic.com>
parents:
9165
diff
changeset
|
157 return opener(name, mode) |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
158 return opener(name + ".a", mode) |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
159 return _divert |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
160 |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
161 def _delayopener(opener, target, buf): |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
162 """build an opener that stores chunks in 'buf' instead of 'target'""" |
30001
b5e5ddf48bd2
revlog: specify checkambig at writing to avoid file stat ambiguity
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
29710
diff
changeset
|
163 def _delay(name, mode='r', checkambig=False): |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
164 if name != target: |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
165 return opener(name, mode) |
19899
8c3dcbbfb5de
changelog: use "vfs.fstat()" instead of "util.fstat()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
19898
diff
changeset
|
166 return appender(opener, name, mode, buf) |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
167 return _delay |
9166
e6162b854ed5
changelog: move delayopener outside of class to eliminate reference cycle
Matt Mackall <mpm@selenic.com>
parents:
9165
diff
changeset
|
168 |
34399
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
169 @attr.s |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
170 class _changelogrevision(object): |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
171 # Extensions might modify _defaultextra, so let the constructor below pass |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
172 # it in |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
173 extra = attr.ib() |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
174 manifest = attr.ib(default=nullid) |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
175 user = attr.ib(default='') |
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
176 date = attr.ib(default=(0, 0)) |
34442
50474f0b3f1b
changelog: use a Factory for default value for files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
34399
diff
changeset
|
177 files = attr.ib(default=attr.Factory(list)) |
34399
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
178 description = attr.ib(default='') |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
179 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
180 class changelogrevision(object): |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
181 """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
|
182 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
183 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
|
184 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
|
185 the parsed object. |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
186 """ |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
187 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
188 __slots__ = ( |
41836
ae189674bdad
global: use raw strings for __slots__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41772
diff
changeset
|
189 r'_offsets', |
ae189674bdad
global: use raw strings for __slots__
Gregory Szorc <gregory.szorc@gmail.com>
parents:
41772
diff
changeset
|
190 r'_text', |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
191 ) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
192 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
193 def __new__(cls, text): |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
194 if not text: |
34399
e51c8ffa1ffa
changelog: use attrs instead of namedtuple
Siddharth Agarwal <sid0@fb.com>
parents:
34303
diff
changeset
|
195 return _changelogrevision(extra=_defaultextra) |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
196 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
197 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
|
198 # 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
|
199 # 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
|
200 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
201 # format used: |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
202 # 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
|
203 # 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
|
204 # 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
|
205 # : 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
|
206 # : older versions ignore it |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
207 # 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
|
208 # (.*) : 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
|
209 # |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
210 # 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
|
211 |
28490
959eadae589a
changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28489
diff
changeset
|
212 nl1 = text.index('\n') |
28491
f57f7500a095
changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28490
diff
changeset
|
213 nl2 = text.index('\n', nl1 + 1) |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
214 nl3 = text.index('\n', nl2 + 1) |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
215 |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
216 # 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
|
217 # double newline that precedes the description. |
32202
6f173560c7f4
py3: slice over bytes to prevent getting ascii values
Pulkit Goyal <7895pulkit@gmail.com>
parents:
31647
diff
changeset
|
218 if text[nl3 + 1:nl3 + 2] == '\n': |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
219 doublenl = nl3 |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
220 else: |
28494
63653147e9bb
changelog: parse description last
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28493
diff
changeset
|
221 doublenl = text.index('\n\n', nl3 + 1) |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
222 |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
223 self._offsets = (nl1, nl2, nl3, doublenl) |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
224 self._text = text |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
225 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
226 return self |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
227 |
28489
8939a95064f1
changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28487
diff
changeset
|
228 @property |
28490
959eadae589a
changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28489
diff
changeset
|
229 def manifest(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
230 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
|
231 |
959eadae589a
changelog: lazily parse manifest node
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28489
diff
changeset
|
232 @property |
28491
f57f7500a095
changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28490
diff
changeset
|
233 def user(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
234 off = self._offsets |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
235 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
|
236 |
f57f7500a095
changelog: lazily parse user
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28490
diff
changeset
|
237 @property |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
238 def _rawdate(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
239 off = self._offsets |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
240 dateextra = self._text[off[1] + 1:off[2]] |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
241 return dateextra.split(' ', 2)[0:2] |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
242 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
243 @property |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
244 def _rawextra(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
245 off = self._offsets |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
246 dateextra = self._text[off[1] + 1:off[2]] |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
247 fields = dateextra.split(' ', 2) |
28492
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
248 if len(fields) != 3: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
249 return None |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
250 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
251 return fields[2] |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
252 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
253 @property |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
254 def date(self): |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
255 raw = self._rawdate |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
256 time = float(raw[0]) |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
257 # 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
|
258 try: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
259 timezone = int(raw[1]) |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
260 except ValueError: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
261 timezone = 0 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
262 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
263 return time, timezone |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
264 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
265 @property |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
266 def extra(self): |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
267 raw = self._rawextra |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
268 if raw is None: |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
269 return _defaultextra |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
270 |
837f1c437d58
changelog: lazily parse date/extra field
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28491
diff
changeset
|
271 return decodeextra(raw) |
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 |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
274 def files(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
275 off = self._offsets |
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
276 if off[2] == off[3]: |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
277 return [] |
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
278 |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
279 return self._text[off[2] + 1:off[3]].split('\n') |
28493
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
280 |
7796473c11b3
changelog: lazily parse files
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28492
diff
changeset
|
281 @property |
28489
8939a95064f1
changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28487
diff
changeset
|
282 def description(self): |
28495
70c2f8a98276
changelog: avoid slicing raw data until needed
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28494
diff
changeset
|
283 return encoding.tolocal(self._text[self._offsets[3] + 2:]) |
28489
8939a95064f1
changelog: lazily parse description
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28487
diff
changeset
|
284 |
7634
14a4337a9b9b
revlog: kill from-style imports
Matt Mackall <mpm@selenic.com>
parents:
7633
diff
changeset
|
285 class changelog(revlog.revlog): |
32332
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
286 def __init__(self, opener, trypending=False): |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
287 """Load a changelog revlog using an opener. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
288 |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
289 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:
32302
diff
changeset
|
290 ``00changelog.i.a`` file instead of the default ``00changelog.i``. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
291 The ``00changelog.i.a`` file contains index (and possibly inline |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
292 revision) data for a transaction that hasn't been finalized yet. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
293 It exists in a separate file to facilitate readers (such as |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
294 hooks processes) accessing data before a transaction is finalized. |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
295 """ |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
296 if trypending and opener.exists('00changelog.i.a'): |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
297 indexfile = '00changelog.i.a' |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
298 else: |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
299 indexfile = '00changelog.i' |
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
300 |
32347
3caec778774b
changelog: make sure datafile is 00changelog.d (API)
Jun Wu <quark@fb.com>
parents:
32332
diff
changeset
|
301 datafile = '00changelog.d' |
3caec778774b
changelog: make sure datafile is 00changelog.d (API)
Jun Wu <quark@fb.com>
parents:
32332
diff
changeset
|
302 revlog.revlog.__init__(self, opener, indexfile, datafile=datafile, |
34303
3c9691728237
revlog: add option to mmap revlog index
Mark Thomas <mbthomas@fb.com>
parents:
34148
diff
changeset
|
303 checkambig=True, mmaplargeindex=True) |
32332
0ad0d26ff703
changelog: load pending file directly
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32302
diff
changeset
|
304 |
41202
e7a2cc84dbc0
revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39892
diff
changeset
|
305 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:
39892
diff
changeset
|
306 # changelogs don't benefit from generaldelta. |
e7a2cc84dbc0
revlog: always enable generaldelta on version 2 revlogs
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39892
diff
changeset
|
307 |
32355
67026d65a4fc
revlog: rename constants (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
32347
diff
changeset
|
308 self.version &= ~revlog.FLAG_GENERALDELTA |
14334
85c82ebc96a3
changelog: don't use generaldelta
Sune Foldager <cryo@cyanite.org>
parents:
14207
diff
changeset
|
309 self._generaldelta = False |
30155
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30004
diff
changeset
|
310 |
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30004
diff
changeset
|
311 # Delta chains for changelogs tend to be very small because entries |
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30004
diff
changeset
|
312 # 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:
30004
diff
changeset
|
313 # chains. |
39260
0a5b20c107a6
repository: remove storedeltachains from ifilestorage
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39229
diff
changeset
|
314 self._storedeltachains = False |
30155
b7a966ce89ed
changelog: disable delta chains
Gregory Szorc <gregory.szorc@gmail.com>
parents:
30004
diff
changeset
|
315 |
8644
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
316 self._realopener = opener |
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
317 self._delayed = False |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
318 self._delaybuf = None |
9163
f193b643d1b1
changelog: _delaycount -> _divert
Matt Mackall <mpm@selenic.com>
parents:
8778
diff
changeset
|
319 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
|
320 self.filteredrevs = frozenset() |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
321 |
35671
8810f0643fa1
changelog: introduce a 'tiprev' method
Boris Feld <boris.feld@octobus.net>
parents:
35317
diff
changeset
|
322 def tiprev(self): |
38823
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
323 for i in pycompat.xrange(len(self) -1, -2, -1): |
35671
8810f0643fa1
changelog: introduce a 'tiprev' method
Boris Feld <boris.feld@octobus.net>
parents:
35317
diff
changeset
|
324 if i not in self.filteredrevs: |
8810f0643fa1
changelog: introduce a 'tiprev' method
Boris Feld <boris.feld@octobus.net>
parents:
35317
diff
changeset
|
325 return i |
8810f0643fa1
changelog: introduce a 'tiprev' method
Boris Feld <boris.feld@octobus.net>
parents:
35317
diff
changeset
|
326 |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
327 def tip(self): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
328 """filtered version of revlog.tip""" |
35672
5a6e0eee7781
changelog: use 'tiprev()' in 'tip()'
Boris Feld <boris.feld@octobus.net>
parents:
35671
diff
changeset
|
329 return self.node(self.tiprev()) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
330 |
24030
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23292
diff
changeset
|
331 def __contains__(self, rev): |
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23292
diff
changeset
|
332 """filtered version of revlog.__contains__""" |
24662
b5cd8c2f6e65
changelog: inline revlog.__contains__ in case it is used in hot loop
Yuya Nishihara <yuya@tcha.org>
parents:
24030
diff
changeset
|
333 return (0 <= rev < len(self) |
24030
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23292
diff
changeset
|
334 and rev not in self.filteredrevs) |
828dc8db5515
revlog: add __contains__ for fast membership test
Yuya Nishihara <yuya@tcha.org>
parents:
23292
diff
changeset
|
335 |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
336 def __iter__(self): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
337 """filtered version of revlog.__iter__""" |
17951
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
338 if len(self.filteredrevs) == 0: |
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
339 return revlog.revlog.__iter__(self) |
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
340 |
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
341 def filterediter(): |
38823
e7aa113b14f7
global: use pycompat.xrange()
Gregory Szorc <gregory.szorc@gmail.com>
parents:
37087
diff
changeset
|
342 for i in pycompat.xrange(len(self)): |
17951
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
343 if i not in self.filteredrevs: |
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
344 yield i |
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
345 |
6f79c32c0bdf
commit: increase perf by avoiding unnecessary filteredrevs check
Durham Goode <durham@fb.com>
parents:
17810
diff
changeset
|
346 return filterediter() |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
347 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
348 def revs(self, start=0, stop=None): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
349 """filtered version of revlog.revs""" |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
350 for i in super(changelog, self).revs(start, stop): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
351 if i not in self.filteredrevs: |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
352 yield i |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
353 |
26005
6f4a280298c1
changelog: add way to call the reachableroots C implementation
Laurent Charignon <lcharignon@fb.com>
parents:
25922
diff
changeset
|
354 def reachableroots(self, minroot, heads, roots, includepath=False): |
26094
df41c7be16d6
reachableroots: construct and sort baseset in revset module
Yuya Nishihara <yuya@tcha.org>
parents:
26061
diff
changeset
|
355 return self.index.reachableroots2(minroot, heads, roots, includepath) |
26005
6f4a280298c1
changelog: add way to call the reachableroots C implementation
Laurent Charignon <lcharignon@fb.com>
parents:
25922
diff
changeset
|
356 |
41772
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
357 def _checknofilteredinrevs(self, revs): |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
358 """raise the appropriate error if 'revs' contains a filtered revision |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
359 |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
360 This returns a version of 'revs' to be used thereafter by the caller. |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
361 In particular, if revs is an iterator, it is converted into a set. |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
362 """ |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
363 safehasattr = util.safehasattr |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
364 if safehasattr(revs, '__next__'): |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
365 # Note that inspect.isgenerator() is not true for iterators, |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
366 revs = set(revs) |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
367 |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
368 filteredrevs = self.filteredrevs |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
369 if safehasattr(revs, 'first'): # smartset |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
370 offenders = revs & filteredrevs |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
371 else: |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
372 offenders = filteredrevs.intersection(revs) |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
373 |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
374 for rev in offenders: |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
375 raise error.FilteredIndexError(rev) |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
376 return revs |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
377 |
41275
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41202
diff
changeset
|
378 def headrevs(self, revs=None): |
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41202
diff
changeset
|
379 if revs is None and self.filteredrevs: |
22484
2b5940f64750
obsolete: use C code for headrevs calculation
Durham Goode <durham@fb.com>
parents:
21544
diff
changeset
|
380 try: |
23088
fe5f044b753d
changelog: use headrevsfiltered
Mads Kiilerich <madski@unity3d.com>
parents:
23015
diff
changeset
|
381 return self.index.headrevsfiltered(self.filteredrevs) |
fe5f044b753d
changelog: use headrevsfiltered
Mads Kiilerich <madski@unity3d.com>
parents:
23015
diff
changeset
|
382 # AttributeError covers non-c-extension environments and |
fe5f044b753d
changelog: use headrevsfiltered
Mads Kiilerich <madski@unity3d.com>
parents:
23015
diff
changeset
|
383 # old c extensions without filter handling. |
fe5f044b753d
changelog: use headrevsfiltered
Mads Kiilerich <madski@unity3d.com>
parents:
23015
diff
changeset
|
384 except AttributeError: |
22484
2b5940f64750
obsolete: use C code for headrevs calculation
Durham Goode <durham@fb.com>
parents:
21544
diff
changeset
|
385 return self._headrevs() |
2b5940f64750
obsolete: use C code for headrevs calculation
Durham Goode <durham@fb.com>
parents:
21544
diff
changeset
|
386 |
41772
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
387 if self.filteredrevs: |
6843379bf99e
changelog: prefilter in headrevs()
Georges Racinet <georges.racinet@octobus.net>
parents:
41588
diff
changeset
|
388 revs = self._checknofilteredinrevs(revs) |
41275
1421d0487a61
revlog: accept a revs argument in `headrevs`
Boris Feld <boris.feld@octobus.net>
parents:
41202
diff
changeset
|
389 return super(changelog, self).headrevs(revs) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
390 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
391 def strip(self, *args, **kwargs): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
392 # XXX make something better than assert |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
393 # We can't expect proper strip behavior if we are filtered. |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
394 assert not self.filteredrevs |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
395 super(changelog, self).strip(*args, **kwargs) |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
396 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
397 def rev(self, node): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
398 """filtered version of revlog.rev""" |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
399 r = super(changelog, self).rev(node) |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
400 if r in self.filteredrevs: |
23015
21c44c1aed87
repoview: add a FilteredLookupError class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23014
diff
changeset
|
401 raise error.FilteredLookupError(hex(node), self.indexfile, |
21c44c1aed87
repoview: add a FilteredLookupError class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23014
diff
changeset
|
402 _('filtered node')) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
403 return r |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
404 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
405 def node(self, rev): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
406 """filtered version of revlog.node""" |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
407 if rev in self.filteredrevs: |
23014
f00813325c5a
repoview: add a FilteredIndexError class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22484
diff
changeset
|
408 raise error.FilteredIndexError(rev) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
409 return super(changelog, self).node(rev) |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
410 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
411 def linkrev(self, rev): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
412 """filtered version of revlog.linkrev""" |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
413 if rev in self.filteredrevs: |
23014
f00813325c5a
repoview: add a FilteredIndexError class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22484
diff
changeset
|
414 raise error.FilteredIndexError(rev) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
415 return super(changelog, self).linkrev(rev) |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
416 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
417 def parentrevs(self, rev): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
418 """filtered version of revlog.parentrevs""" |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
419 if rev in self.filteredrevs: |
23014
f00813325c5a
repoview: add a FilteredIndexError class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22484
diff
changeset
|
420 raise error.FilteredIndexError(rev) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
421 return super(changelog, self).parentrevs(rev) |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
422 |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
423 def flags(self, rev): |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
424 """filtered version of revlog.flags""" |
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
425 if rev in self.filteredrevs: |
23014
f00813325c5a
repoview: add a FilteredIndexError class
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
22484
diff
changeset
|
426 raise error.FilteredIndexError(rev) |
17677
5c89e7fa5bc2
clfilter: introduce `filteredrevs` attribute on changelog
Pierre-Yves David <pierre-yves.david@logilab.fr>
parents:
17424
diff
changeset
|
427 return super(changelog, self).flags(rev) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
428 |
23203
3872d563e01a
changelog: handle writepending in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23201
diff
changeset
|
429 def delayupdate(self, tr): |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
430 "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
|
431 |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
432 if not self._delayed: |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
433 if len(self) == 0: |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
434 self._divert = True |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
435 if self._realopener.exists(self.indexfile + '.a'): |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
436 self._realopener.unlink(self.indexfile + '.a') |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
437 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
|
438 else: |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
439 self._delaybuf = [] |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
440 self.opener = _delayopener(self._realopener, self.indexfile, |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
441 self._delaybuf) |
8644
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
442 self._delayed = True |
23203
3872d563e01a
changelog: handle writepending in the transaction
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23201
diff
changeset
|
443 tr.addpending('cl-%i' % id(self), self._writepending) |
23281
f60ed8cf4afc
transaction: pass the transaction to 'finalize' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23280
diff
changeset
|
444 tr.addfinalize('cl-%i' % id(self), self._finalize) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
445 |
23205
2d54aa5397cd
changelog: rely on transaction for finalization
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23203
diff
changeset
|
446 def _finalize(self, tr): |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
447 "finalize index updates" |
8644
c2ef478b2efa
changelog: make delayopener less intrusive
Matt Mackall <mpm@selenic.com>
parents:
8499
diff
changeset
|
448 self._delayed = False |
9165
07f9b2f4a9aa
changelog: swap opener to switch delay modes
Matt Mackall <mpm@selenic.com>
parents:
9164
diff
changeset
|
449 self.opener = self._realopener |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
450 # move redirected index data back into place |
9164
b0d995b6b0a6
changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents:
9163
diff
changeset
|
451 if self._divert: |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
452 assert not self._delaybuf |
19898
3f92e749d381
changelog: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18587
diff
changeset
|
453 tmpname = self.indexfile + ".a" |
3f92e749d381
changelog: use "vfs.rename()" instead of "util.rename()"
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
18587
diff
changeset
|
454 nfile = self.opener.open(tmpname) |
14207
c1cca38818b9
changelog: fixes leaked file handle
Zachary Gramana <zgramana@pottsconsultinggroup.com>
parents:
14004
diff
changeset
|
455 nfile.close() |
30003
003c41edc5f5
changelog: specify checkambig=True to avoid ambiguity around truncation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30001
diff
changeset
|
456 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
|
457 elif self._delaybuf: |
30003
003c41edc5f5
changelog: specify checkambig=True to avoid ambiguity around truncation
FUJIWARA Katsunori <foozy@lares.dti.ne.jp>
parents:
30001
diff
changeset
|
458 fp = self.opener(self.indexfile, 'a', checkambig=True) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
459 fp.write("".join(self._delaybuf)) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
460 fp.close() |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
461 self._delaybuf = None |
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
462 self._divert = False |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
463 # split when we're done |
36013
9ba1d0c724e2
revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents:
36002
diff
changeset
|
464 self._enforceinlinesize(tr) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
465 |
23280
b01c491af0cf
transaction: pass the transaction to 'pending' callback
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23205
diff
changeset
|
466 def _writepending(self, tr): |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
467 "create a file containing the unfinalized state for pretxnchangegroup" |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
468 if self._delaybuf: |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
469 # make a temporary copy of the index |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
470 fp1 = self._realopener(self.indexfile) |
23292
e44399c494ab
changelog: register changelog.i.a as a temporary file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
471 pendingfilename = self.indexfile + ".a" |
e44399c494ab
changelog: register changelog.i.a as a temporary file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
472 # 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
|
473 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
|
474 # write existing data |
e44399c494ab
changelog: register changelog.i.a as a temporary file
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23281
diff
changeset
|
475 fp2 = self._realopener(pendingfilename, "w") |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
476 fp2.write(fp1.read()) |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
477 # add pending data |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
478 fp2.write("".join(self._delaybuf)) |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
479 fp2.close() |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
480 # 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
|
481 self._delaybuf = None |
9164
b0d995b6b0a6
changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents:
9163
diff
changeset
|
482 self._divert = True |
23201
7e97bf6ee2d6
changelog: rework the delayupdate mechanism
Pierre-Yves David <pierre-yves.david@fb.com>
parents:
23088
diff
changeset
|
483 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
|
484 |
9164
b0d995b6b0a6
changelog: factor out _delayname
Matt Mackall <mpm@selenic.com>
parents:
9163
diff
changeset
|
485 if self._divert: |
7787
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
486 return True |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
487 |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
488 return False |
b8d750daadde
Introduce HG_PREPEND to solve pretxn races
Matt Mackall <mpm@selenic.com>
parents:
7634
diff
changeset
|
489 |
36013
9ba1d0c724e2
revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents:
36002
diff
changeset
|
490 def _enforceinlinesize(self, tr, fp=None): |
9165
07f9b2f4a9aa
changelog: swap opener to switch delay modes
Matt Mackall <mpm@selenic.com>
parents:
9164
diff
changeset
|
491 if not self._delayed: |
36013
9ba1d0c724e2
revlog: rename 'self.checkinlinesize' into '_enforceinlinesize'
Boris Feld <boris.feld@octobus.net>
parents:
36002
diff
changeset
|
492 revlog.revlog._enforceinlinesize(self, tr, fp) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
493 |
5744
9db7fd77417d
changelog: remove extract function
Matt Mackall <mpm@selenic.com>
parents:
5450
diff
changeset
|
494 def read(self, node): |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
495 """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
|
496 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
497 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
|
498 |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
499 - manifest node in binary |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
500 - author/user as a localstr |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
501 - 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
|
502 - list of files |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
503 - commit message as a localstr |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
504 - dict of extra metadata |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
505 |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
506 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
|
507 ``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
|
508 access. |
3077
ad6aecaf4eed
document changelog format
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2859
diff
changeset
|
509 """ |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
510 c = changelogrevision(self.revision(node)) |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
511 return ( |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
512 c.manifest, |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
513 c.user, |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
514 c.date, |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
515 c.files, |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
516 c.description, |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
517 c.extra |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
518 ) |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
519 |
28487
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
520 def changelogrevision(self, nodeorrev): |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
521 """Obtain a ``changelogrevision`` for a node or revision.""" |
98d98a645e9d
changelog: add class to represent parsed changelog revisions
Gregory Szorc <gregory.szorc@gmail.com>
parents:
28315
diff
changeset
|
522 return changelogrevision(self.revision(nodeorrev)) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
523 |
27439
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
524 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
|
525 """ |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
526 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
|
527 """ |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
528 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
|
529 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
|
530 return [] |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
531 last = text.index("\n\n") |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
532 l = text[:last].split('\n') |
ed003859f1d8
changelog: add a new method to get files modified by a changeset
Laurent Charignon <lcharignon@fb.com>
parents:
26094
diff
changeset
|
533 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
|
534 |
8422
437e06bbd11e
changelog: removed bad default arguments in add method
Martin Geisler <mg@lazybytes.net>
parents:
8225
diff
changeset
|
535 def add(self, manifest, files, desc, transaction, p1, p2, |
9677
0c072e63e3e7
changelog: do not use a mutable default value
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
9166
diff
changeset
|
536 user, date=None, extra=None): |
14379
bd23d5f28bbb
changelog: convert user and desc from local encoding early
Martin Geisler <mg@aragost.com>
parents:
10420
diff
changeset
|
537 # 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
|
538 # 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
|
539 # 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
|
540 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
|
541 |
7035
9d023ef7b467
forbid username with '\n' at the changelog level
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6259
diff
changeset
|
542 user = user.strip() |
8424
c5b3d3e30de7
changelog: refuse to add revisions with empty usernames
Martin Geisler <mg@lazybytes.net>
parents:
7807
diff
changeset
|
543 # 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
|
544 # 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
|
545 # 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
|
546 if not user: |
39793
b63dee7bd0d9
global: replace most uses of RevlogError with StorageError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39328
diff
changeset
|
547 raise error.StorageError(_("empty username")) |
7035
9d023ef7b467
forbid username with '\n' at the changelog level
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
6259
diff
changeset
|
548 if "\n" in user: |
39793
b63dee7bd0d9
global: replace most uses of RevlogError with StorageError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39328
diff
changeset
|
549 raise error.StorageError(_("username %r contains a newline") |
b63dee7bd0d9
global: replace most uses of RevlogError with StorageError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39328
diff
changeset
|
550 % pycompat.bytestr(user)) |
8499
fb9b83df45f3
commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents:
8443
diff
changeset
|
551 |
17810
2894d180afa1
changelog: extract description cleaning logic in a dedicated function
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
17677
diff
changeset
|
552 desc = stripdesc(desc) |
8499
fb9b83df45f3
commit: move description trimming into changelog
Matt Mackall <mpm@selenic.com>
parents:
8443
diff
changeset
|
553 |
1195
f92af8d53330
Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1095
diff
changeset
|
554 if date: |
36636
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36266
diff
changeset
|
555 parseddate = "%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
|
556 else: |
36636
c6061cadb400
util: extract all date-related utils in utils/dateutil module
Boris Feld <boris.feld@octobus.net>
parents:
36266
diff
changeset
|
557 parseddate = "%d %d" % dateutil.makedate() |
10417
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
558 if extra: |
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
559 branch = extra.get("branch") |
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
560 if branch in ("default", ""): |
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
561 del extra["branch"] |
58e040c51231
branch: avoid using reserved tag names
Wagner Bruna <wbruna@softwareexpress.com.br>
parents:
10263
diff
changeset
|
562 elif branch in (".", "null", "tip"): |
39793
b63dee7bd0d9
global: replace most uses of RevlogError with StorageError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39328
diff
changeset
|
563 raise error.StorageError(_('the name \'%s\' is reserved') |
b63dee7bd0d9
global: replace most uses of RevlogError with StorageError (API)
Gregory Szorc <gregory.szorc@gmail.com>
parents:
39328
diff
changeset
|
564 % branch) |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
565 if extra: |
8443
53ff4a5af284
changelog: turn {de,en}code_extra methods into functions
Martin Geisler <mg@lazybytes.net>
parents:
8442
diff
changeset
|
566 extra = encodeextra(extra) |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
567 parseddate = "%s %s" % (parseddate, extra) |
8209
a1a5a57efe90
replace util.sort with sorted built-in
Matt Mackall <mpm@selenic.com>
parents:
7948
diff
changeset
|
568 l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
569 text = "\n".join(l) |
6750
fb42030d79d6
add __len__ and __iter__ methods to repo and revlog
Matt Mackall <mpm@selenic.com>
parents:
6259
diff
changeset
|
570 return self.addrevision(text, transaction, len(self), p1, p2) |
18306
06185554e7e3
changelog: add a `branch` method, bypassing changectx
Pierre-Yves David <pierre-yves.david@ens-lyon.org>
parents:
18231
diff
changeset
|
571 |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
19899
diff
changeset
|
572 def branchinfo(self, rev): |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
19899
diff
changeset
|
573 """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
|
574 |
18308
4e27b06a0fd9
changelog: please check-code and remove tabs
Mads Kiilerich <mads@kiilerich.com>
parents:
18306
diff
changeset
|
575 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
|
576 just to access this is costly.""" |
20185
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
19899
diff
changeset
|
577 extra = self.read(rev)[5] |
7d4219512823
branchmap: cache open/closed branch head information
Brodie Rao <brodie@sf.io>
parents:
19899
diff
changeset
|
578 return encoding.tolocal(extra.get("branch")), 'close' in extra |
39892
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39793
diff
changeset
|
579 |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39793
diff
changeset
|
580 def _nodeduplicatecallback(self, transaction, node): |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39793
diff
changeset
|
581 # 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:
39793
diff
changeset
|
582 # |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39793
diff
changeset
|
583 # We track them in a list to preserve their order from the source bundle |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39793
diff
changeset
|
584 duplicates = transaction.changes.setdefault('revduplicates', []) |
a3095bc47217
changelog: keep track of duplicated node in the transaction adding them
Boris Feld <boris.feld@octobus.net>
parents:
39793
diff
changeset
|
585 duplicates.append(self.rev(node)) |