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_filename, oldlines, new_filename, newlines, to_file):
25
def internal_diff(old_label, oldlines, new_label, 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_filename+'\t',
46
tofile=new_filename+'\t')
45
fromfile=old_label, tofile=new_label)
49
48
# work-around for difflib being too smart for its own good
66
def external_diff(old_filename, oldlines, new_filename, newlines, to_file,
65
def external_diff(old_label, oldlines, new_label, newlines, to_file,
68
67
"""Display a diff by calling out to the external diff program."""
100
99
diffcmd = ['diff',
101
'--label', old_filename+'\t',
100
'--label', old_label,
103
'--label', new_filename+'\t',
102
'--label', new_label,
106
105
# diff only allows one style to be specified; they don't override.
144
143
def show_diff(b, from_spec, specific_files, external_diff_options=None,
145
revision2=None, output=None, b2=None):
144
revision2=None, output=None):
146
145
"""Shortcut for showing the diff to the working tree.
159
158
output = sys.stdout
161
160
if from_spec is None:
163
old_tree = b.basis_tree()
165
old_tree = b.working_tree()
161
old_tree = b.basis_tree()
167
163
old_tree = b.revision_tree(from_spec.in_history(b).rev_id)
169
165
if revision2 is None:
171
new_tree = b.working_tree()
173
new_tree = b2.working_tree()
166
new_tree = b.working_tree()
175
168
new_tree = b.revision_tree(revision2.in_history(b).rev_id)
177
return show_diff_trees(old_tree, new_tree, output, specific_files,
178
external_diff_options)
170
show_diff_trees(old_tree, new_tree, output, specific_files,
171
external_diff_options)
214
207
delta = compare_trees(old_tree, new_tree, want_unchanged=False,
215
208
specific_files=specific_files)
218
210
for path, file_id, kind in delta.removed:
220
211
print >>to_file, '=== removed %s %r' % (kind, path)
221
212
old_tree.inventory[file_id].diff(diff_file, old_label + path, old_tree,
222
213
DEVNULL, None, None, to_file)
223
214
for path, file_id, kind in delta.added:
225
215
print >>to_file, '=== added %s %r' % (kind, path)
226
216
new_tree.inventory[file_id].diff(diff_file, new_label + path, new_tree,
227
217
DEVNULL, None, None, to_file,
229
219
for (old_path, new_path, file_id, kind,
230
220
text_modified, meta_modified) in delta.renamed:
232
221
prop_str = get_prop_change(meta_modified)
233
222
print >>to_file, '=== renamed %s %r => %r%s' % (
234
223
kind, old_path, new_path, prop_str)
236
225
new_label, new_path, new_tree,
237
226
text_modified, kind, to_file, diff_file)
238
227
for path, file_id, kind, text_modified, meta_modified in delta.modified:
240
228
prop_str = get_prop_change(meta_modified)
241
229
print >>to_file, '=== modified %s %r%s' % (kind, path, prop_str)
242
230
if text_modified:
243
231
_maybe_diff_file_or_symlink(old_label, path, old_tree, file_id,
244
232
new_label, path, new_tree,
245
233
True, kind, to_file, diff_file)
249
236
def get_prop_change(meta_modified):