~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/merge_core.py

[merge] from robert

 - fix handling of symlinks in tree

 - improved executable bits

 - cache pull over http and test for this

Show diffs side-by-side

added added

removed removed

Lines of Context:
260
260
    metadata = entry.metadata_change
261
261
    if metadata is None:
262
262
        return None
263
 
    if isinstance(metadata, changeset.ChangeUnixPermissions):
264
 
        if metadata.new_mode is None:
 
263
    if isinstance(metadata, changeset.ChangeExecFlag):
 
264
        if metadata.new_exec_flag is None:
265
265
            return None
266
 
        elif metadata.old_mode is None:
 
266
        elif metadata.old_exec_flag is None:
267
267
            return metadata
268
268
        else:
269
269
            base_path = base.readonly_path(entry.id)
270
270
            other_path = other.readonly_path(entry.id)    
271
 
            return PermissionsMerge(base_path, other_path)
 
271
            return ExecFlagMerge(base_path, other_path)
272
272
    
273
273
 
274
 
class PermissionsMerge(object):
 
274
class ExecFlagMerge(object):
275
275
    def __init__(self, base_path, other_path):
276
276
        self.base_path = base_path
277
277
        self.other_path = other_path
283
283
        else:
284
284
            base = self.other_path
285
285
            other = self.base_path
286
 
        base_stat = os.stat(base).st_mode
287
 
        other_stat = os.stat(other).st_mode
288
 
        this_stat = os.stat(filename).st_mode
289
 
        if base_stat &0777 == other_stat &0777:
290
 
            return
291
 
        elif this_stat &0777 == other_stat &0777:
292
 
            return
293
 
        elif this_stat &0777 == base_stat &0777:
294
 
            os.chmod(filename, other_stat)
295
 
        else:
296
 
            conflict_handler.permission_conflict(filename, base, other)
 
286
        base_mode = os.stat(base).st_mode
 
287
        base_exec_flag = bool(base_mode & 0111)
 
288
        other_mode = os.stat(other).st_mode
 
289
        other_exec_flag = bool(other_mode & 0111)
 
290
        this_mode = os.stat(filename).st_mode
 
291
        this_exec_flag = bool(this_mode & 0111)
 
292
        if (base_exec_flag != other_exec_flag and
 
293
            this_exec_flag != other_exec_flag):
 
294
            assert this_exec_flag == base_exec_flag
 
295
            current_mode = os.stat(filename).st_mode
 
296
            if other_exec_flag:
 
297
                umask = os.umask(0)
 
298
                os.umask(umask)
 
299
                to_mode = current_mode | (0100 & ~umask)
 
300
                # Enable x-bit for others only if they can read it.
 
301
                if current_mode & 0004:
 
302
                    to_mode |= 0001 & ~umask
 
303
                if current_mode & 0040:
 
304
                    to_mode |= 0010 & ~umask
 
305
            else:
 
306
                to_mode = current_mode & ~0111
 
307
            os.chmod(filename, to_mode)
 
308