~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

[merge] bzr.dev 1850

Show diffs side-by-side

added added

removed removed

Lines of Context:
268
268
        new_tree = tree
269
269
    else:
270
270
        new_tree = spec_tree(new_revision_spec)
 
271
    if new_tree is not tree:
 
272
        extra_trees = (tree,)
 
273
    else:
 
274
        extra_trees = None
271
275
 
272
276
    return show_diff_trees(old_tree, new_tree, sys.stdout, specific_files,
273
277
                           external_diff_options,
274
 
                           old_label=old_label, new_label=new_label)
 
278
                           old_label=old_label, new_label=new_label,
 
279
                           extra_trees=extra_trees)
275
280
 
276
281
 
277
282
def show_diff_trees(old_tree, new_tree, to_file, specific_files=None,
278
283
                    external_diff_options=None,
279
 
                    old_label='a/', new_label='b/'):
 
284
                    old_label='a/', new_label='b/',
 
285
                    extra_trees=None):
280
286
    """Show in text form the changes from one tree to another.
281
287
 
282
288
    to_files
284
290
 
285
291
    external_diff_options
286
292
        If set, use an external GNU diff and pass these options.
 
293
 
 
294
    extra_trees
 
295
        If set, more Trees to use for looking up file ids
287
296
    """
288
297
    old_tree.lock_read()
289
298
    try:
291
300
        try:
292
301
            return _show_diff_trees(old_tree, new_tree, to_file,
293
302
                                    specific_files, external_diff_options,
294
 
                                    old_label=old_label, new_label=new_label)
 
303
                                    old_label=old_label, new_label=new_label,
 
304
                                    extra_trees=extra_trees)
295
305
        finally:
296
306
            new_tree.unlock()
297
307
    finally:
300
310
 
301
311
def _show_diff_trees(old_tree, new_tree, to_file,
302
312
                     specific_files, external_diff_options, 
303
 
                     old_label='a/', new_label='b/' ):
 
313
                     old_label='a/', new_label='b/', extra_trees=None):
304
314
 
305
315
    # GNU Patch uses the epoch date to detect files that are being added
306
316
    # or removed in a diff.
309
319
    # TODO: Generation of pseudo-diffs for added/deleted files could
310
320
    # be usefully made into a much faster special case.
311
321
 
312
 
    _raise_if_doubly_unversioned(specific_files, old_tree, new_tree)
313
 
 
314
322
    if external_diff_options:
315
323
        assert isinstance(external_diff_options, basestring)
316
324
        opts = external_diff_options.split()
320
328
        diff_file = internal_diff
321
329
    
322
330
    delta = compare_trees(old_tree, new_tree, want_unchanged=False,
323
 
                          specific_files=specific_files)
 
331
                          specific_files=specific_files, 
 
332
                          extra_trees=extra_trees, require_versioned=True)
324
333
 
325
334
    has_changes = 0
326
335
    for path, file_id, kind in delta.removed:
378
387
    return time.strftime('%Y-%m-%d %H:%M:%S +0000', tm)
379
388
 
380
389
 
381
 
def _raise_if_doubly_unversioned(specific_files, old_tree, new_tree):
382
 
    """Complain if paths are not versioned in either tree."""
383
 
    if not specific_files:
384
 
        return
385
 
    old_unversioned = old_tree.filter_unversioned_files(specific_files)
386
 
    new_unversioned = new_tree.filter_unversioned_files(specific_files)
387
 
    unversioned = old_unversioned.intersection(new_unversioned)
388
 
    if unversioned:
389
 
        raise errors.PathsNotVersionedError(sorted(unversioned))
390
 
    
391
 
 
392
390
def _raise_if_nonexistent(paths, old_tree, new_tree):
393
391
    """Complain if paths are not in either inventory or tree.
394
392