~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

Merge http-leaks into sftp-leaks

Show diffs side-by-side

added added

removed removed

Lines of Context:
18
18
import os
19
19
import re
20
20
import stat
21
 
from stat import S_ISREG, S_ISDIR, S_ISLNK, ST_MODE, ST_SIZE
22
21
import sys
23
22
import time
24
23
import codecs
27
26
lazy_import(globals(), """
28
27
from datetime import datetime
29
28
import getpass
30
 
from ntpath import (abspath as _nt_abspath,
31
 
                    join as _nt_join,
32
 
                    normpath as _nt_normpath,
33
 
                    realpath as _nt_realpath,
34
 
                    splitdrive as _nt_splitdrive,
35
 
                    )
 
29
import ntpath
36
30
import posixpath
37
31
import shutil
38
 
from shutil import (
39
 
    rmtree,
40
 
    )
41
32
import socket
42
33
import subprocess
43
34
import tempfile
44
 
from tempfile import (
45
 
    mkdtemp,
46
 
    )
47
35
import unicodedata
48
36
 
49
37
from bzrlib import (
304
292
    running python.exe under cmd.exe return capital C:\\
305
293
    running win32 python inside a cygwin shell returns lowercase c:\\
306
294
    """
307
 
    drive, path = _nt_splitdrive(path)
 
295
    drive, path = ntpath.splitdrive(path)
308
296
    return drive.upper() + path
309
297
 
310
298
 
311
299
def _win32_abspath(path):
312
 
    # Real _nt_abspath doesn't have a problem with a unicode cwd
313
 
    return _win32_fixdrive(_nt_abspath(unicode(path)).replace('\\', '/'))
 
300
    # Real ntpath.abspath doesn't have a problem with a unicode cwd
 
301
    return _win32_fixdrive(ntpath.abspath(unicode(path)).replace('\\', '/'))
314
302
 
315
303
 
316
304
def _win98_abspath(path):
327
315
    #   /path       => C:/path
328
316
    path = unicode(path)
329
317
    # check for absolute path
330
 
    drive = _nt_splitdrive(path)[0]
 
318
    drive = ntpath.splitdrive(path)[0]
331
319
    if drive == '' and path[:2] not in('//','\\\\'):
332
320
        cwd = os.getcwdu()
333
321
        # we cannot simply os.path.join cwd and path
334
322
        # because os.path.join('C:','/path') produce '/path'
335
323
        # and this is incorrect
336
324
        if path[:1] in ('/','\\'):
337
 
            cwd = _nt_splitdrive(cwd)[0]
 
325
            cwd = ntpath.splitdrive(cwd)[0]
338
326
            path = path[1:]
339
327
        path = cwd + '\\' + path
340
 
    return _win32_fixdrive(_nt_normpath(path).replace('\\', '/'))
 
328
    return _win32_fixdrive(ntpath.normpath(path).replace('\\', '/'))
341
329
 
342
330
 
343
331
def _win32_realpath(path):
344
 
    # Real _nt_realpath doesn't have a problem with a unicode cwd
345
 
    return _win32_fixdrive(_nt_realpath(unicode(path)).replace('\\', '/'))
 
332
    # Real ntpath.realpath doesn't have a problem with a unicode cwd
 
333
    return _win32_fixdrive(ntpath.realpath(unicode(path)).replace('\\', '/'))
346
334
 
347
335
 
348
336
def _win32_pathjoin(*args):
349
 
    return _nt_join(*args).replace('\\', '/')
 
337
    return ntpath.join(*args).replace('\\', '/')
350
338
 
351
339
 
352
340
def _win32_normpath(path):
353
 
    return _win32_fixdrive(_nt_normpath(unicode(path)).replace('\\', '/'))
 
341
    return _win32_fixdrive(ntpath.normpath(unicode(path)).replace('\\', '/'))
354
342
 
355
343
 
356
344
def _win32_getcwd():
395
383
basename = os.path.basename
396
384
split = os.path.split
397
385
splitext = os.path.splitext
398
 
# These were already imported into local scope
399
 
# mkdtemp = tempfile.mkdtemp
400
 
# rmtree = shutil.rmtree
 
386
mkdtemp = tempfile.mkdtemp
 
387
rmtree = shutil.rmtree
401
388
 
402
389
MIN_ABS_PATHLENGTH = 1
403
390
 
502
489
def isdir(f):
503
490
    """True if f is an accessible directory."""
504
491
    try:
505
 
        return S_ISDIR(os.lstat(f)[ST_MODE])
 
492
        return stat.S_ISDIR(os.lstat(f)[stat.ST_MODE])
506
493
    except OSError:
507
494
        return False
508
495
 
510
497
def isfile(f):
511
498
    """True if f is a regular file."""
512
499
    try:
513
 
        return S_ISREG(os.lstat(f)[ST_MODE])
 
500
        return stat.S_ISREG(os.lstat(f)[stat.ST_MODE])
514
501
    except OSError:
515
502
        return False
516
503
 
517
504
def islink(f):
518
505
    """True if f is a symlink."""
519
506
    try:
520
 
        return S_ISLNK(os.lstat(f)[ST_MODE])
 
507
        return stat.S_ISLNK(os.lstat(f)[stat.ST_MODE])
521
508
    except OSError:
522
509
        return False
523
510
 
863
850
 
864
851
def filesize(f):
865
852
    """Return size of given open file."""
866
 
    return os.fstat(f.fileno())[ST_SIZE]
 
853
    return os.fstat(f.fileno())[stat.ST_SIZE]
867
854
 
868
855
 
869
856
# Define rand_bytes based on platform.
2043
2030
            sent_total += sent
2044
2031
            report_activity(sent, 'write')
2045
2032
 
 
2033
# socket.create_connection() is not available before python2.6, so we provide
 
2034
# it for earlier versions
 
2035
if getattr(socket, 'create_connection', None) is not None:
 
2036
    connect_socket = socket.create_connection
 
2037
else:
 
2038
    # We don't use nor handle the timeout though
 
2039
    def connect_socket(address, timeout=None):
 
2040
        err = socket.error('getaddrinfo returns an empty list')
 
2041
        for res in socket.getaddrinfo(host, port):
 
2042
            af, socktype, proto, canonname, sa = res
 
2043
            sock = None
 
2044
            try:
 
2045
                sock = socket.socket(af, socktype, proto)
 
2046
                sock.connect(sa)
 
2047
                return sock
 
2048
 
 
2049
            except socket.error, err:
 
2050
                # 'err' is now the most recent error
 
2051
                if sock is not None:
 
2052
                    sock.close()
 
2053
        raise err
 
2054
 
2046
2055
 
2047
2056
def dereference_path(path):
2048
2057
    """Determine the real path to a file.