D6935: vfs: give all vfs an options attribute by default

marmoute (Pierre-Yves David) phabricator at mercurial-scm.org
Tue Oct 1 08:34:19 EDT 2019


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

REVISION SUMMARY
  Multiple code path assume vfs have an options attribute, including the vfs module
  itself. So for consistency we explicitly add one to all vfs.
  
  This will prevent various crash in the next changesets.

REPOSITORY
  rHG Mercurial

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

AFFECTED FILES
  contrib/dumprevlog
  mercurial/revlog.py
  mercurial/statichttprepo.py
  mercurial/vfs.py
  tests/test-parseindex.t

CHANGE DETAILS

diff --git a/tests/test-parseindex.t b/tests/test-parseindex.t
--- a/tests/test-parseindex.t
+++ b/tests/test-parseindex.t
@@ -53,6 +53,7 @@
   >     def wrapper(*a, **kwargs):
   >         f = o(*a, **kwargs)
   >         return singlebyteread(f)
+  >     wrapper.options = o.options
   >     return wrapper
   > 
   > cl = changelog.changelog(opener(b'.hg/store'))
diff --git a/mercurial/vfs.py b/mercurial/vfs.py
--- a/mercurial/vfs.py
+++ b/mercurial/vfs.py
@@ -327,6 +327,7 @@
             self.audit = (lambda path, mode=None: True)
         self.createmode = None
         self._trustnlink = None
+        self.options = {}
 
     @util.propertycache
     def _cansymlink(self):
diff --git a/mercurial/statichttprepo.py b/mercurial/statichttprepo.py
--- a/mercurial/statichttprepo.py
+++ b/mercurial/statichttprepo.py
@@ -115,6 +115,7 @@
     class statichttpvfs(vfsmod.abstractvfs):
         def __init__(self, base):
             self.base = base
+            self.options = {}
 
         def __call__(self, path, mode='r', *args, **kw):
             if mode not in ('r', 'rb'):
diff --git a/mercurial/revlog.py b/mercurial/revlog.py
--- a/mercurial/revlog.py
+++ b/mercurial/revlog.py
@@ -355,7 +355,7 @@
 
     def _loadindex(self):
         mmapindexthreshold = None
-        opts = getattr(self.opener, 'options', {}) or {}
+        opts = self.opener.options
 
         if 'revlogv2' in opts:
             newversionflags = REVLOGV2 | FLAG_INLINE_DATA
@@ -363,7 +363,7 @@
             newversionflags = REVLOGV1 | FLAG_INLINE_DATA
             if 'generaldelta' in opts:
                 newversionflags |= FLAG_GENERALDELTA
-        elif 'revlogv0' in getattr(self.opener, 'options', {}):
+        elif 'revlogv0' in self.opener.options:
             # If options provided but no 'revlog*' found, the repository
             # would have no 'requires' file in it, which means we have to
             # stick to the old format.
diff --git a/contrib/dumprevlog b/contrib/dumprevlog
--- a/contrib/dumprevlog
+++ b/contrib/dumprevlog
@@ -22,6 +22,7 @@
     if b'b' not in mode:
         mode = mode + b'b'
     return open(path, pycompat.sysstr(mode))
+binopen.options = {}
 
 def printb(data, end=b'\n'):
     sys.stdout.flush()



To: marmoute, martinvonz, durin42, indygreg, #hg-reviewers
Cc: mercurial-devel


More information about the Mercurial-devel mailing list