• 
      

    Show diffs for text file attachments.

    Review Request #7123 — Created March 26, 2015 and submitted

    Information

    Review Board
    release-2.5.x
    6cb3753...

    Reviewers

    When viewing diffs of text file attachments, they're now rendered as if
    they were actual diffs. We use the same diff chunk generation and
    rendering logic, and commenting abilities.
    
    This carries over to renderable text files as well. Rendered Markdown is
    diffed as well. We even show the changes within lines, though only
    text changes and not formatting.
    
    Comment thumbnails are shown based on the render state. The thumbnails
    show the diffed contents just like for actual diff comments.
    
    Some of the diff-specific JavaScript code is now made more
    general-purpose, and lives in TextCommentRowSelector. This is primarily
    the row finding code. There's also a convenience function around it for
    finding the beginning and end rows for a line range, needed for both the
    diff viewer and the text attachment review UI.

    Tested viewing individual revisions and revision ranges for various text
    files and for Markdown files (rendered and source).

    Tested commenting on lines within these, both single lines and spanning
    multiple lines. I checked commenting on the first line and last lines of
    the files, to test boundary issues.

    Tested that the thumbnails matched the right lines and the right view mode
    for plain text and Markdown, on both the review dialog and the reviews.


    Description From Last Updated

    Seems to be missing a left border.

    daviddavid

    Col: 80 E501 line too long (80 > 79 characters)

    reviewbotreviewbot

    This could be much more nicely written as: if f: return get_chunks_in_range(f['chunks'], first_line, num_lines) else: return []

    daviddavid

    In this case I think makes more sense than parens.

    daviddavid

    This needs a var definition.

    daviddavid

    This should be a // comment. Same for other one-line comments below.

    daviddavid

    Can we use the context manager form here?

    daviddavid
    reviewbot
    1. Tool: PEP8 Style Checker
      Processed Files:
          reviewboard/reviews/views.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/reviews/ui/markdownui.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
      
      Tool: Pyflakes
      Processed Files:
          reviewboard/reviews/views.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/reviews/ui/markdownui.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
    2. reviewboard/reviews/chunk_generators.py (Diff revision 1)
       
       
      Show all issues
      Col: 80
       E501 line too long (80 > 79 characters)
      
    3. 
        
    chipx86
    reviewbot
    1. Tool: PEP8 Style Checker
      Processed Files:
          reviewboard/reviews/views.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/reviews/ui/markdownui.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
      
      Tool: Pyflakes
      Processed Files:
          reviewboard/reviews/views.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/reviews/ui/markdownui.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
    2. 
        
    david
    1. 
        
    2. Show all issues

      Seems to be missing a left border.

    3. reviewboard/diffviewer/diffutils.py (Diff revision 2)
       
       
       
       
       
       
      Show all issues

      This could be much more nicely written as:

      if f:
          return get_chunks_in_range(f['chunks'], first_line, num_lines)
      else:
          return []
      
      1. get_chunks_in_range is a generator, and you can't just return those. You have to iterate and yield.

      2. That's not true:

        >>> def generator():
        ...     a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
        ...     for item in a:
        ...         if item == 8:
        ...             raise StopIteration
        ...         yield item
        ...
        >>> def proxy():
        ...     return generator()
        ...
        >>> print list(proxy())
        [1, 2, 3, 4, 5, 6, 7]
        
      3. You're right. In my mind, I intended get_file_chunks_in_range itself to be a generator, meaning it'd have to yield from a nested generator and couldn't just return it, but that doesn't make any difference in this case. I'll change it.

      4. I still don't quite understand what you mean. In my example above, calling proxy() will return a generator object, and everything is still lazy until the list call. A function which calls a generator function, iterates it, and yields each result is useless.

    4. reviewboard/reviews/chunk_generators.py (Diff revision 2)
       
       
      Show all issues

      In this case I think makes more sense than parens.

    5. Show all issues

      This needs a var definition.

    6. Show all issues

      This should be a // comment. Same for other one-line comments below.

    7. 
        
    chipx86
    reviewbot
    1. Tool: PEP8 Style Checker
      Processed Files:
          reviewboard/reviews/ui/markdownui.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
      
      Tool: Pyflakes
      Processed Files:
          reviewboard/reviews/ui/markdownui.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
    2. 
        
    david
    1. 
        
    2. reviewboard/reviews/ui/text.py (Diff revision 3)
       
       
       
       
       
       
      Show all issues

      Can we use the context manager form here?

    3. 
        
    chipx86
    reviewbot
    1. Tool: Pyflakes
      Processed Files:
          reviewboard/reviews/ui/markdownui.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
      
      Tool: PEP8 Style Checker
      Processed Files:
          reviewboard/reviews/ui/markdownui.py
          reviewboard/reviews/chunk_generators.py
          reviewboard/reviews/ui/text.py
          reviewboard/diffviewer/templatetags/difftags.py
          reviewboard/diffviewer/diffutils.py
      
      Ignored Files:
          reviewboard/static/rb/css/pages/text-review-ui.less
          reviewboard/templates/diffviewer/diff_file_fragment.html
          reviewboard/templates/reviews/ui/text_comment_thumbnail.html
          reviewboard/static/rb/js/diffviewer/views/diffReviewableView.js
          reviewboard/templates/reviews/ui/text.html
          reviewboard/templates/reviews/ui/_text_table.html
          reviewboard/static/rb/js/views/textBasedReviewableView.js
          reviewboard/static/rb/js/views/textCommentRowSelector.js
      
      
    2. 
        
    david
    1. Ship It!
    2. 
        
    chipx86
    Review request changed
    Status:
    Completed
    Change Summary:
    Pushed to release-2.5.x (ff30e3d)