Mercurial > hgsubversion
comparison svnwrap/svn_swig_wrapper.py @ 77:ed3dd5bf45da
fetch_command: bypass export3() and checkout manually
This method has several advantages:
- export3() does not work very well under Windows, while client.list() and
ra.get_file() do
- File modes are retrieved from get_file() for free, instead of being read from
the filesystem, which does not work under Windows, more generally the
filesystem is bypassed completely.
- It can be made much smarter by checkouting changed files only, like convert
extension does.
| author | Patrick Mezard <pmezard@gmail.com> |
|---|---|
| date | Sun, 09 Nov 2008 18:08:35 -0600 |
| parents | 6c62bd201785 |
| children | 85dcea81f22b |
comparison
equal
deleted
inserted
replaced
| 76:6c62bd201785 | 77:ed3dd5bf45da |
|---|---|
| 431 rev = optrev(revision) | 431 rev = optrev(revision) |
| 432 client.export3(self.svn_url+'/'+path, checkout_path, rev, | 432 client.export3(self.svn_url+'/'+path, checkout_path, rev, |
| 433 rev, True, True, True, 'LF', # should be 'CRLF' on win32 | 433 rev, True, True, True, 'LF', # should be 'CRLF' on win32 |
| 434 self.client_context, self.pool) | 434 self.client_context, self.pool) |
| 435 | 435 |
| 436 def list_files(self, dirpath, revision): | |
| 437 """List the content of a directory at a given revision, recursively. | |
| 438 | |
| 439 Yield tuples (path, kind) where 'path' is the entry path relatively to | |
| 440 'dirpath' and 'kind' is 'f' if the entry is a file, 'd' if it is a | |
| 441 directory. Raise IOError if the directory cannot be found at given | |
| 442 revision. | |
| 443 """ | |
| 444 dirpath = dirpath.strip('/') | |
| 445 pool = core.Pool() | |
| 446 rpath = '/'.join([self.svn_url, dirpath]).strip('/') | |
| 447 rev = optrev(revision) | |
| 448 types = { | |
| 449 core.svn_node_dir: 'd', | |
| 450 core.svn_node_file: 'f', | |
| 451 } | |
| 452 try: | |
| 453 entries = client.ls(rpath, rev, True, self.client_context, pool) | |
| 454 except core.SubversionException, e: | |
| 455 if e.apr_err == core.SVN_ERR_FS_NOT_FOUND: | |
| 456 raise IOError('%s cannot be found at r%d' % (dirpath, revision)) | |
| 457 raise | |
| 458 for path, e in entries.iteritems(): | |
| 459 kind = types.get(e.kind) | |
| 460 yield path, kind | |
| 461 | |
| 436 class SubversionRepoCanNotReplay(Exception): | 462 class SubversionRepoCanNotReplay(Exception): |
| 437 """Exception raised when the svn server is too old to have replay. | 463 """Exception raised when the svn server is too old to have replay. |
| 438 """ | 464 """ |
