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

login
register
mail settings
Submitter phabricator
Date Oct. 1, 2019, 12:34 p.m.
Message ID <differential-rev-PHID-DREV-6aqcxvguuytysrbd5dtu-req@mercurial-scm.org>
Download mbox | patch
Permalink /patch/41885/
State Superseded
Headers show

Comments

phabricator - Oct. 1, 2019, 12:34 p.m.
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




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

Patch

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()