hgext/convert/subversion.py
changeset 4759 95cbb6b74790
parent 4758 b6a1f2c46c6c
child 4762 81b170c41986
equal deleted inserted replaced
4758:b6a1f2c46c6c 4759:95cbb6b74790
     9 
     9 
    10 # Subversion stuff. Works best with very recent Python SVN bindings
    10 # Subversion stuff. Works best with very recent Python SVN bindings
    11 # e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing
    11 # e.g. SVN 1.5 or backports. Thanks to the bzr folks for enhancing
    12 # these bindings.
    12 # these bindings.
    13 
    13 
    14 from svn.core import SubversionException, Pool
       
    15 import svn.core
       
    16 import svn.ra
       
    17 import svn.delta
       
    18 import svn
       
    19 import transport
       
    20 from cStringIO import StringIO
    14 from cStringIO import StringIO
    21 
    15 
    22 from common import NoRepo, commit, converter_source, recode, nocommitmsg
    16 from common import NoRepo, commit, converter_source
       
    17 
       
    18 try:
       
    19     from svn.core import SubversionException, Pool
       
    20     import svn.core
       
    21     import svn.ra
       
    22     import svn.delta
       
    23     import svn
       
    24     import transport
       
    25 except ImportError:
       
    26     pass
    23 
    27 
    24 class CompatibilityException(Exception): pass
    28 class CompatibilityException(Exception): pass
    25 
    29 
    26 nbRevisionsPerFetch = 50
    30 nbRevisionsPerFetch = 50
    27 
    31 
    72     def __repr__(self):
    76     def __repr__(self):
    73         return self.__str__()
    77         return self.__str__()
    74 
    78 
    75 # SVN conversion code stolen from bzr-svn and tailor
    79 # SVN conversion code stolen from bzr-svn and tailor
    76 class convert_svn(converter_source):
    80 class convert_svn(converter_source):
    77     def __init__(self, ui, url):
    81     def __init__(self, ui, url, rev=None):
       
    82         try:
       
    83             SubversionException
       
    84         except NameError:
       
    85             msg = 'subversion python bindings could not be loaded\n'
       
    86             ui.warn(msg)
       
    87             raise NoRepo(msg)
       
    88 
    78         self.ui = ui
    89         self.ui = ui
    79         self.encoding = locale.getpreferredencoding()
    90         self.encoding = locale.getpreferredencoding()
       
    91         latest = None
       
    92         if rev:
       
    93             try:
       
    94                 latest = int(rev)
       
    95             except ValueError:
       
    96                 raise util.Abort('svn: revision %s is not an integer' % rev)
    80         try:
    97         try:
    81             # Support file://path@rev syntax. Useful e.g. to convert
    98             # Support file://path@rev syntax. Useful e.g. to convert
    82             # deleted branches.
    99             # deleted branches.
    83             url, latest = url.rsplit("@", 1)
   100             url, latest = url.rsplit("@", 1)
    84             latest = int(latest)
   101             latest = int(latest)
    85         except ValueError, e:
   102         except ValueError, e:
    86             latest = None
   103             pass
    87         self.url = url
   104         self.url = url
    88         self.encoding = 'UTF-8' # Subversion is always nominal UTF-8
   105         self.encoding = 'UTF-8' # Subversion is always nominal UTF-8
    89         try:
   106         try:
    90             self.transport = transport.SvnRaTransport(url = url)
   107             self.transport = transport.SvnRaTransport(url = url)
    91             self.ra = self.transport.ra
   108             self.ra = self.transport.ra
   366                 # Example SVN datetime. Includes microseconds.
   383                 # Example SVN datetime. Includes microseconds.
   367                 # ISO-8601 conformant
   384                 # ISO-8601 conformant
   368                 # '2007-01-04T17:35:00.902377Z'
   385                 # '2007-01-04T17:35:00.902377Z'
   369                 date = util.parsedate(date[:18] + " UTC", ["%Y-%m-%dT%H:%M:%S"])
   386                 date = util.parsedate(date[:18] + " UTC", ["%Y-%m-%dT%H:%M:%S"])
   370 
   387 
   371                 log = message and self.recode(message) or nocommitmsg
   388                 log = message and self.recode(message)
   372                 author = author and self.recode(author) or ''
   389                 author = author and self.recode(author) or ''
   373 
   390 
   374                 cset = commit(author=author,
   391                 cset = commit(author=author,
   375                         date=util.datestr(date), 
   392                         date=util.datestr(date), 
   376                         desc=log, 
   393                         desc=log, 
   504             self.reparent(self.module)
   521             self.reparent(self.module)
   505             return _find_children_fallback(path, revnum)
   522             return _find_children_fallback(path, revnum)
   506 
   523 
   507         self.reparent(self.module)
   524         self.reparent(self.module)
   508         return [path + "/" + c for c in children]
   525         return [path + "/" + c for c in children]
   509 
       
   510     def recode(self, s):
       
   511         return recode(self.encoding, s)