eggs/mercurial-1.7.3-py2.6-linux-x86_64.egg/hgext/convert/transport.py
changeset 69 c6bca38c1cbf
equal deleted inserted replaced
68:5ff1fc726848 69:c6bca38c1cbf
       
     1 # -*- coding: utf-8 -*-
       
     2 
       
     3 # Copyright (C) 2007 Daniel Holth <dholth@fastmail.fm>
       
     4 # This is a stripped-down version of the original bzr-svn transport.py,
       
     5 # Copyright (C) 2006 Jelmer Vernooij <jelmer@samba.org>
       
     6 
       
     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
       
     9 # the Free Software Foundation; either version 2 of the License, or
       
    10 # (at your option) any later version.
       
    11 
       
    12 # This program is distributed in the hope that it will be useful,
       
    13 # but WITHOUT ANY WARRANTY; without even the implied warranty of
       
    14 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
       
    15 # GNU General Public License for more details.
       
    16 
       
    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
       
    19 # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
       
    20 
       
    21 from svn.core import SubversionException, Pool
       
    22 import svn.ra
       
    23 import svn.client
       
    24 import svn.core
       
    25 
       
    26 # Some older versions of the Python bindings need to be
       
    27 # explicitly initialized. But what we want to do probably
       
    28 # won't work worth a darn against those libraries anyway!
       
    29 svn.ra.initialize()
       
    30 
       
    31 svn_config = svn.core.svn_config_get_config(None)
       
    32 
       
    33 
       
    34 def _create_auth_baton(pool):
       
    35     """Create a Subversion authentication baton. """
       
    36     import svn.client
       
    37     # Give the client context baton a suite of authentication
       
    38     # providers.h
       
    39     providers = [
       
    40         svn.client.get_simple_provider(pool),
       
    41         svn.client.get_username_provider(pool),
       
    42         svn.client.get_ssl_client_cert_file_provider(pool),
       
    43         svn.client.get_ssl_client_cert_pw_file_provider(pool),
       
    44         svn.client.get_ssl_server_trust_file_provider(pool),
       
    45         ]
       
    46     # Platform-dependant authentication methods
       
    47     getprovider = getattr(svn.core, 'svn_auth_get_platform_specific_provider',
       
    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))
       
    59 
       
    60     return svn.core.svn_auth_open(providers, pool)
       
    61 
       
    62 class NotBranchError(SubversionException):
       
    63     pass
       
    64 
       
    65 class SvnRaTransport(object):
       
    66     """
       
    67     Open an ra connection to a Subversion repository.
       
    68     """
       
    69     def __init__(self, url="", ra=None):
       
    70         self.pool = Pool()
       
    71         self.svn_url = url
       
    72         self.username = ''
       
    73         self.password = ''
       
    74 
       
    75         # Only Subversion 1.4 has reparent()
       
    76         if ra is None or not hasattr(svn.ra, 'reparent'):
       
    77             self.client = svn.client.create_context(self.pool)
       
    78             ab = _create_auth_baton(self.pool)
       
    79             if False:
       
    80                 svn.core.svn_auth_set_parameter(
       
    81                     ab, svn.core.SVN_AUTH_PARAM_DEFAULT_USERNAME, self.username)
       
    82                 svn.core.svn_auth_set_parameter(
       
    83                     ab, svn.core.SVN_AUTH_PARAM_DEFAULT_PASSWORD, self.password)
       
    84             self.client.auth_baton = ab
       
    85             self.client.config = svn_config
       
    86             try:
       
    87                 self.ra = svn.client.open_ra_session(
       
    88                     self.svn_url.encode('utf8'),
       
    89                     self.client, self.pool)
       
    90             except SubversionException, (inst, num):
       
    91                 if num in (svn.core.SVN_ERR_RA_ILLEGAL_URL,
       
    92                            svn.core.SVN_ERR_RA_LOCAL_REPOS_OPEN_FAILED,
       
    93                            svn.core.SVN_ERR_BAD_URL):
       
    94                     raise NotBranchError(url)
       
    95                 raise
       
    96         else:
       
    97             self.ra = ra
       
    98             svn.ra.reparent(self.ra, self.svn_url.encode('utf8'))
       
    99 
       
   100     class Reporter(object):
       
   101         def __init__(self, reporter_data):
       
   102             self._reporter, self._baton = reporter_data
       
   103 
       
   104         def set_path(self, path, revnum, start_empty, lock_token, pool=None):
       
   105             svn.ra.reporter2_invoke_set_path(self._reporter, self._baton,
       
   106                         path, revnum, start_empty, lock_token, pool)
       
   107 
       
   108         def delete_path(self, path, pool=None):
       
   109             svn.ra.reporter2_invoke_delete_path(self._reporter, self._baton,
       
   110                     path, pool)
       
   111 
       
   112         def link_path(self, path, url, revision, start_empty, lock_token,
       
   113                       pool=None):
       
   114             svn.ra.reporter2_invoke_link_path(self._reporter, self._baton,
       
   115                     path, url, revision, start_empty, lock_token,
       
   116                     pool)
       
   117 
       
   118         def finish_report(self, pool=None):
       
   119             svn.ra.reporter2_invoke_finish_report(self._reporter,
       
   120                     self._baton, pool)
       
   121 
       
   122         def abort_report(self, pool=None):
       
   123             svn.ra.reporter2_invoke_abort_report(self._reporter,
       
   124                     self._baton, pool)
       
   125 
       
   126     def do_update(self, revnum, path, *args, **kwargs):
       
   127         return self.Reporter(svn.ra.do_update(self.ra, revnum, path,
       
   128                                               *args, **kwargs))