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.
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
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)
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.
330
This method works out the trees to be diff'ed and the files of
331
interest within those trees.
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.
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.
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.
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.
348
if True and a view is set, apply the view or check that the paths
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
309
additional trees to search in for file-ids.
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:]
384
def lock_tree_or_branch(wt, br):
387
add_cleanup(wt.unlock)
390
add_cleanup(br.unlock)
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',
468
411
"""Show in text form the changes from one tree to another.
470
:param to_file: The output stream.
471
:param specific_files:Include only changes to these files - None for all
473
:param external_diff_options: If set, use an external GNU diff and pass
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)
417
Include only changes to these files - None for all changes.
419
external_diff_options
420
If set, use an external GNU diff and pass these options.
423
If set, more Trees to use for looking up file ids
426
If set, the path will be encoded as specified, otherwise is supposed
480
if format_cls is None:
481
format_cls = DiffTree
482
429
old_tree.lock_read()
484
431
if extra_trees is not None:
487
434
new_tree.lock_read()
489
differ = format_cls.from_trees_options(old_tree, new_tree, to_file,
491
external_diff_options,
492
old_label, new_label, using)
436
differ = DiffTree.from_trees_options(old_tree, new_tree, to_file,
438
external_diff_options,
439
old_label, new_label, using)
493
440
return differ.show_diff(specific_files, extra_trees)
495
442
new_tree.unlock()
748
osutils.make_readonly(full_path)
801
750
mtime = tree.get_file_mtime(file_id)
802
751
except errors.FileTimestampUnavailable:
805
os.utime(full_path, (mtime, mtime))
807
osutils.make_readonly(full_path)
753
os.utime(full_path, (mtime, mtime))
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
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