~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2011-08-17 18:13:57 UTC
  • mfrom: (5268.7.29 transport-segments)
  • Revision ID: pqm@pqm.ubuntu.com-20110817181357-y5q5eth1hk8bl3om
(jelmer) Allow specifying the colocated branch to use in the branch URL,
 and retrieving the branch name using ControlDir._get_selected_branch.
 (Jelmer Vernooij)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2005, 2006, 2007 Canonical Ltd
 
1
# Copyright (C) 2005-2011 Canonical Ltd
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
12
12
#
13
13
# You should have received a copy of the GNU General Public License
14
14
# along with this program; if not, write to the Free Software
15
 
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
 
17
import errno
17
18
import os
18
19
import re
19
20
import stat
20
 
from stat import (S_ISREG, S_ISDIR, S_ISLNK, ST_MODE, ST_SIZE,
21
 
                  S_ISCHR, S_ISBLK, S_ISFIFO, S_ISSOCK)
22
21
import sys
23
22
import time
 
23
import codecs
24
24
 
25
25
from bzrlib.lazy_import import lazy_import
26
26
lazy_import(globals(), """
27
 
import codecs
28
27
from datetime import datetime
29
 
import errno
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
 
                    )
 
28
import getpass
 
29
import ntpath
36
30
import posixpath
 
31
# We need to import both shutil and rmtree as we export the later on posix
 
32
# and need the former on windows
37
33
import shutil
38
 
from shutil import (
39
 
    rmtree,
40
 
    )
 
34
from shutil import rmtree
 
35
import socket
 
36
import subprocess
 
37
# We need to import both tempfile and mkdtemp as we export the later on posix
 
38
# and need the former on windows
41
39
import tempfile
42
 
from tempfile import (
43
 
    mkdtemp,
44
 
    )
 
40
from tempfile import mkdtemp
45
41
import unicodedata
46
42
 
47
43
from bzrlib import (
48
44
    cache_utf8,
 
45
    config,
49
46
    errors,
 
47
    trace,
50
48
    win32utils,
51
49
    )
52
50
""")
53
51
 
54
 
# sha and md5 modules are deprecated in python2.6 but hashlib is available as
55
 
# of 2.5
56
 
if sys.version_info < (2, 5):
57
 
    import md5 as _mod_md5
58
 
    md5 = _mod_md5.new
59
 
    import sha as _mod_sha
60
 
    sha = _mod_sha.new
61
 
else:
62
 
    from hashlib import (
63
 
        md5,
64
 
        sha1 as sha,
65
 
        )
 
52
from bzrlib.symbol_versioning import (
 
53
    deprecated_function,
 
54
    deprecated_in,
 
55
    )
 
56
 
 
57
from hashlib import (
 
58
    md5,
 
59
    sha1 as sha,
 
60
    )
66
61
 
67
62
 
68
63
import bzrlib
69
64
from bzrlib import symbol_versioning
70
65
 
71
66
 
 
67
# Cross platform wall-clock time functionality with decent resolution.
 
68
# On Linux ``time.clock`` returns only CPU time. On Windows, ``time.time()``
 
69
# only has a resolution of ~15ms. Note that ``time.clock()`` is not
 
70
# synchronized with ``time.time()``, this is only meant to be used to find
 
71
# delta times by subtracting from another call to this function.
 
72
timer_func = time.time
 
73
if sys.platform == 'win32':
 
74
    timer_func = time.clock
 
75
 
72
76
# On win32, O_BINARY is used to indicate the file should
73
77
# be opened in binary mode, rather than text mode.
74
78
# On other platforms, O_BINARY doesn't exist, because
75
79
# they always open in binary mode, so it is okay to
76
 
# OR with 0 on those platforms
 
80
# OR with 0 on those platforms.
 
81
# O_NOINHERIT and O_TEXT exists only on win32 too.
77
82
O_BINARY = getattr(os, 'O_BINARY', 0)
 
83
O_TEXT = getattr(os, 'O_TEXT', 0)
 
84
O_NOINHERIT = getattr(os, 'O_NOINHERIT', 0)
 
85
 
 
86
 
 
87
def get_unicode_argv():
 
88
    try:
 
89
        user_encoding = get_user_encoding()
 
90
        return [a.decode(user_encoding) for a in sys.argv[1:]]
 
91
    except UnicodeDecodeError:
 
92
        raise errors.BzrError("Parameter %r encoding is unsupported by %s "
 
93
            "application locale." % (a, user_encoding))
78
94
 
79
95
 
80
96
def make_readonly(filename):
97
113
 
98
114
    :param paths: A container (and hence not None) of paths.
99
115
    :return: A set of paths sufficient to include everything in paths via
100
 
        is_inside_any, drawn from the paths parameter.
 
116
        is_inside, drawn from the paths parameter.
101
117
    """
102
 
    search_paths = set()
103
 
    paths = set(paths)
104
 
    for path in paths:
105
 
        other_paths = paths.difference([path])
106
 
        if not is_inside_any(other_paths, path):
107
 
            # this is a top level path, we must check it.
108
 
            search_paths.add(path)
109
 
    return search_paths
 
118
    if len(paths) < 2:
 
119
        return set(paths)
 
120
 
 
121
    def sort_key(path):
 
122
        return path.split('/')
 
123
    sorted_paths = sorted(list(paths), key=sort_key)
 
124
 
 
125
    search_paths = [sorted_paths[0]]
 
126
    for path in sorted_paths[1:]:
 
127
        if not is_inside(search_paths[-1], path):
 
128
            # This path is unique, add it
 
129
            search_paths.append(path)
 
130
 
 
131
    return set(search_paths)
110
132
 
111
133
 
112
134
_QUOTE_RE = None
121
143
    global _QUOTE_RE
122
144
    if _QUOTE_RE is None:
123
145
        _QUOTE_RE = re.compile(r'([^a-zA-Z0-9.,:/\\_~-])')
124
 
        
 
146
 
125
147
    if _QUOTE_RE.search(f):
126
148
        return '"' + f + '"'
127
149
    else:
152
174
    try:
153
175
        return _kind_marker_map[kind]
154
176
    except KeyError:
155
 
        raise errors.BzrError('invalid file kind %r' % kind)
 
177
        # Slightly faster than using .get(, '') when the common case is that
 
178
        # kind will be found
 
179
        return ''
156
180
 
157
181
 
158
182
lexists = getattr(os.path, 'lexists', None)
171
195
 
172
196
def fancy_rename(old, new, rename_func, unlink_func):
173
197
    """A fancy rename, when you don't have atomic rename.
174
 
    
 
198
 
175
199
    :param old: The old path, to rename from
176
200
    :param new: The new path, to rename to
177
201
    :param rename_func: The potentially non-atomic rename function
178
 
    :param unlink_func: A way to delete the target file if the full rename succeeds
 
202
    :param unlink_func: A way to delete the target file if the full rename
 
203
        succeeds
179
204
    """
180
 
 
181
205
    # sftp rename doesn't allow overwriting, so play tricks:
182
206
    base = os.path.basename(new)
183
207
    dirname = os.path.dirname(new)
184
 
    tmp_name = u'tmp.%s.%.9f.%d.%s' % (base, time.time(), os.getpid(), rand_chars(10))
 
208
    # callers use different encodings for the paths so the following MUST
 
209
    # respect that. We rely on python upcasting to unicode if new is unicode
 
210
    # and keeping a str if not.
 
211
    tmp_name = 'tmp.%s.%.9f.%d.%s' % (base, time.time(),
 
212
                                      os.getpid(), rand_chars(10))
185
213
    tmp_name = pathjoin(dirname, tmp_name)
186
214
 
187
215
    # Rename the file out of the way, but keep track if it didn't exist
207
235
    else:
208
236
        file_existed = True
209
237
 
 
238
    failure_exc = None
210
239
    success = False
211
240
    try:
212
241
        try:
218
247
            # source and target may be aliases of each other (e.g. on a
219
248
            # case-insensitive filesystem), so we may have accidentally renamed
220
249
            # source by when we tried to rename target
221
 
            if not (file_existed and e.errno in (None, errno.ENOENT)):
222
 
                raise
 
250
            failure_exc = sys.exc_info()
 
251
            if (file_existed and e.errno in (None, errno.ENOENT)
 
252
                and old.lower() == new.lower()):
 
253
                # source and target are the same file on a case-insensitive
 
254
                # filesystem, so we don't generate an exception
 
255
                failure_exc = None
223
256
    finally:
224
257
        if file_existed:
225
258
            # If the file used to exist, rename it back into place
228
261
                unlink_func(tmp_name)
229
262
            else:
230
263
                rename_func(tmp_name, new)
 
264
    if failure_exc is not None:
 
265
        try:
 
266
            raise failure_exc[0], failure_exc[1], failure_exc[2]
 
267
        finally:
 
268
            del failure_exc
231
269
 
232
270
 
233
271
# In Python 2.4.2 and older, os.path.abspath and os.path.realpath
256
294
    running python.exe under cmd.exe return capital C:\\
257
295
    running win32 python inside a cygwin shell returns lowercase c:\\
258
296
    """
259
 
    drive, path = _nt_splitdrive(path)
 
297
    drive, path = ntpath.splitdrive(path)
260
298
    return drive.upper() + path
261
299
 
262
300
 
263
301
def _win32_abspath(path):
264
 
    # Real _nt_abspath doesn't have a problem with a unicode cwd
265
 
    return _win32_fixdrive(_nt_abspath(unicode(path)).replace('\\', '/'))
 
302
    # Real ntpath.abspath doesn't have a problem with a unicode cwd
 
303
    return _win32_fixdrive(ntpath.abspath(unicode(path)).replace('\\', '/'))
266
304
 
267
305
 
268
306
def _win98_abspath(path):
279
317
    #   /path       => C:/path
280
318
    path = unicode(path)
281
319
    # check for absolute path
282
 
    drive = _nt_splitdrive(path)[0]
 
320
    drive = ntpath.splitdrive(path)[0]
283
321
    if drive == '' and path[:2] not in('//','\\\\'):
284
322
        cwd = os.getcwdu()
285
323
        # we cannot simply os.path.join cwd and path
286
324
        # because os.path.join('C:','/path') produce '/path'
287
325
        # and this is incorrect
288
326
        if path[:1] in ('/','\\'):
289
 
            cwd = _nt_splitdrive(cwd)[0]
 
327
            cwd = ntpath.splitdrive(cwd)[0]
290
328
            path = path[1:]
291
329
        path = cwd + '\\' + path
292
 
    return _win32_fixdrive(_nt_normpath(path).replace('\\', '/'))
 
330
    return _win32_fixdrive(ntpath.normpath(path).replace('\\', '/'))
293
331
 
294
332
 
295
333
def _win32_realpath(path):
296
 
    # Real _nt_realpath doesn't have a problem with a unicode cwd
297
 
    return _win32_fixdrive(_nt_realpath(unicode(path)).replace('\\', '/'))
 
334
    # Real ntpath.realpath doesn't have a problem with a unicode cwd
 
335
    return _win32_fixdrive(ntpath.realpath(unicode(path)).replace('\\', '/'))
298
336
 
299
337
 
300
338
def _win32_pathjoin(*args):
301
 
    return _nt_join(*args).replace('\\', '/')
 
339
    return ntpath.join(*args).replace('\\', '/')
302
340
 
303
341
 
304
342
def _win32_normpath(path):
305
 
    return _win32_fixdrive(_nt_normpath(unicode(path)).replace('\\', '/'))
 
343
    return _win32_fixdrive(ntpath.normpath(unicode(path)).replace('\\', '/'))
306
344
 
307
345
 
308
346
def _win32_getcwd():
317
355
    """We expect to be able to atomically replace 'new' with old.
318
356
 
319
357
    On win32, if new exists, it must be moved out of the way first,
320
 
    and then deleted. 
 
358
    and then deleted.
321
359
    """
322
360
    try:
323
361
        fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
324
362
    except OSError, e:
325
363
        if e.errno in (errno.EPERM, errno.EACCES, errno.EBUSY, errno.EINVAL):
326
 
            # If we try to rename a non-existant file onto cwd, we get 
327
 
            # EPERM or EACCES instead of ENOENT, this will raise ENOENT 
 
364
            # If we try to rename a non-existant file onto cwd, we get
 
365
            # EPERM or EACCES instead of ENOENT, this will raise ENOENT
328
366
            # if the old path doesn't exist, sometimes we get EACCES
329
367
            # On Linux, we seem to get EBUSY, on Mac we get EINVAL
330
368
            os.lstat(old)
347
385
basename = os.path.basename
348
386
split = os.path.split
349
387
splitext = os.path.splitext
350
 
# These were already imported into local scope
 
388
# These were already lazily imported into local scope
351
389
# mkdtemp = tempfile.mkdtemp
352
390
# rmtree = shutil.rmtree
 
391
lstat = os.lstat
 
392
fstat = os.fstat
 
393
 
 
394
def wrap_stat(st):
 
395
    return st
 
396
 
353
397
 
354
398
MIN_ABS_PATHLENGTH = 1
355
399
 
365
409
    getcwd = _win32_getcwd
366
410
    mkdtemp = _win32_mkdtemp
367
411
    rename = _win32_rename
 
412
    try:
 
413
        from bzrlib import _walkdirs_win32
 
414
    except ImportError:
 
415
        pass
 
416
    else:
 
417
        lstat = _walkdirs_win32.lstat
 
418
        fstat = _walkdirs_win32.fstat
 
419
        wrap_stat = _walkdirs_win32.wrap_stat
368
420
 
369
421
    MIN_ABS_PATHLENGTH = 3
370
422
 
384
436
    def rmtree(path, ignore_errors=False, onerror=_win32_delete_readonly):
385
437
        """Replacer for shutil.rmtree: could remove readonly dirs/files"""
386
438
        return shutil.rmtree(path, ignore_errors, onerror)
 
439
 
 
440
    f = win32utils.get_unicode_argv     # special function or None
 
441
    if f is not None:
 
442
        get_unicode_argv = f
 
443
 
387
444
elif sys.platform == 'darwin':
388
445
    getcwd = _mac_getcwd
389
446
 
390
447
 
391
 
def get_terminal_encoding():
 
448
def get_terminal_encoding(trace=False):
392
449
    """Find the best encoding for printing to the screen.
393
450
 
394
451
    This attempts to check both sys.stdout and sys.stdin to see
400
457
 
401
458
    On my standard US Windows XP, the preferred encoding is
402
459
    cp1252, but the console is cp437
 
460
 
 
461
    :param trace: If True trace the selected encoding via mutter().
403
462
    """
404
463
    from bzrlib.trace import mutter
405
464
    output_encoding = getattr(sys.stdout, 'encoding', None)
407
466
        input_encoding = getattr(sys.stdin, 'encoding', None)
408
467
        if not input_encoding:
409
468
            output_encoding = get_user_encoding()
410
 
            mutter('encoding stdout as osutils.get_user_encoding() %r',
 
469
            if trace:
 
470
                mutter('encoding stdout as osutils.get_user_encoding() %r',
411
471
                   output_encoding)
412
472
        else:
413
473
            output_encoding = input_encoding
414
 
            mutter('encoding stdout as sys.stdin encoding %r', output_encoding)
 
474
            if trace:
 
475
                mutter('encoding stdout as sys.stdin encoding %r',
 
476
                    output_encoding)
415
477
    else:
416
 
        mutter('encoding stdout as sys.stdout encoding %r', output_encoding)
 
478
        if trace:
 
479
            mutter('encoding stdout as sys.stdout encoding %r', output_encoding)
417
480
    if output_encoding == 'cp0':
418
481
        # invalid encoding (cp0 means 'no codepage' on Windows)
419
482
        output_encoding = get_user_encoding()
420
 
        mutter('cp0 is invalid encoding.'
 
483
        if trace:
 
484
            mutter('cp0 is invalid encoding.'
421
485
               ' encoding stdout as osutils.get_user_encoding() %r',
422
486
               output_encoding)
423
487
    # check encoding
449
513
def isdir(f):
450
514
    """True if f is an accessible directory."""
451
515
    try:
452
 
        return S_ISDIR(os.lstat(f)[ST_MODE])
 
516
        return stat.S_ISDIR(os.lstat(f)[stat.ST_MODE])
453
517
    except OSError:
454
518
        return False
455
519
 
457
521
def isfile(f):
458
522
    """True if f is a regular file."""
459
523
    try:
460
 
        return S_ISREG(os.lstat(f)[ST_MODE])
 
524
        return stat.S_ISREG(os.lstat(f)[stat.ST_MODE])
461
525
    except OSError:
462
526
        return False
463
527
 
464
528
def islink(f):
465
529
    """True if f is a symlink."""
466
530
    try:
467
 
        return S_ISLNK(os.lstat(f)[ST_MODE])
 
531
        return stat.S_ISLNK(os.lstat(f)[stat.ST_MODE])
468
532
    except OSError:
469
533
        return False
470
534
 
471
535
def is_inside(dir, fname):
472
536
    """True if fname is inside dir.
473
 
    
 
537
 
474
538
    The parameters should typically be passed to osutils.normpath first, so
475
539
    that . and .. and repeated slashes are eliminated, and the separators
476
540
    are canonical for the platform.
477
 
    
478
 
    The empty string as a dir name is taken as top-of-tree and matches 
 
541
 
 
542
    The empty string as a dir name is taken as top-of-tree and matches
479
543
    everything.
480
544
    """
481
 
    # XXX: Most callers of this can actually do something smarter by 
 
545
    # XXX: Most callers of this can actually do something smarter by
482
546
    # looking at the inventory
483
547
    if dir == fname:
484
548
        return True
485
 
    
 
549
 
486
550
    if dir == '':
487
551
        return True
488
552
 
508
572
    return False
509
573
 
510
574
 
511
 
def pumpfile(from_file, to_file, read_length=-1, buff_size=32768):
 
575
def pumpfile(from_file, to_file, read_length=-1, buff_size=32768,
 
576
             report_activity=None, direction='read'):
512
577
    """Copy contents of one file to another.
513
578
 
514
579
    The read_length can either be -1 to read to end-of-file (EOF) or
517
582
    The buff_size represents the maximum size for each read operation
518
583
    performed on from_file.
519
584
 
 
585
    :param report_activity: Call this as bytes are read, see
 
586
        Transport._report_activity
 
587
    :param direction: Will be passed to report_activity
 
588
 
520
589
    :return: The number of bytes copied.
521
590
    """
522
591
    length = 0
530
599
            if not block:
531
600
                # EOF reached
532
601
                break
 
602
            if report_activity is not None:
 
603
                report_activity(len(block), direction)
533
604
            to_file.write(block)
534
605
 
535
606
            actual_bytes_read = len(block)
542
613
            if not block:
543
614
                # EOF reached
544
615
                break
 
616
            if report_activity is not None:
 
617
                report_activity(len(block), direction)
545
618
            to_file.write(block)
546
619
            length += len(block)
547
620
    return length
588
661
    return s.hexdigest()
589
662
 
590
663
 
 
664
def size_sha_file(f):
 
665
    """Calculate the size and hexdigest of an open file.
 
666
 
 
667
    The file cursor should be already at the start and
 
668
    the caller is responsible for closing the file afterwards.
 
669
    """
 
670
    size = 0
 
671
    s = sha()
 
672
    BUFSIZE = 128<<10
 
673
    while True:
 
674
        b = f.read(BUFSIZE)
 
675
        if not b:
 
676
            break
 
677
        size += len(b)
 
678
        s.update(b)
 
679
    return size, s.hexdigest()
 
680
 
 
681
 
591
682
def sha_file_by_name(fname):
592
683
    """Calculate the SHA1 of a file by reading the full text"""
593
684
    s = sha()
594
 
    f = os.open(fname, os.O_RDONLY | O_BINARY)
 
685
    f = os.open(fname, os.O_RDONLY | O_BINARY | O_NOINHERIT)
595
686
    try:
596
687
        while True:
597
688
            b = os.read(f, 1<<16)
639
730
    return offset.days * 86400 + offset.seconds
640
731
 
641
732
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
642
 
    
 
733
_default_format_by_weekday_num = [wd + " %Y-%m-%d %H:%M:%S" for wd in weekdays]
 
734
 
 
735
 
643
736
def format_date(t, offset=0, timezone='original', date_fmt=None,
644
737
                show_offset=True):
645
738
    """Return a formatted date string.
658
751
    date_str = time.strftime(date_fmt, tt)
659
752
    return date_str + offset_str
660
753
 
 
754
 
 
755
# Cache of formatted offset strings
 
756
_offset_cache = {}
 
757
 
 
758
 
 
759
def format_date_with_offset_in_original_timezone(t, offset=0,
 
760
    _cache=_offset_cache):
 
761
    """Return a formatted date string in the original timezone.
 
762
 
 
763
    This routine may be faster then format_date.
 
764
 
 
765
    :param t: Seconds since the epoch.
 
766
    :param offset: Timezone offset in seconds east of utc.
 
767
    """
 
768
    if offset is None:
 
769
        offset = 0
 
770
    tt = time.gmtime(t + offset)
 
771
    date_fmt = _default_format_by_weekday_num[tt[6]]
 
772
    date_str = time.strftime(date_fmt, tt)
 
773
    offset_str = _cache.get(offset, None)
 
774
    if offset_str is None:
 
775
        offset_str = ' %+03d%02d' % (offset / 3600, (offset / 60) % 60)
 
776
        _cache[offset] = offset_str
 
777
    return date_str + offset_str
 
778
 
 
779
 
661
780
def format_local_date(t, offset=0, timezone='original', date_fmt=None,
662
781
                      show_offset=True):
663
782
    """Return an unicode date string formatted according to the current locale.
674
793
               _format_date(t, offset, timezone, date_fmt, show_offset)
675
794
    date_str = time.strftime(date_fmt, tt)
676
795
    if not isinstance(date_str, unicode):
677
 
        date_str = date_str.decode(bzrlib.user_encoding, 'replace')
 
796
        date_str = date_str.decode(get_user_encoding(), 'replace')
678
797
    return date_str + offset_str
679
798
 
 
799
 
680
800
def _format_date(t, offset, timezone, date_fmt, show_offset):
681
801
    if timezone == 'utc':
682
802
        tt = time.gmtime(t)
701
821
 
702
822
def compact_date(when):
703
823
    return time.strftime('%Y%m%d%H%M%S', time.gmtime(when))
704
 
    
 
824
 
705
825
 
706
826
def format_delta(delta):
707
827
    """Get a nice looking string for a time delta.
754
874
 
755
875
def filesize(f):
756
876
    """Return size of given open file."""
757
 
    return os.fstat(f.fileno())[ST_SIZE]
 
877
    return os.fstat(f.fileno())[stat.ST_SIZE]
758
878
 
759
879
 
760
880
# Define rand_bytes based on platform.
783
903
ALNUM = '0123456789abcdefghijklmnopqrstuvwxyz'
784
904
def rand_chars(num):
785
905
    """Return a random string of num alphanumeric characters
786
 
    
787
 
    The result only contains lowercase chars because it may be used on 
 
906
 
 
907
    The result only contains lowercase chars because it may be used on
788
908
    case-insensitive filesystems.
789
909
    """
790
910
    s = ''
812
932
            rps.append(f)
813
933
    return rps
814
934
 
 
935
 
815
936
def joinpath(p):
816
937
    for f in p:
817
938
        if (f == '..') or (f is None) or (f == ''):
819
940
    return pathjoin(*p)
820
941
 
821
942
 
 
943
def parent_directories(filename):
 
944
    """Return the list of parent directories, deepest first.
 
945
 
 
946
    For example, parent_directories("a/b/c") -> ["a/b", "a"].
 
947
    """
 
948
    parents = []
 
949
    parts = splitpath(dirname(filename))
 
950
    while parts:
 
951
        parents.append(joinpath(parts))
 
952
        parts.pop()
 
953
    return parents
 
954
 
 
955
 
 
956
_extension_load_failures = []
 
957
 
 
958
 
 
959
def failed_to_load_extension(exception):
 
960
    """Handle failing to load a binary extension.
 
961
 
 
962
    This should be called from the ImportError block guarding the attempt to
 
963
    import the native extension.  If this function returns, the pure-Python
 
964
    implementation should be loaded instead::
 
965
 
 
966
    >>> try:
 
967
    >>>     import bzrlib._fictional_extension_pyx
 
968
    >>> except ImportError, e:
 
969
    >>>     bzrlib.osutils.failed_to_load_extension(e)
 
970
    >>>     import bzrlib._fictional_extension_py
 
971
    """
 
972
    # NB: This docstring is just an example, not a doctest, because doctest
 
973
    # currently can't cope with the use of lazy imports in this namespace --
 
974
    # mbp 20090729
 
975
 
 
976
    # This currently doesn't report the failure at the time it occurs, because
 
977
    # they tend to happen very early in startup when we can't check config
 
978
    # files etc, and also we want to report all failures but not spam the user
 
979
    # with 10 warnings.
 
980
    exception_str = str(exception)
 
981
    if exception_str not in _extension_load_failures:
 
982
        trace.mutter("failed to load compiled extension: %s" % exception_str)
 
983
        _extension_load_failures.append(exception_str)
 
984
 
 
985
 
 
986
def report_extension_load_failures():
 
987
    if not _extension_load_failures:
 
988
        return
 
989
    if config.GlobalStack().get('ignore_missing_extensions'):
 
990
        return
 
991
    # the warnings framework should by default show this only once
 
992
    from bzrlib.trace import warning
 
993
    warning(
 
994
        "bzr: warning: some compiled extensions could not be loaded; "
 
995
        "see <https://answers.launchpad.net/bzr/+faq/703>")
 
996
    # we no longer show the specific missing extensions here, because it makes
 
997
    # the message too long and scary - see
 
998
    # https://bugs.launchpad.net/bzr/+bug/430529
 
999
 
 
1000
 
 
1001
try:
 
1002
    from bzrlib._chunks_to_lines_pyx import chunks_to_lines
 
1003
except ImportError, e:
 
1004
    failed_to_load_extension(e)
 
1005
    from bzrlib._chunks_to_lines_py import chunks_to_lines
 
1006
 
 
1007
 
822
1008
def split_lines(s):
823
1009
    """Split s into lines, but without removing the newline characters."""
 
1010
    # Trivially convert a fulltext into a 'chunked' representation, and let
 
1011
    # chunks_to_lines do the heavy lifting.
 
1012
    if isinstance(s, str):
 
1013
        # chunks_to_lines only supports 8-bit strings
 
1014
        return chunks_to_lines([s])
 
1015
    else:
 
1016
        return _split_lines(s)
 
1017
 
 
1018
 
 
1019
def _split_lines(s):
 
1020
    """Split s into lines, but without removing the newline characters.
 
1021
 
 
1022
    This supports Unicode or plain string objects.
 
1023
    """
824
1024
    lines = s.split('\n')
825
1025
    result = [line + '\n' for line in lines[:-1]]
826
1026
    if lines[-1]:
845
1045
        shutil.copyfile(src, dest)
846
1046
 
847
1047
 
848
 
# Look Before You Leap (LBYL) is appropriate here instead of Easier to Ask for
849
 
# Forgiveness than Permission (EAFP) because:
850
 
# - root can damage a solaris file system by using unlink,
851
 
# - unlink raises different exceptions on different OSes (linux: EISDIR, win32:
852
 
#   EACCES, OSX: EPERM) when invoked on a directory.
853
1048
def delete_any(path):
854
 
    """Delete a file or directory."""
 
1049
    """Delete a file, symlink or directory.
 
1050
 
 
1051
    Will delete even if readonly.
 
1052
    """
 
1053
    try:
 
1054
       _delete_file_or_dir(path)
 
1055
    except (OSError, IOError), e:
 
1056
        if e.errno in (errno.EPERM, errno.EACCES):
 
1057
            # make writable and try again
 
1058
            try:
 
1059
                make_writable(path)
 
1060
            except (OSError, IOError):
 
1061
                pass
 
1062
            _delete_file_or_dir(path)
 
1063
        else:
 
1064
            raise
 
1065
 
 
1066
 
 
1067
def _delete_file_or_dir(path):
 
1068
    # Look Before You Leap (LBYL) is appropriate here instead of Easier to Ask for
 
1069
    # Forgiveness than Permission (EAFP) because:
 
1070
    # - root can damage a solaris file system by using unlink,
 
1071
    # - unlink raises different exceptions on different OSes (linux: EISDIR, win32:
 
1072
    #   EACCES, OSX: EPERM) when invoked on a directory.
855
1073
    if isdir(path): # Takes care of symlinks
856
1074
        os.rmdir(path)
857
1075
    else:
877
1095
            and sys.platform not in ('cygwin', 'win32'))
878
1096
 
879
1097
 
 
1098
def readlink(abspath):
 
1099
    """Return a string representing the path to which the symbolic link points.
 
1100
 
 
1101
    :param abspath: The link absolute unicode path.
 
1102
 
 
1103
    This his guaranteed to return the symbolic link in unicode in all python
 
1104
    versions.
 
1105
    """
 
1106
    link = abspath.encode(_fs_enc)
 
1107
    target = os.readlink(link)
 
1108
    target = target.decode(_fs_enc)
 
1109
    return target
 
1110
 
 
1111
 
880
1112
def contains_whitespace(s):
881
1113
    """True if there are any whitespace characters in s."""
882
1114
    # string.whitespace can include '\xa0' in certain locales, because it is
907
1139
 
908
1140
 
909
1141
def relpath(base, path):
910
 
    """Return path relative to base, or raise exception.
 
1142
    """Return path relative to base, or raise PathNotChild exception.
911
1143
 
912
1144
    The path may be either an absolute path or a path relative to the
913
1145
    current working directory.
915
1147
    os.path.commonprefix (python2.4) has a bad bug that it works just
916
1148
    on string prefixes, assuming that '/u' is a prefix of '/u2'.  This
917
1149
    avoids that problem.
 
1150
 
 
1151
    NOTE: `base` should not have a trailing slash otherwise you'll get
 
1152
    PathNotChild exceptions regardless of `path`.
918
1153
    """
919
1154
 
920
1155
    if len(base) < MIN_ABS_PATHLENGTH:
926
1161
 
927
1162
    s = []
928
1163
    head = rp
929
 
    while len(head) >= len(base):
 
1164
    while True:
 
1165
        if len(head) <= len(base) and head != base:
 
1166
            raise errors.PathNotChild(rp, base)
930
1167
        if head == base:
931
1168
            break
932
 
        head, tail = os.path.split(head)
 
1169
        head, tail = split(head)
933
1170
        if tail:
934
 
            s.insert(0, tail)
935
 
    else:
936
 
        raise errors.PathNotChild(rp, base)
 
1171
            s.append(tail)
937
1172
 
938
1173
    if s:
939
 
        return pathjoin(*s)
 
1174
        return pathjoin(*reversed(s))
940
1175
    else:
941
1176
        return ''
942
1177
 
943
1178
 
 
1179
def _cicp_canonical_relpath(base, path):
 
1180
    """Return the canonical path relative to base.
 
1181
 
 
1182
    Like relpath, but on case-insensitive-case-preserving file-systems, this
 
1183
    will return the relpath as stored on the file-system rather than in the
 
1184
    case specified in the input string, for all existing portions of the path.
 
1185
 
 
1186
    This will cause O(N) behaviour if called for every path in a tree; if you
 
1187
    have a number of paths to convert, you should use canonical_relpaths().
 
1188
    """
 
1189
    # TODO: it should be possible to optimize this for Windows by using the
 
1190
    # win32 API FindFiles function to look for the specified name - but using
 
1191
    # os.listdir() still gives us the correct, platform agnostic semantics in
 
1192
    # the short term.
 
1193
 
 
1194
    rel = relpath(base, path)
 
1195
    # '.' will have been turned into ''
 
1196
    if not rel:
 
1197
        return rel
 
1198
 
 
1199
    abs_base = abspath(base)
 
1200
    current = abs_base
 
1201
    _listdir = os.listdir
 
1202
 
 
1203
    # use an explicit iterator so we can easily consume the rest on early exit.
 
1204
    bit_iter = iter(rel.split('/'))
 
1205
    for bit in bit_iter:
 
1206
        lbit = bit.lower()
 
1207
        try:
 
1208
            next_entries = _listdir(current)
 
1209
        except OSError: # enoent, eperm, etc
 
1210
            # We can't find this in the filesystem, so just append the
 
1211
            # remaining bits.
 
1212
            current = pathjoin(current, bit, *list(bit_iter))
 
1213
            break
 
1214
        for look in next_entries:
 
1215
            if lbit == look.lower():
 
1216
                current = pathjoin(current, look)
 
1217
                break
 
1218
        else:
 
1219
            # got to the end, nothing matched, so we just return the
 
1220
            # non-existing bits as they were specified (the filename may be
 
1221
            # the target of a move, for example).
 
1222
            current = pathjoin(current, bit, *list(bit_iter))
 
1223
            break
 
1224
    return current[len(abs_base):].lstrip('/')
 
1225
 
 
1226
# XXX - TODO - we need better detection/integration of case-insensitive
 
1227
# file-systems; Linux often sees FAT32 devices (or NFS-mounted OSX
 
1228
# filesystems), for example, so could probably benefit from the same basic
 
1229
# support there.  For now though, only Windows and OSX get that support, and
 
1230
# they get it for *all* file-systems!
 
1231
if sys.platform in ('win32', 'darwin'):
 
1232
    canonical_relpath = _cicp_canonical_relpath
 
1233
else:
 
1234
    canonical_relpath = relpath
 
1235
 
 
1236
def canonical_relpaths(base, paths):
 
1237
    """Create an iterable to canonicalize a sequence of relative paths.
 
1238
 
 
1239
    The intent is for this implementation to use a cache, vastly speeding
 
1240
    up multiple transformations in the same directory.
 
1241
    """
 
1242
    # but for now, we haven't optimized...
 
1243
    return [canonical_relpath(base, p) for p in paths]
 
1244
 
 
1245
 
 
1246
def decode_filename(filename):
 
1247
    """Decode the filename using the filesystem encoding
 
1248
 
 
1249
    If it is unicode, it is returned.
 
1250
    Otherwise it is decoded from the the filesystem's encoding. If decoding
 
1251
    fails, a errors.BadFilenameEncoding exception is raised.
 
1252
    """
 
1253
    if type(filename) is unicode:
 
1254
        return filename
 
1255
    try:
 
1256
        return filename.decode(_fs_enc)
 
1257
    except UnicodeDecodeError:
 
1258
        raise errors.BadFilenameEncoding(filename, _fs_enc)
 
1259
 
 
1260
 
944
1261
def safe_unicode(unicode_or_utf8_string):
945
1262
    """Coerce unicode_or_utf8_string into unicode.
946
1263
 
947
1264
    If it is unicode, it is returned.
948
 
    Otherwise it is decoded from utf-8. If a decoding error
949
 
    occurs, it is wrapped as a If the decoding fails, the exception is wrapped 
950
 
    as a BzrBadParameter exception.
 
1265
    Otherwise it is decoded from utf-8. If decoding fails, the exception is
 
1266
    wrapped in a BzrBadParameterNotUnicode exception.
951
1267
    """
952
1268
    if isinstance(unicode_or_utf8_string, unicode):
953
1269
        return unicode_or_utf8_string
1030
1346
def normalizes_filenames():
1031
1347
    """Return True if this platform normalizes unicode filenames.
1032
1348
 
1033
 
    Mac OSX does, Windows/Linux do not.
 
1349
    Only Mac OSX.
1034
1350
    """
1035
1351
    return _platform_normalizes_filenames
1036
1352
 
1040
1356
 
1041
1357
    On platforms where the system normalizes filenames (Mac OSX),
1042
1358
    you can access a file by any path which will normalize correctly.
1043
 
    On platforms where the system does not normalize filenames 
1044
 
    (Windows, Linux), you have to access a file by its exact path.
 
1359
    On platforms where the system does not normalize filenames
 
1360
    (everything else), you have to access a file by its exact path.
1045
1361
 
1046
 
    Internally, bzr only supports NFC normalization, since that is 
 
1362
    Internally, bzr only supports NFC normalization, since that is
1047
1363
    the standard for XML documents.
1048
1364
 
1049
1365
    So return the normalized path, and a flag indicating if the file
1066
1382
    normalized_filename = _inaccessible_normalized_filename
1067
1383
 
1068
1384
 
 
1385
def set_signal_handler(signum, handler, restart_syscall=True):
 
1386
    """A wrapper for signal.signal that also calls siginterrupt(signum, False)
 
1387
    on platforms that support that.
 
1388
 
 
1389
    :param restart_syscall: if set, allow syscalls interrupted by a signal to
 
1390
        automatically restart (by calling `signal.siginterrupt(signum,
 
1391
        False)`).  May be ignored if the feature is not available on this
 
1392
        platform or Python version.
 
1393
    """
 
1394
    try:
 
1395
        import signal
 
1396
        siginterrupt = signal.siginterrupt
 
1397
    except ImportError:
 
1398
        # This python implementation doesn't provide signal support, hence no
 
1399
        # handler exists
 
1400
        return None
 
1401
    except AttributeError:
 
1402
        # siginterrupt doesn't exist on this platform, or for this version
 
1403
        # of Python.
 
1404
        siginterrupt = lambda signum, flag: None
 
1405
    if restart_syscall:
 
1406
        def sig_handler(*args):
 
1407
            # Python resets the siginterrupt flag when a signal is
 
1408
            # received.  <http://bugs.python.org/issue8354>
 
1409
            # As a workaround for some cases, set it back the way we want it.
 
1410
            siginterrupt(signum, False)
 
1411
            # Now run the handler function passed to set_signal_handler.
 
1412
            handler(*args)
 
1413
    else:
 
1414
        sig_handler = handler
 
1415
    old_handler = signal.signal(signum, sig_handler)
 
1416
    if restart_syscall:
 
1417
        siginterrupt(signum, False)
 
1418
    return old_handler
 
1419
 
 
1420
 
 
1421
default_terminal_width = 80
 
1422
"""The default terminal width for ttys.
 
1423
 
 
1424
This is defined so that higher levels can share a common fallback value when
 
1425
terminal_width() returns None.
 
1426
"""
 
1427
 
 
1428
# Keep some state so that terminal_width can detect if _terminal_size has
 
1429
# returned a different size since the process started.  See docstring and
 
1430
# comments of terminal_width for details.
 
1431
# _terminal_size_state has 3 possible values: no_data, unchanged, and changed.
 
1432
_terminal_size_state = 'no_data'
 
1433
_first_terminal_size = None
 
1434
 
1069
1435
def terminal_width():
1070
 
    """Return estimated terminal width."""
1071
 
    if sys.platform == 'win32':
1072
 
        return win32utils.get_console_size()[0]
1073
 
    width = 0
 
1436
    """Return terminal width.
 
1437
 
 
1438
    None is returned if the width can't established precisely.
 
1439
 
 
1440
    The rules are:
 
1441
    - if BZR_COLUMNS is set, returns its value
 
1442
    - if there is no controlling terminal, returns None
 
1443
    - query the OS, if the queried size has changed since the last query,
 
1444
      return its value,
 
1445
    - if COLUMNS is set, returns its value,
 
1446
    - if the OS has a value (even though it's never changed), return its value.
 
1447
 
 
1448
    From there, we need to query the OS to get the size of the controlling
 
1449
    terminal.
 
1450
 
 
1451
    On Unices we query the OS by:
 
1452
    - get termios.TIOCGWINSZ
 
1453
    - if an error occurs or a negative value is obtained, returns None
 
1454
 
 
1455
    On Windows we query the OS by:
 
1456
    - win32utils.get_console_size() decides,
 
1457
    - returns None on error (provided default value)
 
1458
    """
 
1459
    # Note to implementors: if changing the rules for determining the width,
 
1460
    # make sure you've considered the behaviour in these cases:
 
1461
    #  - M-x shell in emacs, where $COLUMNS is set and TIOCGWINSZ returns 0,0.
 
1462
    #  - bzr log | less, in bash, where $COLUMNS not set and TIOCGWINSZ returns
 
1463
    #    0,0.
 
1464
    #  - (add more interesting cases here, if you find any)
 
1465
    # Some programs implement "Use $COLUMNS (if set) until SIGWINCH occurs",
 
1466
    # but we don't want to register a signal handler because it is impossible
 
1467
    # to do so without risking EINTR errors in Python <= 2.6.5 (see
 
1468
    # <http://bugs.python.org/issue8354>).  Instead we check TIOCGWINSZ every
 
1469
    # time so we can notice if the reported size has changed, which should have
 
1470
    # a similar effect.
 
1471
 
 
1472
    # If BZR_COLUMNS is set, take it, user is always right
 
1473
    # Except if they specified 0 in which case, impose no limit here
 
1474
    try:
 
1475
        width = int(os.environ['BZR_COLUMNS'])
 
1476
    except (KeyError, ValueError):
 
1477
        width = None
 
1478
    if width is not None:
 
1479
        if width > 0:
 
1480
            return width
 
1481
        else:
 
1482
            return None
 
1483
 
 
1484
    isatty = getattr(sys.stdout, 'isatty', None)
 
1485
    if isatty is None or not isatty():
 
1486
        # Don't guess, setting BZR_COLUMNS is the recommended way to override.
 
1487
        return None
 
1488
 
 
1489
    # Query the OS
 
1490
    width, height = os_size = _terminal_size(None, None)
 
1491
    global _first_terminal_size, _terminal_size_state
 
1492
    if _terminal_size_state == 'no_data':
 
1493
        _first_terminal_size = os_size
 
1494
        _terminal_size_state = 'unchanged'
 
1495
    elif (_terminal_size_state == 'unchanged' and
 
1496
          _first_terminal_size != os_size):
 
1497
        _terminal_size_state = 'changed'
 
1498
 
 
1499
    # If the OS claims to know how wide the terminal is, and this value has
 
1500
    # ever changed, use that.
 
1501
    if _terminal_size_state == 'changed':
 
1502
        if width is not None and width > 0:
 
1503
            return width
 
1504
 
 
1505
    # If COLUMNS is set, use it.
 
1506
    try:
 
1507
        return int(os.environ['COLUMNS'])
 
1508
    except (KeyError, ValueError):
 
1509
        pass
 
1510
 
 
1511
    # Finally, use an unchanged size from the OS, if we have one.
 
1512
    if _terminal_size_state == 'unchanged':
 
1513
        if width is not None and width > 0:
 
1514
            return width
 
1515
 
 
1516
    # The width could not be determined.
 
1517
    return None
 
1518
 
 
1519
 
 
1520
def _win32_terminal_size(width, height):
 
1521
    width, height = win32utils.get_console_size(defaultx=width, defaulty=height)
 
1522
    return width, height
 
1523
 
 
1524
 
 
1525
def _ioctl_terminal_size(width, height):
1074
1526
    try:
1075
1527
        import struct, fcntl, termios
1076
1528
        s = struct.pack('HHHH', 0, 0, 0, 0)
1077
1529
        x = fcntl.ioctl(1, termios.TIOCGWINSZ, s)
1078
 
        width = struct.unpack('HHHH', x)[1]
1079
 
    except IOError:
 
1530
        height, width = struct.unpack('HHHH', x)[0:2]
 
1531
    except (IOError, AttributeError):
1080
1532
        pass
1081
 
    if width <= 0:
1082
 
        try:
1083
 
            width = int(os.environ['COLUMNS'])
1084
 
        except:
1085
 
            pass
1086
 
    if width <= 0:
1087
 
        width = 80
1088
 
 
1089
 
    return width
 
1533
    return width, height
 
1534
 
 
1535
_terminal_size = None
 
1536
"""Returns the terminal size as (width, height).
 
1537
 
 
1538
:param width: Default value for width.
 
1539
:param height: Default value for height.
 
1540
 
 
1541
This is defined specifically for each OS and query the size of the controlling
 
1542
terminal. If any error occurs, the provided default values should be returned.
 
1543
"""
 
1544
if sys.platform == 'win32':
 
1545
    _terminal_size = _win32_terminal_size
 
1546
else:
 
1547
    _terminal_size = _ioctl_terminal_size
1090
1548
 
1091
1549
 
1092
1550
def supports_executable():
1129
1587
 
1130
1588
 
1131
1589
def check_legal_path(path):
1132
 
    """Check whether the supplied path is legal.  
 
1590
    """Check whether the supplied path is legal.
1133
1591
    This is only required on Windows, so we don't test on other platforms
1134
1592
    right now.
1135
1593
    """
1169
1627
 
1170
1628
def walkdirs(top, prefix=""):
1171
1629
    """Yield data about all the directories in a tree.
1172
 
    
 
1630
 
1173
1631
    This yields all the data about the contents of a directory at a time.
1174
1632
    After each directory has been yielded, if the caller has mutated the list
1175
1633
    to exclude some directories, they are then not descended into.
1176
 
    
 
1634
 
1177
1635
    The data yielded is of the form:
1178
1636
    ((directory-relpath, directory-path-from-top),
1179
1637
    [(relpath, basename, kind, lstat, path-from-top), ...]),
1180
1638
     - directory-relpath is the relative path of the directory being returned
1181
1639
       with respect to top. prefix is prepended to this.
1182
 
     - directory-path-from-root is the path including top for this directory. 
 
1640
     - directory-path-from-root is the path including top for this directory.
1183
1641
       It is suitable for use with os functions.
1184
1642
     - relpath is the relative path within the subtree being walked.
1185
1643
     - basename is the basename of the path
1187
1645
       present within the tree - but it may be recorded as versioned. See
1188
1646
       versioned_kind.
1189
1647
     - lstat is the stat data *if* the file was statted.
1190
 
     - planned, not implemented: 
 
1648
     - planned, not implemented:
1191
1649
       path_from_tree_root is the path from the root of the tree.
1192
1650
 
1193
 
    :param prefix: Prefix the relpaths that are yielded with 'prefix'. This 
 
1651
    :param prefix: Prefix the relpaths that are yielded with 'prefix'. This
1194
1652
        allows one to walk a subtree but get paths that are relative to a tree
1195
1653
        rooted higher up.
1196
1654
    :return: an iterator over the dirs.
1197
1655
    """
1198
1656
    #TODO there is a bit of a smell where the results of the directory-
1199
 
    # summary in this, and the path from the root, may not agree 
 
1657
    # summary in this, and the path from the root, may not agree
1200
1658
    # depending on top and prefix - i.e. ./foo and foo as a pair leads to
1201
1659
    # potentially confusing output. We should make this more robust - but
1202
1660
    # not at a speed cost. RBC 20060731
1217
1675
        dirblock = []
1218
1676
        append = dirblock.append
1219
1677
        try:
1220
 
            names = sorted(_listdir(top))
 
1678
            names = sorted(map(decode_filename, _listdir(top)))
1221
1679
        except OSError, e:
1222
1680
            if not _is_error_enotdir(e):
1223
1681
                raise
1286
1744
            #       for win98 anyway.
1287
1745
            try:
1288
1746
                from bzrlib._walkdirs_win32 import Win32ReadDir
1289
 
            except ImportError:
1290
 
                _selected_dir_reader = UnicodeDirReader()
1291
 
            else:
1292
1747
                _selected_dir_reader = Win32ReadDir()
1293
 
        elif fs_encoding not in ('UTF-8', 'US-ASCII', 'ANSI_X3.4-1968'):
 
1748
            except ImportError:
 
1749
                pass
 
1750
        elif fs_encoding in ('UTF-8', 'US-ASCII', 'ANSI_X3.4-1968'):
1294
1751
            # ANSI_X3.4-1968 is a form of ASCII
1295
 
            _selected_dir_reader = UnicodeDirReader()
1296
 
        else:
1297
1752
            try:
1298
1753
                from bzrlib._readdir_pyx import UTF8DirReader
1299
 
            except ImportError:
1300
 
                # No optimised code path
1301
 
                _selected_dir_reader = UnicodeDirReader()
1302
 
            else:
1303
1754
                _selected_dir_reader = UTF8DirReader()
 
1755
            except ImportError, e:
 
1756
                failed_to_load_extension(e)
 
1757
                pass
 
1758
 
 
1759
    if _selected_dir_reader is None:
 
1760
        # Fallback to the python version
 
1761
        _selected_dir_reader = UnicodeDirReader()
 
1762
 
1304
1763
    # 0 - relpath, 1- basename, 2- kind, 3- stat, 4-toppath
1305
1764
    # But we don't actually uses 1-3 in pending, so set them to None
1306
1765
    pending = [[_selected_dir_reader.top_prefix_to_starting_dir(top, prefix)]]
1372
1831
def copy_tree(from_path, to_path, handlers={}):
1373
1832
    """Copy all of the entries in from_path into to_path.
1374
1833
 
1375
 
    :param from_path: The base directory to copy. 
 
1834
    :param from_path: The base directory to copy.
1376
1835
    :param to_path: The target directory. If it does not exist, it will
1377
1836
        be created.
1378
1837
    :param handlers: A dictionary of functions, which takes a source and
1411
1870
            real_handlers[kind](abspath, relpath)
1412
1871
 
1413
1872
 
 
1873
def copy_ownership_from_path(dst, src=None):
 
1874
    """Copy usr/grp ownership from src file/dir to dst file/dir.
 
1875
 
 
1876
    If src is None, the containing directory is used as source. If chown
 
1877
    fails, the error is ignored and a warning is printed.
 
1878
    """
 
1879
    chown = getattr(os, 'chown', None)
 
1880
    if chown is None:
 
1881
        return
 
1882
 
 
1883
    if src == None:
 
1884
        src = os.path.dirname(dst)
 
1885
        if src == '':
 
1886
            src = '.'
 
1887
 
 
1888
    try:
 
1889
        s = os.stat(src)
 
1890
        chown(dst, s.st_uid, s.st_gid)
 
1891
    except OSError, e:
 
1892
        trace.warning(
 
1893
            'Unable to copy ownership from "%s" to "%s". '
 
1894
            'You may want to set it manually.', src, dst)
 
1895
        trace.log_exception_quietly()
 
1896
 
 
1897
 
1414
1898
def path_prefix_key(path):
1415
1899
    """Generate a prefix-order path key for path.
1416
1900
 
1502
1986
    return user_encoding
1503
1987
 
1504
1988
 
 
1989
def get_diff_header_encoding():
 
1990
    return get_terminal_encoding()
 
1991
 
 
1992
 
1505
1993
def get_host_name():
1506
1994
    """Return the current unicode host name.
1507
1995
 
1516
2004
        return socket.gethostname().decode(get_user_encoding())
1517
2005
 
1518
2006
 
1519
 
def recv_all(socket, bytes):
 
2007
# We must not read/write any more than 64k at a time from/to a socket so we
 
2008
# don't risk "no buffer space available" errors on some platforms.  Windows in
 
2009
# particular is likely to throw WSAECONNABORTED or WSAENOBUFS if given too much
 
2010
# data at once.
 
2011
MAX_SOCKET_CHUNK = 64 * 1024
 
2012
 
 
2013
_end_of_stream_errors = [errno.ECONNRESET]
 
2014
for _eno in ['WSAECONNRESET', 'WSAECONNABORTED']:
 
2015
    _eno = getattr(errno, _eno, None)
 
2016
    if _eno is not None:
 
2017
        _end_of_stream_errors.append(_eno)
 
2018
del _eno
 
2019
 
 
2020
 
 
2021
def read_bytes_from_socket(sock, report_activity=None,
 
2022
        max_read_size=MAX_SOCKET_CHUNK):
 
2023
    """Read up to max_read_size of bytes from sock and notify of progress.
 
2024
 
 
2025
    Translates "Connection reset by peer" into file-like EOF (return an
 
2026
    empty string rather than raise an error), and repeats the recv if
 
2027
    interrupted by a signal.
 
2028
    """
 
2029
    while 1:
 
2030
        try:
 
2031
            bytes = sock.recv(max_read_size)
 
2032
        except socket.error, e:
 
2033
            eno = e.args[0]
 
2034
            if eno in _end_of_stream_errors:
 
2035
                # The connection was closed by the other side.  Callers expect
 
2036
                # an empty string to signal end-of-stream.
 
2037
                return ""
 
2038
            elif eno == errno.EINTR:
 
2039
                # Retry the interrupted recv.
 
2040
                continue
 
2041
            raise
 
2042
        else:
 
2043
            if report_activity is not None:
 
2044
                report_activity(len(bytes), 'read')
 
2045
            return bytes
 
2046
 
 
2047
 
 
2048
def recv_all(socket, count):
1520
2049
    """Receive an exact number of bytes.
1521
2050
 
1522
2051
    Regular Socket.recv() may return less than the requested number of bytes,
1523
 
    dependning on what's in the OS buffer.  MSG_WAITALL is not available
 
2052
    depending on what's in the OS buffer.  MSG_WAITALL is not available
1524
2053
    on all platforms, but this should work everywhere.  This will return
1525
2054
    less than the requested amount if the remote end closes.
1526
2055
 
1527
2056
    This isn't optimized and is intended mostly for use in testing.
1528
2057
    """
1529
2058
    b = ''
1530
 
    while len(b) < bytes:
1531
 
        new = socket.recv(bytes - len(b))
 
2059
    while len(b) < count:
 
2060
        new = read_bytes_from_socket(socket, None, count - len(b))
1532
2061
        if new == '':
1533
2062
            break # eof
1534
2063
        b += new
1535
2064
    return b
1536
2065
 
1537
2066
 
1538
 
def send_all(socket, bytes):
 
2067
def send_all(sock, bytes, report_activity=None):
1539
2068
    """Send all bytes on a socket.
1540
2069
 
1541
 
    Regular socket.sendall() can give socket error 10053 on Windows.  This
1542
 
    implementation sends no more than 64k at a time, which avoids this problem.
 
2070
    Breaks large blocks in smaller chunks to avoid buffering limitations on
 
2071
    some platforms, and catches EINTR which may be thrown if the send is
 
2072
    interrupted by a signal.
 
2073
 
 
2074
    This is preferred to socket.sendall(), because it avoids portability bugs
 
2075
    and provides activity reporting.
 
2076
 
 
2077
    :param report_activity: Call this as bytes are read, see
 
2078
        Transport._report_activity
1543
2079
    """
1544
 
    chunk_size = 2**16
1545
 
    for pos in xrange(0, len(bytes), chunk_size):
1546
 
        socket.sendall(bytes[pos:pos+chunk_size])
 
2080
    sent_total = 0
 
2081
    byte_count = len(bytes)
 
2082
    while sent_total < byte_count:
 
2083
        try:
 
2084
            sent = sock.send(buffer(bytes, sent_total, MAX_SOCKET_CHUNK))
 
2085
        except socket.error, e:
 
2086
            if e.args[0] != errno.EINTR:
 
2087
                raise
 
2088
        else:
 
2089
            sent_total += sent
 
2090
            report_activity(sent, 'write')
 
2091
 
 
2092
 
 
2093
def connect_socket(address):
 
2094
    # Slight variation of the socket.create_connection() function (provided by
 
2095
    # python-2.6) that can fail if getaddrinfo returns an empty list. We also
 
2096
    # provide it for previous python versions. Also, we don't use the timeout
 
2097
    # parameter (provided by the python implementation) so we don't implement
 
2098
    # it either).
 
2099
    err = socket.error('getaddrinfo returns an empty list')
 
2100
    host, port = address
 
2101
    for res in socket.getaddrinfo(host, port, 0, socket.SOCK_STREAM):
 
2102
        af, socktype, proto, canonname, sa = res
 
2103
        sock = None
 
2104
        try:
 
2105
            sock = socket.socket(af, socktype, proto)
 
2106
            sock.connect(sa)
 
2107
            return sock
 
2108
 
 
2109
        except socket.error, err:
 
2110
            # 'err' is now the most recent error
 
2111
            if sock is not None:
 
2112
                sock.close()
 
2113
    raise err
1547
2114
 
1548
2115
 
1549
2116
def dereference_path(path):
1590
2157
    base = dirname(bzrlib.__file__)
1591
2158
    if getattr(sys, 'frozen', None):    # bzr.exe
1592
2159
        base = abspath(pathjoin(base, '..', '..'))
1593
 
    filename = pathjoin(base, resource_relpath)
1594
 
    return open(filename, 'rU').read()
1595
 
 
 
2160
    f = file(pathjoin(base, resource_relpath), "rU")
 
2161
    try:
 
2162
        return f.read()
 
2163
    finally:
 
2164
        f.close()
1596
2165
 
1597
2166
def file_kind_from_stat_mode_thunk(mode):
1598
2167
    global file_kind_from_stat_mode
1600
2169
        try:
1601
2170
            from bzrlib._readdir_pyx import UTF8DirReader
1602
2171
            file_kind_from_stat_mode = UTF8DirReader().kind_from_mode
1603
 
        except ImportError:
 
2172
        except ImportError, e:
 
2173
            # This is one time where we won't warn that an extension failed to
 
2174
            # load. The extension is never available on Windows anyway.
1604
2175
            from bzrlib._readdir_py import (
1605
2176
                _kind_from_mode as file_kind_from_stat_mode
1606
2177
                )
1617
2188
        raise
1618
2189
 
1619
2190
 
 
2191
def until_no_eintr(f, *a, **kw):
 
2192
    """Run f(*a, **kw), retrying if an EINTR error occurs.
 
2193
 
 
2194
    WARNING: you must be certain that it is safe to retry the call repeatedly
 
2195
    if EINTR does occur.  This is typically only true for low-level operations
 
2196
    like os.read.  If in any doubt, don't use this.
 
2197
 
 
2198
    Keep in mind that this is not a complete solution to EINTR.  There is
 
2199
    probably code in the Python standard library and other dependencies that
 
2200
    may encounter EINTR if a signal arrives (and there is signal handler for
 
2201
    that signal).  So this function can reduce the impact for IO that bzrlib
 
2202
    directly controls, but it is not a complete solution.
 
2203
    """
 
2204
    # Borrowed from Twisted's twisted.python.util.untilConcludes function.
 
2205
    while True:
 
2206
        try:
 
2207
            return f(*a, **kw)
 
2208
        except (IOError, OSError), e:
 
2209
            if e.errno == errno.EINTR:
 
2210
                continue
 
2211
            raise
 
2212
 
 
2213
 
 
2214
@deprecated_function(deprecated_in((2, 2, 0)))
 
2215
def re_compile_checked(re_string, flags=0, where=""):
 
2216
    """Return a compiled re, or raise a sensible error.
 
2217
 
 
2218
    This should only be used when compiling user-supplied REs.
 
2219
 
 
2220
    :param re_string: Text form of regular expression.
 
2221
    :param flags: eg re.IGNORECASE
 
2222
    :param where: Message explaining to the user the context where
 
2223
        it occurred, eg 'log search filter'.
 
2224
    """
 
2225
    # from https://bugs.launchpad.net/bzr/+bug/251352
 
2226
    try:
 
2227
        re_obj = re.compile(re_string, flags)
 
2228
        re_obj.search("")
 
2229
        return re_obj
 
2230
    except errors.InvalidPattern, e:
 
2231
        if where:
 
2232
            where = ' in ' + where
 
2233
        # despite the name 'error' is a type
 
2234
        raise errors.BzrCommandError('Invalid regular expression%s: %s'
 
2235
            % (where, e.msg))
 
2236
 
 
2237
 
 
2238
if sys.platform == "win32":
 
2239
    import msvcrt
 
2240
    def getchar():
 
2241
        return msvcrt.getch()
 
2242
else:
 
2243
    import tty
 
2244
    import termios
 
2245
    def getchar():
 
2246
        fd = sys.stdin.fileno()
 
2247
        settings = termios.tcgetattr(fd)
 
2248
        try:
 
2249
            tty.setraw(fd)
 
2250
            ch = sys.stdin.read(1)
 
2251
        finally:
 
2252
            termios.tcsetattr(fd, termios.TCSADRAIN, settings)
 
2253
        return ch
 
2254
 
 
2255
if sys.platform == 'linux2':
 
2256
    def _local_concurrency():
 
2257
        try:
 
2258
            return os.sysconf('SC_NPROCESSORS_ONLN')
 
2259
        except (ValueError, OSError, AttributeError):
 
2260
            return None
 
2261
elif sys.platform == 'darwin':
 
2262
    def _local_concurrency():
 
2263
        return subprocess.Popen(['sysctl', '-n', 'hw.availcpu'],
 
2264
                                stdout=subprocess.PIPE).communicate()[0]
 
2265
elif "bsd" in sys.platform:
 
2266
    def _local_concurrency():
 
2267
        return subprocess.Popen(['sysctl', '-n', 'hw.ncpu'],
 
2268
                                stdout=subprocess.PIPE).communicate()[0]
 
2269
elif sys.platform == 'sunos5':
 
2270
    def _local_concurrency():
 
2271
        return subprocess.Popen(['psrinfo', '-p',],
 
2272
                                stdout=subprocess.PIPE).communicate()[0]
 
2273
elif sys.platform == "win32":
 
2274
    def _local_concurrency():
 
2275
        # This appears to return the number of cores.
 
2276
        return os.environ.get('NUMBER_OF_PROCESSORS')
 
2277
else:
 
2278
    def _local_concurrency():
 
2279
        # Who knows ?
 
2280
        return None
 
2281
 
 
2282
 
 
2283
_cached_local_concurrency = None
 
2284
 
 
2285
def local_concurrency(use_cache=True):
 
2286
    """Return how many processes can be run concurrently.
 
2287
 
 
2288
    Rely on platform specific implementations and default to 1 (one) if
 
2289
    anything goes wrong.
 
2290
    """
 
2291
    global _cached_local_concurrency
 
2292
 
 
2293
    if _cached_local_concurrency is not None and use_cache:
 
2294
        return _cached_local_concurrency
 
2295
 
 
2296
    concurrency = os.environ.get('BZR_CONCURRENCY', None)
 
2297
    if concurrency is None:
 
2298
        try:
 
2299
            import multiprocessing
 
2300
        except ImportError:
 
2301
            # multiprocessing is only available on Python >= 2.6
 
2302
            try:
 
2303
                concurrency = _local_concurrency()
 
2304
            except (OSError, IOError):
 
2305
                pass
 
2306
        else:
 
2307
            concurrency = multiprocessing.cpu_count()
 
2308
    try:
 
2309
        concurrency = int(concurrency)
 
2310
    except (TypeError, ValueError):
 
2311
        concurrency = 1
 
2312
    if use_cache:
 
2313
        _cached_concurrency = concurrency
 
2314
    return concurrency
 
2315
 
 
2316
 
 
2317
class UnicodeOrBytesToBytesWriter(codecs.StreamWriter):
 
2318
    """A stream writer that doesn't decode str arguments."""
 
2319
 
 
2320
    def __init__(self, encode, stream, errors='strict'):
 
2321
        codecs.StreamWriter.__init__(self, stream, errors)
 
2322
        self.encode = encode
 
2323
 
 
2324
    def write(self, object):
 
2325
        if type(object) is str:
 
2326
            self.stream.write(object)
 
2327
        else:
 
2328
            data, _ = self.encode(object, self.errors)
 
2329
            self.stream.write(data)
 
2330
 
 
2331
if sys.platform == 'win32':
 
2332
    def open_file(filename, mode='r', bufsize=-1):
 
2333
        """This function is used to override the ``open`` builtin.
 
2334
 
 
2335
        But it uses O_NOINHERIT flag so the file handle is not inherited by
 
2336
        child processes.  Deleting or renaming a closed file opened with this
 
2337
        function is not blocking child processes.
 
2338
        """
 
2339
        writing = 'w' in mode
 
2340
        appending = 'a' in mode
 
2341
        updating = '+' in mode
 
2342
        binary = 'b' in mode
 
2343
 
 
2344
        flags = O_NOINHERIT
 
2345
        # see http://msdn.microsoft.com/en-us/library/yeby3zcb%28VS.71%29.aspx
 
2346
        # for flags for each modes.
 
2347
        if binary:
 
2348
            flags |= O_BINARY
 
2349
        else:
 
2350
            flags |= O_TEXT
 
2351
 
 
2352
        if writing:
 
2353
            if updating:
 
2354
                flags |= os.O_RDWR
 
2355
            else:
 
2356
                flags |= os.O_WRONLY
 
2357
            flags |= os.O_CREAT | os.O_TRUNC
 
2358
        elif appending:
 
2359
            if updating:
 
2360
                flags |= os.O_RDWR
 
2361
            else:
 
2362
                flags |= os.O_WRONLY
 
2363
            flags |= os.O_CREAT | os.O_APPEND
 
2364
        else: #reading
 
2365
            if updating:
 
2366
                flags |= os.O_RDWR
 
2367
            else:
 
2368
                flags |= os.O_RDONLY
 
2369
 
 
2370
        return os.fdopen(os.open(filename, flags), mode, bufsize)
 
2371
else:
 
2372
    open_file = open
 
2373
 
 
2374
 
 
2375
def getuser_unicode():
 
2376
    """Return the username as unicode.
 
2377
    """
 
2378
    try:
 
2379
        user_encoding = get_user_encoding()
 
2380
        username = getpass.getuser().decode(user_encoding)
 
2381
    except UnicodeDecodeError:
 
2382
        raise errors.BzrError("Can't decode username as %s." % \
 
2383
                user_encoding)
 
2384
    except ImportError, e:
 
2385
        if sys.platform != 'win32':
 
2386
            raise
 
2387
        if str(e) != 'No module named pwd':
 
2388
            raise
 
2389
        # https://bugs.launchpad.net/bzr/+bug/660174
 
2390
        # getpass.getuser() is unable to return username on Windows
 
2391
        # if there is no USERNAME environment variable set.
 
2392
        # That could be true if bzr is running as a service,
 
2393
        # e.g. running `bzr serve` as a service on Windows.
 
2394
        # We should not fail with traceback in this case.
 
2395
        username = u'UNKNOWN'
 
2396
    return username
 
2397
 
 
2398
 
 
2399
def available_backup_name(base, exists):
 
2400
    """Find a non-existing backup file name.
 
2401
 
 
2402
    This will *not* create anything, this only return a 'free' entry.  This
 
2403
    should be used for checking names in a directory below a locked
 
2404
    tree/branch/repo to avoid race conditions. This is LBYL (Look Before You
 
2405
    Leap) and generally discouraged.
 
2406
 
 
2407
    :param base: The base name.
 
2408
 
 
2409
    :param exists: A callable returning True if the path parameter exists.
 
2410
    """
 
2411
    counter = 1
 
2412
    name = "%s.~%d~" % (base, counter)
 
2413
    while exists(name):
 
2414
        counter += 1
 
2415
        name = "%s.~%d~" % (base, counter)
 
2416
    return name
 
2417
 
 
2418
 
 
2419
def set_fd_cloexec(fd):
 
2420
    """Set a Unix file descriptor's FD_CLOEXEC flag.  Do nothing if platform
 
2421
    support for this is not available.
 
2422
    """
 
2423
    try:
 
2424
        import fcntl
 
2425
        old = fcntl.fcntl(fd, fcntl.F_GETFD)
 
2426
        fcntl.fcntl(fd, fcntl.F_SETFD, old | fcntl.FD_CLOEXEC)
 
2427
    except (ImportError, AttributeError):
 
2428
        # Either the fcntl module or specific constants are not present
 
2429
        pass
 
2430
 
 
2431
 
 
2432
def find_executable_on_path(name):
 
2433
    """Finds an executable on the PATH.
 
2434
    
 
2435
    On Windows, this will try to append each extension in the PATHEXT
 
2436
    environment variable to the name, if it cannot be found with the name
 
2437
    as given.
 
2438
    
 
2439
    :param name: The base name of the executable.
 
2440
    :return: The path to the executable found or None.
 
2441
    """
 
2442
    path = os.environ.get('PATH')
 
2443
    if path is None:
 
2444
        return None
 
2445
    path = path.split(os.pathsep)
 
2446
    if sys.platform == 'win32':
 
2447
        exts = os.environ.get('PATHEXT', '').split(os.pathsep)
 
2448
        exts = [ext.lower() for ext in exts]
 
2449
        base, ext = os.path.splitext(name)
 
2450
        if ext != '':
 
2451
            if ext.lower() not in exts:
 
2452
                return None
 
2453
            name = base
 
2454
            exts = [ext]
 
2455
    else:
 
2456
        exts = ['']
 
2457
    for ext in exts:
 
2458
        for d in path:
 
2459
            f = os.path.join(d, name) + ext
 
2460
            if os.access(f, os.X_OK):
 
2461
                return f
 
2462
    return None
 
2463
 
 
2464
 
 
2465
def _posix_is_local_pid_dead(pid):
 
2466
    """True if pid doesn't correspond to live process on this machine"""
 
2467
    try:
 
2468
        # Special meaning of unix kill: just check if it's there.
 
2469
        os.kill(pid, 0)
 
2470
    except OSError, e:
 
2471
        if e.errno == errno.ESRCH:
 
2472
            # On this machine, and really not found: as sure as we can be
 
2473
            # that it's dead.
 
2474
            return True
 
2475
        elif e.errno == errno.EPERM:
 
2476
            # exists, though not ours
 
2477
            return False
 
2478
        else:
 
2479
            mutter("os.kill(%d, 0) failed: %s" % (pid, e))
 
2480
            # Don't really know.
 
2481
            return False
 
2482
    else:
 
2483
        # Exists and our process: not dead.
 
2484
        return False
 
2485
 
 
2486
if sys.platform == "win32":
 
2487
    is_local_pid_dead = win32utils.is_local_pid_dead
 
2488
else:
 
2489
    is_local_pid_dead = _posix_is_local_pid_dead
 
2490
 
 
2491
 
 
2492
def fdatasync(fileno):
 
2493
    """Flush file contents to disk if possible.
 
2494
    
 
2495
    :param fileno: Integer OS file handle.
 
2496
    :raises TransportNotPossible: If flushing to disk is not possible.
 
2497
    """
 
2498
    fn = getattr(os, 'fdatasync', getattr(os, 'fsync', None))
 
2499
    if fn is not None:
 
2500
        fn(fileno)