diff --git a/mercurial/changelog.py b/mercurial/changelog.py --- a/mercurial/changelog.py +++ b/mercurial/changelog.py @@ -23,6 +23,19 @@ def _string_escape(text): text = text.replace('\\', '\\\\').replace('\n', '\\n').replace('\r', '\\r') return text.replace('\0', '\\0') +def decodeextra(text): + extra = {} + for l in text.split('\0'): + if l: + k, v = l.decode('string_escape').split(':', 1) + extra[k] = v + return extra + +def encodeextra(d): + # keys must be sorted to produce a deterministic changelog entry + items = [_string_escape('%s:%s' % (k, d[k])) for k in sorted(d)] + return "\0".join(items) + class appender: '''the changelog index must be updated last on disk, so we use this class to delay writes to it''' @@ -145,19 +158,6 @@ class changelog(revlog.revlog): return return revlog.revlog.checkinlinesize(self, tr, fp) - def decode_extra(self, text): - extra = {} - for l in text.split('\0'): - if l: - k, v = l.decode('string_escape').split(':', 1) - extra[k] = v - return extra - - def encode_extra(self, d): - # keys must be sorted to produce a deterministic changelog entry - items = [_string_escape('%s:%s' % (k, d[k])) for k in sorted(d)] - return "\0".join(items) - def read(self, node): """ format used: @@ -192,7 +192,7 @@ class changelog(revlog.revlog): else: time, timezone, extra = extra_data time, timezone = float(time), int(timezone) - extra = self.decode_extra(extra) + extra = decodeextra(extra) if not extra.get('branch'): extra['branch'] = 'default' files = l[3:] @@ -218,7 +218,7 @@ class changelog(revlog.revlog): if extra and extra.get("branch") in ("default", ""): del extra["branch"] if extra: - extra = self.encode_extra(extra) + extra = encodeextra(extra) parseddate = "%s %s" % (parseddate, extra) l = [hex(manifest), user, parseddate] + sorted(files) + ["", desc] text = "\n".join(l)