Mercurial > hg
annotate mercurial/changelog.py @ 6078:ebc23d34102f
convert: added gnu arch (baz) tests
author | Aleix Conchillo Flaque <aleix@member.fsf.org> |
---|---|
date | Tue, 12 Feb 2008 10:38:34 +0100 |
parents | d09ccdbf7286 |
children | f89fd07fc51d |
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 # |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
5 # This software may be used and distributed according to the terms |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
6 # of the GNU General Public License, incorporated herein by reference. |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
7 |
262 | 8 from revlog import * |
3891 | 9 from i18n import _ |
3877
abaee83ce0a6
Replace demandload with new demandimport
Matt Mackall <mpm@selenic.com>
parents:
3771
diff
changeset
|
10 import os, time, util |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
11 |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
12 def _string_escape(text): |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
13 """ |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
14 >>> d = {'nl': chr(10), 'bs': chr(92), 'cr': chr(13), 'nul': chr(0)} |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
15 >>> s = "ab%(nl)scd%(bs)s%(bs)sn%(nul)sab%(cr)scd%(bs)s%(nl)s" % d |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
16 >>> s |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
17 'ab\\ncd\\\\\\\\n\\x00ab\\rcd\\\\\\n' |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
18 >>> res = _string_escape(s) |
5745
234e40e636a8
changelog: inline trivial call for extra data unescaping
Matt Mackall <mpm@selenic.com>
parents:
5744
diff
changeset
|
19 >>> s == res.decode('string_escape') |
3232
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
20 True |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
21 """ |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
22 # subset of the string_escape codec |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
23 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
|
24 return text.replace('\0', '\\0') |
394ac87f3b74
[extendedchangelog] encode/decode function
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3077
diff
changeset
|
25 |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
26 class appender: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
27 '''the changelog index must be update last on disk, so we use this class |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
28 to delay writes to it''' |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
29 def __init__(self, fp, buf): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
30 self.data = buf |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
31 self.fp = fp |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
32 self.offset = fp.tell() |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
33 self.size = util.fstat(fp).st_size |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
34 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
35 def end(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
36 return self.size + len("".join(self.data)) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
37 def tell(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
38 return self.offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
39 def flush(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
40 pass |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
41 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
|
42 self.fp.close() |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
43 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
44 def seek(self, offset, whence=0): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
45 '''virtual file offset spans real file and data''' |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
46 if whence == 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
47 self.offset = offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
48 elif whence == 1: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
49 self.offset += offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
50 elif whence == 2: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
51 self.offset = self.end() + offset |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
52 if self.offset < self.size: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
53 self.fp.seek(self.offset) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
54 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
55 def read(self, count=-1): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
56 '''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
|
57 ret = "" |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
58 if self.offset < self.size: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
59 s = self.fp.read(count) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
60 ret = s |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
61 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
62 if count > 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
63 count -= len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
64 if count != 0: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
65 doff = self.offset - self.size |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
66 self.data.insert(0, "".join(self.data)) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
67 del self.data[1:] |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
68 s = self.data[0][doff:doff+count] |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
69 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
70 ret += s |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
71 return ret |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
72 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
73 def write(self, s): |
5450
c728424d44c6
revlog: fix caching of buffer objects
Matt Mackall <mpm@selenic.com>
parents:
4963
diff
changeset
|
74 self.data.append(str(s)) |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
75 self.offset += len(s) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
76 |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
77 class changelog(revlog): |
4258
b11a2fb59cf5
revlog: simplify revlog version handling
Matt Mackall <mpm@selenic.com>
parents:
4257
diff
changeset
|
78 def __init__(self, opener): |
b11a2fb59cf5
revlog: simplify revlog version handling
Matt Mackall <mpm@selenic.com>
parents:
4257
diff
changeset
|
79 revlog.__init__(self, opener, "00changelog.i") |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
80 |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
81 def delayupdate(self): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
82 "delay visibility of index updates to other readers" |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
83 self._realopener = self.opener |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
84 self.opener = self._delayopener |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
85 self._delaycount = self.count() |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
86 self._delaybuf = [] |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
87 self._delayname = None |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
88 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
89 def finalize(self, tr): |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
90 "finalize index updates" |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
91 self.opener = self._realopener |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
92 # move redirected index data back into place |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
93 if self._delayname: |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
94 util.rename(self._delayname + ".a", self._delayname) |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
95 elif self._delaybuf: |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
96 fp = self.opener(self.indexfile, 'a') |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
97 fp.write("".join(self._delaybuf)) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
98 fp.close() |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
99 del self._delaybuf |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
100 # split when we're done |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
101 self.checkinlinesize(tr) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
102 |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
103 def _delayopener(self, name, mode='r'): |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
104 fp = self._realopener(name, mode) |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
105 # only divert the index |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
106 if not name == self.indexfile: |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
107 return fp |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
108 # if we're doing an initial clone, divert to another file |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
109 if self._delaycount == 0: |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
110 self._delayname = fp.name |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
111 return self._realopener(name + ".a", mode) |
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
112 # otherwise, divert to memory |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
113 return appender(fp, self._delaybuf) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
114 |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
115 def checkinlinesize(self, tr, fp=None): |
4269
73c918c71300
changelog: optimize delayed updates for clone vs pull
Matt Mackall <mpm@selenic.com>
parents:
4261
diff
changeset
|
116 if self.opener == self._delayopener: |
4261
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
117 return |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
118 return revlog.checkinlinesize(self, tr, fp) |
cd7b36b7869c
restructure changelog file appending
Matt Mackall <mpm@selenic.com>
parents:
4258
diff
changeset
|
119 |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
120 def decode_extra(self, text): |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
121 extra = {} |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
122 for l in text.split('\0'): |
5745
234e40e636a8
changelog: inline trivial call for extra data unescaping
Matt Mackall <mpm@selenic.com>
parents:
5744
diff
changeset
|
123 if l: |
5791
d09ccdbf7286
changelog: fix decoding of extra
Matt Mackall <mpm@selenic.com>
parents:
5745
diff
changeset
|
124 k, v = l.decode('string_escape').split(':', 1) |
5745
234e40e636a8
changelog: inline trivial call for extra data unescaping
Matt Mackall <mpm@selenic.com>
parents:
5744
diff
changeset
|
125 extra[k] = v |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
126 return extra |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
127 |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
128 def encode_extra(self, d): |
4847
845e0071b704
Sort changelog extra dict to avoid possible nondeterminism
Brendan Cully <brendan@kublai.com>
parents:
4635
diff
changeset
|
129 # keys must be sorted to produce a deterministic changelog entry |
4848
5e365008360f
python 2.3 does not have sorted
Brendan Cully <brendan@kublai.com>
parents:
4847
diff
changeset
|
130 keys = d.keys() |
5e365008360f
python 2.3 does not have sorted
Brendan Cully <brendan@kublai.com>
parents:
4847
diff
changeset
|
131 keys.sort() |
5e365008360f
python 2.3 does not have sorted
Brendan Cully <brendan@kublai.com>
parents:
4847
diff
changeset
|
132 items = [_string_escape('%s:%s' % (k, d[k])) for k in keys] |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
133 return "\0".join(items) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
134 |
5744
9db7fd77417d
changelog: remove extract function
Matt Mackall <mpm@selenic.com>
parents:
5450
diff
changeset
|
135 def read(self, node): |
3077
ad6aecaf4eed
document changelog format
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2859
diff
changeset
|
136 """ |
ad6aecaf4eed
document changelog format
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2859
diff
changeset
|
137 format used: |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
138 nodeid\n : manifest node in ascii |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
139 user\n : user, no \n or \r allowed |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
140 time tz extra\n : date (time is int or float, timezone is int) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
141 : extra is metadatas, encoded and separated by '\0' |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
142 : older versions ignore it |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
143 files\n\n : files modified by the cset, no \n or \r allowed |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
144 (.*) : comment (free text, ideally utf-8) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
145 |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
146 changelog v0 doesn't use extra |
3077
ad6aecaf4eed
document changelog format
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2859
diff
changeset
|
147 """ |
5744
9db7fd77417d
changelog: remove extract function
Matt Mackall <mpm@selenic.com>
parents:
5450
diff
changeset
|
148 text = self.revision(node) |
37 | 149 if not text: |
4176
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3771
diff
changeset
|
150 return (nullid, "", (0, 0), [], "", {'branch': 'default'}) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
151 last = text.index("\n\n") |
3771
29d91e57d055
Handle transcoding of username and description in changelog
Matt Mackall <mpm@selenic.com>
parents:
3412
diff
changeset
|
152 desc = util.tolocal(text[last + 2:]) |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
153 l = text[:last].split('\n') |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
154 manifest = bin(l[0]) |
3771
29d91e57d055
Handle transcoding of username and description in changelog
Matt Mackall <mpm@selenic.com>
parents:
3412
diff
changeset
|
155 user = util.tolocal(l[1]) |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
156 |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
157 extra_data = l[2].split(' ', 2) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
158 if len(extra_data) != 3: |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
159 time = float(extra_data.pop(0)) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
160 try: |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
161 # various tools did silly things with the time zone field. |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
162 timezone = int(extra_data[0]) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
163 except: |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
164 timezone = 0 |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
165 extra = {} |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
166 else: |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
167 time, timezone, extra = extra_data |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
168 time, timezone = float(time), int(timezone) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
169 extra = self.decode_extra(extra) |
4176
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3771
diff
changeset
|
170 if not extra.get('branch'): |
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3771
diff
changeset
|
171 extra['branch'] = 'default' |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
172 files = l[3:] |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
173 return (manifest, user, (time, timezone), files, desc, extra) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
174 |
203 | 175 def add(self, manifest, list, desc, transaction, p1=None, p2=None, |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
176 user=None, date=None, extra={}): |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
177 |
3771
29d91e57d055
Handle transcoding of username and description in changelog
Matt Mackall <mpm@selenic.com>
parents:
3412
diff
changeset
|
178 user, desc = util.fromlocal(user), util.fromlocal(desc) |
29d91e57d055
Handle transcoding of username and description in changelog
Matt Mackall <mpm@selenic.com>
parents:
3412
diff
changeset
|
179 |
1195
f92af8d53330
Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1095
diff
changeset
|
180 if date: |
2523
4ab59a3acd16
validate the resulting date in parsedate
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
2522
diff
changeset
|
181 parseddate = "%d %d" % util.parsedate(date) |
1195
f92af8d53330
Validate user input of dates when adding a changelog entry.
Bryan O'Sullivan <bos@serpentine.com>
parents:
1095
diff
changeset
|
182 else: |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2142
diff
changeset
|
183 parseddate = "%d %d" % util.makedate() |
4176
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3771
diff
changeset
|
184 if extra and extra.get("branch") in ("default", ""): |
f9bbcebcacea
"default" is the default branch name
Alexis S. L. Carvalho <alexis@cecm.usp.br>
parents:
3771
diff
changeset
|
185 del extra["branch"] |
3233
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
186 if extra: |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
187 extra = self.encode_extra(extra) |
2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
Benoit Boissinot <benoit.boissinot@ens-lyon.org>
parents:
3232
diff
changeset
|
188 parseddate = "%s %s" % (parseddate, extra) |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
189 list.sort() |
2522
85f796baab10
Allow the use of human readable dates (issue 251)
Jose M. Prieto <jmprieto@gmx.net>
parents:
2142
diff
changeset
|
190 l = [hex(manifest), user, parseddate] + list + ["", desc] |
0
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
191 text = "\n".join(l) |
9117c6561b0b
Add back links from file revisions to changeset revisions
mpm@selenic.com
parents:
diff
changeset
|
192 return self.addrevision(text, transaction, self.count(), p1, p2) |