~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

  • Committer: Martin Pool
  • Date: 2005-09-12 09:50:44 UTC
  • Revision ID: mbp@sourcefrog.net-20050912095044-6acfdb5611729987
- no tests in bzrlib.fetch anymore

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#! /usr/bin/env python
1
2
# -*- coding: UTF-8 -*-
2
3
 
3
4
# This program is free software; you can redistribute it and/or modify
14
15
# along with this program; if not, write to the Free Software
15
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
16
17
 
17
 
from bzrlib.inventory import InventoryEntry
18
18
from bzrlib.trace import mutter
19
19
 
20
20
class TreeDelta(object):
27
27
    removed
28
28
        (path, id, kind)
29
29
    renamed
30
 
        (oldpath, newpath, id, kind, text_modified, meta_modified)
 
30
        (oldpath, newpath, id, kind, text_modified)
31
31
    modified
32
 
        (path, id, kind, text_modified, meta_modified)
 
32
        (path, id, kind)
33
33
    unchanged
34
34
        (path, id, kind)
35
35
 
36
36
    Each id is listed only once.
37
37
 
38
38
    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.
 
39
    renamed, with the text_modified flag true.
42
40
 
43
41
    Files are only considered renamed if their name has changed or
44
42
    their parent directory has changed.  Renaming a directory
90
88
 
91
89
    def show(self, to_file, show_ids=False, show_unchanged=False):
92
90
        def show_list(files):
93
 
            for item in files:
94
 
                path, fid, kind = item[:3]
95
 
 
 
91
            for path, fid, kind in files:
96
92
                if kind == 'directory':
97
93
                    path += '/'
98
94
                elif kind == 'symlink':
99
95
                    path += '@'
100
 
 
101
 
                if len(item) == 5 and item[4]:
102
 
                    path += '*'
103
 
 
 
96
                    
104
97
                if show_ids:
105
98
                    print >>to_file, '  %-30s %s' % (path, fid)
106
99
                else:
116
109
 
117
110
        if self.renamed:
118
111
            print >>to_file, 'renamed:'
119
 
            for (oldpath, newpath, fid, kind,
120
 
                 text_modified, meta_modified) in self.renamed:
121
 
                if meta_modified:
122
 
                    newpath += '*'
 
112
            for oldpath, newpath, fid, kind, text_modified in self.renamed:
123
113
                if show_ids:
124
114
                    print >>to_file, '  %s => %s %s' % (oldpath, newpath, fid)
125
115
                else:
172
162
            kind = old_ie.kind
173
163
            assert kind == new_ie.kind
174
164
            
175
 
            assert kind in InventoryEntry.known_kinds, \
 
165
            assert kind in ('file', 'directory', 'symlink', 'root_directory'), \
176
166
                   'invalid file kind %r' % kind
177
167
 
178
168
            if kind == 'root_directory':
183
173
                    and not is_inside_any(specific_files, new_inv.id2path(file_id))):
184
174
                    continue
185
175
 
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)
 
176
            if kind == 'file':
 
177
                old_sha1 = old_tree.get_file_sha1(file_id)
 
178
                new_sha1 = new_tree.get_file_sha1(file_id)
 
179
                text_modified = (old_sha1 != new_sha1)
 
180
            else:
 
181
                ## mutter("no text to check for %r %r" % (file_id, kind))
 
182
                text_modified = False
193
183
 
194
184
            # TODO: Can possibly avoid calculating path strings if the
195
185
            # two files are unchanged and their names and parents are
198
188
            
199
189
            if (old_ie.name != new_ie.name
200
190
                or old_ie.parent_id != new_ie.parent_id):
201
 
                delta.renamed.append((old_path,
202
 
                                      new_path,
 
191
                delta.renamed.append((old_inv.id2path(file_id),
 
192
                                      new_inv.id2path(file_id),
203
193
                                      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))
 
194
                                      text_modified))
 
195
            elif text_modified:
 
196
                delta.modified.append((new_inv.id2path(file_id), file_id, kind))
208
197
            elif want_unchanged:
209
 
                delta.unchanged.append((new_path, file_id, kind))
 
198
                delta.unchanged.append((new_inv.id2path(file_id), file_id, kind))
210
199
        else:
211
200
            kind = old_inv.get_file_kind(file_id)
212
201
            if kind == 'root_directory':