[PATCH 00/51] Series aware patchwork

Damien Lespiau damien.lespiau at intel.com
Sat Sep 12 01:54:33 AEST 2015

Here a few initial patches to make patchwork understand series instead of just
patches. This is not the end of the story, but a minimal-ish start to build
upon. What the series does:

  - Parse mails and creates Series objects (what you would expect all mails
    part of the same git send-email are part of the same series)
  - Display the list of series
  - Display details about the series (eg. cover latter + list of patches)
  - As first feature on top, add a way to assign a reviewer to that series



The two main objects are Series and SeriesRevision. When a series is sent again
after review (v2), or when a single patch is sent as reply of one of the series
patches, patchwork should create a second SeriesRevision of the same Series.
ie. The series objects contains all subsequent revisions, after one or more
patches have been reworked.

One of the big design desisions was to introduce a REST API to expose series.
That's because I'm using Ajaxy things to access data from the page itself. My
plan is to grow that REST API to eventually replace the XML-RPC one and make a
lot of more things in the UI modern-ish, interfacing with the server through

The last two patches (Selenium integration, http://www.seleniumhq.org/) don't
really have to be there but I think using Selenium would be a great step
towards testing the interface itself, especially as I added quite a bit of

Next steps, some of them are well underway already:

  - This work doesn't have a series state. So we can't quite display the
    list of series with "action needed" by default. The state of the series
    depends on the state of the underlying patches and is not a simple function
    that can be expressed easily in SQL (except in stored procedures).

    So, what I do is compute the state of the series once one of its patches
    change state and store the resulting state in the series itself. It's
    making the SQL schema denormalized, but I think for the better.

  - There no filtering on Series implemented yet

  - Handling v2 of patches / series. I've quite a bit of code around this
    already. The goal is to understand when new versions of a series is sent
    (by matching the cover-letter title) and create a new revision of the
    original series object, deprecated the previous patches on way.

    The same can be done with a single patch, when it's sent as a reply of
    of the series patches.

  - RSS feed with series events. One of the things I'd like very soon is to
    have some interface exposing the new series so testing tools can pick them
    up and do their thing. I thought that a RSS feed is simple enough to do
    that and will work will a lot of established tools (jenkins can monitor XML
    content) and languages (2 lines to parse a RSS feed in python).

  - Have a git-pw git plugin using the REST API. I'd love a single

    $ git-pw apply-series 4321

    that would apply the series, augmented with the tags given to the patches,
    on the current branch. A nice way to kick start a command line client
    using the REST API.

  - There's plenty of work/refinements left of the UI itself, no doubt about

As always, thoughts and comments are most definitely welcomed.


Damien Lespiau (51):
  gitignore: Only ignore quilt files at the root of the repository
  tests: Fix a typo in the MboxPassThroughHeaderTest description
  parsemail: Return the list of prefixes when cleaning up the subject
  parsemail: Make find_content() return a MailContent object
  parsemail: Add a function to parse series markers eg. "1/12"
  parsemail: Extract building the list of mail references
  parsemail: Strip mail signatures from comments
  tests: Make sure all emails have a valid msgid
  person: Don't return the email along with the name in __unicode__
  series: Add a Series model
  series: Provide the migration step to add series
  series: Create Series objects when parsing mails
  series: Add unit tests for Series parsing
  model: Split a user_name() helper out of UserProfile
  models: Monkey patch User to have a name() method
  settings: Add Django REST framework to the project
  style: Move the background color of the table headers to a class
  api: Expose projects
  Move files where they belong
  api: Expose Series
  api: Expose Revisions
  js: Add jquery.dynatable.js
  dynatable: Allow the user to have a pre-defined per-page element
  dynatable: Use our theming for the table headers
  dynatable: Style the pagination widget to look list the patches one
  dynatable: Allow the user to have pre-defined pagination links
  gitignore: Explicitely ignore sub-directories in lib/packages
  series: Add a first attempt at a Series list view
  series: Add a detailed view a Series
  js: Extract a function that changes the current context
  users: Expose a way to get a list of users for autocompletion
  series: Make the reviewer field editable
  dynatable: Tweak dynatable to work with DRF ordering
  series: Enable sorting in the series list
  api: Make the series only editable by maintainers
  series: Only show the edit icon when the series is editable
  api: Expose a self object
  api: Extract a SeriesList mixin
  api: Add a way to retrieve the list of pending reviews
  series: Move the series table into its own template file
  js: Make the series API URL a parameter
  series: Add series to the TODO list
  series: Default to displaying series ordered by submission date
  toolbar: Provide a way to switch between Series and Patches views
  urls: Create another entry point for the list of patches
  series: Always return a displayable name in submitter__name
  models: Split the notication logic into its own function
  models: Provide a string representation of Series
  models: Provide a string representation of SeriesRevision
  tests: Add a couple of Selenium tests
  tests: Add a way for the user to skip selenium tests

 .gitignore                                         |    4 +-
 docs/requirements-base.txt                         |    2 +
 docs/requirements-dev.txt                          |    1 +
 htdocs/css/jquery.dynatable.css                    |    1 +
 htdocs/css/style.css                               |   16 +-
 htdocs/js/jquery.dynatable.js                      |    1 +
 htdocs/js/patchwork.js                             |  278 +++
 lib/packages/.gitignore                            |    2 +-
 lib/packages/jquery/README                         |    5 +
 lib/packages/jquery/jquery.dynatable.css           |   63 +
 lib/packages/jquery/jquery.dynatable.js            | 1778 ++++++++++++++++++++
 patchwork/bin/parsemail.py                         |  171 +-
 patchwork/migrations/0004_series.py                |   73 +
 patchwork/models.py                                |  106 +-
 patchwork/serializers.py                           |   67 +
 patchwork/settings/base.py                         |   12 +
 patchwork/templates/patchwork/list.html            |    4 +
 patchwork/templates/patchwork/patch-list.html      |    2 +-
 patchwork/templates/patchwork/profile.html         |    6 +-
 patchwork/templates/patchwork/series-list.html     |   25 +
 patchwork/templates/patchwork/series.html          |  119 ++
 patchwork/templates/patchwork/todo-list.html       |   18 +-
 patchwork/templates/patchwork/todo-lists.html      |    2 +-
 patchwork/tests/browser.py                         |  159 ++
 patchwork/tests/mail/series/0001-single-mail.mbox  |   75 +
 .../series/0010-multiple-mails-cover-letter.mbox   |   57 +
 .../series/0011-multiple-mails-cover-letter.mbox   |   64 +
 .../series/0012-multiple-mails-cover-letter.mbox   |  348 ++++
 .../series/0013-multiple-mails-cover-letter.mbox   |   63 +
 .../series/0014-multiple-mails-cover-letter.mbox   |  232 +++
 patchwork/tests/test_mboxviews.py                  |    2 +-
 patchwork/tests/test_patchparser.py                |  121 +-
 patchwork/tests/test_series.py                     |  157 ++
 patchwork/tests/test_user_browser.py               |   38 +
 patchwork/tests/utils.py                           |    5 +
 patchwork/urls.py                                  |   43 +
 patchwork/views/api.py                             |  117 ++
 patchwork/views/base.py                            |   32 +-
 patchwork/views/series.py                          |   43 +
 patchwork/views/user.py                            |    7 +-
 templates/base.html                                |   15 +-
 templates/patchwork/series-list-table.html         |   36 +
 42 files changed, 4274 insertions(+), 96 deletions(-)
 create mode 120000 htdocs/css/jquery.dynatable.css
 create mode 120000 htdocs/js/jquery.dynatable.js
 create mode 100644 htdocs/js/patchwork.js
 create mode 100644 lib/packages/jquery/jquery.dynatable.css
 create mode 100644 lib/packages/jquery/jquery.dynatable.js
 create mode 100644 patchwork/migrations/0004_series.py
 create mode 100644 patchwork/serializers.py
 create mode 100644 patchwork/templates/patchwork/series-list.html
 create mode 100644 patchwork/templates/patchwork/series.html
 create mode 100644 patchwork/tests/browser.py
 create mode 100644 patchwork/tests/mail/series/0001-single-mail.mbox
 create mode 100644 patchwork/tests/mail/series/0010-multiple-mails-cover-letter.mbox
 create mode 100644 patchwork/tests/mail/series/0011-multiple-mails-cover-letter.mbox
 create mode 100644 patchwork/tests/mail/series/0012-multiple-mails-cover-letter.mbox
 create mode 100644 patchwork/tests/mail/series/0013-multiple-mails-cover-letter.mbox
 create mode 100644 patchwork/tests/mail/series/0014-multiple-mails-cover-letter.mbox
 create mode 100644 patchwork/tests/test_series.py
 create mode 100644 patchwork/tests/test_user_browser.py
 create mode 100644 patchwork/views/api.py
 create mode 100644 patchwork/views/series.py
 create mode 100644 templates/patchwork/series-list-table.html


More information about the Patchwork mailing list