vfs: give all vfs an options attribute by default
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.
Differential Revision: https://phab.mercurial-scm.org/D6935
--- a/contrib/dumprevlog Fri Sep 27 06:24:42 2019 +0200
+++ b/contrib/dumprevlog Fri Sep 27 05:17:30 2019 +0200
@@ -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()
--- a/mercurial/revlog.py Fri Sep 27 06:24:42 2019 +0200
+++ b/mercurial/revlog.py Fri Sep 27 05:17:30 2019 +0200
@@ -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:
newversionflags = REVLOGV0
else:
newversionflags = REVLOG_DEFAULT_VERSION
--- a/mercurial/statichttprepo.py Fri Sep 27 06:24:42 2019 +0200
+++ b/mercurial/statichttprepo.py Fri Sep 27 05:17:30 2019 +0200
@@ -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'):
--- a/mercurial/vfs.py Fri Sep 27 06:24:42 2019 +0200
+++ b/mercurial/vfs.py Fri Sep 27 05:17:30 2019 +0200
@@ -327,6 +327,7 @@
self.audit = (lambda path, mode=None: True)
self.createmode = None
self._trustnlink = None
+ self.options = {}
@util.propertycache
def _cansymlink(self):
--- a/tests/test-parseindex.t Fri Sep 27 06:24:42 2019 +0200
+++ b/tests/test-parseindex.t Fri Sep 27 05:17:30 2019 +0200
@@ -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'))