D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
Closed by commit rHG0171483b082f: sidedatacopies: read rename information from 
sidedata (authored by marmoute).
This revision was automatically updated to reflect the committed changes.
This revision was not accepted when it landed; it landed in state "Needs 
Review".

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6953?vs=17023=17027

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

AFFECTED FILES
  mercurial/changelog.py
  mercurial/context.py
  mercurial/copies.py
  tests/test-copies-unrelated.t
  tests/test-copies.t

CHANGE DETAILS

diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -309,7 +309,6 @@
   x -> z
   $ hg debugpathcopies 0 2
   x -> z (filelog !)
-  x -> z (sidedata !)
 
 Copy file that exists on both sides of the merge, different content
   $ newrepo
@@ -338,12 +337,14 @@
  x
   $ hg debugp1copies -r 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugp2copies -r 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
   $ hg debugpathcopies 1 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugpathcopies 0 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
 
 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies 
from one parent
 of the merge to the merge should include the copy from the other side.
@@ -403,7 +404,7 @@
   $ hg debugpathcopies 2 3
   y -> z
   $ hg debugpathcopies 1 3
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
 
 Create x and y, then rename x to z on one side of merge, and rename y to z and
 modify z on the other side. When storing copies in the changeset, we don't
@@ -448,18 +449,16 @@
   o  0 add x and y
  x y
   $ hg debugpathcopies 1 4
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 4
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 4
   x -> z (filelog !)
-  x -> z (sidedata !)
-  y -> z (compatibility !)
-  y -> z (changeset !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 1 5
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 5
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 5
   x -> z
 
diff --git a/tests/test-copies-unrelated.t b/tests/test-copies-unrelated.t
--- a/tests/test-copies-unrelated.t
+++ b/tests/test-copies-unrelated.t
@@ -179,8 +179,8 @@
   o  0 add x
  x
   $ hg debugpathcopies 0 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x again" (glob)
   merging y and x to y
@@ -347,8 +347,8 @@
   o  0 base
  a
   $ hg debugpathcopies 1 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x" (glob)
   merging y and x to y
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -188,6 +188,8 @@
 
 def usechangesetcentricalgo(repo):
 """Checks if we should use changeset-centric copy algorithms"""
+if repo.filecopiesmode == b'changeset-sidedata':
+return True
 readfrom = repo.ui.config(b'experimental', b'copies.read-from')
 changesetsource = (b'changeset-only', b'compatibility')
 return readfrom in changesetsource
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -533,55 +533,76 @@
 return sorted(modified)
 
 def filesadded(self):
-source = self._repo.ui.config(b'experimental', b'copies.read-from')
 filesadded = self._changeset.filesadded
-if source == b'changeset-only':
-if filesadded is None:
+compute_on_none = True
+if self._repo.filecopiesmode == b'changeset-sidedata':
+compute_on_none = False
+else:
+source = self._repo.ui.config(b'experimental', b'copies.read-from')
+if source == b'changeset-only':
+compute_on_none = False
+elif source != b'compatibility':
+# filelog mode, ignore any changelog content
+filesadded = None
+if filesadded is None:
+if compute_on_none:
+filesadded = scmutil.computechangesetfilesadded(self)
+else:
 filesadded = []
-elif source == b'compatibility':
-if filesadded is None:
-filesadded = scmutil.computechangesetfilesadded(self)
-else:
-filesadded = scmutil.computechangesetfilesadded(self)
 return filesadded
 
 def filesremoved(self):
-source = self._repo.ui.config(b'experimental', b'copies.read-from')
 filesremoved = self._changeset.filesremoved

D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute updated this revision to Diff 17023.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6953?vs=17008=17023

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

AFFECTED FILES
  mercurial/changelog.py
  mercurial/context.py
  mercurial/copies.py
  tests/test-copies-unrelated.t
  tests/test-copies.t

CHANGE DETAILS

diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -309,7 +309,6 @@
   x -> z
   $ hg debugpathcopies 0 2
   x -> z (filelog !)
-  x -> z (sidedata !)
 
 Copy file that exists on both sides of the merge, different content
   $ newrepo
@@ -338,12 +337,14 @@
  x
   $ hg debugp1copies -r 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugp2copies -r 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
   $ hg debugpathcopies 1 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugpathcopies 0 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
 
 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies 
from one parent
 of the merge to the merge should include the copy from the other side.
@@ -403,7 +404,7 @@
   $ hg debugpathcopies 2 3
   y -> z
   $ hg debugpathcopies 1 3
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
 
 Create x and y, then rename x to z on one side of merge, and rename y to z and
 modify z on the other side. When storing copies in the changeset, we don't
@@ -448,18 +449,16 @@
   o  0 add x and y
  x y
   $ hg debugpathcopies 1 4
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 4
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 4
   x -> z (filelog !)
-  x -> z (sidedata !)
-  y -> z (compatibility !)
-  y -> z (changeset !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 1 5
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 5
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 5
   x -> z
 
diff --git a/tests/test-copies-unrelated.t b/tests/test-copies-unrelated.t
--- a/tests/test-copies-unrelated.t
+++ b/tests/test-copies-unrelated.t
@@ -179,8 +179,8 @@
   o  0 add x
  x
   $ hg debugpathcopies 0 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x again" (glob)
   merging y and x to y
@@ -347,8 +347,8 @@
   o  0 base
  a
   $ hg debugpathcopies 1 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x" (glob)
   merging y and x to y
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -188,6 +188,8 @@
 
 def usechangesetcentricalgo(repo):
 """Checks if we should use changeset-centric copy algorithms"""
+if repo.filecopiesmode == b'changeset-sidedata':
+return True
 readfrom = repo.ui.config(b'experimental', b'copies.read-from')
 changesetsource = (b'changeset-only', b'compatibility')
 return readfrom in changesetsource
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -533,55 +533,76 @@
 return sorted(modified)
 
 def filesadded(self):
-source = self._repo.ui.config(b'experimental', b'copies.read-from')
 filesadded = self._changeset.filesadded
-if source == b'changeset-only':
-if filesadded is None:
+compute_on_none = True
+if self._repo.filecopiesmode == b'changeset-sidedata':
+compute_on_none = False
+else:
+source = self._repo.ui.config(b'experimental', b'copies.read-from')
+if source == b'changeset-only':
+compute_on_none = False
+elif source != b'compatibility':
+# filelog mode, ignore any changelog content
+filesadded = None
+if filesadded is None:
+if compute_on_none:
+filesadded = scmutil.computechangesetfilesadded(self)
+else:
 filesadded = []
-elif source == b'compatibility':
-if filesadded is None:
-filesadded = scmutil.computechangesetfilesadded(self)
-else:
-filesadded = scmutil.computechangesetfilesadded(self)
 return filesadded
 
 def filesremoved(self):
-source = self._repo.ui.config(b'experimental', b'copies.read-from')
 filesremoved = self._changeset.filesremoved
-if source == b'changeset-only':
-if filesremoved is None:
+compute_on_none = True
+if self._repo.filecopiesmode == b'changeset-sidedata':
+compute_on_none = False
+

D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> marmoute wrote in changelog.py:369-371
> On this side of the discussion, confusion increases I want `None` value to be 
> preserved (if not relevant now, if will quickly become so). As far as I 
> understand, `decodefileindices` does not do this.

I think we've talked about this long enough now that it's clear that changing 
this behavior is not the purpose of this patch and that it deserves its own 
patch where you can explain what you're changing and why.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute added inline comments.

INLINE COMMENTS

> martinvonz wrote in changelog.py:369-371
> Actually, both `decodefileindices()` and `decodecopies()` seem to properly 
> handle the "empty input" case. So I think you can revert this change. As I 
> suggested earlier, it may be best as a separate patch anyway since it seems 
> unrelated to this patch (although maybe it is required by, if I'm still 
> misunderstanding and it really is a bug). Sorry I didn't notice this earlier.

On this side of the discussion, confusion increases I want `None` value to be 
preserved (if not relevant now, if will quickly become so). As far as I 
understand, `decodefileindices` does not do this.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> marmoute wrote in changelog.py:369-371
> Yes, this is to handle `b''` in  different way from `None`.

Actually, both `decodefileindices()` and `decodecopies()` seem to properly 
handle the "empty input" case. So I think you can revert this change. As I 
suggested earlier, it may be best as a separate patch anyway since it seems 
unrelated to this patch (although maybe it is required by, if I'm still 
misunderstanding and it really is a bug). Sorry I didn't notice this earlier.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute marked an inline comment as done.
marmoute updated this revision to Diff 17008.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6953?vs=16954=17008

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

AFFECTED FILES
  mercurial/changelog.py
  mercurial/context.py
  mercurial/copies.py
  tests/test-copies-unrelated.t
  tests/test-copies.t

CHANGE DETAILS

diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -309,7 +309,6 @@
   x -> z
   $ hg debugpathcopies 0 2
   x -> z (filelog !)
-  x -> z (sidedata !)
 
 Copy file that exists on both sides of the merge, different content
   $ newrepo
@@ -338,12 +337,14 @@
  x
   $ hg debugp1copies -r 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugp2copies -r 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
   $ hg debugpathcopies 1 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugpathcopies 0 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
 
 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies 
from one parent
 of the merge to the merge should include the copy from the other side.
@@ -403,7 +404,7 @@
   $ hg debugpathcopies 2 3
   y -> z
   $ hg debugpathcopies 1 3
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
 
 Create x and y, then rename x to z on one side of merge, and rename y to z and
 modify z on the other side. When storing copies in the changeset, we don't
@@ -448,18 +449,16 @@
   o  0 add x and y
  x y
   $ hg debugpathcopies 1 4
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 4
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 4
   x -> z (filelog !)
-  x -> z (sidedata !)
-  y -> z (compatibility !)
-  y -> z (changeset !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 1 5
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 5
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 5
   x -> z
 
diff --git a/tests/test-copies-unrelated.t b/tests/test-copies-unrelated.t
--- a/tests/test-copies-unrelated.t
+++ b/tests/test-copies-unrelated.t
@@ -179,8 +179,8 @@
   o  0 add x
  x
   $ hg debugpathcopies 0 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x again" (glob)
   merging y and x to y
@@ -347,8 +347,8 @@
   o  0 base
  a
   $ hg debugpathcopies 1 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x" (glob)
   merging y and x to y
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -188,6 +188,8 @@
 
 def usechangesetcentricalgo(repo):
 """Checks if we should use changeset-centric copy algorithms"""
+if repo.filecopiesmode == b'changeset-sidedata':
+return True
 readfrom = repo.ui.config(b'experimental', b'copies.read-from')
 changesetsource = (b'changeset-only', b'compatibility')
 return readfrom in changesetsource
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -533,55 +533,76 @@
 return sorted(modified)
 
 def filesadded(self):
-source = self._repo.ui.config(b'experimental', b'copies.read-from')
 filesadded = self._changeset.filesadded
-if source == b'changeset-only':
-if filesadded is None:
+compute_on_none = True
+if self._repo.filecopiesmode == b'changeset-sidedata':
+compute_on_none = False
+else:
+source = self._repo.ui.config(b'experimental', b'copies.read-from')
+if source == b'changeset-only':
+compute_on_none = False
+elif source != b'compatibility':
+# filelog mode, ignore any changelog content
+filesadded = None
+if filesadded is None:
+if compute_on_none:
+filesadded = scmutil.computechangesetfilesadded(self)
+else:
 filesadded = []
-elif source == b'compatibility':
-if filesadded is None:
-filesadded = scmutil.computechangesetfilesadded(self)
-else:
-filesadded = scmutil.computechangesetfilesadded(self)
 return filesadded
 
 def filesremoved(self):
-source = self._repo.ui.config(b'experimental', b'copies.read-from')
 filesremoved = self._changeset.filesremoved
-if source == b'changeset-only':
-if filesremoved is None:
+compute_on_none = True
+if self._repo.filecopiesmode == b'changeset-sidedata':
+  

D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute added inline comments.
marmoute marked 3 inline comments as done.

INLINE COMMENTS

> martinvonz wrote in changelog.py:369-371
> I think you're saying that you changed it in order to handle `rawindices == 
> b''` correctly. Makes sense.

Yes, this is to handle `b''` in  different way from `None`.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute added inline comments.

INLINE COMMENTS

> martinvonz wrote in context.py:536-550
> Is there a way of writing `self._repo.filecopiesmode != 
> b'changeset-sidedata'` in positive way? Maybe  `self._repo.filecopiesmode is 
> None`? The `source != b'changeset-only'` is because we want any 
> invalid/unexpected config to be treated as "filelog-only".
> 
> I won't insist on changing.

What about something like this: We "duplicate" the intend code, and factor the 
actual "computation" out.

  def filesadded(self):
  filesadded = self._changeset.filesadded
  compute_on_none = True
  if self._repo.filecopiesmode == b'changeset-sidedata':
  compute_on_none = False
  else:
  source = self._repo.ui.config(b'experimental', b'copies.read-from')
  if source == b'changeset-only':
  compute_on_none = False
  elif source != b'compatibility':
  # filelog mode, ignore any changelog content
  filesadded = None
  if filesadded is None:
  if compute_on_none:
  filesadded = scmutil.computechangesetfilesadded(self)
  else:
  filesadded = []
  return filesadded

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> marmoute wrote in changelog.py:369-371
> I am confused, the function should return a list or None. Since rawindides 
> are bytes, they are not eligible for returns.
> I updated the code as follow:
> 
>   --- a/mercurial/changelog.py
>   +++ b/mercurial/changelog.py
>   @@ -366,9 +366,9 @@ class changelogrevision(object):
>rawindices = self._sidedata.get(sidedatamod.SD_FILESADDED)
>else:
>rawindices = self.extra.get(b'filesadded')
>   -if rawindices is not None:
>   -rawindices = decodefileindices(self.files, rawindices)
>   -return rawindices
>   +if rawindices is None:
>   +return None
>   +return decodefileindices(self.files, rawindices)
>
>@property
>def filesremoved(self):

I think you're saying that you changed it in order to handle `rawindices == 
b''` correctly. Makes sense.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute added inline comments.

INLINE COMMENTS

> martinvonz wrote in changelog.py:369-371
> I thought the reason you explicitly did `if rawindices is not None` was in 
> order to not run the next statement if `rawindices` was an empty list. But 
> that should have no effect anyway, so I was clearly wrong about that. So why 
> did you make the `is not None` explicit? Can you just revert it if there was 
> no good reason for it?

I am confused, the function should return a list or None. Since rawindides are 
bytes, they are not eligible for returns.
I updated the code as follow:

  --- a/mercurial/changelog.py
  +++ b/mercurial/changelog.py
  @@ -366,9 +366,9 @@ class changelogrevision(object):
   rawindices = self._sidedata.get(sidedatamod.SD_FILESADDED)
   else:
   rawindices = self.extra.get(b'filesadded')
  -if rawindices is not None:
  -rawindices = decodefileindices(self.files, rawindices)
  -return rawindices
  +if rawindices is None:
  +return None
  +return decodefileindices(self.files, rawindices)
   
   @property
   def filesremoved(self):

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> marmoute wrote in context.py:536-550
> I think I prefer my version for being a bit more explicite (all `if`s are 
> positive) and hence easier to read for people new to this code. However, I 
> don't mind your version if you really want it that way. Just let me know.

Is there a way of writing `self._repo.filecopiesmode != b'changeset-sidedata'` 
in positive way? Maybe  `self._repo.filecopiesmode is None`? The `source != 
b'changeset-only'` is because we want any invalid/unexpected config to be 
treated as "filelog-only".

I won't insist on changing.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute added inline comments.

INLINE COMMENTS

> martinvonz wrote in context.py:536-550
> What do you think about writing this as follows? That reduces some of the `if 
> filesremoved is None: filesremoved = []` duplication.
> 
>   filesadded = self._changeset.filesadded
>   if self._repo.filecopiesmode != b'changeset-sidedata':
>   source = self._repo.ui.config(b'experimental', b'copies.read-from')
>   if source == b'compatibility':
>   if filesadded is None:
>   filesadded = copies.computechangesetfilesadded(self)
>   elif source != b'changeset-only':
>   filesadded = copies.computechangesetfilesadded(self)
>   if filesadded is None:
>   filesadded = []
>   return filesadded
> 
> Analogous changes can be made to `filesremoved()` and `p[12]copies()`.

I think I prefer my version for being a bit more explicite (all `if`s are 
positive) and hence easier to read for people new to this code. However, I 
don't mind your version if you really want it that way. Just let me know.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> marmoute wrote in changelog.py:369-371
> > I see that you've changed this code to return an empty list of files when 
> > the list of indices was itself an empty list.
> 
> I dont' follow this sentence. What do you mean ?

I thought the reason you explicitly did `if rawindices is not None` was in 
order to not run the next statement if `rawindices` was an empty list. But that 
should have no effect anyway, so I was clearly wrong about that. So why did you 
make the `is not None` explicit? Can you just revert it if there was no good 
reason for it?

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread marmoute (Pierre-Yves David)
marmoute added inline comments.

INLINE COMMENTS

> martinvonz wrote in changelog.py:369-371
> Calling the list of filenames `rawindices` is misleading. I see that you've 
> changed this code to return an empty list of files when the list of indices 
> was itself an empty list. That makes sense. Could you extract that to a 
> separate patch ? Does it matter in practice for sidedata? Please explain in 
> the commit message if it does. That patch would also assign the decoded list 
> of indices to a variable called `files` or something like that.

> I see that you've changed this code to return an empty list of files when the 
> list of indices was itself an empty list.

I dont' follow this sentence. What do you mean ?

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> test-copies.t:457-459
> +  y -> z (sidedata !)
>y -> z (compatibility !)
>y -> z (changeset !)

nit: combine these into a `no-filelog` case?

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> context.py:536-550
>  filesadded = self._changeset.filesadded
> -if True:
> +if self._repo.filecopiesmode == b'changeset-sidedata':
> +if filesadded is None:
> +filesadded = []
> +else:
>  source = self._repo.ui.config(b'experimental', 
> b'copies.read-from')
>  if source == b'changeset-only':

What do you think about writing this as follows? That reduces some of the `if 
filesremoved is None: filesremoved = []` duplication.

  filesadded = self._changeset.filesadded
  if self._repo.filecopiesmode != b'changeset-sidedata':
  source = self._repo.ui.config(b'experimental', b'copies.read-from')
  if source == b'compatibility':
  if filesadded is None:
  filesadded = copies.computechangesetfilesadded(self)
  elif source != b'changeset-only':
  filesadded = copies.computechangesetfilesadded(self)
  if filesadded is None:
  filesadded = []
  return filesadded

Analogous changes can be made to `filesremoved()` and `p[12]copies()`.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-09 Thread martinvonz (Martin von Zweigbergk)
martinvonz added inline comments.

INLINE COMMENTS

> changelog.py:369-371
> +if rawindices is not None:
> +rawindices = decodefileindices(self.files, rawindices)
> +return rawindices

Calling the list of filenames `rawindices` is misleading. I see that you've 
changed this code to return an empty list of files when the list of indices was 
itself an empty list. That makes sense. Could you extract that to a separate 
patch ? Does it matter in practice for sidedata? Please explain in the commit 
message if it does. That patch would also assign the decoded list of indices to 
a variable called `files` or something like that.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

To: marmoute, #hg-reviewers
Cc: martinvonz, mercurial-devel
___
Mercurial-devel mailing list
Mercurial-devel@mercurial-scm.org
https://www.mercurial-scm.org/mailman/listinfo/mercurial-devel


D6953: sidedatacopies: read rename information from sidedata

2019-10-07 Thread marmoute (Pierre-Yves David)
marmoute updated this revision to Diff 16954.

REPOSITORY
  rHG Mercurial

CHANGES SINCE LAST UPDATE
  https://phab.mercurial-scm.org/D6953?vs=16785=16954

CHANGES SINCE LAST ACTION
  https://phab.mercurial-scm.org/D6953/new/

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

AFFECTED FILES
  mercurial/changelog.py
  mercurial/context.py
  mercurial/copies.py
  tests/test-copies-unrelated.t
  tests/test-copies.t

CHANGE DETAILS

diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -309,7 +309,6 @@
   x -> z
   $ hg debugpathcopies 0 2
   x -> z (filelog !)
-  x -> z (sidedata !)
 
 Copy file that exists on both sides of the merge, different content
   $ newrepo
@@ -338,12 +337,14 @@
  x
   $ hg debugp1copies -r 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugp2copies -r 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
   $ hg debugpathcopies 1 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugpathcopies 0 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
 
 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies 
from one parent
 of the merge to the merge should include the copy from the other side.
@@ -403,7 +404,7 @@
   $ hg debugpathcopies 2 3
   y -> z
   $ hg debugpathcopies 1 3
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
 
 Create x and y, then rename x to z on one side of merge, and rename y to z and
 modify z on the other side. When storing copies in the changeset, we don't
@@ -448,18 +449,18 @@
   o  0 add x and y
  x y
   $ hg debugpathcopies 1 4
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 4
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 4
   x -> z (filelog !)
-  x -> z (sidedata !)
+  y -> z (sidedata !)
   y -> z (compatibility !)
   y -> z (changeset !)
   $ hg debugpathcopies 1 5
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 5
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 5
   x -> z
 
diff --git a/tests/test-copies-unrelated.t b/tests/test-copies-unrelated.t
--- a/tests/test-copies-unrelated.t
+++ b/tests/test-copies-unrelated.t
@@ -179,8 +179,8 @@
   o  0 add x
  x
   $ hg debugpathcopies 0 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x again" (glob)
   merging y and x to y
@@ -347,8 +347,8 @@
   o  0 base
  a
   $ hg debugpathcopies 1 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x" (glob)
   merging y and x to y
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -187,6 +187,8 @@
 
 def usechangesetcentricalgo(repo):
 """Checks if we should use changeset-centric copy algorithms"""
+if repo.filecopiesmode == b'changeset-sidedata':
+return True
 readfrom = repo.ui.config(b'experimental', b'copies.read-from')
 changesetsource = (b'changeset-only', b'compatibility')
 return readfrom in changesetsource
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -534,7 +534,10 @@
 
 def filesadded(self):
 filesadded = self._changeset.filesadded
-if True:
+if self._repo.filecopiesmode == b'changeset-sidedata':
+if filesadded is None:
+filesadded = []
+else:
 source = self._repo.ui.config(b'experimental', b'copies.read-from')
 if source == b'changeset-only':
 if filesadded is None:
@@ -548,7 +551,10 @@
 
 def filesremoved(self):
 filesremoved = self._changeset.filesremoved
-if True:
+if self._repo.filecopiesmode == b'changeset-sidedata':
+if filesremoved is None:
+filesremoved = []
+else:
 source = self._repo.ui.config(b'experimental', b'copies.read-from')
 if source == b'changeset-only':
 if filesremoved is None:
@@ -564,7 +570,12 @@
 def _copies(self):
 p1copies = self._changeset.p1copies
 p2copies = self._changeset.p2copies
-if True:
+if self._repo.filecopiesmode == b'changeset-sidedata':
+if p1copies is None:
+p1copies = {}
+if p2copies is None:
+p2copies = {}
+else:
 source = self._repo.ui.config(b'experimental', b'copies.read-from')
 # If config says to get copy metadata only from changeset, then
 # return that, defaulting to {} if there was no copy metadata.  In
diff --git a/mercurial/changelog.py b/mercurial/changelog.py
--- a/mercurial/changelog.py
+++ 

D6953: sidedatacopies: read rename information from sidedata

2019-10-03 Thread marmoute (Pierre-Yves David)
marmoute created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  Repository using the new format now use changeset centric algorithm and read 
the
  copies information from the changelog sidedata.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/changelog.py
  mercurial/context.py
  mercurial/copies.py
  tests/test-copies-unrelated.t
  tests/test-copies.t

CHANGE DETAILS

diff --git a/tests/test-copies.t b/tests/test-copies.t
--- a/tests/test-copies.t
+++ b/tests/test-copies.t
@@ -309,7 +309,6 @@
   x -> z
   $ hg debugpathcopies 0 2
   x -> z (filelog !)
-  x -> z (sidedata !)
 
 Copy file that exists on both sides of the merge, different content
   $ newrepo
@@ -338,12 +337,14 @@
  x
   $ hg debugp1copies -r 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugp2copies -r 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
   $ hg debugpathcopies 1 2
   x -> z (changeset !)
+  x -> z (sidedata !)
   $ hg debugpathcopies 0 2
-  x -> z (no-changeset !)
+  x -> z (no-changeset no-sidedata !)
 
 Copy x->y on one side of merge and copy x->z on the other side. Pathcopies 
from one parent
 of the merge to the merge should include the copy from the other side.
@@ -403,7 +404,7 @@
   $ hg debugpathcopies 2 3
   y -> z
   $ hg debugpathcopies 1 3
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
 
 Create x and y, then rename x to z on one side of merge, and rename y to z and
 modify z on the other side. When storing copies in the changeset, we don't
@@ -448,18 +449,18 @@
   o  0 add x and y
  x y
   $ hg debugpathcopies 1 4
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 4
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 4
   x -> z (filelog !)
-  x -> z (sidedata !)
+  y -> z (sidedata !)
   y -> z (compatibility !)
   y -> z (changeset !)
   $ hg debugpathcopies 1 5
-  y -> z (no-filelog no-sidedata !)
+  y -> z (no-filelog !)
   $ hg debugpathcopies 2 5
-  x -> z (no-filelog no-sidedata !)
+  x -> z (no-filelog !)
   $ hg debugpathcopies 0 5
   x -> z
 
diff --git a/tests/test-copies-unrelated.t b/tests/test-copies-unrelated.t
--- a/tests/test-copies-unrelated.t
+++ b/tests/test-copies-unrelated.t
@@ -179,8 +179,8 @@
   o  0 add x
  x
   $ hg debugpathcopies 0 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x again" (glob)
   merging y and x to y
@@ -347,8 +347,8 @@
   o  0 base
  a
   $ hg debugpathcopies 1 5
-  x -> y (no-filelog no-sidedata !)
-#if no-filelog no-sidedata
+  x -> y (no-filelog !)
+#if no-filelog
   $ hg graft -r 2
   grafting 2:* "modify x" (glob)
   merging y and x to y
diff --git a/mercurial/copies.py b/mercurial/copies.py
--- a/mercurial/copies.py
+++ b/mercurial/copies.py
@@ -182,6 +182,8 @@
 
 def usechangesetcentricalgo(repo):
 """Checks if we should use changeset-centric copy algorithms"""
+if repo.filecopiesmode == 'changeset-sidedata':
+return True
 readfrom = repo.ui.config('experimental', 'copies.read-from')
 changesetsource = ('changeset-only', 'compatibility')
 return readfrom in changesetsource
diff --git a/mercurial/context.py b/mercurial/context.py
--- a/mercurial/context.py
+++ b/mercurial/context.py
@@ -456,7 +456,10 @@
 
 def filesadded(self):
 filesadded = self._changeset.filesadded
-if True:
+if self._repo.filecopiesmode == 'changeset-sidedata':
+if filesadded is None:
+filesadded = []
+else:
 source = self._repo.ui.config('experimental', 'copies.read-from')
 if source == 'changeset-only':
 if filesadded is None:
@@ -470,7 +473,10 @@
 
 def filesremoved(self):
 filesremoved = self._changeset.filesremoved
-if True:
+if self._repo.filecopiesmode == 'changeset-sidedata':
+if filesremoved is None:
+filesremoved = []
+else:
 source = self._repo.ui.config('experimental', 'copies.read-from')
 if source == 'changeset-only':
 if filesremoved is None:
@@ -486,7 +492,12 @@
 def _copies(self):
 p1copies = self._changeset.p1copies
 p2copies = self._changeset.p2copies
-if True:
+if self._repo.filecopiesmode == 'changeset-sidedata':
+if p1copies is None:
+p1copies = {}
+if p2copies is None:
+p2copies = {}
+else:
 source = self._repo.ui.config('experimental', 'copies.read-from')
 # If config says to get copy metadata only from changeset, then
 # return that, defaulting to {} if there was no copy metadata.  In
diff --git a/mercurial/changelog.py