~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

add a clean target

Show diffs side-by-side

added added

removed removed

Lines of Context:
14
14
# along with this program; if not, write to the Free Software
15
15
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
16
 
17
 
from bzrlib.inventory import InventoryEntry
18
17
from bzrlib.trace import mutter
19
18
 
20
19
class TreeDelta(object):
27
26
    removed
28
27
        (path, id, kind)
29
28
    renamed
30
 
        (oldpath, newpath, id, kind, text_modified, meta_modified)
 
29
        (oldpath, newpath, id, kind, text_modified)
31
30
    modified
32
 
        (path, id, kind, text_modified, meta_modified)
 
31
        (path, id, kind)
33
32
    unchanged
34
33
        (path, id, kind)
35
34
 
36
35
    Each id is listed only once.
37
36
 
38
37
    Files that are both modified and renamed are listed only in
39
 
    renamed, with the text_modified flag true. The text_modified
40
 
    applies either to the the content of the file or the target of the
41
 
    symbolic link, depending of the kind of file.
 
38
    renamed, with the text_modified flag true.
42
39
 
43
40
    Files are only considered renamed if their name has changed or
44
41
    their parent directory has changed.  Renaming a directory
71
68
            self.modified, self.unchanged)
72
69
 
73
70
    def has_changed(self):
74
 
        return bool(self.modified
75
 
                    or self.added
76
 
                    or self.removed
77
 
                    or self.renamed)
 
71
        changes = len(self.added) + len(self.removed) + len(self.renamed)
 
72
        changes += len(self.modified) 
 
73
        return (changes != 0)
78
74
 
79
75
    def touches_file_id(self, file_id):
80
76
        """Return True if file_id is modified by this delta."""
90
86
 
91
87
    def show(self, to_file, show_ids=False, show_unchanged=False):
92
88
        def show_list(files):
93
 
            for item in files:
94
 
                path, fid, kind = item[:3]
95
 
 
 
89
            for path, fid, kind in files:
96
90
                if kind == 'directory':
97
91
                    path += '/'
98
92
                elif kind == 'symlink':
99
93
                    path += '@'
100
 
 
101
 
                if len(item) == 5 and item[4]:
102
 
                    path += '*'
103
 
 
 
94
                    
104
95
                if show_ids:
105
96
                    print >>to_file, '  %-30s %s' % (path, fid)
106
97
                else:
116
107
 
117
108
        if self.renamed:
118
109
            print >>to_file, 'renamed:'
119
 
            for (oldpath, newpath, fid, kind,
120
 
                 text_modified, meta_modified) in self.renamed:
121
 
                if meta_modified:
122
 
                    newpath += '*'
 
110
            for oldpath, newpath, fid, kind, text_modified in self.renamed:
123
111
                if show_ids:
124
112
                    print >>to_file, '  %s => %s %s' % (oldpath, newpath, fid)
125
113
                else:
172
160
            kind = old_ie.kind
173
161
            assert kind == new_ie.kind
174
162
            
175
 
            assert kind in InventoryEntry.known_kinds, \
 
163
            assert kind in ('file', 'directory', 'symlink', 'root_directory'), \
176
164
                   'invalid file kind %r' % kind
177
165
 
178
166
            if kind == 'root_directory':
183
171
                    and not is_inside_any(specific_files, new_inv.id2path(file_id))):
184
172
                    continue
185
173
 
186
 
            # temporary hack until all entries are populated before clients 
187
 
            # get them
188
 
            old_path = old_inv.id2path(file_id)
189
 
            new_path = new_inv.id2path(file_id)
190
 
            old_ie._read_tree_state(old_path, old_tree)
191
 
            new_ie._read_tree_state(new_path, new_tree)
192
 
            text_modified, meta_modified = new_ie.detect_changes(old_ie)
 
174
            if kind == 'file':
 
175
                old_sha1 = old_tree.get_file_sha1(file_id)
 
176
                new_sha1 = new_tree.get_file_sha1(file_id)
 
177
                text_modified = (old_sha1 != new_sha1)
 
178
            else:
 
179
                ## mutter("no text to check for %r %r" % (file_id, kind))
 
180
                text_modified = False
193
181
 
194
182
            # TODO: Can possibly avoid calculating path strings if the
195
183
            # two files are unchanged and their names and parents are
198
186
            
199
187
            if (old_ie.name != new_ie.name
200
188
                or old_ie.parent_id != new_ie.parent_id):
201
 
                delta.renamed.append((old_path,
202
 
                                      new_path,
 
189
                delta.renamed.append((old_inv.id2path(file_id),
 
190
                                      new_inv.id2path(file_id),
203
191
                                      file_id, kind,
204
 
                                      text_modified, meta_modified))
205
 
            elif text_modified or meta_modified:
206
 
                delta.modified.append((new_path, file_id, kind,
207
 
                                       text_modified, meta_modified))
 
192
                                      text_modified))
 
193
            elif text_modified:
 
194
                delta.modified.append((new_inv.id2path(file_id), file_id, kind))
208
195
            elif want_unchanged:
209
 
                delta.unchanged.append((new_path, file_id, kind))
 
196
                delta.unchanged.append((new_inv.id2path(file_id), file_id, kind))
210
197
        else:
211
198
            kind = old_inv.get_file_kind(file_id)
212
199
            if kind == 'root_directory':