/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: John Arbash Meinel
  • Date: 2008-09-05 03:11:40 UTC
  • mfrom: (3691 +trunk)
  • mto: (3697.7.4 1.7)
  • mto: This revision was merged to the branch mainline in revision 3748.
  • Revision ID: john@arbash-meinel.com-20080905031140-hj0adlcf30l7i99v
Merge in bzr.dev 3691

Show diffs side-by-side

added added

removed removed

Lines of Context:
569
569
    return length
570
570
 
571
571
 
 
572
def pump_string_file(bytes, file_handle, segment_size=None):
 
573
    """Write bytes to file_handle in many smaller writes.
 
574
 
 
575
    :param bytes: The string to write.
 
576
    :param file_handle: The file to write to.
 
577
    """
 
578
    # Write data in chunks rather than all at once, because very large
 
579
    # writes fail on some platforms (e.g. Windows with SMB  mounted
 
580
    # drives).
 
581
    if not segment_size:
 
582
        segment_size = 5242880 # 5MB
 
583
    segments = range(len(bytes) / segment_size + 1)
 
584
    write = file_handle.write
 
585
    for segment_index in segments:
 
586
        segment = buffer(bytes, segment_index * segment_size, segment_size)
 
587
        write(segment)
 
588
 
 
589
 
572
590
def file_iterator(input_file, readsize=32768):
573
591
    while True:
574
592
        b = input_file.read(readsize)
1119
1137
        raise errors.IllegalPath(path)
1120
1138
 
1121
1139
 
 
1140
_WIN32_ERROR_DIRECTORY = 267 # Similar to errno.ENOTDIR
 
1141
 
 
1142
def _is_error_enotdir(e):
 
1143
    """Check if this exception represents ENOTDIR.
 
1144
 
 
1145
    Unfortunately, python is very inconsistent about the exception
 
1146
    here. The cases are:
 
1147
      1) Linux, Mac OSX all versions seem to set errno == ENOTDIR
 
1148
      2) Windows, Python2.4, uses errno == ERROR_DIRECTORY (267)
 
1149
         which is the windows error code.
 
1150
      3) Windows, Python2.5 uses errno == EINVAL and
 
1151
         winerror == ERROR_DIRECTORY
 
1152
 
 
1153
    :param e: An Exception object (expected to be OSError with an errno
 
1154
        attribute, but we should be able to cope with anything)
 
1155
    :return: True if this represents an ENOTDIR error. False otherwise.
 
1156
    """
 
1157
    en = getattr(e, 'errno', None)
 
1158
    if (en == errno.ENOTDIR
 
1159
        or (sys.platform == 'win32'
 
1160
            and (en == _WIN32_ERROR_DIRECTORY
 
1161
                 or (en == errno.EINVAL
 
1162
                     and getattr(e, 'winerror', None) == _WIN32_ERROR_DIRECTORY)
 
1163
        ))):
 
1164
        return True
 
1165
    return False
 
1166
 
 
1167
 
1122
1168
def walkdirs(top, prefix=""):
1123
1169
    """Yield data about all the directories in a tree.
1124
1170
    
1168
1214
 
1169
1215
        dirblock = []
1170
1216
        append = dirblock.append
1171
 
        for name in sorted(_listdir(top)):
1172
 
            abspath = top_slash + name
1173
 
            statvalue = _lstat(abspath)
1174
 
            kind = _kind_from_mode(statvalue.st_mode & 0170000, 'unknown')
1175
 
            append((relprefix + name, name, kind, statvalue, abspath))
 
1217
        try:
 
1218
            names = sorted(_listdir(top))
 
1219
        except OSError, e:
 
1220
            if not _is_error_enotdir(e):
 
1221
                raise
 
1222
        else:
 
1223
            for name in names:
 
1224
                abspath = top_slash + name
 
1225
                statvalue = _lstat(abspath)
 
1226
                kind = _kind_from_mode(statvalue.st_mode & 0170000, 'unknown')
 
1227
                append((relprefix + name, name, kind, statvalue, abspath))
1176
1228
        yield (relroot, top), dirblock
1177
1229
 
1178
1230
        # push the user specified dirs from dirblock
1226
1278
    """
1227
1279
    _lstat = os.lstat
1228
1280
    _directory = _directory_kind
1229
 
    _listdir = os.listdir
 
1281
    # Use C accelerated directory listing.
 
1282
    _listdir = _read_dir
1230
1283
    _kind_from_mode = _formats.get
1231
1284
 
1232
1285
    # 0 - relpath, 1- basename, 2- kind, 3- stat, 4-toppath
1242
1295
 
1243
1296
        dirblock = []
1244
1297
        append = dirblock.append
1245
 
        for name in sorted(_listdir(top)):
 
1298
        # read_dir supplies in should-stat order.
 
1299
        for _, name in sorted(_listdir(top)):
1246
1300
            abspath = top_slash + name
1247
1301
            statvalue = _lstat(abspath)
1248
1302
            kind = _kind_from_mode(statvalue.st_mode & 0170000, 'unknown')
1249
1303
            append((relprefix + name, name, kind, statvalue, abspath))
 
1304
        dirblock.sort()
1250
1305
        yield (relroot, top), dirblock
1251
1306
 
1252
1307
        # push the user specified dirs from dirblock
1415
1470
    return user_encoding
1416
1471
 
1417
1472
 
 
1473
def get_host_name():
 
1474
    """Return the current unicode host name.
 
1475
 
 
1476
    This is meant to be used in place of socket.gethostname() because that
 
1477
    behaves inconsistently on different platforms.
 
1478
    """
 
1479
    if sys.platform == "win32":
 
1480
        import win32utils
 
1481
        return win32utils.get_host_name()
 
1482
    else:
 
1483
        import socket
 
1484
        return socket.gethostname().decode(get_user_encoding())
 
1485
 
 
1486
 
1418
1487
def recv_all(socket, bytes):
1419
1488
    """Receive an exact number of bytes.
1420
1489
 
1491
1560
        base = abspath(pathjoin(base, '..', '..'))
1492
1561
    filename = pathjoin(base, resource_relpath)
1493
1562
    return open(filename, 'rU').read()
 
1563
 
 
1564
 
 
1565
try:
 
1566
    from bzrlib._readdir_pyx import read_dir as _read_dir
 
1567
except ImportError:
 
1568
    from bzrlib._readdir_py import read_dir as _read_dir