294
@deprecated_function(deprecated_in((2, 2, 0)))
289
295
def get_trees_and_branches_to_diff(path_list, revision_specs, old_url, new_url,
290
296
apply_view=True):
291
297
"""Get the trees and specific files to diff given a list of paths.
311
317
a tuple of (old_tree, new_tree, old_branch, new_branch,
312
318
specific_files, extra_trees) where extra_trees is a sequence of
313
additional trees to search in for file-ids.
319
additional trees to search in for file-ids. The trees and branches
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)
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.
331
This method works out the trees to be diff'ed and the files of
332
interest within those trees.
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.
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.
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.
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.
349
if True and a view is set, apply the view or check that the paths
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
315
358
# Get the old and new revision specs
316
359
old_revision_spec = None
339
382
default_location = path_list[0]
340
383
other_paths = path_list[1:]
385
def lock_tree_or_branch(wt, br):
388
add_cleanup(wt.unlock)
391
add_cleanup(br.unlock)
342
393
# Get the old location
343
394
specific_files = []
344
395
if old_url is None:
345
396
old_url = default_location
346
397
working_tree, branch, relpath = \
347
398
bzrdir.BzrDir.open_containing_tree_or_branch(old_url)
399
lock_tree_or_branch(working_tree, branch)
348
400
if consider_relpath and relpath != '':
349
401
if working_tree is not None and apply_view:
350
402
views.check_path_in_view(working_tree, relpath)
358
410
if new_url != old_url:
359
411
working_tree, branch, relpath = \
360
412
bzrdir.BzrDir.open_containing_tree_or_branch(new_url)
413
lock_tree_or_branch(working_tree, branch)
361
414
if consider_relpath and relpath != '':
362
415
if working_tree is not None and apply_view:
363
416
views.check_path_in_view(working_tree, relpath)
411
464
old_label='a/', new_label='b/',
412
465
extra_trees=None,
413
466
path_encoding='utf8',
415
469
"""Show in text form the changes from one tree to another.
421
Include only changes to these files - None for all changes.
423
external_diff_options
424
If set, use an external GNU diff and pass these options.
427
If set, more Trees to use for looking up file ids
430
If set, the path will be encoded as specified, otherwise is supposed
471
:param to_file: The output stream.
472
:param specific_files:Include only changes to these files - None for all
474
:param external_diff_options: If set, use an external GNU diff and pass
476
:param extra_trees: If set, more Trees to use for looking up file ids
477
:param path_encoding: If set, the path will be encoded as specified,
478
otherwise is supposed to be utf8
479
:param format_cls: Formatter class (DiffTree subclass)
481
if format_cls is None:
482
format_cls = DiffTree
433
483
old_tree.lock_read()
435
485
if extra_trees is not None:
438
488
new_tree.lock_read()
440
differ = DiffTree.from_trees_options(old_tree, new_tree, to_file,
442
external_diff_options,
443
old_label, new_label, using)
490
differ = format_cls.from_trees_options(old_tree, new_tree, to_file,
492
external_diff_options,
493
old_label, new_label, using)
444
494
return differ.show_diff(specific_files, extra_trees)
446
496
new_tree.unlock()
802
mtime = tree.get_file_mtime(file_id)
803
except errors.FileTimestampUnavailable:
806
os.utime(full_path, (mtime, mtime))
751
807
if not allow_write:
752
808
osutils.make_readonly(full_path)
754
mtime = tree.get_file_mtime(file_id)
755
except errors.FileTimestampUnavailable:
757
os.utime(full_path, (mtime, mtime))
760
811
def _prepare_files(self, file_id, old_path, new_path, force_temp=False,
882
933
def show_diff(self, specific_files, extra_trees=None):
883
934
"""Write tree diff to self.to_file
885
:param sepecific_files: the specific files to compare (recursive)
936
:param specific_files: the specific files to compare (recursive)
886
937
:param extra_trees: extra trees to use for mapping paths to file_ids