~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

  • Committer: Robert Collins
  • Date: 2010-04-08 04:34:03 UTC
  • mfrom: (5138 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5139.
  • Revision ID: robertc@robertcollins.net-20100408043403-56z0d07vdqrx7f3t
Update bugfix for 528114 to trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
107
107
                return True
108
108
        return False
109
109
 
110
 
 
111
 
    def show(self, to_file, show_ids=False, show_unchanged=False,
112
 
             short_status=False, indent='',
113
 
             filter=None):
114
 
        """Output this delta in status-like form to to_file.
115
 
 
116
 
        :param to_file: A file-like object where the output is displayed.
117
 
 
118
 
        :param show_ids: Output the file ids if True.
119
 
 
120
 
        :param show_unchanged: Output the unchanged files if True.
121
 
 
122
 
        :param short_status: Single-line status if True.
123
 
 
124
 
        :param indent: Added at the beginning of all output lines (for merged
125
 
            revisions).
126
 
 
127
 
        :param filter: A callable receiving a path and a file id and
128
 
            returning True if the path should be displayed.
129
 
        """
130
 
 
131
 
        def decorate_path(path, kind, meta_modified=None):
132
 
            if kind == 'directory':
133
 
                path += '/'
134
 
            elif kind == 'symlink':
135
 
                path += '@'
136
 
            if meta_modified:
137
 
                path += '*'
138
 
            return path
139
 
 
140
 
        def show_more_renamed(item):
141
 
            (oldpath, file_id, kind,
142
 
             text_modified, meta_modified, newpath) = item
143
 
            dec_new_path = decorate_path(newpath, kind, meta_modified)
144
 
            to_file.write(' => %s' % dec_new_path)
145
 
            if text_modified or meta_modified:
146
 
                extra_modified.append((newpath, file_id, kind,
147
 
                                       text_modified, meta_modified))
148
 
 
149
 
        def show_more_kind_changed(item):
150
 
            (path, file_id, old_kind, new_kind) = item
151
 
            to_file.write(' (%s => %s)' % (old_kind, new_kind))
152
 
 
153
 
        def show_path(path, file_id, kind, meta_modified,
154
 
                      default_format, with_file_id_format):
155
 
            dec_path = decorate_path(path, kind, meta_modified)
156
 
            if show_ids:
157
 
                to_file.write(with_file_id_format % dec_path)
158
 
            else:
159
 
                to_file.write(default_format % dec_path)
160
 
 
161
 
        def show_list(files, long_status_name, short_status_letter,
162
 
                      default_format='%s', with_file_id_format='%-30s',
163
 
                      show_more=None):
164
 
            if files:
165
 
                header_shown = False
166
 
                if short_status:
167
 
                    prefix = short_status_letter
168
 
                else:
169
 
                    prefix = ''
170
 
                prefix = indent + prefix + '  '
171
 
 
172
 
                for item in files:
173
 
                    path, file_id, kind = item[:3]
174
 
                    if (filter is not None and not filter(path, file_id)):
175
 
                        continue
176
 
                    if not header_shown and not short_status:
177
 
                        to_file.write(indent + long_status_name + ':\n')
178
 
                        header_shown = True
179
 
                    meta_modified = None
180
 
                    if len(item) == 5:
181
 
                        meta_modified = item[4]
182
 
 
183
 
                    to_file.write(prefix)
184
 
                    show_path(path, file_id, kind, meta_modified,
185
 
                              default_format, with_file_id_format)
186
 
                    if show_more is not None:
187
 
                        show_more(item)
188
 
                    if show_ids:
189
 
                        to_file.write(' %s' % file_id)
190
 
                    to_file.write('\n')
191
 
 
192
 
        show_list(self.removed, 'removed', 'D')#
193
 
        show_list(self.added, 'added', 'A')
194
 
        extra_modified = []
195
 
        # Reorder self.renamed tuples so that all lists share the same
196
 
        # order for their 3 first fields and that they also begin like
197
 
        # the self.modified tuples
198
 
        renamed = [(p, i, k, tm, mm, np)
199
 
                   for  p, np, i, k, tm, mm  in self.renamed]
200
 
        show_list(renamed, 'renamed', 'R', with_file_id_format='%s',
201
 
                  show_more=show_more_renamed)
202
 
        show_list(self.kind_changed, 'kind changed', 'K',
203
 
                  with_file_id_format='%s',
204
 
                  show_more=show_more_kind_changed)
205
 
        show_list(self.modified + extra_modified, 'modified', 'M')
206
 
        if show_unchanged:
207
 
            show_list(self.unchanged, 'unchanged', 'S')
208
 
 
209
 
        show_list(self.unversioned, 'unknown', ' ')
210
 
 
211
110
    def get_changes_as_text(self, show_ids=False, show_unchanged=False,
212
 
             short_status=False):
 
111
                            short_status=False):
213
112
        import StringIO
214
113
        output = StringIO.StringIO()
215
 
        self.show(output, show_ids, show_unchanged, short_status)
 
114
        report_delta(output, self, short_status, show_ids, show_unchanged)
216
115
        return output.getvalue()
217
116
 
218
117
 
393
292
        self.output("%s%s%s %s%s", rename, self.modified_map[modified], exe,
394
293
                    old_path, path)
395
294
 
396
 
 
397
295
def report_changes(change_iterator, reporter):
398
296
    """Report the changes from a change iterator.
399
297
 
437
335
        versioned_change = versioned_change_map[versioned]
438
336
        reporter.report(file_id, path, versioned_change, renamed, modified,
439
337
                        exe_change, kind)
 
338
 
 
339
def report_delta(to_file, delta, short_status=False, show_ids=False, 
 
340
         show_unchanged=False, indent='', filter=None):
 
341
    """Output this delta in status-like form to to_file.
 
342
 
 
343
    :param to_file: A file-like object where the output is displayed.
 
344
 
 
345
    :param delta: A TreeDelta containing the changes to be displayed
 
346
 
 
347
    :param short_status: Single-line status if True.
 
348
 
 
349
    :param show_ids: Output the file ids if True.
 
350
 
 
351
    :param show_unchanged: Output the unchanged files if True.
 
352
 
 
353
    :param indent: Added at the beginning of all output lines (for merged
 
354
        revisions).
 
355
 
 
356
    :param filter: A callable receiving a path and a file id and
 
357
        returning True if the path should be displayed.
 
358
    """
 
359
 
 
360
    def decorate_path(path, kind, meta_modified=None):
 
361
        if kind == 'directory':
 
362
            path += '/'
 
363
        elif kind == 'symlink':
 
364
            path += '@'
 
365
        if meta_modified:
 
366
            path += '*'
 
367
        return path
 
368
 
 
369
    def show_more_renamed(item):
 
370
        (oldpath, file_id, kind,
 
371
         text_modified, meta_modified, newpath) = item
 
372
        dec_new_path = decorate_path(newpath, kind, meta_modified)
 
373
        to_file.write(' => %s' % dec_new_path)
 
374
        if text_modified or meta_modified:
 
375
            extra_modified.append((newpath, file_id, kind,
 
376
                                   text_modified, meta_modified))
 
377
 
 
378
    def show_more_kind_changed(item):
 
379
        (path, file_id, old_kind, new_kind) = item
 
380
        to_file.write(' (%s => %s)' % (old_kind, new_kind))
 
381
 
 
382
    def show_path(path, file_id, kind, meta_modified,
 
383
                  default_format, with_file_id_format):
 
384
        dec_path = decorate_path(path, kind, meta_modified)
 
385
        if show_ids:
 
386
            to_file.write(with_file_id_format % dec_path)
 
387
        else:
 
388
            to_file.write(default_format % dec_path)
 
389
 
 
390
    def show_list(files, long_status_name, short_status_letter,
 
391
                  default_format='%s', with_file_id_format='%-30s',
 
392
                  show_more=None):
 
393
        if files:
 
394
            header_shown = False
 
395
            if short_status:
 
396
                prefix = short_status_letter
 
397
            else:
 
398
                prefix = ''
 
399
            prefix = indent + prefix + '  '
 
400
 
 
401
            for item in files:
 
402
                path, file_id, kind = item[:3]
 
403
                if (filter is not None and not filter(path, file_id)):
 
404
                    continue
 
405
                if not header_shown and not short_status:
 
406
                    to_file.write(indent + long_status_name + ':\n')
 
407
                    header_shown = True
 
408
                meta_modified = None
 
409
                if len(item) == 5:
 
410
                    meta_modified = item[4]
 
411
 
 
412
                to_file.write(prefix)
 
413
                show_path(path, file_id, kind, meta_modified,
 
414
                          default_format, with_file_id_format)
 
415
                if show_more is not None:
 
416
                    show_more(item)
 
417
                if show_ids:
 
418
                    to_file.write(' %s' % file_id)
 
419
                to_file.write('\n')
 
420
 
 
421
    show_list(delta.removed, 'removed', 'D')
 
422
    show_list(delta.added, 'added', 'A')
 
423
    extra_modified = []
 
424
    # Reorder delta.renamed tuples so that all lists share the same
 
425
    # order for their 3 first fields and that they also begin like
 
426
    # the delta.modified tuples
 
427
    renamed = [(p, i, k, tm, mm, np)
 
428
               for  p, np, i, k, tm, mm  in delta.renamed]
 
429
    show_list(renamed, 'renamed', 'R', with_file_id_format='%s',
 
430
              show_more=show_more_renamed)
 
431
    show_list(delta.kind_changed, 'kind changed', 'K',
 
432
              with_file_id_format='%s',
 
433
              show_more=show_more_kind_changed)
 
434
    show_list(delta.modified + extra_modified, 'modified', 'M')
 
435
    if show_unchanged:
 
436
        show_list(delta.unchanged, 'unchanged', 'S')
 
437
 
 
438
    show_list(delta.unversioned, 'unknown', ' ')
 
439