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: