33
36
(oldpath, newpath, id, kind, text_modified, meta_modified)
35
(path, id, old_kind, new_kind)
37
38
(path, id, kind, text_modified, meta_modified)
43
44
Each id is listed only once.
45
46
Files that are both modified and renamed are listed only in
46
47
renamed, with the text_modified flag true. The text_modified
47
applies either to the content of the file or the target of the
48
applies either to the the content of the file or the target of the
48
49
symbolic link, depending of the kind of file.
50
51
Files are only considered renamed if their name has changed or
104
104
if v[1] == file_id:
109
def show(self, to_file, show_ids=False, show_unchanged=False,
110
short_status=False, indent=''):
111
"""output this delta in status-like form to to_file."""
112
def show_list(files, short_status_letter=''):
114
path, fid, kind = item[:3]
116
if kind == 'directory':
118
elif kind == 'symlink':
121
if len(item) == 5 and item[4]:
125
to_file.write(indent + '%s %-30s %s\n' % (short_status_letter,
128
to_file.write(indent + '%s %s\n' % (short_status_letter, path))
132
to_file.write(indent + 'removed:\n')
133
show_list(self.removed)
135
show_list(self.removed, 'D')
139
to_file.write(indent + 'added:\n')
140
show_list(self.added)
142
show_list(self.added, 'A')
147
short_status_letter = 'R'
149
to_file.write(indent + 'renamed:\n')
150
short_status_letter = ''
151
for (oldpath, newpath, fid, kind,
152
text_modified, meta_modified) in self.renamed:
153
if text_modified or meta_modified:
154
extra_modified.append((newpath, fid, kind,
155
text_modified, meta_modified))
159
to_file.write(indent + '%s %s => %s %s\n' % (
160
short_status_letter, oldpath, newpath, fid))
162
to_file.write(indent + '%s %s => %s\n' % (
163
short_status_letter, oldpath, newpath))
165
if self.kind_changed:
167
short_status_letter = 'K'
169
to_file.write(indent + 'kind changed:\n')
170
short_status_letter = ''
171
for (path, fid, old_kind, new_kind) in self.kind_changed:
176
to_file.write(indent + '%s %s (%s => %s)%s\n' % (
177
short_status_letter, path, old_kind, new_kind, suffix))
179
if self.modified or extra_modified:
180
short_status_letter = 'M'
182
to_file.write(indent + 'modified:\n')
183
short_status_letter = ''
184
show_list(self.modified, short_status_letter)
185
show_list(extra_modified, short_status_letter)
187
if show_unchanged and self.unchanged:
189
to_file.write(indent + 'unchanged:\n')
190
show_list(self.unchanged)
192
show_list(self.unchanged, 'S')
195
to_file.write(indent + 'unknown:\n')
196
show_list(self.unversioned)
108
198
def get_changes_as_text(self, show_ids=False, show_unchanged=False,
111
201
output = StringIO.StringIO()
112
report_delta(output, self, short_status, show_ids, show_unchanged)
202
self.show(output, show_ids, show_unchanged, short_status)
113
203
return output.getvalue()
206
290
'unchanged': ' ',
212
294
self.versioned_map = {'added': '+', # versioned target
213
295
'unchanged': ' ', # versioned in both
214
296
'removed': '-', # versioned in source
215
297
'unversioned': '?', # versioned in neither
217
299
self.unversioned_filter = unversioned_filter
219
self.kind_marker = osutils.kind_marker
221
self.kind_marker = lambda kind: ''
222
if view_info is None:
223
self.view_name = None
226
self.view_name = view_info[0]
227
self.view_files = view_info[1]
228
self.output("Operating on whole tree but only reporting on "
229
"'%s' view." % (self.view_name,))
231
301
def report(self, file_id, paths, versioned, renamed, modified, exe_change,
344
410
versioned_change = versioned_change_map[versioned]
345
411
reporter.report(file_id, path, versioned_change, renamed, modified,
346
412
exe_change, kind)
348
def report_delta(to_file, delta, short_status=False, show_ids=False,
349
show_unchanged=False, indent='', filter=None, classify=True):
350
"""Output this delta in status-like form to to_file.
352
:param to_file: A file-like object where the output is displayed.
354
:param delta: A TreeDelta containing the changes to be displayed
356
:param short_status: Single-line status if True.
358
:param show_ids: Output the file ids if True.
360
:param show_unchanged: Output the unchanged files if True.
362
:param indent: Added at the beginning of all output lines (for merged
365
:param filter: A callable receiving a path and a file id and
366
returning True if the path should be displayed.
368
:param classify: Add special symbols to indicate file kind.
371
def decorate_path(path, kind, meta_modified=None):
374
if kind == 'directory':
376
elif kind == 'symlink':
382
def show_more_renamed(item):
383
(oldpath, file_id, kind,
384
text_modified, meta_modified, newpath) = item
385
dec_new_path = decorate_path(newpath, kind, meta_modified)
386
to_file.write(' => %s' % dec_new_path)
387
if text_modified or meta_modified:
388
extra_modified.append((newpath, file_id, kind,
389
text_modified, meta_modified))
391
def show_more_kind_changed(item):
392
(path, file_id, old_kind, new_kind) = item
393
to_file.write(' (%s => %s)' % (old_kind, new_kind))
395
def show_path(path, file_id, kind, meta_modified,
396
default_format, with_file_id_format):
397
dec_path = decorate_path(path, kind, meta_modified)
399
to_file.write(with_file_id_format % dec_path)
401
to_file.write(default_format % dec_path)
403
def show_list(files, long_status_name, short_status_letter,
404
default_format='%s', with_file_id_format='%-30s',
409
prefix = short_status_letter
412
prefix = indent + prefix + ' '
415
path, file_id, kind = item[:3]
416
if (filter is not None and not filter(path, file_id)):
418
if not header_shown and not short_status:
419
to_file.write(indent + long_status_name + ':\n')
423
meta_modified = item[4]
425
to_file.write(prefix)
426
show_path(path, file_id, kind, meta_modified,
427
default_format, with_file_id_format)
428
if show_more is not None:
431
to_file.write(' %s' % file_id)
434
show_list(delta.removed, 'removed', 'D')
435
show_list(delta.added, 'added', 'A')
436
show_list(delta.missing, 'missing', '!')
438
# Reorder delta.renamed tuples so that all lists share the same
439
# order for their 3 first fields and that they also begin like
440
# the delta.modified tuples
441
renamed = [(p, i, k, tm, mm, np)
442
for p, np, i, k, tm, mm in delta.renamed]
443
show_list(renamed, 'renamed', 'R', with_file_id_format='%s',
444
show_more=show_more_renamed)
445
show_list(delta.kind_changed, 'kind changed', 'K',
446
with_file_id_format='%s',
447
show_more=show_more_kind_changed)
448
show_list(delta.modified + extra_modified, 'modified', 'M')
450
show_list(delta.unchanged, 'unchanged', 'S')
452
show_list(delta.unversioned, 'unknown', ' ')