~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

  • Committer: Jelmer Vernooij
  • Date: 2010-04-30 11:03:59 UTC
  • mto: This revision was merged to the branch mainline in revision 5197.
  • Revision ID: jelmer@samba.org-20100430110359-ow3e3grh7sxy93pa
Remove more unused imports.

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