# HG changeset patch # User Jerome M. BERGER # Date 1321959265 -3600 # Node ID 95d040755254c2eca7d074191abcacf679315822 # Parent df2c854780632d2cb17a82aa557667df8af60dc5 Added ability to configure the password stores diff --git a/hgsubversion/help/subversion.rst b/hgsubversion/help/subversion.rst --- a/hgsubversion/help/subversion.rst +++ b/hgsubversion/help/subversion.rst @@ -306,6 +306,17 @@ settings: Set the username or password for accessing Subversion repositories. + ``hgsubversion.password_stores`` + + List of methods to use for storing passwords (similar to the option of the + same name in the subversion configuration files). Default is + ``gnome_keyring,keychain,kwallet,windows``. Password stores can be disabled + completely by setting this to an empty value. + + .. NOTE:: + + Password stores are only supported with the SWIG bindings. + ``hgsubversion.stupid`` Setting this boolean option to true will force using a slower method for pulling revisions from Subversion. This method is compatible with servers diff --git a/hgsubversion/svnrepo.py b/hgsubversion/svnrepo.py --- a/hgsubversion/svnrepo.py +++ b/hgsubversion/svnrepo.py @@ -21,6 +21,7 @@ from mercurial import util as hgutil from mercurial import httprepo import mercurial.repo +import re import util import wrappers import svnwrap @@ -107,6 +108,14 @@ class svnremoterepo(mercurial.repo.repos raise hgutil.Abort('no Subversion URL specified') self.path = path self.capabilities = set(['lookup', 'subversion']) + pws = self.ui.config('hgsubversion', 'password_stores', None) + if pws is not None: + # Split pws at comas and strip neighbouring whitespace (whitespace + # at the beginning and end of pws has already been removed by the + # config parser). + self.password_stores = re.split(r'\s*,\s*', pws) + else: + self.password_stores = None @propertycache def svnauth(self): @@ -127,7 +136,7 @@ class svnremoterepo(mercurial.repo.repos @propertycache def svn(self): try: - return svnwrap.SubversionRepo(*self.svnauth) + return svnwrap.SubversionRepo(*self.svnauth, password_stores=self.password_stores) except svnwrap.SubversionConnectionException, e: self.ui.traceback() raise hgutil.Abort(e) diff --git a/hgsubversion/svnwrap/subvertpy_wrapper.py b/hgsubversion/svnwrap/subvertpy_wrapper.py --- a/hgsubversion/svnwrap/subvertpy_wrapper.py +++ b/hgsubversion/svnwrap/subvertpy_wrapper.py @@ -165,8 +165,11 @@ class SubversionRepo(object): This wrapper uses Subvertpy, an alternate set of bindings for Subversion that's more pythonic and sucks less. See earlier in this file for version requirements. + + Note that password stores do not work, the parameter is only here + to ensure that the API is the same as for the SWIG wrapper. """ - def __init__(self, url='', username='', password='', head=None): + def __init__(self, url='', username='', password='', head=None, password_stores=None): parsed = common.parse_url(url, username, password) # --username and --password override URL credentials self.username = parsed[0] diff --git a/hgsubversion/svnwrap/svn_swig_wrapper.py b/hgsubversion/svnwrap/svn_swig_wrapper.py --- a/hgsubversion/svnwrap/svn_swig_wrapper.py +++ b/hgsubversion/svnwrap/svn_swig_wrapper.py @@ -103,7 +103,7 @@ def user_pass_prompt(realm, default_user creds.password = getpass.getpass('Password for %s: ' % creds.username) return creds -def _create_auth_baton(pool): +def _create_auth_baton(pool, password_stores): """Create a Subversion authentication baton. """ # Give the client context baton a suite of authentication # providers.h @@ -124,7 +124,9 @@ def _create_auth_baton(pool): None) if getprovider: # Available in svn >= 1.6 - for name in ('gnome_keyring', 'keychain', 'kwallet', 'windows'): + if password_stores is None: + password_stores = ('gnome_keyring', 'keychain', 'kwallet', 'windows') + for name in password_stores: for type in ('simple', 'ssl_client_cert_pw', 'ssl_server_trust'): p = getprovider(name, type, pool) if p: @@ -158,14 +160,14 @@ class SubversionRepo(object): It uses the SWIG Python bindings, see above for requirements. """ - def __init__(self, url='', username='', password='', head=None): + def __init__(self, url='', username='', password='', head=None, password_stores=None): parsed = common.parse_url(url, username, password) # --username and --password override URL credentials self.username = parsed[0] self.password = parsed[1] self.svn_url = parsed[2] self.auth_baton_pool = core.Pool() - self.auth_baton = _create_auth_baton(self.auth_baton_pool) + self.auth_baton = _create_auth_baton(self.auth_baton_pool, password_stores) # self.init_ra_and_client() assumes that a pool already exists self.pool = core.Pool()