mercurial/changelog.py
changeset 42407 602469a91550
parent 42406 f385ba70e4af
child 42426 a1f87294471f
--- a/mercurial/changelog.py	Tue May 14 22:19:51 2019 -0700
+++ b/mercurial/changelog.py	Tue May 14 22:20:10 2019 -0700
@@ -107,6 +107,20 @@
             indices.append('%d' % i)
     return '\0'.join(indices)
 
+def decodefileindices(files, data):
+    try:
+        subset = []
+        for strindex in data.split('\0'):
+            i = int(strindex)
+            if i < 0 or i >= len(files):
+                return None
+            subset.append(files[i])
+        return subset
+    except (ValueError, IndexError):
+        # Perhaps someone had chosen the same key name (e.g. "added") and
+        # used different syntax for the value.
+        return None
+
 def stripdesc(desc):
     """strip trailing whitespace and leading and trailing empty lines"""
     return '\n'.join([l.rstrip() for l in desc.splitlines()]).strip('\n')
@@ -202,6 +216,8 @@
     user = attr.ib(default='')
     date = attr.ib(default=(0, 0))
     files = attr.ib(default=attr.Factory(list))
+    filesadded = attr.ib(default=None)
+    filesremoved = attr.ib(default=None)
     p1copies = attr.ib(default=None)
     p2copies = attr.ib(default=None)
     description = attr.ib(default='')
@@ -308,6 +324,16 @@
         return self._text[off[2] + 1:off[3]].split('\n')
 
     @property
+    def filesadded(self):
+        rawindices = self.extra.get('filesadded')
+        return rawindices and decodefileindices(self.files, rawindices)
+
+    @property
+    def filesremoved(self):
+        rawindices = self.extra.get('filesremoved')
+        return rawindices and decodefileindices(self.files, rawindices)
+
+    @property
     def p1copies(self):
         rawcopies = self.extra.get('p1copies')
         return rawcopies and decodecopies(rawcopies)