/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: Robert Collins
  • Date: 2010-05-06 11:08:10 UTC
  • mto: This revision was merged to the branch mainline in revision 5223.
  • Revision ID: robertc@robertcollins.net-20100506110810-h3j07fh5gmw54s25
Cleaner matcher matching revised unlocking protocol.

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
21
20
import string
22
21
import sys
23
22
 
32
31
    branch as _mod_branch,
33
32
    bzrdir,
34
33
    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,
51
52
    )
52
53
from bzrlib.trace import mutter, note, warning
53
54
 
289
290
                        new_abspath, e)
290
291
 
291
292
 
 
293
@deprecated_function(deprecated_in((2, 2, 0)))
292
294
def get_trees_and_branches_to_diff(path_list, revision_specs, old_url, new_url,
293
295
                                   apply_view=True):
294
296
    """Get the trees and specific files to diff given a list of paths.
313
315
    :returns:
314
316
        a tuple of (old_tree, new_tree, old_branch, new_branch,
315
317
        specific_files, extra_trees) where extra_trees is a sequence of
316
 
        additional trees to search in for file-ids.
 
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.
317
356
    """
318
357
    # Get the old and new revision specs
319
358
    old_revision_spec = None
342
381
        default_location = path_list[0]
343
382
        other_paths = path_list[1:]
344
383
 
 
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
 
345
392
    # Get the old location
346
393
    specific_files = []
347
394
    if old_url is None:
348
395
        old_url = default_location
349
396
    working_tree, branch, relpath = \
350
397
        bzrdir.BzrDir.open_containing_tree_or_branch(old_url)
 
398
    lock_tree_or_branch(working_tree, branch)
351
399
    if consider_relpath and relpath != '':
352
400
        if working_tree is not None and apply_view:
353
401
            views.check_path_in_view(working_tree, relpath)
361
409
    if new_url != old_url:
362
410
        working_tree, branch, relpath = \
363
411
            bzrdir.BzrDir.open_containing_tree_or_branch(new_url)
 
412
        lock_tree_or_branch(working_tree, branch)
364
413
        if consider_relpath and relpath != '':
365
414
            if working_tree is not None and apply_view:
366
415
                views.check_path_in_view(working_tree, relpath)
751
800
        try:
752
801
            mtime = tree.get_file_mtime(file_id)
753
802
        except errors.FileTimestampUnavailable:
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))
 
803
            pass
 
804
        else:
 
805
            os.utime(full_path, (mtime, mtime))
758
806
        if not allow_write:
759
807
            osutils.make_readonly(full_path)
760
808
        return full_path