~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: 2009-02-23 17:00:36 UTC
  • mfrom: (4032.1.4 jam-integration)
  • Revision ID: pqm@pqm.ubuntu.com-20090223170036-3q1v68ewdt8i0to5
(Marius Kruger) Remove all trailing whitespace and add tests to
        enforce this.

Show diffs side-by-side

added added

removed removed

Lines of Context:
121
121
    global _QUOTE_RE
122
122
    if _QUOTE_RE is None:
123
123
        _QUOTE_RE = re.compile(r'([^a-zA-Z0-9.,:/\\_~-])')
124
 
        
 
124
 
125
125
    if _QUOTE_RE.search(f):
126
126
        return '"' + f + '"'
127
127
    else:
171
171
 
172
172
def fancy_rename(old, new, rename_func, unlink_func):
173
173
    """A fancy rename, when you don't have atomic rename.
174
 
    
 
174
 
175
175
    :param old: The old path, to rename from
176
176
    :param new: The new path, to rename to
177
177
    :param rename_func: The potentially non-atomic rename function
317
317
    """We expect to be able to atomically replace 'new' with old.
318
318
 
319
319
    On win32, if new exists, it must be moved out of the way first,
320
 
    and then deleted. 
 
320
    and then deleted.
321
321
    """
322
322
    try:
323
323
        fancy_rename(old, new, rename_func=os.rename, unlink_func=os.unlink)
324
324
    except OSError, e:
325
325
        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 
 
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
328
328
            # if the old path doesn't exist, sometimes we get EACCES
329
329
            # On Linux, we seem to get EBUSY, on Mac we get EINVAL
330
330
            os.lstat(old)
470
470
 
471
471
def is_inside(dir, fname):
472
472
    """True if fname is inside dir.
473
 
    
 
473
 
474
474
    The parameters should typically be passed to osutils.normpath first, so
475
475
    that . and .. and repeated slashes are eliminated, and the separators
476
476
    are canonical for the platform.
477
 
    
478
 
    The empty string as a dir name is taken as top-of-tree and matches 
 
477
 
 
478
    The empty string as a dir name is taken as top-of-tree and matches
479
479
    everything.
480
480
    """
481
 
    # XXX: Most callers of this can actually do something smarter by 
 
481
    # XXX: Most callers of this can actually do something smarter by
482
482
    # looking at the inventory
483
483
    if dir == fname:
484
484
        return True
485
 
    
 
485
 
486
486
    if dir == '':
487
487
        return True
488
488
 
648
648
    return offset.days * 86400 + offset.seconds
649
649
 
650
650
weekdays = ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
651
 
    
 
651
 
652
652
def format_date(t, offset=0, timezone='original', date_fmt=None,
653
653
                show_offset=True):
654
654
    """Return a formatted date string.
710
710
 
711
711
def compact_date(when):
712
712
    return time.strftime('%Y%m%d%H%M%S', time.gmtime(when))
713
 
    
 
713
 
714
714
 
715
715
def format_delta(delta):
716
716
    """Get a nice looking string for a time delta.
792
792
ALNUM = '0123456789abcdefghijklmnopqrstuvwxyz'
793
793
def rand_chars(num):
794
794
    """Return a random string of num alphanumeric characters
795
 
    
796
 
    The result only contains lowercase chars because it may be used on 
 
795
 
 
796
    The result only contains lowercase chars because it may be used on
797
797
    case-insensitive filesystems.
798
798
    """
799
799
    s = ''
1034
1034
 
1035
1035
    If it is unicode, it is returned.
1036
1036
    Otherwise it is decoded from utf-8. If a decoding error
1037
 
    occurs, it is wrapped as a If the decoding fails, the exception is wrapped 
 
1037
    occurs, it is wrapped as a If the decoding fails, the exception is wrapped
1038
1038
    as a BzrBadParameter exception.
1039
1039
    """
1040
1040
    if isinstance(unicode_or_utf8_string, unicode):
1128
1128
 
1129
1129
    On platforms where the system normalizes filenames (Mac OSX),
1130
1130
    you can access a file by any path which will normalize correctly.
1131
 
    On platforms where the system does not normalize filenames 
 
1131
    On platforms where the system does not normalize filenames
1132
1132
    (Windows, Linux), you have to access a file by its exact path.
1133
1133
 
1134
 
    Internally, bzr only supports NFC normalization, since that is 
 
1134
    Internally, bzr only supports NFC normalization, since that is
1135
1135
    the standard for XML documents.
1136
1136
 
1137
1137
    So return the normalized path, and a flag indicating if the file
1217
1217
 
1218
1218
 
1219
1219
def check_legal_path(path):
1220
 
    """Check whether the supplied path is legal.  
 
1220
    """Check whether the supplied path is legal.
1221
1221
    This is only required on Windows, so we don't test on other platforms
1222
1222
    right now.
1223
1223
    """
1257
1257
 
1258
1258
def walkdirs(top, prefix=""):
1259
1259
    """Yield data about all the directories in a tree.
1260
 
    
 
1260
 
1261
1261
    This yields all the data about the contents of a directory at a time.
1262
1262
    After each directory has been yielded, if the caller has mutated the list
1263
1263
    to exclude some directories, they are then not descended into.
1264
 
    
 
1264
 
1265
1265
    The data yielded is of the form:
1266
1266
    ((directory-relpath, directory-path-from-top),
1267
1267
    [(relpath, basename, kind, lstat, path-from-top), ...]),
1268
1268
     - directory-relpath is the relative path of the directory being returned
1269
1269
       with respect to top. prefix is prepended to this.
1270
 
     - directory-path-from-root is the path including top for this directory. 
 
1270
     - directory-path-from-root is the path including top for this directory.
1271
1271
       It is suitable for use with os functions.
1272
1272
     - relpath is the relative path within the subtree being walked.
1273
1273
     - basename is the basename of the path
1275
1275
       present within the tree - but it may be recorded as versioned. See
1276
1276
       versioned_kind.
1277
1277
     - lstat is the stat data *if* the file was statted.
1278
 
     - planned, not implemented: 
 
1278
     - planned, not implemented:
1279
1279
       path_from_tree_root is the path from the root of the tree.
1280
1280
 
1281
 
    :param prefix: Prefix the relpaths that are yielded with 'prefix'. This 
 
1281
    :param prefix: Prefix the relpaths that are yielded with 'prefix'. This
1282
1282
        allows one to walk a subtree but get paths that are relative to a tree
1283
1283
        rooted higher up.
1284
1284
    :return: an iterator over the dirs.
1285
1285
    """
1286
1286
    #TODO there is a bit of a smell where the results of the directory-
1287
 
    # summary in this, and the path from the root, may not agree 
 
1287
    # summary in this, and the path from the root, may not agree
1288
1288
    # depending on top and prefix - i.e. ./foo and foo as a pair leads to
1289
1289
    # potentially confusing output. We should make this more robust - but
1290
1290
    # not at a speed cost. RBC 20060731
1460
1460
def copy_tree(from_path, to_path, handlers={}):
1461
1461
    """Copy all of the entries in from_path into to_path.
1462
1462
 
1463
 
    :param from_path: The base directory to copy. 
 
1463
    :param from_path: The base directory to copy.
1464
1464
    :param to_path: The target directory. If it does not exist, it will
1465
1465
        be created.
1466
1466
    :param handlers: A dictionary of functions, which takes a source and