88
def show(self, to_file, show_ids=False, show_unchanged=False):
90
for path, fid, kind in files:
94
def show(self, to_file, show_ids=False, show_unchanged=False, short_status=False):
95
"""output this delta in status-like form to to_file."""
96
def show_list(files, short_status_letter=''):
98
path, fid, kind = item[:3]
91
100
if kind == 'directory':
93
102
elif kind == 'symlink':
105
if len(item) == 5 and item[4]:
97
print >>to_file, ' %-30s %s' % (path, fid)
109
print >>to_file, '%s %-30s %s' % (short_status_letter, path, fid)
99
print >>to_file, ' ', path
111
print >>to_file, '%s %s' % (short_status_letter, path)
102
print >>to_file, 'removed:'
103
show_list(self.removed)
115
print >>to_file, 'removed:'
116
show_list(self.removed)
118
show_list(self.removed, 'D')
106
print >>to_file, 'added:'
107
show_list(self.added)
122
print >>to_file, 'added:'
123
show_list(self.added)
125
show_list(self.added, 'A')
110
print >>to_file, 'renamed:'
111
for oldpath, newpath, fid, kind, text_modified in self.renamed:
130
short_status_letter = 'R'
132
print >>to_file, 'renamed:'
133
short_status_letter = ''
134
for (oldpath, newpath, fid, kind,
135
text_modified, meta_modified) in self.renamed:
136
if text_modified or meta_modified:
137
extra_modified.append((newpath, fid, kind,
138
text_modified, meta_modified))
113
print >>to_file, ' %s => %s %s' % (oldpath, newpath, fid)
142
print >>to_file, '%s %s => %s %s' % (short_status_letter,
143
oldpath, newpath, fid)
115
print >>to_file, ' %s => %s' % (oldpath, newpath)
145
print >>to_file, '%s %s => %s' % (short_status_letter,
118
print >>to_file, 'modified:'
119
show_list(self.modified)
148
if self.modified or extra_modified:
149
short_status_letter = 'M'
151
print >>to_file, 'modified:'
152
short_status_letter = ''
153
show_list(self.modified, short_status_letter)
154
show_list(extra_modified, short_status_letter)
121
156
if show_unchanged and self.unchanged:
122
print >>to_file, 'unchanged:'
123
show_list(self.unchanged)
127
def compare_trees(old_tree, new_tree, want_unchanged=False, specific_files=None):
128
"""Describe changes from one tree to another.
130
Returns a TreeDelta with details of added, modified, renamed, and
133
The root entry is specifically exempt.
135
This only considers versioned files.
138
If true, also list files unchanged from one version to
142
If true, only check for changes to specified names or
146
from osutils import is_inside_any
148
old_inv = old_tree.inventory
149
new_inv = new_tree.inventory
158
print >>to_file, 'unchanged:'
159
show_list(self.unchanged)
161
show_list(self.unchanged, 'S')
164
@deprecated_function(zero_nine)
165
def compare_trees(old_tree, new_tree, want_unchanged=False,
166
specific_files=None, extra_trees=None,
167
require_versioned=False):
168
"""compare_trees was deprecated in 0.10. Please see Tree.changes_from."""
169
return new_tree.changes_from(old_tree,
170
want_unchanged=want_unchanged,
171
specific_files=specific_files,
172
extra_trees=extra_trees,
173
require_versioned=require_versioned,
177
def _compare_trees(old_tree, new_tree, want_unchanged, specific_file_ids,
150
179
delta = TreeDelta()
151
mutter('start compare_trees')
153
# TODO: match for specific files can be rather smarter by finding
154
# the IDs of those files up front and then considering only that.
156
for file_id in old_tree:
157
if file_id in new_tree:
158
old_ie = old_inv[file_id]
159
new_ie = new_inv[file_id]
162
assert kind == new_ie.kind
164
assert kind in ('file', 'directory', 'symlink', 'root_directory'), \
165
'invalid file kind %r' % kind
167
if kind == 'root_directory':
171
if (not is_inside_any(specific_files, old_inv.id2path(file_id))
172
and not is_inside_any(specific_files, new_inv.id2path(file_id))):
176
old_sha1 = old_tree.get_file_sha1(file_id)
177
new_sha1 = new_tree.get_file_sha1(file_id)
178
text_modified = (old_sha1 != new_sha1)
180
# mutter('start compare_trees')
182
for (file_id, path, content_change, versioned, parent_id, name, kind,
183
executable) in new_tree._iter_changes(old_tree, want_unchanged,
185
if not include_root and (None, None) == parent_id:
187
assert kind[0] == kind[1] or None in kind
188
# the only 'kind change' permitted is creation/deletion
189
fully_present = tuple((versioned[x] and kind[x] is not None) for
191
if fully_present[0] != fully_present[1]:
192
if fully_present[1] is True:
193
delta.added.append((path, file_id, kind[1]))
180
## mutter("no text to check for %r %r" % (file_id, kind))
181
text_modified = False
183
# TODO: Can possibly avoid calculating path strings if the
184
# two files are unchanged and their names and parents are
185
# the same and the parents are unchanged all the way up.
186
# May not be worthwhile.
188
if (old_ie.name != new_ie.name
189
or old_ie.parent_id != new_ie.parent_id):
190
delta.renamed.append((old_inv.id2path(file_id),
191
new_inv.id2path(file_id),
195
delta.modified.append((new_inv.id2path(file_id), file_id, kind))
197
delta.unchanged.append((new_inv.id2path(file_id), file_id, kind))
195
assert fully_present[0] is True
196
old_path = old_tree.id2path(file_id)
197
delta.removed.append((old_path, file_id, kind[0]))
198
elif fully_present[0] is False:
200
elif name[0] != name[1] or parent_id[0] != parent_id[1]:
201
# If the name changes, or the parent_id changes, we have a rename
202
# (if we move a parent, that doesn't count as a rename for the
204
old_path = old_tree.id2path(file_id)
205
delta.renamed.append((old_path,
210
(executable[0] != executable[1])))
211
elif content_change is True or executable[0] != executable[1]:
212
delta.modified.append((path, file_id, kind[1],
214
(executable[0] != executable[1])))
199
kind = old_inv.get_file_kind(file_id)
200
if kind == 'root_directory':
202
old_path = old_inv.id2path(file_id)
204
if not is_inside_any(specific_files, old_path):
206
delta.removed.append((old_path, file_id, kind))
216
delta.unchanged.append((path, file_id, kind[1]))
208
mutter('start looking for new files')
209
for file_id in new_inv:
210
if file_id in old_inv:
212
kind = new_inv.get_file_kind(file_id)
213
if kind == 'root_directory':
215
new_path = new_inv.id2path(file_id)
217
if not is_inside_any(specific_files, new_path):
219
delta.added.append((new_path, file_id, kind))
221
218
delta.removed.sort()
222
219
delta.added.sort()
223
220
delta.renamed.sort()
221
# TODO: jam 20060529 These lists shouldn't need to be sorted
222
# since we added them in alphabetical order.
224
223
delta.modified.sort()
225
224
delta.unchanged.sort()