Display commit lists for review requests created with history

Review Request #10094 — Created July 18, 2018 and submitted

Information

Review Board
release-4.0.x
9d9e132...

Reviewers

The CommitListField renders the summaries (and authors if they differ
from the review request submitter) of the commits that make up a
multi-commit review request. This field has been added to a new
ExtraFieldSet, which exists below the MainFieldSet. This is due to
the RB.ReviewRequestEditorView expecting the last field in the main
field set to be an editable text field and working around this
limitation was more complex and convoluted than adding a new fieldset.

The JS RB.ReviewRequestFields.CommitListFieldView is responsible for
toggling between the full commit message (if it is longer than a single
line) and the summary.

  • Ran unit tests.
  • Ran JS tests.
  • Uploaded review requests with multiple commits and saw the correct
    commits displayed in the field and in change descriptions.
  • Uploaded a plain review request and did not see the new field on
    the review request page or change description box.

Description From Last Updated

Unit tests for the field should probably be added (mentioned as a "TODO" in your Testing Done). Did your test …

chipx86chipx86

E111 indentation is not a multiple of four

reviewbotreviewbot

E302 expected 2 blank lines, found 1

reviewbotreviewbot

F401 'reviewboard.diffviewer.models.DiffCommit' imported but unused

reviewbotreviewbot

F401 'reviewboard.reviews.builtin_fields.ReviewRequestPageDataMixin' imported but unused

reviewbotreviewbot

E303 too many blank lines (2)

reviewbotreviewbot

E702 multiple statements on one line (semicolon)

reviewbotreviewbot

I'm switching more code over to this (I have a pending change I need to split up and put up …

chipx86chipx86

We do this both here and in should_render(), but we do it differently in each. We should be consistent, or …

chipx86chipx86

Typo: "rquest" -> "request"

chipx86chipx86

Rather than loop through the commits multiple times, how about: include_author_name = not submitter_name should_expand = {} show_expand_collapse = False …

chipx86chipx86

This sounds like a boolean, but it's a dictionary. Maybe call it commits_to_expand?

chipx86chipx86

Let's make this a private method on the class, so it's not redefined every time this method is called. Alternatively, …

chipx86chipx86

The annoyance with {} for both sets and dicts is that this looks pretty weird at first glance. Thinking we …

chipx86chipx86

Missing trailing comma.

chipx86chipx86

We should probably explicitly check that diffset_id is not None here.

chipx86chipx86

Missing a docstring.

chipx86chipx86

Typo: "creatd" -> "created"

chipx86chipx86

We can define this once in the base class instead of in each subclass by doing: if not self.get_review_request().created_with_history: return …

chipx86chipx86

Typo: "creatd" -> "created"

chipx86chipx86

Unwanted blank line.

chipx86chipx86

Alphabetical order.

chipx86chipx86

Can you define a constant for this?

chipx86chipx86

We should either have a constant already for the font size, or you should be able to inherit.

chipx86chipx86

Can you define a constant for this?

chipx86chipx86

We should have constants for this already, since we have the same styling elsewhere. If not, it should be added …

chipx86chipx86

Blank line here.

chipx86chipx86

This is missing the mobile rule in #review-request-main. Really, we should add a mixin that's used both here and there …

chipx86chipx86

Comma before "if any."

chipx86chipx86

Here as well.

chipx86chipx86

Looks like you got some whiteout on your '.

chipx86chipx86

Typo: "statis" -> "status"

chipx86chipx86

Typo: "Collpase" -> "Collapse"

chipx86chipx86

You can do this.$('.commit-message') instead.

chipx86chipx86

Can you start the first parameter on the function call line? That or turn this into a dictionary. Looks a …

chipx86chipx86

Typo: "colum" -> "column"

chipx86chipx86

Instead of - and +, can you use fa fa-plus and fa fa-minus? That's what we use for other collapse/expand …

chipx86chipx86

E501 line too long (83 > 79 characters)

reviewbotreviewbot

E501 line too long (83 > 79 characters)

reviewbotreviewbot

This should be the new full type path.

chipx86chipx86

You should use keyword arguments for these calls to render_to_string(), to ensure compatibility going forward.

chipx86chipx86

Can you put the start of the tuple on the second line?

chipx86chipx86

"Array", not "array".

chipx86chipx86

"Backbone", not "Bckbone".

chipx86chipx86

Alphabetical order.

chipx86chipx86

RequestFactory() should be defined in setUp and not setUpClass, since it keeps state between requests and can introduce subtle failures.

chipx86chipx86

Should be Model Attributes.

chipx86chipx86

Should be jQuery.Event.

chipx86chipx86

Should be jQuery.Event.

chipx86chipx86

Should be jQuery.Event.

chipx86chipx86

Should be boolean.

chipx86chipx86
Checks run (1 failed, 1 failed with error)
flake8 failed.
JSHint internal error.

flake8

brennie
Review request changed
Summary:
WIP
Display commit lists for review requests created with history
Description:
~  

WIP

  ~

The CommitListField renders the summaries (and authors if they differ

  + from the review request submitter) of the commits that make up a
  + multi-commit review request. This field has been added to a new
  + ExtraFieldSet, which exists below the MainFieldSet. This is due to
  + the RB.ReviewRequestEditorView expecting the last field in the main
  + field set to be an editable text field and working around this
  + limitation was more complex and convoluted than adding a new fieldset.

  +
  +

The JS RB.ReviewRequestFields.CommitListFieldView is responsible for

  + toggling between the full commit message (if it is longer than a single
  + line) and the summary.

Testing Done:
  +
  • Ran unit tests.
  +
  • Uploaded review requests with multiple commits and saw the correct
    commits displayed in the field and in change descriptions.
  +
  • TODO: Add unit tests for the field.
Commit:
af8a4800e4076aa05c36f4b489023be474aab363
bec2c2299fc198e5674b709d1a041b3e0f1064dc
Added Files:

Checks run (1 failed, 1 failed with error)

flake8 failed.
JSHint internal error.

flake8

brennie
Review request changed
Change Summary:

Fix unit test failures and flake8

Commit:
bec2c2299fc198e5674b709d1a041b3e0f1064dc
0fd9669d997973173f3add19d431b5ed470c7f14

Checks run (1 failed, 1 succeeded)

flake8 failed.
JSHint passed.

flake8

brennie
brennie
brennie
brennie
chipx86
  1. 
      
  2. Show all issues

    Unit tests for the field should probably be added (mentioned as a "TODO" in your Testing Done).

    Did your test run include JavaScript unit tests, and review requests without history support?

  3. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
    Show all issues

    I'm switching more code over to this (I have a pending change I need to split up and put up for review), but for render_to_string() you'll want to use the new compat function we have, which will help us migrate to newer versions of Django soon.

    from djblets.util.compat.django.template.loader import render_to_string
    
    ...
    
    render_to_string(template_name=...,
                     context={...},
                     request=request)
    

    Passing in request gives you a RequestContext. If not passed in, you get a Context.

    (It does support passing in those objects themselves, but a dictionary is more future-proof.)

  4. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
     
     
     
     
    Show all issues

    We do this both here and in should_render(), but we do it differently in each. We should be consistent, or we should have a private helper that wraps it.

  5. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
    Show all issues

    Typo: "rquest" -> "request"

  6. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
     
     
     
     
     
     
     
     
     
     
    Show all issues

    Rather than loop through the commits multiple times, how about:

    include_author_name = not submitter_name
    should_expand = {}
    show_expand_collapse = False
    
    for commit in commits:
        commit_should_expand = (commit.summary.strip() != commit.commit_message.strip())
        should_expand[commit.pk] = commit_should_expand
    
        if commit_should_expand:
            show_expand_collapse = True
    
        if not include_author_name and commit.author_name != submitter_name:
            include_author_name = True
    

    Potentially, you could also get rid of show_expand_collapse by turning should_expand into a set of ones to expand. It's then easy to check against that for both individual commits and as a larger "are there any commits that should expand". Then we're simply looking at:

    include_author_name = not submitter_name
    should_expand = set()
    
    for commit in commits:
        if (commit.summary.strip() != commit.commit_message.strip()):
            should_expand.add(commit.pk)
    
        if not include_author_name and commit.author_name != submitter_name:
            include_author_name = True
    
  7. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
    Show all issues

    This sounds like a boolean, but it's a dictionary. Maybe call it commits_to_expand?

  8. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
     
     
     
     
     
     
     
    Show all issues

    Let's make this a private method on the class, so it's not redefined every time this method is called.

    Alternatively, do this instead:

    return {
        key: set(
            {
                'author': commit.author_name,
                'summary': commit.summary,
            }
            for commit in commits_by_diffset_id[info[key]]
        )
        for key in ('old', 'new')
    }
    
  9. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
    Show all issues

    The annoyance with {} for both sets and dicts is that this looks pretty weird at first glance. Thinking we should use set() explicitly here to differentiate from the dict.

    1. It was supposed to be a list 😄

  10. reviewboard/reviews/builtin_fields.py (Diff revision 7)
     
     
    Show all issues

    Missing trailing comma.

  11. reviewboard/reviews/detail.py (Diff revision 7)
     
     
     
    Show all issues

    We should probably explicitly check that diffset_id is not None here.

  12. Show all issues

    Missing a docstring.

  13. Show all issues

    Typo: "creatd" -> "created"

  14. reviewboard/reviews/models/review_request_draft.py (Diff revision 7)
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
     
    Show all issues

    We can define this once in the base class instead of in each subclass by doing:

    if not self.get_review_request().created_with_history:
        return None
    
    if not hasattr(self, '_commit_messages'):
        self._commit_messages = list(
            self.get_latest_diffset().commits
            .values_list('commit_message', flat=True)
    
    return self._commit_messages
    
    1. This gets removed in a subsequent patch so I'm not super worried about it.

  15. Show all issues

    Typo: "creatd" -> "created"

  16. Show all issues

    Unwanted blank line.

  17. Show all issues

    Alphabetical order.

  18. Show all issues

    Can you define a constant for this?

  19. Show all issues

    We should either have a constant already for the font size, or you should be able to inherit.

  20. Show all issues

    Can you define a constant for this?

  21. Show all issues

    We should have constants for this already, since we have the same styling elsewhere. If not, it should be added and used both here and in the file list.

  22. Show all issues

    Blank line here.

  23. Show all issues

    This is missing the mobile rule in #review-request-main. Really, we should add a mixin that's used both here and there that sets up this styling and the mobile styling. Probably want to sneak in the position: relative and display: block as well, I'd think.

  24. Show all issues

    Comma before "if any."

  25. Show all issues

    Here as well.

  26. Show all issues

    Looks like you got some whiteout on your '.

  27. Show all issues

    Typo: "statis" -> "status"

  28. Show all issues

    Typo: "Collpase" -> "Collapse"

  29. Show all issues

    You can do this.$('.commit-message') instead.

  30. Show all issues

    Can you start the first parameter on the function call line? That or turn this into a dictionary. Looks a bit out of place the way it is.

  31. Show all issues

    Typo: "colum" -> "column"

  32. Show all issues

    Instead of - and +, can you use fa fa-plus and fa fa-minus? That's what we use for other collapse/expand controls.

    1. Indeed, which this is not. This is the add/remove line marker. This currently does not have expand controls.

    2. Ahh, right. Ignore me!

  33. 
      
brennie
brennie
Review request changed
Change Summary:

Addressed issues.

Testing Done:
   
  • Ran unit tests.
~  
  • Uploaded review requests with multiple commits and saw the correct
    commits displayed in the field and in change descriptions.
~  
  • TODO: Add unit tests for the field.
  ~
  • Ran JS tests.
  ~
  • Uploaded review requests with multiple commits and saw the correct
    commits displayed in the field and in change descriptions.
  +
  • Uploaded a plain review request and did not see the new field on
    the review request page or change description box.
Commit:
3c6cb257bbd6f60e47975c79e703aab80b50f345
78a47edf09cf309867f61e51d8b8b24e1ccc1de9

Checks run (1 failed, 1 succeeded)

flake8 failed.
JSHint passed.

flake8

brennie
chipx86
  1. 
      
  2. reviewboard/reviews/builtin_fields.py (Diff revision 10)
     
     
    Show all issues

    This should be the new full type path.

  3. reviewboard/reviews/builtin_fields.py (Diff revision 10)
     
     
     
     
     
     
    Show all issues

    You should use keyword arguments for these calls to render_to_string(), to ensure compatibility going forward.

  4. reviewboard/reviews/builtin_fields.py (Diff revision 10)
     
     
     
    Show all issues

    Can you put the start of the tuple on the second line?

  5. Show all issues

    "Array", not "array".

  6. Show all issues

    "Backbone", not "Bckbone".

  7. Show all issues

    Alphabetical order.

  8. 
      
brennie
chipx86
  1. 
      
  2. reviewboard/reviews/tests/test_builtin_fields.py (Diff revision 11)
     
     
     
     
     
     
    Show all issues

    RequestFactory() should be defined in setUp and not setUpClass, since it keeps state between requests and can introduce subtle failures.

  3. Show all issues

    Should be Model Attributes.

  4. Show all issues

    Should be jQuery.Event.

  5. Show all issues

    Should be jQuery.Event.

  6. Show all issues

    Should be jQuery.Event.

    1. No it shouldn't :).

  7. Show all issues

    Should be boolean.

  8. 
      
brennie
chipx86
  1. Ship It!
  2. 
      
brennie
Review request changed
Status:
Completed
Change Summary:
Pushed to release-4.0.x (6b29797)