changeset 51030:177e7d6bf875

revlog: overwrite revlog config through copy of the config object The new objects allow for this kind of blanket approach that make things cleaner. If we have more cases, it would probably deserve a context manager, but since we only have two usage, I don't think it is worth it.
author Pierre-Yves David <pierre-yves.david@octobus.net>
date Tue, 10 Oct 2023 10:02:13 +0200
parents 498afb627f78
children 133f5a54ed9d
files mercurial/revlog.py tests/test-revlog-raw.py
diffstat 2 files changed, 25 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/mercurial/revlog.py	Tue Oct 10 10:02:05 2023 +0200
+++ b/mercurial/revlog.py	Tue Oct 10 10:02:13 2023 +0200
@@ -241,8 +241,13 @@
 hexdigits = b'0123456789abcdefABCDEF'
 
 
+class _Config:
+    def copy(self):
+        return self.__class__(**self.__dict__)
+
+
 @attr.s()
-class FeatureConfig:
+class FeatureConfig(_Config):
     """Hold configuration values about the available revlog features"""
 
     # the default compression engine
@@ -265,9 +270,14 @@
     # can ellipsis commit be used
     enable_ellipsis = attr.ib(default=False)
 
+    def copy(self):
+        new = super().copy()
+        new.compression_engine_options = self.compression_engine_options.copy()
+        return new
+
 
 @attr.s()
-class DataConfig:
+class DataConfig(_Config):
     """Hold configuration value about how the revlog data are read"""
 
     # should we try to open the "pending" version of the revlog
@@ -297,7 +307,7 @@
 
 
 @attr.s()
-class DeltaConfig:
+class DeltaConfig(_Config):
     """Hold configuration value about how new delta are computed
 
     Some attributes are duplicated from DataConfig to help havign each object
@@ -3375,9 +3385,8 @@
 
         # lazydelta and lazydeltabase controls whether to reuse a cached delta,
         # if possible.
-        oldlazydelta = destrevlog._lazydelta
-        oldlazydeltabase = destrevlog._lazydeltabase
-        oldamd = destrevlog._deltabothparents
+        old_delta_config = destrevlog.delta_config
+        destrevlog.delta_config = destrevlog.delta_config.copy()
 
         try:
             if deltareuse == self.DELTAREUSEALWAYS:
@@ -3390,7 +3399,9 @@
                 destrevlog.delta_config.lazy_delta_base = False
                 destrevlog.delta_config.lazy_delta = False
 
-            delta_both_parents = forcedeltabothparents or oldamd
+            delta_both_parents = (
+                forcedeltabothparents or old_delta_config.delta_both_parents
+            )
             destrevlog.delta_config.delta_both_parents = delta_both_parents
 
             with self.reading():
@@ -3404,9 +3415,7 @@
                 )
 
         finally:
-            destrevlog.delta_config.lazy_delta = oldlazydelta
-            destrevlog.delta_config.lazy_delta_base = oldlazydeltabase
-            destrevlog.delta_config.delta_both_parents = oldamd
+            destrevlog.delta_config = old_delta_config
 
     def _clone(
         self,
--- a/tests/test-revlog-raw.py	Tue Oct 10 10:02:05 2023 +0200
+++ b/tests/test-revlog-raw.py	Tue Oct 10 10:02:13 2023 +0200
@@ -371,7 +371,10 @@
 
 
 def slicingtest(rlog):
-    oldmin = rlog._srmingapsize
+    old_delta_config = rlog.delta_config
+    old_data_config = rlog.data_config
+    rlog.delta_config = rlog.delta_config.copy()
+    rlog.data_config = rlog.data_config.copy()
     try:
         # the test revlog is small, we remove the floor under which we
         # slicing is diregarded.
@@ -388,8 +391,8 @@
                 print('  expected: %s' % expected)
                 print('  result:   %s' % result)
     finally:
-        rlog.data_config.sr_min_gap_size = oldmin
-        rlog.delta_config.sr_min_gap_size = oldmin
+        rlog.delta_config = old_delta_config
+        rlog.data_config = old_data_config
 
 
 def md5sum(s):