~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2010-04-14 04:35:47 UTC
  • mfrom: (5147.3.7 diff-relock)
  • Revision ID: pqm@pqm.ubuntu.com-20100414043547-j4t4napw7duy07if
(andrew) Read-lock the trees and branches only once in cmd_diff.

Show diffs side-by-side

added added

removed removed

Lines of Context:
32
32
    branch as _mod_branch,
33
33
    bzrdir,
34
34
    cmdline,
 
35
    cleanup,
35
36
    errors,
36
37
    osutils,
37
38
    patiencediff,
48
49
    )
49
50
from bzrlib.symbol_versioning import (
50
51
    deprecated_function,
 
52
    deprecated_in,
51
53
    )
52
54
from bzrlib.trace import mutter, note, warning
53
55
 
289
291
                        new_abspath, e)
290
292
 
291
293
 
 
294
@deprecated_function(deprecated_in((2, 2, 0)))
292
295
def get_trees_and_branches_to_diff(path_list, revision_specs, old_url, new_url,
293
296
                                   apply_view=True):
294
297
    """Get the trees and specific files to diff given a list of paths.
313
316
    :returns:
314
317
        a tuple of (old_tree, new_tree, old_branch, new_branch,
315
318
        specific_files, extra_trees) where extra_trees is a sequence of
316
 
        additional trees to search in for file-ids.
 
319
        additional trees to search in for file-ids.  The trees and branches
 
320
        are not locked.
 
321
    """
 
322
    op = cleanup.OperationWithCleanups(get_trees_and_branches_to_diff_locked)
 
323
    return op.run_simple(path_list, revision_specs, old_url, new_url,
 
324
            op.add_cleanup, apply_view=apply_view)
 
325
    
 
326
 
 
327
def get_trees_and_branches_to_diff_locked(
 
328
    path_list, revision_specs, old_url, new_url, add_cleanup, apply_view=True):
 
329
    """Get the trees and specific files to diff given a list of paths.
 
330
 
 
331
    This method works out the trees to be diff'ed and the files of
 
332
    interest within those trees.
 
333
 
 
334
    :param path_list:
 
335
        the list of arguments passed to the diff command
 
336
    :param revision_specs:
 
337
        Zero, one or two RevisionSpecs from the diff command line,
 
338
        saying what revisions to compare.
 
339
    :param old_url:
 
340
        The url of the old branch or tree. If None, the tree to use is
 
341
        taken from the first path, if any, or the current working tree.
 
342
    :param new_url:
 
343
        The url of the new branch or tree. If None, the tree to use is
 
344
        taken from the first path, if any, or the current working tree.
 
345
    :param add_cleanup:
 
346
        a callable like Command.add_cleanup.  get_trees_and_branches_to_diff
 
347
        will register cleanups that must be run to unlock the trees, etc.
 
348
    :param apply_view:
 
349
        if True and a view is set, apply the view or check that the paths
 
350
        are within it
 
351
    :returns:
 
352
        a tuple of (old_tree, new_tree, old_branch, new_branch,
 
353
        specific_files, extra_trees) where extra_trees is a sequence of
 
354
        additional trees to search in for file-ids.  The trees and branches
 
355
        will be read-locked until the cleanups registered via the add_cleanup
 
356
        param are run.
317
357
    """
318
358
    # Get the old and new revision specs
319
359
    old_revision_spec = None
342
382
        default_location = path_list[0]
343
383
        other_paths = path_list[1:]
344
384
 
 
385
    def lock_tree_or_branch(wt, br):
 
386
        if wt is not None:
 
387
            wt.lock_read()
 
388
            add_cleanup(wt.unlock)
 
389
        elif br is not None:
 
390
            br.lock_read()
 
391
            add_cleanup(br.unlock)
 
392
 
345
393
    # Get the old location
346
394
    specific_files = []
347
395
    if old_url is None:
348
396
        old_url = default_location
349
397
    working_tree, branch, relpath = \
350
398
        bzrdir.BzrDir.open_containing_tree_or_branch(old_url)
 
399
    lock_tree_or_branch(working_tree, branch)
351
400
    if consider_relpath and relpath != '':
352
401
        if working_tree is not None and apply_view:
353
402
            views.check_path_in_view(working_tree, relpath)
361
410
    if new_url != old_url:
362
411
        working_tree, branch, relpath = \
363
412
            bzrdir.BzrDir.open_containing_tree_or_branch(new_url)
 
413
        lock_tree_or_branch(working_tree, branch)
364
414
        if consider_relpath and relpath != '':
365
415
            if working_tree is not None and apply_view:
366
416
                views.check_path_in_view(working_tree, relpath)