D715: repair: preserve phase also when not using generaldelta (issue5678)

martinvonz (Martin von Zweigbergk) phabricator at mercurial-scm.org
Thu Sep 14 18:55:07 UTC 2017


martinvonz created this revision.
Herald added a subscriber: mercurial-devel.
Herald added a reviewer: hg-reviewers.

REVISION SUMMARY
  It seems like we used to pick the oldest possible version of the
  changegroup to use for bundles created by the repair module (used
  e.g. by "hg strip" and for temporary bundles by "hg rebase"). I tried
  to preserve that behavior when I created the changegroup.safeversion()
  method in https://phab.mercurial-scm.org/rHG3b2ac2115464477040b21efd10c7ce69c8ba513f (changegroup: introduce safeversion(),
  2016-01-19).
  
  However, we have recently chagned our minds and decided that these
  commands are only used locally and downgrades are unlikely. That
  decicion allowed us to start adding obsmarker and phase information to
  these bundles. However, as the bug report shows, it means we get
  different behavior e.g. when generaldelta is not enabled (because when
  it was enabled, it forced us to use bundle2).
  
  So, since we now depend on having more information in the bundles,
  let's make sure we instead pick the newest possible changegroup
  version.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  mercurial/changegroup.py
  mercurial/repair.py
  tests/test-rebase-scenario-global.t

CHANGE DETAILS

diff --git a/tests/test-rebase-scenario-global.t b/tests/test-rebase-scenario-global.t
--- a/tests/test-rebase-scenario-global.t
+++ b/tests/test-rebase-scenario-global.t
@@ -399,11 +399,10 @@
   $ hg rebase -s 1 -d 2
   rebasing 1:d2ae7f538514 "b"
   saved backup bundle to $TESTTMP/issue5678/.hg/strip-backup/d2ae7f538514-2953539b-rebase.hg (glob)
-BROKEN: d36c should remain public
   $ hg log -G -T '{node|shortest} {phase} {desc}\n'
   o  c882 draft b
   |
-  @  d36c draft c
+  @  d36c public c
   |
   o  cb9a public a
   
diff --git a/mercurial/repair.py b/mercurial/repair.py
--- a/mercurial/repair.py
+++ b/mercurial/repair.py
@@ -38,7 +38,7 @@
     totalhash = hashlib.sha1(''.join(allhashes)).hexdigest()
     name = "%s/%s-%s-%s.hg" % (backupdir, short(node), totalhash[:8], suffix)
 
-    cgversion = changegroup.safeversion(repo)
+    cgversion = changegroup.localversion(repo)
     comp = None
     if cgversion != '01':
         bundletype = "HG20"
diff --git a/mercurial/changegroup.py b/mercurial/changegroup.py
--- a/mercurial/changegroup.py
+++ b/mercurial/changegroup.py
@@ -872,6 +872,11 @@
         versions.discard('02')
     return versions
 
+def localversion(repo):
+    # Finds the best version to use for bundles that are meant to be used
+    # locally, such as those from strip and shelve, and temporary bundles.
+    return max(supportedoutgoingversions(repo))
+
 def safeversion(repo):
     # Finds the smallest version that it's safe to assume clients of the repo
     # will support. For example, all hg versions that support generaldelta also



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


More information about the Mercurial-devel mailing list