changeset 40432:968dd7e02ac5

changegroup: allow to force delta to be against p1 This new developer option is useful to general more "generic" bundle. Without this option, a bundle generated from the repository use deltas similar to the one stored in the specific repository it was generated from. This makes performance testing a bit tricky. Using deltas similar to the final result means all delta stored in the bundle can be applied to the target repository without any further processing (except for the rare case of a full snapshot). The application of such bundles (almost) never exercises the (slower) path of searching for a new valid delta. This result in unrealistic and too favorable timing and profile. Instead, we introduce an option to make sure all revisions are stored as a delta against p1. It might not be the best generation option, but it guarantees that the content will be "generic", not favoring a specific target.
author Boris Feld <boris.feld@octobus.net>
date Wed, 10 Oct 2018 00:21:02 +0200
parents 6a917075535a
children 808b762679cd
files mercurial/changegroup.py mercurial/configitems.py mercurial/repository.py mercurial/utils/storageutil.py tests/test-bundle.t
diffstat 5 files changed, 19 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/changegroup.py	Tue Oct 09 23:26:35 2018 +0200
+++ b/mercurial/changegroup.py	Wed Oct 10 00:21:02 2018 +0200
@@ -697,9 +697,16 @@
         progress = repo.ui.makeprogress(topic, unit=_('chunks'),
                                         total=len(nodes))
 
+    configtarget = repo.ui.config('devel', 'bundle.delta')
+    if configtarget not in ('', 'p1'):
+        msg = _("""config "devel.bundle.delta" as unknown value: %s""")
+        repo.ui.warn(msg % configtarget)
+
     deltamode = repository.CG_DELTAMODE_STD
     if forcedeltaparentprev:
         deltamode = repository.CG_DELTAMODE_PREV
+    elif configtarget == 'p1':
+        deltamode = repository.CG_DELTAMODE_P1
 
     revisions = store.emitrevisions(
         nodes,
--- a/mercurial/configitems.py	Tue Oct 09 23:26:35 2018 +0200
+++ b/mercurial/configitems.py	Wed Oct 10 00:21:02 2018 +0200
@@ -329,6 +329,9 @@
 coreconfigitem('devel', 'bundle2.debug',
     default=False,
 )
+coreconfigitem('devel', 'bundle.delta',
+    default='',
+)
 coreconfigitem('devel', 'cache-vfs',
     default=None,
 )
--- a/mercurial/repository.py	Tue Oct 09 23:26:35 2018 +0200
+++ b/mercurial/repository.py	Wed Oct 10 00:21:02 2018 +0200
@@ -42,6 +42,7 @@
 CG_DELTAMODE_STD = b'default'
 CG_DELTAMODE_PREV = b'previous'
 CG_DELTAMODE_FULL = b'fulltext'
+CG_DELTAMODE_P1 = b'p1'
 
 class ipeerconnection(interfaceutil.Interface):
     """Represents a "connection" to a repository.
--- a/mercurial/utils/storageutil.py	Tue Oct 09 23:26:35 2018 +0200
+++ b/mercurial/utils/storageutil.py	Wed Oct 10 00:21:02 2018 +0200
@@ -373,6 +373,9 @@
         # We're instructed to send fulltext. Honor that.
         elif deltamode == repository.CG_DELTAMODE_FULL:
             baserev = nullrev
+        # We're instructed to use p1. Honor that
+        elif deltamode == repository.CG_DELTAMODE_P1:
+            baserev = p1rev
 
         # There is a delta in storage. We try to use that because it
         # amounts to effectively copying data from storage and is
--- a/tests/test-bundle.t	Tue Oct 09 23:26:35 2018 +0200
+++ b/tests/test-bundle.t	Wed Oct 10 00:21:02 2018 +0200
@@ -900,3 +900,8 @@
   $ hg update -R ../update2bundled.hg -r 0
   0 files updated, 0 files merged, 2 files removed, 0 files unresolved
 #endif
+
+Test the option that create slim bundle
+
+  $ hg bundle -a --config devel.bundle.delta=p1 ./slim.hg
+  3 changesets found