22
22
# invoke callbacks on an object. That object can either accumulate a
23
23
# list, write them out directly, etc etc.
25
def internal_diff(old_label, oldlines, new_label, newlines, to_file):
25
def internal_diff(old_filename, oldlines, new_filename, newlines, to_file):
28
28
# FIXME: difflib is wrong if there is no trailing newline.
44
44
ud = difflib.unified_diff(oldlines, newlines,
45
fromfile=old_label, tofile=new_label)
45
fromfile=old_filename+'\t',
46
tofile=new_filename+'\t')
48
49
# work-around for difflib being too smart for its own good
65
def external_diff(old_label, oldlines, new_label, newlines, to_file,
66
def external_diff(old_filename, oldlines, new_filename, newlines, to_file,
67
68
"""Display a diff by calling out to the external diff program."""
99
100
diffcmd = ['diff',
100
'--label', old_label,
101
'--label', old_filename+'\t',
102
'--label', new_label,
103
'--label', new_filename+'\t',
105
106
# diff only allows one style to be specified; they don't override.
140
141
oldtmpf.close() # and delete
143
def show_diff(b, revision, specific_files, external_diff_options=None,
144
revision2=None, output=None):
144
def show_diff(b, from_spec, specific_files, external_diff_options=None,
145
revision2=None, output=None, b2=None):
145
146
"""Shortcut for showing the diff to the working tree.
151
None for each, or otherwise the old revision to compare against.
152
None for 'basis tree', or otherwise the old revision to compare against.
153
154
The more general form is show_diff_trees(), where the caller
154
155
supplies any two trees.
158
159
output = sys.stdout
161
old_tree = b.basis_tree()
161
if from_spec is None:
163
old_tree = b.basis_tree()
165
old_tree = b.working_tree()
163
old_tree = b.revision_tree(revision.in_history(b).rev_id)
167
old_tree = b.revision_tree(from_spec.in_history(b).rev_id)
165
169
if revision2 is None:
166
new_tree = b.working_tree()
171
new_tree = b.working_tree()
173
new_tree = b2.working_tree()
168
175
new_tree = b.revision_tree(revision2.in_history(b).rev_id)
170
show_diff_trees(old_tree, new_tree, output, specific_files,
171
external_diff_options)
177
return show_diff_trees(old_tree, new_tree, output, specific_files,
178
external_diff_options)
207
214
delta = compare_trees(old_tree, new_tree, want_unchanged=False,
208
215
specific_files=specific_files)
210
218
for path, file_id, kind in delta.removed:
211
220
print >>to_file, '=== removed %s %r' % (kind, path)
212
221
old_tree.inventory[file_id].diff(diff_file, old_label + path, old_tree,
213
222
DEVNULL, None, None, to_file)
214
223
for path, file_id, kind in delta.added:
215
225
print >>to_file, '=== added %s %r' % (kind, path)
216
226
new_tree.inventory[file_id].diff(diff_file, new_label + path, new_tree,
217
227
DEVNULL, None, None, to_file,
219
229
for (old_path, new_path, file_id, kind,
220
230
text_modified, meta_modified) in delta.renamed:
221
232
prop_str = get_prop_change(meta_modified)
222
233
print >>to_file, '=== renamed %s %r => %r%s' % (
223
234
kind, old_path, new_path, prop_str)
225
236
new_label, new_path, new_tree,
226
237
text_modified, kind, to_file, diff_file)
227
238
for path, file_id, kind, text_modified, meta_modified in delta.modified:
228
240
prop_str = get_prop_change(meta_modified)
229
241
print >>to_file, '=== modified %s %r%s' % (kind, path, prop_str)
230
242
if text_modified:
231
243
_maybe_diff_file_or_symlink(old_label, path, old_tree, file_id,
232
244
new_label, path, new_tree,
233
245
True, kind, to_file, diff_file)
236
249
def get_prop_change(meta_modified):