/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:
31
31
    branch as _mod_branch,
32
32
    bzrdir,
33
33
    cmdline,
 
34
    cleanup,
34
35
    errors,
35
36
    osutils,
36
37
    patiencediff,
42
43
from bzrlib.workingtree import WorkingTree
43
44
""")
44
45
 
 
46
from bzrlib.registry import (
 
47
    Registry,
 
48
    )
 
49
from bzrlib.symbol_versioning import (
 
50
    deprecated_function,
 
51
    deprecated_in,
 
52
    )
45
53
from bzrlib.trace import mutter, note, warning
46
54
 
47
55
 
282
290
                        new_abspath, e)
283
291
 
284
292
 
 
293
@deprecated_function(deprecated_in((2, 2, 0)))
285
294
def get_trees_and_branches_to_diff(path_list, revision_specs, old_url, new_url,
286
295
                                   apply_view=True):
287
296
    """Get the trees and specific files to diff given a list of paths.
306
315
    :returns:
307
316
        a tuple of (old_tree, new_tree, old_branch, new_branch,
308
317
        specific_files, extra_trees) where extra_trees is a sequence of
309
 
        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.
310
356
    """
311
357
    # Get the old and new revision specs
312
358
    old_revision_spec = None
335
381
        default_location = path_list[0]
336
382
        other_paths = path_list[1:]
337
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
 
338
392
    # Get the old location
339
393
    specific_files = []
340
394
    if old_url is None:
341
395
        old_url = default_location
342
396
    working_tree, branch, relpath = \
343
397
        bzrdir.BzrDir.open_containing_tree_or_branch(old_url)
 
398
    lock_tree_or_branch(working_tree, branch)
344
399
    if consider_relpath and relpath != '':
345
400
        if working_tree is not None and apply_view:
346
401
            views.check_path_in_view(working_tree, relpath)
354
409
    if new_url != old_url:
355
410
        working_tree, branch, relpath = \
356
411
            bzrdir.BzrDir.open_containing_tree_or_branch(new_url)
 
412
        lock_tree_or_branch(working_tree, branch)
357
413
        if consider_relpath and relpath != '':
358
414
            if working_tree is not None and apply_view:
359
415
                views.check_path_in_view(working_tree, relpath)
407
463
                    old_label='a/', new_label='b/',
408
464
                    extra_trees=None,
409
465
                    path_encoding='utf8',
410
 
                    using=None):
 
466
                    using=None,
 
467
                    format_cls=None):
411
468
    """Show in text form the changes from one tree to another.
412
469
 
413
 
    to_file
414
 
        The output stream.
415
 
 
416
 
    specific_files
417
 
        Include only changes to these files - None for all changes.
418
 
 
419
 
    external_diff_options
420
 
        If set, use an external GNU diff and pass these options.
421
 
 
422
 
    extra_trees
423
 
        If set, more Trees to use for looking up file ids
424
 
 
425
 
    path_encoding
426
 
        If set, the path will be encoded as specified, otherwise is supposed
427
 
        to be utf8
 
470
    :param to_file: The output stream.
 
471
    :param specific_files:Include only changes to these files - None for all
 
472
        changes.
 
473
    :param external_diff_options: If set, use an external GNU diff and pass 
 
474
        these options.
 
475
    :param extra_trees: If set, more Trees to use for looking up file ids
 
476
    :param path_encoding: If set, the path will be encoded as specified, 
 
477
        otherwise is supposed to be utf8
 
478
    :param format_cls: Formatter class (DiffTree subclass)
428
479
    """
 
480
    if format_cls is None:
 
481
        format_cls = DiffTree
429
482
    old_tree.lock_read()
430
483
    try:
431
484
        if extra_trees is not None:
433
486
                tree.lock_read()
434
487
        new_tree.lock_read()
435
488
        try:
436
 
            differ = DiffTree.from_trees_options(old_tree, new_tree, to_file,
437
 
                                                 path_encoding,
438
 
                                                 external_diff_options,
439
 
                                                 old_label, new_label, using)
 
489
            differ = format_cls.from_trees_options(old_tree, new_tree, to_file,
 
490
                                                   path_encoding,
 
491
                                                   external_diff_options,
 
492
                                                   old_label, new_label, using)
440
493
            return differ.show_diff(specific_files, extra_trees)
441
494
        finally:
442
495
            new_tree.unlock()
744
797
                target.close()
745
798
        finally:
746
799
            source.close()
 
800
        try:
 
801
            mtime = tree.get_file_mtime(file_id)
 
802
        except errors.FileTimestampUnavailable:
 
803
            pass
 
804
        else:
 
805
            os.utime(full_path, (mtime, mtime))
747
806
        if not allow_write:
748
807
            osutils.make_readonly(full_path)
749
 
        try:
750
 
            mtime = tree.get_file_mtime(file_id)
751
 
        except errors.FileTimestampUnavailable:
752
 
            mtime = 0
753
 
        os.utime(full_path, (mtime, mtime))
754
808
        return full_path
755
809
 
756
810
    def _prepare_files(self, file_id, old_path, new_path, force_temp=False,
878
932
    def show_diff(self, specific_files, extra_trees=None):
879
933
        """Write tree diff to self.to_file
880
934
 
881
 
        :param sepecific_files: the specific files to compare (recursive)
 
935
        :param specific_files: the specific files to compare (recursive)
882
936
        :param extra_trees: extra trees to use for mapping paths to file_ids
883
937
        """
884
938
        try:
974
1028
            if error_path is None:
975
1029
                error_path = old_path
976
1030
            raise errors.NoDiffFound(error_path)
 
1031
 
 
1032
 
 
1033
format_registry = Registry()
 
1034
format_registry.register('default', DiffTree)