demandimport error - mercurial_keyring fails with latest keyring (2.0)
Created originally on Bitbucket by sutupud
After upgrading keyring to version 2.0 mercurial_keyring stopped working.
After adding some traceback, this is what I'm getting:
:::none
$ hg push
Traceback (most recent call last):
File "/home/sutu/.local/lib/python2.7/site-packages/mercurial_keyring.py", line 70, in <module>
import keyring
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 95, in _demandimport
return _import(name, globals, locals, fromlist, level)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/__init__.py", line 9, in <module>
from core import (set_keyring, get_keyring, set_password, get_password,
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 114, in _demandimport
mod = _origimport(name, globals, locals)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/core.py", line 13, in <module>
from keyring import backend
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 95, in _demandimport
return _import(name, globals, locals, fromlist, level)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backend.py", line 130, in <module>
from keyring.backends.Windows import EncryptedKeyring as Win32CryptoKeyring
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 114, in _demandimport
mod = _origimport(name, globals, locals)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backends/Windows.py", line 26, in <module>
from . import _win_crypto
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 112, in _demandimport
return _origimport(name, globals, locals, fromlist, level)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backends/_win_crypto.py", line 15, in <module>
class DATA_BLOB(Structure):
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backends/_win_crypto.py", line 16, in DATA_BLOB
_fields_ = [('cbData', wintypes.DWORD),
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 86, in __getattribute__
self._load()
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 58, in _load
mod = _origimport(head, globals, locals)
File "/usr/lib/python2.7/ctypes/wintypes.py", line 23, in <module>
class VARIANT_BOOL(_SimpleCData):
ValueError: _type_ 'v' not supported
*** failed to import extension mercurial_keyring: _type_ 'v' not supported
Adding ctypes
to the list of blocked modules for demandimport fixes the problem.
update:
Seems the problem is a little more serious then I thought previously, I missed it because I was setting my keyring in keyringrc.conf.
When disabling that, there are more errors:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/mercurial/extensions.py", line 88, in loadall
load(ui, name, path)
File "/usr/lib/python2.7/dist-packages/mercurial/extensions.py", line 75, in load
mod = importh(name)
File "/usr/lib/python2.7/dist-packages/mercurial/extensions.py", line 65, in importh
mod = __import__(name)
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 95, in _demandimport
return _import(name, globals, locals, fromlist, level)
File "/home/sutu/.local/lib/python2.7/site-packages/mercurial_keyring.py", line 71, in <module>
import keyring
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 95, in _demandimport
return _import(name, globals, locals, fromlist, level)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/__init__.py", line 9, in <module>
from core import (set_keyring, get_keyring, set_password, get_password,
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 114, in _demandimport
mod = _origimport(name, globals, locals)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/core.py", line 166, in <module>
init_backend()
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/core.py", line 63, in init_backend
keyrings = backend.get_all_keyring()
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/util/__init__.py", line 24, in wrapper
func.always_returns = func(*args, **kwargs)
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backend.py", line 119, in get_all_keyring
exceptions=TypeError))
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/util/__init__.py", line 35, in suppress_exceptions
for callable in callables:
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backend.py", line 111, in is_class_viable
keyring_cls.priority
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/util/properties.py", line 20, in __get__
return self.fget.__get__(None, owner)()
File "/home/sutu/.local/lib/python2.7/site-packages/keyring-2.0-py2.7.egg/keyring/backends/SecretService.py", line 26, in priority
except secretstorage.exceptions.SecretServiceNotAvailableException:
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 86, in __getattribute__
self._load()
File "/usr/lib/python2.7/dist-packages/mercurial/demandimport.py", line 58, in _load
mod = _origimport(head, globals, locals)
ImportError: No module named secretstorage
Unfortunately I adding secretstorage
to the block list doesn't help. The only way to fix this I could find is to disable demandimport when importing keyring:
from mercurial import demandimport
if __import__ == demandimport._import:
demandimport.disable()
try:
import keyring
finally:
demandimport.enable()
else:
import keyring