Patchwork D6417: context: get filesadded() and filesremoved() from changeset if configured

login
register
mail settings
Submitter phabricator
Date May 22, 2019, 5:02 p.m.
Message ID <94250b73e1cc8af3032dd3da9fc6d206@localhost.localdomain>
Download mbox | patch
Permalink /patch/40191/
State Not Applicable
Headers show

Comments

phabricator - May 22, 2019, 5:02 p.m.
martinvonz updated this revision to Diff 15232.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6417?vs=15215&id=15232

REVISION DETAIL
  https://phab.mercurial-scm.org/D6417

AFFECTED FILES
  mercurial/changelog.py
  mercurial/context.py

CHANGE DETAILS




To: martinvonz, #hg-reviewers
Cc: mercurial-devel
Yuya Nishihara - May 26, 2019, 11:29 p.m.
I can't really comment on the storage format. I'm not keen on using extras
for this kind of stuff (including copies), but that seems be okay for
experiment.

@indygreg Any comments?

> +def decodefileindices(files, data):
> +    try:
> +        subset = []
> +        for str in data.split('\0'):
> +            i = int(str)

Better to not shadow `str()` function.

> +            if i < 0 or i > len(files):

Off by one?

> +                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.
phabricator - May 26, 2019, 11:31 p.m.
yuja added subscribers: indygreg, yuja.
yuja added a comment.


  I can't really comment on the storage format. I'm not keen on using extras
  for this kind of stuff (including copies), but that seems be okay for
  experiment.
  
  @indygreg Any comments?
  
  > +def decodefileindices(files, data):
  >  +    try:
  >  +        subset = []
  >  +        for str in data.split('\0'):
  >  +            i = int(str)
  
  Better to not shadow `str()` function.
  
  > +            if i < 0 or i > len(files):
  
  Off by one?
  
  > +                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.

REPOSITORY
  rHG Mercurial

REVISION DETAIL
  https://phab.mercurial-scm.org/D6417

To: martinvonz, #hg-reviewers
Cc: yuja, indygreg, mercurial-devel

Patch

diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -469,12 +469,24 @@ 
         modified.difference_update(self.filesremoved())
         return sorted(modified)
     def filesadded(self):
+        source = self._repo.ui.config('experimental', 'copies.read-from')
+        if (source == 'changeset-only' or
+            (source == 'compatibility' and
+             self._changeset.filesadded is not None)):
+            return self._changeset.filesadded or []
+
         added = []
         for f in self.files():
             if not any(f in p for p in self.parents()):
                 added.append(f)
         return added
     def filesremoved(self):
+        source = self._repo.ui.config('experimental', 'copies.read-from')
+        if (source == 'changeset-only' or
+            (source == 'compatibility' and
+             self._changeset.filesremoved is not None)):
+            return self._changeset.filesremoved or []
+
         removed = []
         for f in self.files():
             if f not in self:
diff --git a/mercurial/changelog.py b/mercurial/changelog.py
--- a/mercurial/changelog.py
+++ b/mercurial/changelog.py
@@ -107,6 +107,20 @@ 
             indices.append('%d' % i)
     return '\0'.join(indices)
 
+def decodefileindices(files, data):
+    try:
+        subset = []
+        for str in data.split('\0'):
+            i = int(str)
+            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)