~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/transport/sftp.py

Merged John Meinel's integration

Show diffs side-by-side

added added

removed removed

Lines of Context:
19
19
import errno
20
20
import getpass
21
21
import os
 
22
import random
22
23
import re
23
24
import stat
 
25
import subprocess
24
26
import sys
 
27
import time
25
28
import urllib
26
29
import urlparse
27
 
import time
28
 
import random
29
 
import subprocess
30
30
import weakref
31
31
 
32
32
from bzrlib.config import config_dir, ensure_config_dir_exists
53
53
    from paramiko.sftp_file import SFTPFile
54
54
    from paramiko.sftp_client import SFTPClient
55
55
 
56
 
if 'sftp' not in urlparse.uses_netloc: urlparse.uses_netloc.append('sftp')
 
56
if 'sftp' not in urlparse.uses_netloc:
 
57
    urlparse.uses_netloc.append('sftp')
 
58
 
 
59
# don't use prefetch unless paramiko version >= 1.5.2 (there were bugs earlier)
 
60
_default_do_prefetch = False
 
61
if getattr(paramiko, '__version_info__', (0, 0, 0)) >= (1, 5, 2):
 
62
    _default_do_prefetch = True
57
63
 
58
64
 
59
65
_close_fds = True
62
68
    _close_fds = False
63
69
 
64
70
_ssh_vendor = None
 
71
 
65
72
def _get_ssh_vendor():
66
73
    """Find out what version of SSH is on the system."""
67
74
    global _ssh_vendor
70
77
 
71
78
    _ssh_vendor = 'none'
72
79
 
 
80
    if 'BZR_SSH' in os.environ:
 
81
        _ssh_vendor = os.environ['BZR_SSH']
 
82
        if _ssh_vendor == 'paramiko':
 
83
            _ssh_vendor = 'none'
 
84
        return _ssh_vendor
 
85
 
73
86
    try:
74
87
        p = subprocess.Popen(['ssh', '-V'],
75
88
                             close_fds=_close_fds,
243
256
            # What specific errors should we catch here?
244
257
            pass
245
258
 
246
 
 
247
259
class SFTPTransport (Transport):
248
260
    """
249
261
    Transport implementation for SFTP access.
250
262
    """
251
 
    _do_prefetch = False # Right now Paramiko's prefetch support causes things to hang
 
263
    _do_prefetch = _default_do_prefetch
252
264
 
253
265
    def __init__(self, base, clone_from=None):
254
266
        assert base.startswith('sftp://')
353
365
        try:
354
366
            path = self._remote_path(relpath)
355
367
            f = self._sftp.file(path, mode='rb')
356
 
            if self._do_prefetch and hasattr(f, 'prefetch'):
 
368
            if self._do_prefetch and (getattr(f, 'prefetch', None) is not None):
357
369
                f.prefetch()
358
370
            return f
359
371
        except (IOError, paramiko.SSHException), e: