##// END OF EJS Templates
convert/svn: support more OS specific auth providers via svn 1.6 API
Patrick Mezard -
r8120:2b36ed5c default
parent child Browse files
Show More
@@ -1,118 +1,128 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2007 Daniel Holth <dholth@fastmail.fm>
3 # Copyright (C) 2007 Daniel Holth <dholth@fastmail.fm>
4 # This is a stripped-down version of the original bzr-svn transport.py,
4 # This is a stripped-down version of the original bzr-svn transport.py,
5 # Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
5 # Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
6
6
7 # This program is free software; you can redistribute it and/or modify
7 # This program is free software; you can redistribute it and/or modify
8 # it under the terms of the GNU General Public License as published by
8 # it under the terms of the GNU General Public License as published by
9 # the Free Software Foundation; either version 2 of the License, or
9 # the Free Software Foundation; either version 2 of the License, or
10 # (at your option) any later version.
10 # (at your option) any later version.
11
11
12 # This program is distributed in the hope that it will be useful,
12 # This program is distributed in the hope that it will be useful,
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 # GNU General Public License for more details.
15 # GNU General Public License for more details.
16
16
17 # You should have received a copy of the GNU General Public License
17 # You should have received a copy of the GNU General Public License
18 # along with this program; if not, write to the Free Software
18 # along with this program; if not, write to the Free Software
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20
20
21 from svn.core import SubversionException, Pool
21 from svn.core import SubversionException, Pool
22 import svn.ra
22 import svn.ra
23 import svn.client
23 import svn.client
24 import svn.core
24 import svn.core
25
25
26 # Some older versions of the Python bindings need to be
26 # Some older versions of the Python bindings need to be
27 # explicitly initialized. But what we want to do probably
27 # explicitly initialized. But what we want to do probably
28 # won't work worth a darn against those libraries anyway!
28 # won't work worth a darn against those libraries anyway!
29 svn.ra.initialize()
29 svn.ra.initialize()
30
30
31 svn_config = svn.core.svn_config_get_config(None)
31 svn_config = svn.core.svn_config_get_config(None)
32
32
33
33
34 def _create_auth_baton(pool):
34 def _create_auth_baton(pool):
35 """Create a Subversion authentication baton. """
35 """Create a Subversion authentication baton. """
36 import svn.client
36 import svn.client
37 # Give the client context baton a suite of authentication
37 # Give the client context baton a suite of authentication
38 # providers.h
38 # providers.h
39 providers = [
39 providers = [
40 svn.client.get_simple_provider(pool),
40 svn.client.get_simple_provider(pool),
41 svn.client.get_username_provider(pool),
41 svn.client.get_username_provider(pool),
42 svn.client.get_ssl_client_cert_file_provider(pool),
42 svn.client.get_ssl_client_cert_file_provider(pool),
43 svn.client.get_ssl_client_cert_pw_file_provider(pool),
43 svn.client.get_ssl_client_cert_pw_file_provider(pool),
44 svn.client.get_ssl_server_trust_file_provider(pool),
44 svn.client.get_ssl_server_trust_file_provider(pool),
45 ]
45 ]
46 # Platform-dependant authentication methods
46 # Platform-dependant authentication methods
47 if hasattr(svn.client, 'get_windows_simple_provider'):
47 getprovider = getattr(svn.core, 'svn_auth_get_platform_specific_provider',
48 providers.append(svn.client.get_windows_simple_provider(pool))
48 None)
49 if getprovider:
50 # Available in svn >= 1.6
51 for name in ('gnome_keyring', 'keychain', 'kwallet', 'windows'):
52 for type in ('simple', 'ssl_client_cert_pw', 'ssl_server_trust'):
53 p = getprovider(name, type, pool)
54 if p:
55 providers.append(p)
56 else:
57 if hasattr(svn.client, 'get_windows_simple_provider'):
58 providers.append(svn.client.get_windows_simple_provider(pool))
49
59
50 return svn.core.svn_auth_open(providers, pool)
60 return svn.core.svn_auth_open(providers, pool)
51
61
52 class NotBranchError(SubversionException):
62 class NotBranchError(SubversionException):
53 pass
63 pass
54
64
55 class SvnRaTransport(object):
65 class SvnRaTransport(object):
56 """
66 """
57 Open an ra connection to a Subversion repository.
67 Open an ra connection to a Subversion repository.
58 """
68 """
59 def __init__(self, url="", ra=None):
69 def __init__(self, url="", ra=None):
60 self.pool = Pool()
70 self.pool = Pool()
61 self.svn_url = url
71 self.svn_url = url
62 self.username = ''
72 self.username = ''
63 self.password = ''
73 self.password = ''
64
74
65 # Only Subversion 1.4 has reparent()
75 # Only Subversion 1.4 has reparent()
66 if ra is None or not hasattr(svn.ra, 'reparent'):
76 if ra is None or not hasattr(svn.ra, 'reparent'):
67 self.client = svn.client.create_context(self.pool)
77 self.client = svn.client.create_context(self.pool)
68 ab = _create_auth_baton(self.pool)
78 ab = _create_auth_baton(self.pool)
69 if False:
79 if False:
70 svn.core.svn_auth_set_parameter(
80 svn.core.svn_auth_set_parameter(
71 ab, svn.core.SVN_AUTH_PARAM_DEFAULT_USERNAME, self.username)
81 ab, svn.core.SVN_AUTH_PARAM_DEFAULT_USERNAME, self.username)
72 svn.core.svn_auth_set_parameter(
82 svn.core.svn_auth_set_parameter(
73 ab, svn.core.SVN_AUTH_PARAM_DEFAULT_PASSWORD, self.password)
83 ab, svn.core.SVN_AUTH_PARAM_DEFAULT_PASSWORD, self.password)
74 self.client.auth_baton = ab
84 self.client.auth_baton = ab
75 self.client.config = svn_config
85 self.client.config = svn_config
76 try:
86 try:
77 self.ra = svn.client.open_ra_session(
87 self.ra = svn.client.open_ra_session(
78 self.svn_url.encode('utf8'),
88 self.svn_url.encode('utf8'),
79 self.client, self.pool)
89 self.client, self.pool)
80 except SubversionException, (inst, num):
90 except SubversionException, (inst, num):
81 if num in (svn.core.SVN_ERR_RA_ILLEGAL_URL,
91 if num in (svn.core.SVN_ERR_RA_ILLEGAL_URL,
82 svn.core.SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED,
92 svn.core.SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED,
83 svn.core.SVN_ERR_BAD_URL):
93 svn.core.SVN_ERR_BAD_URL):
84 raise NotBranchError(url)
94 raise NotBranchError(url)
85 raise
95 raise
86 else:
96 else:
87 self.ra = ra
97 self.ra = ra
88 svn.ra.reparent(self.ra, self.svn_url.encode('utf8'))
98 svn.ra.reparent(self.ra, self.svn_url.encode('utf8'))
89
99
90 class Reporter:
100 class Reporter:
91 def __init__(self, (reporter, report_baton)):
101 def __init__(self, (reporter, report_baton)):
92 self._reporter = reporter
102 self._reporter = reporter
93 self._baton = report_baton
103 self._baton = report_baton
94
104
95 def set_path(self, path, revnum, start_empty, lock_token, pool=None):
105 def set_path(self, path, revnum, start_empty, lock_token, pool=None):
96 svn.ra.reporter2_invoke_set_path(self._reporter, self._baton,
106 svn.ra.reporter2_invoke_set_path(self._reporter, self._baton,
97 path, revnum, start_empty, lock_token, pool)
107 path, revnum, start_empty, lock_token, pool)
98
108
99 def delete_path(self, path, pool=None):
109 def delete_path(self, path, pool=None):
100 svn.ra.reporter2_invoke_delete_path(self._reporter, self._baton,
110 svn.ra.reporter2_invoke_delete_path(self._reporter, self._baton,
101 path, pool)
111 path, pool)
102
112
103 def link_path(self, path, url, revision, start_empty, lock_token,
113 def link_path(self, path, url, revision, start_empty, lock_token,
104 pool=None):
114 pool=None):
105 svn.ra.reporter2_invoke_link_path(self._reporter, self._baton,
115 svn.ra.reporter2_invoke_link_path(self._reporter, self._baton,
106 path, url, revision, start_empty, lock_token,
116 path, url, revision, start_empty, lock_token,
107 pool)
117 pool)
108
118
109 def finish_report(self, pool=None):
119 def finish_report(self, pool=None):
110 svn.ra.reporter2_invoke_finish_report(self._reporter,
120 svn.ra.reporter2_invoke_finish_report(self._reporter,
111 self._baton, pool)
121 self._baton, pool)
112
122
113 def abort_report(self, pool=None):
123 def abort_report(self, pool=None):
114 svn.ra.reporter2_invoke_abort_report(self._reporter,
124 svn.ra.reporter2_invoke_abort_report(self._reporter,
115 self._baton, pool)
125 self._baton, pool)
116
126
117 def do_update(self, revnum, path, *args, **kwargs):
127 def do_update(self, revnum, path, *args, **kwargs):
118 return self.Reporter(svn.ra.do_update(self.ra, revnum, path, *args, **kwargs))
128 return self.Reporter(svn.ra.do_update(self.ra, revnum, path, *args, **kwargs))
General Comments 0
You need to be logged in to leave comments. Login now