~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/diff.py

  • Committer: Robert Collins
  • Date: 2005-10-24 13:59:18 UTC
  • mfrom: (1185.20.1)
  • Revision ID: robertc@robertcollins.net-20051024135918-024629d7ee347b5c
fix upgrading of trees with no commits

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
#! /usr/bin/env python
2
1
# -*- coding: UTF-8 -*-
3
2
 
4
3
# This program is free software; you can redistribute it and/or modify
45
44
    ud = difflib.unified_diff(oldlines, newlines,
46
45
                              fromfile=old_label, tofile=new_label)
47
46
 
 
47
    ud = list(ud)
48
48
    # work-around for difflib being too smart for its own good
49
49
    # if /dev/null is "1,0", patch won't recognize it as /dev/null
50
50
    if not oldlines:
51
 
        ud = list(ud)
52
51
        ud[2] = ud[2].replace('-1,0', '-0,0')
53
52
    elif not newlines:
54
 
        ud = list(ud)
55
53
        ud[2] = ud[2].replace('+1,0', '+0,0')
 
54
    # work around for difflib emitting random spaces after the label
 
55
    ud[0] = ud[0][:-2] + '\n'
 
56
    ud[1] = ud[1][:-2] + '\n'
56
57
 
57
58
    for line in ud:
58
59
        to_file.write(line)
61
62
    print >>to_file
62
63
 
63
64
 
64
 
 
65
 
 
66
65
def external_diff(old_label, oldlines, new_label, newlines, to_file,
67
66
                  diff_opts):
68
67
    """Display a diff by calling out to the external diff program."""
140
139
    finally:
141
140
        oldtmpf.close()                 # and delete
142
141
        newtmpf.close()
143
 
    
144
 
 
145
 
 
146
 
def show_diff(b, revision, specific_files, external_diff_options=None,
147
 
              revision2=None):
 
142
 
 
143
def show_diff(b, from_spec, specific_files, external_diff_options=None,
 
144
              revision2=None, output=None):
148
145
    """Shortcut for showing the diff to the working tree.
149
146
 
150
147
    b
151
148
        Branch.
152
149
 
153
150
    revision
154
 
        None for each, or otherwise the old revision to compare against.
 
151
        None for 'basis tree', or otherwise the old revision to compare against.
155
152
    
156
153
    The more general form is show_diff_trees(), where the caller
157
154
    supplies any two trees.
158
155
    """
159
 
    import sys
 
156
    if output is None:
 
157
        import sys
 
158
        output = sys.stdout
160
159
 
161
 
    if revision == None:
 
160
    if from_spec is None:
162
161
        old_tree = b.basis_tree()
163
162
    else:
164
 
        old_tree = b.revision_tree(b.lookup_revision(revision))
 
163
        old_tree = b.revision_tree(from_spec.in_history(b).rev_id)
165
164
 
166
 
    if revision2 == None:
 
165
    if revision2 is None:
167
166
        new_tree = b.working_tree()
168
167
    else:
169
 
        new_tree = b.revision_tree(b.lookup_revision(revision2))
 
168
        new_tree = b.revision_tree(revision2.in_history(b).rev_id)
170
169
 
171
 
    show_diff_trees(old_tree, new_tree, sys.stdout, specific_files,
 
170
    show_diff_trees(old_tree, new_tree, output, specific_files,
172
171
                    external_diff_options)
173
172
 
174
173
 
209
208
                          specific_files=specific_files)
210
209
 
211
210
    for path, file_id, kind in delta.removed:
212
 
        print >>to_file, '*** removed %s %r' % (kind, path)
213
 
        if kind == 'file':
214
 
            diff_file(old_label + path,
215
 
                      old_tree.get_file(file_id).readlines(),
216
 
                      DEVNULL, 
217
 
                      [],
218
 
                      to_file)
219
 
 
 
211
        print >>to_file, '=== removed %s %r' % (kind, path)
 
212
        old_tree.inventory[file_id].diff(diff_file, old_label + path, old_tree,
 
213
                                         DEVNULL, None, None, to_file)
220
214
    for path, file_id, kind in delta.added:
221
 
        print >>to_file, '*** added %s %r' % (kind, path)
222
 
        if kind == 'file':
223
 
            diff_file(DEVNULL,
224
 
                      [],
225
 
                      new_label + path,
226
 
                      new_tree.get_file(file_id).readlines(),
227
 
                      to_file)
228
 
 
229
 
    for old_path, new_path, file_id, kind, text_modified in delta.renamed:
230
 
        print >>to_file, '*** renamed %s %r => %r' % (kind, old_path, new_path)
 
215
        print >>to_file, '=== added %s %r' % (kind, path)
 
216
        new_tree.inventory[file_id].diff(diff_file, new_label + path, new_tree,
 
217
                                         DEVNULL, None, None, to_file, 
 
218
                                         reverse=True)
 
219
    for (old_path, new_path, file_id, kind,
 
220
         text_modified, meta_modified) in delta.renamed:
 
221
        prop_str = get_prop_change(meta_modified)
 
222
        print >>to_file, '=== renamed %s %r => %r%s' % (
 
223
                          kind, old_path, new_path, prop_str)
 
224
        _maybe_diff_file_or_symlink(old_label, old_path, old_tree, file_id,
 
225
                                    new_label, new_path, new_tree,
 
226
                                    text_modified, kind, to_file, diff_file)
 
227
    for path, file_id, kind, text_modified, meta_modified in delta.modified:
 
228
        prop_str = get_prop_change(meta_modified)
 
229
        print >>to_file, '=== modified %s %r%s' % (kind, path, prop_str)
231
230
        if text_modified:
232
 
            diff_file(old_label + old_path,
233
 
                      old_tree.get_file(file_id).readlines(),
234
 
                      new_label + new_path,
235
 
                      new_tree.get_file(file_id).readlines(),
236
 
                      to_file)
237
 
 
238
 
    for path, file_id, kind in delta.modified:
239
 
        print >>to_file, '*** modified %s %r' % (kind, path)
240
 
        if kind == 'file':
241
 
            diff_file(old_label + path,
242
 
                      old_tree.get_file(file_id).readlines(),
243
 
                      new_label + path,
244
 
                      new_tree.get_file(file_id).readlines(),
245
 
                      to_file)
246
 
 
247
 
 
248
 
 
249
 
 
250
 
 
 
231
            _maybe_diff_file_or_symlink(old_label, path, old_tree, file_id,
 
232
                                        new_label, path, new_tree,
 
233
                                        True, kind, to_file, diff_file)
 
234
    
 
235
 
 
236
def get_prop_change(meta_modified):
 
237
    if meta_modified:
 
238
        return " (properties changed)"
 
239
    else:
 
240
        return  ""
 
241
 
 
242
 
 
243
def _maybe_diff_file_or_symlink(old_label, old_path, old_tree, file_id,
 
244
                                new_label, new_path, new_tree, text_modified,
 
245
                                kind, to_file, diff_file):
 
246
    if text_modified:
 
247
        new_entry = new_tree.inventory[file_id]
 
248
        old_tree.inventory[file_id].diff(diff_file,
 
249
                                         old_label + old_path, old_tree,
 
250
                                         new_label + new_path, new_entry, 
 
251
                                         new_tree, to_file)