~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/osutils.py

  • Committer: John Arbash Meinel
  • Date: 2011-08-09 14:18:05 UTC
  • mto: (6015.9.8 2.4)
  • mto: This revision was merged to the branch mainline in revision 6066.
  • Revision ID: john@arbash-meinel.com-20110809141805-9lq771mvpsukl0pe
Catch a couple more cases that test tag fetching.

Show diffs side-by-side

added added

removed removed

Lines of Context:
97
97
    mod = os.lstat(filename).st_mode
98
98
    if not stat.S_ISLNK(mod):
99
99
        mod = mod & 0777555
100
 
        chmod_if_possible(filename, mod)
 
100
        os.chmod(filename, mod)
101
101
 
102
102
 
103
103
def make_writable(filename):
104
104
    mod = os.lstat(filename).st_mode
105
105
    if not stat.S_ISLNK(mod):
106
106
        mod = mod | 0200
107
 
        chmod_if_possible(filename, mod)
108
 
 
109
 
 
110
 
def chmod_if_possible(filename, mode):
111
 
    # Set file mode if that can be safely done.
112
 
    # Sometimes even on unix the filesystem won't allow it - see
113
 
    # https://bugs.launchpad.net/bzr/+bug/606537
114
 
    try:
115
 
        # It is probably faster to just do the chmod, rather than
116
 
        # doing a stat, and then trying to compare
117
 
        os.chmod(filename, mode)
118
 
    except (IOError, OSError),e:
119
 
        # Permission/access denied seems to commonly happen on smbfs; there's
120
 
        # probably no point warning about it.
121
 
        # <https://bugs.launchpad.net/bzr/+bug/606537>
122
 
        if getattr(e, 'errno') in (errno.EPERM, errno.EACCES):
123
 
            trace.mutter("ignore error on chmod of %r: %r" % (
124
 
                filename, e))
125
 
            return
126
 
        raise
 
107
        os.chmod(filename, mod)
127
108
 
128
109
 
129
110
def minimum_path_selection(paths):
296
277
    # copy posixpath.abspath, but use os.getcwdu instead
297
278
    if not posixpath.isabs(path):
298
279
        path = posixpath.join(getcwd(), path)
299
 
    return _posix_normpath(path)
 
280
    return posixpath.normpath(path)
300
281
 
301
282
 
302
283
def _posix_realpath(path):
303
284
    return posixpath.realpath(path.encode(_fs_enc)).decode(_fs_enc)
304
285
 
305
286
 
306
 
def _posix_normpath(path):
307
 
    path = posixpath.normpath(path)
308
 
    # Bug 861008: posixpath.normpath() returns a path normalized according to
309
 
    # the POSIX standard, which stipulates (for compatibility reasons) that two
310
 
    # leading slashes must not be simplified to one, and only if there are 3 or
311
 
    # more should they be simplified as one. So we treat the leading 2 slashes
312
 
    # as a special case here by simply removing the first slash, as we consider
313
 
    # that breaking POSIX compatibility for this obscure feature is acceptable.
314
 
    # This is not a paranoid precaution, as we notably get paths like this when
315
 
    # the repo is hosted at the root of the filesystem, i.e. in "/".    
316
 
    if path.startswith('//'):
317
 
        path = path[1:]
318
 
    return path
319
 
 
320
 
 
321
287
def _win32_fixdrive(path):
322
288
    """Force drive letters to be consistent.
323
289
 
411
377
abspath = _posix_abspath
412
378
realpath = _posix_realpath
413
379
pathjoin = os.path.join
414
 
normpath = _posix_normpath
 
380
normpath = os.path.normpath
415
381
getcwd = os.getcwdu
416
382
rename = os.rename
417
383
dirname = os.path.dirname
2532
2498
    fn = getattr(os, 'fdatasync', getattr(os, 'fsync', None))
2533
2499
    if fn is not None:
2534
2500
        fn(fileno)
2535
 
 
2536
 
 
2537
 
def ensure_empty_directory_exists(path, exception_class):
2538
 
    """Make sure a local directory exists and is empty.
2539
 
    
2540
 
    If it does not exist, it is created.  If it exists and is not empty, an
2541
 
    instance of exception_class is raised.
2542
 
    """
2543
 
    try:
2544
 
        os.mkdir(path)
2545
 
    except OSError, e:
2546
 
        if e.errno != errno.EEXIST:
2547
 
            raise
2548
 
        if os.listdir(path) != []:
2549
 
            raise exception_class(path)