marmoute created this revision.
Herald added a reviewer: hg-reviewers.
Herald added a subscriber: mercurial-patches.

REVISION SUMMARY
  They are different kind of requirements, the one which impact the store and 
are
  relevant to the files being streamed and the one which does not. For example
  some requirements are only relevant to the working copy, like sparse, or
  dirstate-v2.
  
  Since they are irrelevant to the content being streamed, they should not
  prevent the receiving side to use streaming clone. So we no longer advertise
  them over the wire.
  
  In addition, the client side can decide to use whichever format it desire for
  the part that does not affect the store itself. So the configuration related 
to
  these format are not used when doing a streaming clone.

REPOSITORY
  rHG Mercurial

BRANCH
  default

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

AFFECTED FILES
  mercurial/bundle2.py
  mercurial/streamclone.py
  mercurial/wireprotov1server.py
  tests/test-clone-stream.t

CHANGE DETAILS

diff --git a/tests/test-clone-stream.t b/tests/test-clone-stream.t
--- a/tests/test-clone-stream.t
+++ b/tests/test-clone-stream.t
@@ -905,3 +905,52 @@
   $ killdaemons.py
 
 #endif
+
+Stream clone regarding non-store format variant
+-----------------------------------------------
+
+  $ cat << EOF >> $HGRCPATH
+  > [storage]
+  > dirstate-v2.slow-path=allow
+  > EOF
+
+
+We can add dirstate-v2 when cloning (or any other non-store format change 
actually)
+
+  $ hg init server-no-dirstate-v2 --config format.exp-rc-dirstate-v2=no
+  $ hg debugbuilddag .+5 -R server-no-dirstate-v2
+  $ hg serve -p $HGPORT -d --pid-file=hg.pid -R server-no-dirstate-v2
+  $ cat hg.pid > $DAEMON_PIDS
+  $ hg debugcapabilities http://localhost:$HGPORT | grep streamreqs
+    streamreqs=generaldelta,revlogv1,sparserevlog (no-rust !)
+    streamreqs=generaldelta,persistent-nodemap,revlogv1,sparserevlog (rust !)
+  $ hg clone --quiet -U --stream --config format.exp-rc-dirstate-v2=yes 
http://localhost:$HGPORT clone-added-d2
+  $ hg debugrequirement -R server-no-dirstate-v2 | grep dirstate-v2
+  [1]
+  $ hg debugformat -R server-no-dirstate-v2 | grep dirstate-v2
+  dirstate-v2:         no
+  $ hg debugrequirement -R clone-added-d2 | grep dirstate-v2
+  dirstate-v2
+  $ hg debugformat -R clone-added-d2 | grep dirstate-v2
+  dirstate-v2:        yes
+  $ killdaemons.py
+
+We can drop it when cloning too.
+
+  $ hg init server-dirstate-v2 --config format.exp-rc-dirstate-v2=yes
+  $ hg debugbuilddag .+5 -R server-dirstate-v2
+  $ hg serve -p $HGPORT -d --pid-file=hg.pid -R server-dirstate-v2
+  $ cat hg.pid > $DAEMON_PIDS
+  $ hg debugcapabilities http://localhost:$HGPORT | grep streamreqs
+    streamreqs=generaldelta,revlogv1,sparserevlog (no-rust !)
+    streamreqs=generaldelta,persistent-nodemap,revlogv1,sparserevlog (rust !)
+  $ hg clone --quiet -U --stream --config format.exp-rc-dirstate-v2=no 
http://localhost:$HGPORT clone-dropped-d2
+  $ hg debugrequirement -R server-dirstate-v2 | grep dirstate-v2
+  dirstate-v2
+  $ hg debugformat -R server-dirstate-v2 | grep dirstate-v2
+  dirstate-v2:        yes
+  $ hg debugrequirement -R clone-dropped-d2 | grep dirstate-v2
+  [1]
+  $ hg debugformat -R clone-dropped-d2 | grep dirstate-v2
+  dirstate-v2:         no
+  $ killdaemons.py
diff --git a/mercurial/wireprotov1server.py b/mercurial/wireprotov1server.py
--- a/mercurial/wireprotov1server.py
+++ b/mercurial/wireprotov1server.py
@@ -301,6 +301,7 @@
         if repo.ui.configbool(b'server', b'preferuncompressed'):
             caps.append(b'stream-preferred')
         requiredformats = repo.requirements & repo.supportedformats
+        requiredformats -= requirementsmod.WORKING_DIR_REQUIREMENTS
         # if our local revlogs are just revlogv1, add 'stream' cap
         if not requiredformats - {requirementsmod.REVLOGV1_REQUIREMENT}:
             caps.append(b'stream')
diff --git a/mercurial/streamclone.py b/mercurial/streamclone.py
--- a/mercurial/streamclone.py
+++ b/mercurial/streamclone.py
@@ -184,13 +184,13 @@
 
     with repo.lock():
         consumev1(repo, fp, filecount, bytecount)
-
-        # new requirements = old non-format requirements +
-        #                    new format-related remote requirements
-        # requirements from the streamed-in repository
-        repo.requirements = requirements | (
-            repo.requirements - repo.supportedformats
-        )
+        # new requirements = old non-(store)-format requirements +
+        #                    new (store) format-related remote requirements
+        kept_requirements = set(repo.requirements)
+        kept_requirements -= repo.supportedformats
+        wc_req = requirementsmod.WORKING_DIR_REQUIREMENTS
+        kept_requirements |= repo.requirements & wc_req
+        repo.requirements = kept_requirements | set(requirements)
         repo.svfs.options = localrepo.resolvestorevfsoptions(
             repo.ui, repo.requirements, repo.features
         )
@@ -334,6 +334,7 @@
         raise ValueError(b'we do not support the compression argument yet')
 
     requirements = repo.requirements & repo.supportedformats
+    requirements -= requirementsmod.WORKING_DIR_REQUIREMENTS
     requires = b','.join(sorted(requirements))
 
     def gen():
@@ -797,12 +798,14 @@
 
     consumev2(repo, fp, filecount, filesize)
 
-    # new requirements = old non-format requirements +
-    #                    new format-related remote requirements
+    # new requirements = old non-(store)-format requirements +
+    #                    new (store) format-related remote requirements
     # requirements from the streamed-in repository
-    repo.requirements = set(requirements) | (
-        repo.requirements - repo.supportedformats
-    )
+    kept_requirements = set(repo.requirements)
+    kept_requirements -= repo.supportedformats
+    wc_req = requirementsmod.WORKING_DIR_REQUIREMENTS
+    kept_requirements |= repo.requirements & wc_req
+    repo.requirements = kept_requirements | set(requirements)
     repo.svfs.options = localrepo.resolvestorevfsoptions(
         repo.ui, repo.requirements, repo.features
     )
diff --git a/mercurial/bundle2.py b/mercurial/bundle2.py
--- a/mercurial/bundle2.py
+++ b/mercurial/bundle2.py
@@ -1804,9 +1804,11 @@
     bundler.newpart(b'cache:rev-branch-cache', data=generate(), 
mandatory=False)
 
 
-def _formatrequirementsspec(requirements):
-    requirements = [req for req in requirements if req != b"shared"]
-    return urlreq.quote(b','.join(sorted(requirements)))
+def _formatrequirementsspec(requs):
+    requs = [
+        req for req in requs if req not in 
requirements.WORKING_DIR_REQUIREMENTS
+    ]
+    return urlreq.quote(b','.join(sorted(requs)))
 
 
 def _formatrequirementsparams(requirements):



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

Reply via email to