~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/delta.py

  • Committer: Arnaud Jeansen
  • Date: 2010-03-19 23:58:06 UTC
  • mto: This revision was merged to the branch mainline in revision 5126.
  • Revision ID: arnaud.jeansen@gmail.com-20100319235806-n0owdq874qsrb12u
Go back to unified report_delta method (i.e. former TreeDelta.show())

Show diffs side-by-side

added added

removed removed

Lines of Context:
111
111
                            short_status=False):
112
112
        import StringIO
113
113
        output = StringIO.StringIO()
114
 
        if short_status:
115
 
            report_short(output, self, show_ids, show_unchanged)
116
 
        else:
117
 
            report_long(output, self, show_ids, show_unchanged)
 
114
        report_delta(output, self, short_status, show_ids, show_unchanged)
118
115
        return output.getvalue()
119
116
 
120
117
 
341
338
 
342
339
def report_delta(to_file, delta, short_status=False, show_ids=False, 
343
340
         show_unchanged=False, indent='', filter=None):
344
 
    if short_status:
345
 
        __report_delta_short(to_file, delta, show_ids, show_unchanged, 
346
 
                             indent, filter)        
347
 
    else:
348
 
        __report_delta_long(to_file, delta, show_ids, show_unchanged, 
349
 
                             indent, filter)
350
 
 
351
 
def __report_delta_short(to_file, delta, show_ids=False, show_unchanged=False,
352
 
         indent='', filter=None):
353
 
    """Output given delta in status-like form to to_file, using a short format.
354
 
 
355
 
    :param to_file: A file-like object where the output is displayed.
356
 
 
357
 
    :param delta: A TreeDelta containing the changes to be displayed
358
 
 
359
 
    :param show_ids: Output the file ids if True.
360
 
 
361
 
    :param show_unchanged: Output the unchanged files if True.
362
 
 
363
 
    :param indent: Added at the beginning of all output lines (for merged
364
 
        revisions).
365
 
 
366
 
    :param filter: A callable receiving a path and a file id and
367
 
        returning True if the path should be displayed.
368
 
    """
369
 
 
370
 
    def decorate_path(path, kind, meta_modified=None):
371
 
        if kind == 'directory':
372
 
            path += '/'
373
 
        elif kind == 'symlink':
374
 
            path += '@'
375
 
        if meta_modified:
376
 
            path += '*'
377
 
        return path
378
 
 
379
 
    def show_more_renamed(item):
380
 
        (oldpath, file_id, kind,
381
 
         text_modified, meta_modified, newpath) = item
382
 
        dec_new_path = decorate_path(newpath, kind, meta_modified)
383
 
        to_file.write(' => %s' % dec_new_path)
384
 
        if text_modified or meta_modified:
385
 
            extra_modified.append((newpath, file_id, kind,
386
 
                                   text_modified, meta_modified))
387
 
 
388
 
    def show_more_kind_changed(item):
389
 
        (path, file_id, old_kind, new_kind) = item
390
 
        to_file.write(' (%s => %s)' % (old_kind, new_kind))
391
 
 
392
 
    def show_path(path, file_id, kind, meta_modified,
393
 
                  default_format, with_file_id_format):
394
 
        dec_path = decorate_path(path, kind, meta_modified)
395
 
        if show_ids:
396
 
            to_file.write(with_file_id_format % dec_path)
397
 
        else:
398
 
            to_file.write(default_format % dec_path)
399
 
 
400
 
    def show_list(files, short_status_letter, default_format='%s', 
401
 
                  with_file_id_format='%-30s', show_more=None):
402
 
        if files:
403
 
            prefix = indent + short_status_letter + '  '
404
 
 
405
 
            for item in files:
406
 
                path, file_id, kind = item[:3]
407
 
                if (filter is not None and not filter(path, file_id)):
408
 
                    continue
409
 
                meta_modified = None
410
 
                if len(item) == 5:
411
 
                    meta_modified = item[4]
412
 
 
413
 
                to_file.write(prefix)
414
 
                show_path(path, file_id, kind, meta_modified,
415
 
                          default_format, with_file_id_format)
416
 
                if show_more is not None:
417
 
                    show_more(item)
418
 
                if show_ids:
419
 
                    to_file.write(' %s' % file_id)
420
 
                to_file.write('\n')
421
 
 
422
 
    show_list(delta.removed, 'D')
423
 
    show_list(delta.added, 'A')
424
 
    extra_modified = []
425
 
    # Reorder delta.renamed tuples so that all lists share the same
426
 
    # order for their 3 first fields and that they also begin like
427
 
    # the delta.modified tuples
428
 
    renamed = [(p, i, k, tm, mm, np)
429
 
               for  p, np, i, k, tm, mm  in delta.renamed]
430
 
    show_list(renamed, 'R', with_file_id_format='%s',
431
 
              show_more=show_more_renamed)
432
 
    show_list(delta.kind_changed, 'K', 
433
 
              with_file_id_format='%s',
434
 
              show_more=show_more_kind_changed)
435
 
    show_list(delta.modified + extra_modified, 'M')
436
 
    if show_unchanged:
437
 
        show_list(delta.unchanged, 'S')
438
 
 
439
 
    show_list(delta.unversioned, ' ')
440
 
 
441
 
 
442
 
 
443
 
def __report_delta_long(to_file, delta, show_ids=False, show_unchanged=False,
444
 
         indent='', filter=None):
445
 
    """Output given delta in status-like form to to_file.
446
 
 
447
 
    :param to_file: A file-like object where the output is displayed.
448
 
 
449
 
    :param delta: A TreeDelta containing the changes to be displayed
450
 
 
451
 
    :param show_ids: Output the file ids if True.
452
 
 
453
 
    :param show_unchanged: Output the unchanged files if True.
454
 
 
455
 
    :param indent: Added at the beginning of all output lines (for merged
456
 
        revisions).
457
 
 
458
 
    :param filter: A callable receiving a path and a file id and
459
 
        returning True if the path should be displayed.
460
 
    """
461
 
 
462
 
    def decorate_path(path, kind, meta_modified=None):
463
 
        if kind == 'directory':
464
 
            path += '/'
465
 
        elif kind == 'symlink':
466
 
            path += '@'
467
 
        if meta_modified:
468
 
            path += '*'
469
 
        return path
470
 
 
471
 
    def show_more_renamed(item):
472
 
        (oldpath, file_id, kind,
473
 
         text_modified, meta_modified, newpath) = item
474
 
        dec_new_path = decorate_path(newpath, kind, meta_modified)
475
 
        to_file.write(' => %s' % dec_new_path)
476
 
        if text_modified or meta_modified:
477
 
            extra_modified.append((newpath, file_id, kind,
478
 
                                   text_modified, meta_modified))
479
 
 
480
 
    def show_more_kind_changed(item):
481
 
        (path, file_id, old_kind, new_kind) = item
482
 
        to_file.write(' (%s => %s)' % (old_kind, new_kind))
483
 
 
484
 
    def show_path(path, file_id, kind, meta_modified,
485
 
                  default_format, with_file_id_format):
486
 
        dec_path = decorate_path(path, kind, meta_modified)
487
 
        if show_ids:
488
 
            to_file.write(with_file_id_format % dec_path)
489
 
        else:
490
 
            to_file.write(default_format % dec_path)
491
 
 
492
 
    def show_list(files, long_status_name, default_format='%s', 
493
 
                  with_file_id_format='%-30s', show_more=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):
494
393
        if files:
495
394
            header_shown = False
496
 
            prefix = indent + '  '
 
395
            if short_status:
 
396
                prefix = short_status_letter
 
397
            else:
 
398
                prefix = ''
 
399
            prefix = indent + prefix + '  '
497
400
 
498
401
            for item in files:
499
402
                path, file_id, kind = item[:3]
500
403
                if (filter is not None and not filter(path, file_id)):
501
404
                    continue
502
 
                if not header_shown:
 
405
                if not header_shown and not short_status:
503
406
                    to_file.write(indent + long_status_name + ':\n')
504
407
                    header_shown = True
505
408
                meta_modified = None
515
418
                    to_file.write(' %s' % file_id)
516
419
                to_file.write('\n')
517
420
 
518
 
    show_list(delta.removed, 'removed')
519
 
    show_list(delta.added, 'added')
 
421
    show_list(delta.removed, 'removed', 'D')
 
422
    show_list(delta.added, 'added', 'A')
520
423
    extra_modified = []
521
424
    # Reorder delta.renamed tuples so that all lists share the same
522
425
    # order for their 3 first fields and that they also begin like
523
426
    # the delta.modified tuples
524
427
    renamed = [(p, i, k, tm, mm, np)
525
428
               for  p, np, i, k, tm, mm  in delta.renamed]
526
 
    show_list(renamed, 'renamed', with_file_id_format='%s',
 
429
    show_list(renamed, 'renamed', 'R', with_file_id_format='%s',
527
430
              show_more=show_more_renamed)
528
 
    show_list(delta.kind_changed, 'kind changed', 
 
431
    show_list(delta.kind_changed, 'kind changed', 'K',
529
432
              with_file_id_format='%s',
530
433
              show_more=show_more_kind_changed)
531
 
    show_list(delta.modified + extra_modified, 'modified')
 
434
    show_list(delta.modified + extra_modified, 'modified', 'M')
532
435
    if show_unchanged:
533
 
        show_list(delta.unchanged, 'unchanged')
 
436
        show_list(delta.unchanged, 'unchanged', 'S')
534
437
 
535
 
    show_list(delta.unversioned, 'unknown')
 
438
    show_list(delta.unversioned, 'unknown', ' ')
536
439