Mercurial > public > mercurial-scm > hg
diff mercurial/changelog.py @ 42426:a1f87294471f
copies: also encode p[12]copies destination as index into "files" list
This is mostly for consistency with the filesaddes/filesremoved
fields, but it should also save a bit of space.
Differential Revision: https://phab.mercurial-scm.org/D6431
author | Martin von Zweigbergk <martinvonz@google.com> |
---|---|
date | Wed, 22 May 2019 09:54:00 -0700 |
parents | 602469a91550 |
children | 027f1567f97f |
line wrap: on
line diff
--- a/mercurial/changelog.py Wed Jun 05 11:23:25 2019 +0200 +++ b/mercurial/changelog.py Wed May 22 09:54:00 2019 -0700 @@ -80,21 +80,25 @@ ] return "\0".join(items) -def encodecopies(copies): - items = [ - '%s\0%s' % (k, copies[k]) - for k in sorted(copies) - ] +def encodecopies(files, copies): + items = [] + for i, dst in enumerate(files): + if dst in copies: + items.append('%d\0%s' % (i, copies[dst])) + if len(items) != len(copies): + raise error.ProgrammingError('some copy targets missing from file list') return "\n".join(items) -def decodecopies(data): +def decodecopies(files, data): try: copies = {} for l in data.split('\n'): - k, v = l.split('\0') - copies[k] = v + strindex, src = l.split('\0') + i = int(strindex) + dst = files[i] + copies[dst] = src return copies - except ValueError: + except (ValueError, IndexError): # Perhaps someone had chosen the same key name (e.g. "p1copies") and # used different syntax for the value. return None @@ -336,12 +340,12 @@ @property def p1copies(self): rawcopies = self.extra.get('p1copies') - return rawcopies and decodecopies(rawcopies) + return rawcopies and decodecopies(self.files, rawcopies) @property def p2copies(self): rawcopies = self.extra.get('p2copies') - return rawcopies and decodecopies(rawcopies) + return rawcopies and decodecopies(self.files, rawcopies) @property def description(self): @@ -631,11 +635,11 @@ extrasentries = p1copies, p2copies, filesadded, filesremoved if extra is None and any(x is not None for x in extrasentries): extra = {} + sortedfiles = sorted(files) if p1copies is not None: - extra['p1copies'] = encodecopies(p1copies) + extra['p1copies'] = encodecopies(sortedfiles, p1copies) if p2copies is not None: - extra['p2copies'] = encodecopies(p2copies) - sortedfiles = sorted(files) + extra['p2copies'] = encodecopies(sortedfiles, p2copies) if filesadded is not None: extra['filesadded'] = encodefileindices(sortedfiles, filesadded) if filesremoved is not None: