~bzr/ubuntu/lucid/bzr/beta-ppa

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

  • Committer: Martin Pool
  • Date: 2010-08-18 04:26:39 UTC
  • mfrom: (129.1.8 packaging-karmic)
  • Revision ID: mbp@sourcefrog.net-20100818042639-mjoxtngyjwiu05fo
* PPA rebuild for lucid.
* PPA rebuild for karmic.
* PPA rebuild onto jaunty.
* New upstream release.

Show diffs side-by-side

added added

removed removed

Lines of Context:
15
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
16
16
 
17
17
from bzrlib import (
18
 
    errors,
19
18
    osutils,
20
19
    )
21
 
from bzrlib.inventory import InventoryEntry
22
 
from bzrlib.trace import mutter, is_quiet
23
 
from bzrlib.symbol_versioning import deprecated_function
 
20
from bzrlib.trace import is_quiet
24
21
 
25
22
 
26
23
class TreeDelta(object):
107
104
                return True
108
105
        return False
109
106
 
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
107
    def get_changes_as_text(self, show_ids=False, show_unchanged=False,
212
 
             short_status=False):
 
108
                            short_status=False):
213
109
        import StringIO
214
110
        output = StringIO.StringIO()
215
 
        self.show(output, show_ids, show_unchanged, short_status)
 
111
        report_delta(output, self, short_status, show_ids, show_unchanged)
216
112
        return output.getvalue()
217
113
 
218
114
 
393
289
        self.output("%s%s%s %s%s", rename, self.modified_map[modified], exe,
394
290
                    old_path, path)
395
291
 
396
 
 
397
292
def report_changes(change_iterator, reporter):
398
293
    """Report the changes from a change iterator.
399
294
 
437
332
        versioned_change = versioned_change_map[versioned]
438
333
        reporter.report(file_id, path, versioned_change, renamed, modified,
439
334
                        exe_change, kind)
 
335
 
 
336
def report_delta(to_file, delta, short_status=False, show_ids=False, 
 
337
         show_unchanged=False, indent='', filter=None):
 
338
    """Output this delta in status-like form to to_file.
 
339
 
 
340
    :param to_file: A file-like object where the output is displayed.
 
341
 
 
342
    :param delta: A TreeDelta containing the changes to be displayed
 
343
 
 
344
    :param short_status: Single-line status if True.
 
345
 
 
346
    :param show_ids: Output the file ids if True.
 
347
 
 
348
    :param show_unchanged: Output the unchanged files if True.
 
349
 
 
350
    :param indent: Added at the beginning of all output lines (for merged
 
351
        revisions).
 
352
 
 
353
    :param filter: A callable receiving a path and a file id and
 
354
        returning True if the path should be displayed.
 
355
    """
 
356
 
 
357
    def decorate_path(path, kind, meta_modified=None):
 
358
        if kind == 'directory':
 
359
            path += '/'
 
360
        elif kind == 'symlink':
 
361
            path += '@'
 
362
        if meta_modified:
 
363
            path += '*'
 
364
        return path
 
365
 
 
366
    def show_more_renamed(item):
 
367
        (oldpath, file_id, kind,
 
368
         text_modified, meta_modified, newpath) = item
 
369
        dec_new_path = decorate_path(newpath, kind, meta_modified)
 
370
        to_file.write(' => %s' % dec_new_path)
 
371
        if text_modified or meta_modified:
 
372
            extra_modified.append((newpath, file_id, kind,
 
373
                                   text_modified, meta_modified))
 
374
 
 
375
    def show_more_kind_changed(item):
 
376
        (path, file_id, old_kind, new_kind) = item
 
377
        to_file.write(' (%s => %s)' % (old_kind, new_kind))
 
378
 
 
379
    def show_path(path, file_id, kind, meta_modified,
 
380
                  default_format, with_file_id_format):
 
381
        dec_path = decorate_path(path, kind, meta_modified)
 
382
        if show_ids:
 
383
            to_file.write(with_file_id_format % dec_path)
 
384
        else:
 
385
            to_file.write(default_format % dec_path)
 
386
 
 
387
    def show_list(files, long_status_name, short_status_letter,
 
388
                  default_format='%s', with_file_id_format='%-30s',
 
389
                  show_more=None):
 
390
        if files:
 
391
            header_shown = False
 
392
            if short_status:
 
393
                prefix = short_status_letter
 
394
            else:
 
395
                prefix = ''
 
396
            prefix = indent + prefix + '  '
 
397
 
 
398
            for item in files:
 
399
                path, file_id, kind = item[:3]
 
400
                if (filter is not None and not filter(path, file_id)):
 
401
                    continue
 
402
                if not header_shown and not short_status:
 
403
                    to_file.write(indent + long_status_name + ':\n')
 
404
                    header_shown = True
 
405
                meta_modified = None
 
406
                if len(item) == 5:
 
407
                    meta_modified = item[4]
 
408
 
 
409
                to_file.write(prefix)
 
410
                show_path(path, file_id, kind, meta_modified,
 
411
                          default_format, with_file_id_format)
 
412
                if show_more is not None:
 
413
                    show_more(item)
 
414
                if show_ids:
 
415
                    to_file.write(' %s' % file_id)
 
416
                to_file.write('\n')
 
417
 
 
418
    show_list(delta.removed, 'removed', 'D')
 
419
    show_list(delta.added, 'added', 'A')
 
420
    extra_modified = []
 
421
    # Reorder delta.renamed tuples so that all lists share the same
 
422
    # order for their 3 first fields and that they also begin like
 
423
    # the delta.modified tuples
 
424
    renamed = [(p, i, k, tm, mm, np)
 
425
               for  p, np, i, k, tm, mm  in delta.renamed]
 
426
    show_list(renamed, 'renamed', 'R', with_file_id_format='%s',
 
427
              show_more=show_more_renamed)
 
428
    show_list(delta.kind_changed, 'kind changed', 'K',
 
429
              with_file_id_format='%s',
 
430
              show_more=show_more_kind_changed)
 
431
    show_list(delta.modified + extra_modified, 'modified', 'M')
 
432
    if show_unchanged:
 
433
        show_list(delta.unchanged, 'unchanged', 'S')
 
434
 
 
435
    show_list(delta.unversioned, 'unknown', ' ')
 
436