/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/diff.py

  • Committer: Martin
  • Date: 2010-04-14 00:11:32 UTC
  • mto: This revision was merged to the branch mainline in revision 5164.
  • Revision ID: gzlist@googlemail.com-20100414001132-6m1ru11mbfu87x6m
Fix os.utime test failures, three on FAT filesystems and one with readonly files

Show diffs side-by-side

added added

removed removed

Lines of Context:
17
17
import difflib
18
18
import os
19
19
import re
 
20
import shutil
20
21
import string
21
22
import sys
22
23
 
31
32
    branch as _mod_branch,
32
33
    bzrdir,
33
34
    cmdline,
34
 
    cleanup,
35
35
    errors,
36
36
    osutils,
37
37
    patiencediff,
48
48
    )
49
49
from bzrlib.symbol_versioning import (
50
50
    deprecated_function,
51
 
    deprecated_in,
52
51
    )
53
52
from bzrlib.trace import mutter, note, warning
54
53
 
290
289
                        new_abspath, e)
291
290
 
292
291
 
293
 
@deprecated_function(deprecated_in((2, 2, 0)))
294
292
def get_trees_and_branches_to_diff(path_list, revision_specs, old_url, new_url,
295
293
                                   apply_view=True):
296
294
    """Get the trees and specific files to diff given a list of paths.
315
313
    :returns:
316
314
        a tuple of (old_tree, new_tree, old_branch, new_branch,
317
315
        specific_files, extra_trees) where extra_trees is a sequence of
318
 
        additional trees to search in for file-ids.  The trees and branches
319
 
        are not locked.
320
 
    """
321
 
    op = cleanup.OperationWithCleanups(get_trees_and_branches_to_diff_locked)
322
 
    return op.run_simple(path_list, revision_specs, old_url, new_url,
323
 
            op.add_cleanup, apply_view=apply_view)
324
 
    
325
 
 
326
 
def get_trees_and_branches_to_diff_locked(
327
 
    path_list, revision_specs, old_url, new_url, add_cleanup, apply_view=True):
328
 
    """Get the trees and specific files to diff given a list of paths.
329
 
 
330
 
    This method works out the trees to be diff'ed and the files of
331
 
    interest within those trees.
332
 
 
333
 
    :param path_list:
334
 
        the list of arguments passed to the diff command
335
 
    :param revision_specs:
336
 
        Zero, one or two RevisionSpecs from the diff command line,
337
 
        saying what revisions to compare.
338
 
    :param old_url:
339
 
        The url of the old branch or tree. If None, the tree to use is
340
 
        taken from the first path, if any, or the current working tree.
341
 
    :param new_url:
342
 
        The url of the new branch or tree. If None, the tree to use is
343
 
        taken from the first path, if any, or the current working tree.
344
 
    :param add_cleanup:
345
 
        a callable like Command.add_cleanup.  get_trees_and_branches_to_diff
346
 
        will register cleanups that must be run to unlock the trees, etc.
347
 
    :param apply_view:
348
 
        if True and a view is set, apply the view or check that the paths
349
 
        are within it
350
 
    :returns:
351
 
        a tuple of (old_tree, new_tree, old_branch, new_branch,
352
 
        specific_files, extra_trees) where extra_trees is a sequence of
353
 
        additional trees to search in for file-ids.  The trees and branches
354
 
        will be read-locked until the cleanups registered via the add_cleanup
355
 
        param are run.
 
316
        additional trees to search in for file-ids.
356
317
    """
357
318
    # Get the old and new revision specs
358
319
    old_revision_spec = None
381
342
        default_location = path_list[0]
382
343
        other_paths = path_list[1:]
383
344
 
384
 
    def lock_tree_or_branch(wt, br):
385
 
        if wt is not None:
386
 
            wt.lock_read()
387
 
            add_cleanup(wt.unlock)
388
 
        elif br is not None:
389
 
            br.lock_read()
390
 
            add_cleanup(br.unlock)
391
 
 
392
345
    # Get the old location
393
346
    specific_files = []
394
347
    if old_url is None:
395
348
        old_url = default_location
396
349
    working_tree, branch, relpath = \
397
350
        bzrdir.BzrDir.open_containing_tree_or_branch(old_url)
398
 
    lock_tree_or_branch(working_tree, branch)
399
351
    if consider_relpath and relpath != '':
400
352
        if working_tree is not None and apply_view:
401
353
            views.check_path_in_view(working_tree, relpath)
409
361
    if new_url != old_url:
410
362
        working_tree, branch, relpath = \
411
363
            bzrdir.BzrDir.open_containing_tree_or_branch(new_url)
412
 
        lock_tree_or_branch(working_tree, branch)
413
364
        if consider_relpath and relpath != '':
414
365
            if working_tree is not None and apply_view:
415
366
                views.check_path_in_view(working_tree, relpath)
800
751
        try:
801
752
            mtime = tree.get_file_mtime(file_id)
802
753
        except errors.FileTimestampUnavailable:
803
 
            pass
804
 
        else:
805
 
            os.utime(full_path, (mtime, mtime))
 
754
            # GZ 2010-04-13: Zero is a bad 'unavailable' time as it predates
 
755
            #                the earliest allowable date on FAT filesystems
 
756
            mtime = 0
 
757
        os.utime(full_path, (mtime, mtime))
806
758
        if not allow_write:
807
759
            osutils.make_readonly(full_path)
808
760
        return full_path