Mercurial > hg
comparison mercurial/changelog.py @ 3233:2f35961854fb
[extendedchangelog] add extra metadata in the changelog entry
- add a third item in the date field that holds arbitrary
key:value items
author | Benoit Boissinot <benoit.boissinot@ens-lyon.org> |
---|---|
date | Mon, 02 Oct 2006 22:35:52 +0200 |
parents | 394ac87f3b74 |
children | f2de6b6bc57a |
comparison
equal
deleted
inserted
replaced
3232:394ac87f3b74 | 3233:2f35961854fb |
---|---|
30 class changelog(revlog): | 30 class changelog(revlog): |
31 def __init__(self, opener, defversion=REVLOGV0): | 31 def __init__(self, opener, defversion=REVLOGV0): |
32 revlog.__init__(self, opener, "00changelog.i", "00changelog.d", | 32 revlog.__init__(self, opener, "00changelog.i", "00changelog.d", |
33 defversion) | 33 defversion) |
34 | 34 |
35 def decode_extra(self, text): | |
36 extra = {} | |
37 for l in text.split('\0'): | |
38 if not l: | |
39 continue | |
40 k, v = _string_unescape(l).split(':', 1) | |
41 extra[k] = v | |
42 return extra | |
43 | |
44 def encode_extra(self, d): | |
45 items = [_string_escape(":".join(t)) for t in d.iteritems()] | |
46 return "\0".join(items) | |
47 | |
35 def extract(self, text): | 48 def extract(self, text): |
36 """ | 49 """ |
37 format used: | 50 format used: |
38 nodeid\n : manifest node in ascii | 51 nodeid\n : manifest node in ascii |
39 user\n : user, no \n or \r allowed | 52 user\n : user, no \n or \r allowed |
40 time tz\n : date (time is int or float, timezone is int) | 53 time tz extra\n : date (time is int or float, timezone is int) |
41 files\n\n : files modified by the cset, no \n or \r allowed | 54 : extra is metadatas, encoded and separated by '\0' |
42 (.*) : comment (free text, ideally utf-8) | 55 : older versions ignore it |
56 files\n\n : files modified by the cset, no \n or \r allowed | |
57 (.*) : comment (free text, ideally utf-8) | |
58 | |
59 changelog v0 doesn't use extra | |
43 """ | 60 """ |
44 if not text: | 61 if not text: |
45 return (nullid, "", (0, 0), [], "") | 62 return (nullid, "", (0, 0), [], "") |
46 last = text.index("\n\n") | 63 last = text.index("\n\n") |
47 desc = text[last + 2:] | 64 desc = text[last + 2:] |
48 l = text[:last].splitlines() | 65 l = text[:last].split('\n') |
49 manifest = bin(l[0]) | 66 manifest = bin(l[0]) |
50 user = l[1] | 67 user = l[1] |
51 date = l[2].split(' ') | 68 |
52 time = float(date.pop(0)) | 69 extra_data = l[2].split(' ', 2) |
53 try: | 70 if len(extra_data) != 3: |
54 # various tools did silly things with the time zone field. | 71 time = float(extra_data.pop(0)) |
55 timezone = int(date[0]) | 72 try: |
56 except: | 73 # various tools did silly things with the time zone field. |
57 timezone = 0 | 74 timezone = int(extra_data[0]) |
75 except: | |
76 timezone = 0 | |
77 extra = {} | |
78 else: | |
79 time, timezone, extra = extra_data | |
80 time, timezone = float(time), int(timezone) | |
81 extra = self.decode_extra(extra) | |
58 files = l[3:] | 82 files = l[3:] |
59 return (manifest, user, (time, timezone), files, desc) | 83 return (manifest, user, (time, timezone), files, desc, extra) |
60 | 84 |
61 def read(self, node): | 85 def read(self, node): |
62 return self.extract(self.revision(node)) | 86 return self.extract(self.revision(node)) |
63 | 87 |
64 def add(self, manifest, list, desc, transaction, p1=None, p2=None, | 88 def add(self, manifest, list, desc, transaction, p1=None, p2=None, |
65 user=None, date=None): | 89 user=None, date=None, extra={}): |
90 | |
66 if date: | 91 if date: |
67 parseddate = "%d %d" % util.parsedate(date) | 92 parseddate = "%d %d" % util.parsedate(date) |
68 else: | 93 else: |
69 parseddate = "%d %d" % util.makedate() | 94 parseddate = "%d %d" % util.makedate() |
95 if extra: | |
96 extra = self.encode_extra(extra) | |
97 parseddate = "%s %s" % (parseddate, extra) | |
70 list.sort() | 98 list.sort() |
71 l = [hex(manifest), user, parseddate] + list + ["", desc] | 99 l = [hex(manifest), user, parseddate] + list + ["", desc] |
72 text = "\n".join(l) | 100 text = "\n".join(l) |
73 return self.addrevision(text, transaction, self.count(), p1, p2) | 101 return self.addrevision(text, transaction, self.count(), p1, p2) |