~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

(mbp) merge bzr.dev to 0.8, prepare for release

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# -*- coding: UTF-8 -*-
 
1
# Copyright (C) 2005, 2006 Canonical
2
2
 
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
114
114
            print >>to_file, 'added:'
115
115
            show_list(self.added)
116
116
 
 
117
        extra_modified = []
 
118
 
117
119
        if self.renamed:
118
120
            print >>to_file, 'renamed:'
119
121
            for (oldpath, newpath, fid, kind,
120
122
                 text_modified, meta_modified) in self.renamed:
 
123
                if text_modified or meta_modified:
 
124
                    extra_modified.append((newpath, fid, kind,
 
125
                                           text_modified, meta_modified))
121
126
                if meta_modified:
122
127
                    newpath += '*'
123
128
                if show_ids:
125
130
                else:
126
131
                    print >>to_file, '  %s => %s' % (oldpath, newpath)
127
132
                    
128
 
        if self.modified:
 
133
        if self.modified or extra_modified:
129
134
            print >>to_file, 'modified:'
130
135
            show_list(self.modified)
 
136
            show_list(extra_modified)
131
137
            
132
138
        if show_unchanged and self.unchanged:
133
139
            print >>to_file, 'unchanged:'
151
157
 
152
158
    specific_files
153
159
        If true, only check for changes to specified names or
154
 
        files within them.
 
160
        files within them.  Any unversioned files given have no effect
 
161
        (but this might change in the future).
155
162
    """
 
163
    # NB: show_status depends on being able to pass in non-versioned files and
 
164
    # report them as unknown
 
165
    old_tree.lock_read()
 
166
    try:
 
167
        new_tree.lock_read()
 
168
        try:
 
169
            return _compare_trees(old_tree, new_tree, want_unchanged,
 
170
                                  specific_files)
 
171
        finally:
 
172
            new_tree.unlock()
 
173
    finally:
 
174
        old_tree.unlock()
 
175
 
 
176
 
 
177
def _compare_trees(old_tree, new_tree, want_unchanged, specific_files):
156
178
 
157
179
    from osutils import is_inside_any
158
180
    
161
183
    delta = TreeDelta()
162
184
    mutter('start compare_trees')
163
185
 
164
 
    # TODO: match for specific files can be rather smarter by finding
165
 
    # the IDs of those files up front and then considering only that.
 
186
    # TODO: Rather than iterating over the whole tree and then filtering, we
 
187
    # could diff just the specified files (if any) and their subtrees.  
 
188
    # Perhaps should take a list of file-ids instead?   Need to indicate any
 
189
    # ids or names which were not found in the trees.
166
190
 
167
191
    for file_id in old_tree:
168
192
        if file_id in new_tree:
219
243
 
220
244
    mutter('start looking for new files')
221
245
    for file_id in new_inv:
222
 
        if file_id in old_inv:
 
246
        if file_id in old_inv or file_id not in new_tree:
223
247
            continue
224
248
        kind = new_inv.get_file_kind(file_id)
225
249
        if kind == 'root_directory':