]> git.ipfire.org Git - thirdparty/patchwork.git/log
thirdparty/patchwork.git
3 years agoPost-release version bump stable/2.2
Stephen Finucane [Wed, 27 Oct 2021 10:56:54 +0000 (11:56 +0100)] 
Post-release version bump

Signed-off-by: Stephen Finucane <stephen@that.guru>
3 years agoRelease 2.2.6 v2.2.6
Stephen Finucane [Wed, 27 Oct 2021 10:55:54 +0000 (11:55 +0100)] 
Release 2.2.6

Signed-off-by: Stephen Finucane <stephen@that.guru>
3 years agoREST: Don't error if a versioned field we would remove is absent
Daniel Axtens [Fri, 20 Aug 2021 14:57:58 +0000 (00:57 +1000)] 
REST: Don't error if a versioned field we would remove is absent

We remove fields that shouldn't be seen on old versions of the API.
This was done with `pop(field name)`, which will throw an exception
if the named field is absent from the data. However, sometimes if
a patch request is via an old API version, we hit this line without
ever having the field present.

This is odd, but not harmful and we definitely shouldn't 500.

Signed-off-by: Daniel Axtens <dja@axtens.net>
[stephenfin: Merge test into bug fix]
Signed-off-by: Stephen Finucane <stephen@that.guru>
Tested-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Fixes: d944f17ec059 ("REST: Use versioning for modified responses")
Closes: #423
(cherry picked from commit 5c22f9d8fcc72deec7d8beaefc97207ea8fc646d)
(cherry picked from commit 956f988a47c9c10c5141bc0209dc58916e983ca2)

4 years agoPost-release version bump
Stephen Finucane [Mon, 26 Jul 2021 16:57:18 +0000 (17:57 +0100)] 
Post-release version bump

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agoRelease 2.2.5 v2.2.5
Stephen Finucane [Mon, 26 Jul 2021 16:57:01 +0000 (17:57 +0100)] 
Release 2.2.5

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agoOnly show unique checks
Stephen Finucane [Sat, 6 Mar 2021 14:54:59 +0000 (14:54 +0000)] 
Only show unique checks

Commit e5c641fc4 optimized fetching of checks when displaying a patch by
prefetching these checks ahead of time. Unfortunately we missed that
this should exclude older versions of checks for a given context. Make
the code used to generate the unique checks generic and allow us to use
that as a filter to the checks provided to the template, restoring the
correct behavior.

Conflicts:
  patchwork/tests/test_detail.py

NOTE(stephenfin): Conflicts are due to some differences in imports,
however, we also need to drop some usages of f-strings since Patchwork
2.x supported Python 2.x also. We also need to specify an explicit
decode value for some strings since Python 2.x defaults to 'ascii', not
'utf-8'.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Closes: #398
Fixes: e5c641fc4 ("Optimise fetching checks when displaying a patch")
(cherry picked from commit a43d6acda0939c14e8135549968815876680d497)
(cherry picked from commit f4ff605eb449ea56b265ee7a5a516b48d83a5eb0)

4 years agoPost-release version bump
Stephen Finucane [Wed, 24 Feb 2021 15:33:26 +0000 (15:33 +0000)] 
Post-release version bump

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agoRelease 2.2.4 v2.2.4
Stephen Finucane [Wed, 24 Feb 2021 15:32:53 +0000 (15:32 +0000)] 
Release 2.2.4

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agoapi: do not fetch every patch in a patch detail view 404 (v2)
Stephen Finucane [Wed, 24 Feb 2021 15:08:45 +0000 (15:08 +0000)] 
api: do not fetch every patch in a patch detail view 404 (v2)

Commit 08c5856 fixed an issue whereby a 404 on the aforementioned URL
could result in a large DB query due to DRF attempting to populate the
'related' list box with all patches on the instance. That was
accidentally reverted in commit fe07f30. "Unrevert" this change.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: fe07f30 ("Remove 'PatchRelationSerializer'")
Closes: #397
(cherry picked from commit 79700f321335a2d7c649eb03932797af521942a0)

4 years agorequirements: Cap pyrsistent on Python 2
Stephen Finucane [Mon, 22 Feb 2021 09:23:34 +0000 (09:23 +0000)] 
requirements: Cap pyrsistent on Python 2

I can't reproduce this locally, but it's breaking Travis.

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agomodels: Use parent model to get comment's 'list_archive_url'
Stephen Finucane [Sat, 20 Feb 2021 14:35:07 +0000 (14:35 +0000)] 
models: Use parent model to get comment's 'list_archive_url'

We were attempting to retrieve the 'list_archive_url' attribute from the
'PatchComment' or 'CoverComment' instances, rather than the parent
'Patch' and 'Cover' object, respectively. Correct this and add plenty of
tests to prevent this regressing.

Conflicts:
  patchwork/models.py

Changes:
  patchwork/tests/api/test_comment.py

NOTE(stephenfin): Conflicts and changes are necessary to deal with the
fact we have a single comment model instead of two comment models as in
stable/3.0.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: 02ffb1315 ("models: Add list archive lookup")
Closes: #391
(cherry picked from commit 93ff4db29262c0560122f61eadf78d9626def238)
(cherry picked from commit 6c73a55c52ecd6d756901c9e9647fae57aceda01)

4 years agoPost-release version bump
Stephen Finucane [Sun, 13 Dec 2020 19:06:03 +0000 (19:06 +0000)] 
Post-release version bump

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agoRelease 2.2.3 v2.2.3
Stephen Finucane [Sun, 13 Dec 2020 19:05:14 +0000 (19:05 +0000)] 
Release 2.2.3

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agoAdd release note for #379
Stephen Finucane [Sun, 13 Dec 2020 18:34:47 +0000 (18:34 +0000)] 
Add release note for #379

Signed-off-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 4c8154d178b63a77048638323b0171116426112e)

4 years agoREST: Null out previous, current relation info
Stephen Finucane [Sun, 29 Nov 2020 12:50:22 +0000 (12:50 +0000)] 
REST: Null out previous, current relation info

These fields don't work like we expect them to. Because we're linking to
a non-idempotent entity, an instance of 'relation', what we're storing
in either of these fields is subject to change as patches are added and
removed. This makes the information pretty much useless after the fact.
It's best to just state the patch and request that people query the
information themselves if necessary. We don't want to remove the field
entirely from the API - that would be a truly breaking change - so
instead we null it out like we do for patch tags. In a v2 API (i.e. a
major version bump) we can remove this entirely.

A small bug with the schema generation is corrected.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Related: #379
(cherry picked from commit 646a2f2c80056a33c70efd760446832f90899247)

4 years agoRemove 'PatchRelationSerializer'
Stephen Finucane [Thu, 1 Oct 2020 13:38:31 +0000 (14:38 +0100)] 
Remove 'PatchRelationSerializer'

This wasn't writeable for reasons I haven't been able to figure out.
However, it's not actually needed: the 'PatchSerializer' can do the job
just fine, given enough information. This exposes a bug in DRF, which
has been reported upstream [1]. While we wait for that fix, or some
variant of it, to be merged, we must monkey patch the library.

Conflicts:
patchwork/api/patch.py

NOTE(stephenfin): Conflicts are due to the absence of commit d3d4f9f36
("Add Django 3.0 support") which we do not want to backport here.

[1] https://github.com/encode/django-rest-framework/issues/7550
[2] https://github.com/encode/django-rest-framework/pull/7574

Signed-off-by: Stephen Finucane <stephen@that.guru>
Reported-by: Ralf Ramsauer <ralf.ramsauer@oth-regensburg.de>
Closes: #379
Cc: Daniel Axtens <dja@axtens.net>
Cc: Rohit Sarkar <rohitsarkar5398@gmail.com>
(cherry picked from commit fe07f30df6fe263938b1f898ffffc354c4ff470c)

4 years agotests: Add tests for 'patch-relation-changed' events
Stephen Finucane [Sun, 4 Oct 2020 11:03:19 +0000 (12:03 +0100)] 
tests: Add tests for 'patch-relation-changed' events

This event is rather odd. If you have two patches then the way a
relation is created is by creating a 'PatchRelation' instance and then
setting the 'related' attribute on the first patch followed by the
second patch. Because the event uses the 'Patch' model's 'pre_save'
signal, we'll only see events for the patch being currently saved. This
means no event will be raised for the first patch and only one event,
the one for the second patch, will be raised when the second patch is
being added to the relationship.

In hindsight, the structure of the event is off. We should have had
something like a 'patch-added-to-relationship' and a
'patch-removed-from-relationship' event, both with the same fields:
'project', 'actor', 'patch' and 'related', the latter of which would
have listed all of the _other_ patches in the relationship. Sadly, this
is an API change which means we can't do it now. We may well wish to do
so in the future though.

Signed-off-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 8092f8f4f59ea5581180a13994eb090d24394206)

4 years agotests: Rework 'create_relation' helper
Stephen Finucane [Sun, 4 Oct 2020 10:42:42 +0000 (11:42 +0100)] 
tests: Rework 'create_relation' helper

This wasn't actually creating just a patch relation object - it was also
creating patches, which is something we already have an explicit helper
for. Clean this thing up.

Signed-off-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 87e9f510b2670d199ab2930900c357c3ecda761d)

4 years agolib: Grant SELECT on auth_user
Stephen Finucane [Sat, 28 Nov 2020 17:32:32 +0000 (17:32 +0000)] 
lib: Grant SELECT on auth_user

If a mail arrives with the 'X-Patchwork-Delegate' hint header, the
'patchwork.parser' script will need to index the users table to find the
appropriate user. This should be okay from a security perspective since
passwords are hashed and salted and the rest of the information is
mostly accessible publicly via the web UI and REST API.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Suggested-by: Ali Alnubani <alialnu@mellanox.com>
Closes: #365
(cherry picked from commit e69a2adcf50b57980d5eb0074cc72698d5cac31a)

4 years agolib: Drop errant comma
Stephen Finucane [Sat, 28 Nov 2020 17:28:33 +0000 (17:28 +0000)] 
lib: Drop errant comma

Signed-off-by: Stephen Finucane <stephen@that.guru>
4 years agolib: Add update permissions to 'nobody' postgres user
Stephen Finucane [Sat, 28 Nov 2020 17:09:45 +0000 (17:09 +0000)] 
lib: Add update permissions to 'nobody' postgres user

This user needs the ability to change some attributes of 'Patch' and
'CoverLetter' instances that are stored in the 'patchwork_submission'
table, since both are are concrete subclasses of 'Submission'.

Stable-only since the 'Submission model has been removed on 'master'.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Suggested-by: Ali Alnubani <alialnu@mellanox.com>
Closes: #364
Stable-Only

5 years agoPost-release version bump
Stephen Finucane [Mon, 25 May 2020 10:33:26 +0000 (11:33 +0100)] 
Post-release version bump

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoRelease 2.2.2 v2.2.2
Stephen Finucane [Mon, 25 May 2020 10:31:14 +0000 (11:31 +0100)] 
Release 2.2.2

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoadmin: fix series query
Jan Remmet [Mon, 25 May 2020 07:03:10 +0000 (09:03 +0200)] 
admin: fix series query

remove typo from search_fields.

Signed-off-by: Jan Remmet <j.remmet@phytec.de>
Signed-off-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 7e5d2e64e2a51a7c4b789888e93788d5ad8875c8)

5 years agodocker: Ignore postgres data file
Stephen Finucane [Sun, 26 Apr 2020 14:28:20 +0000 (15:28 +0100)] 
docker: Ignore postgres data file

Signed-off-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 10b6162807ed76b1b56c0a57c9e55e02e88daad1)

5 years agoparser: don't trigger database IntegrityErrors on duplicate coverletters
Jeremy Kerr [Thu, 16 Apr 2020 01:29:28 +0000 (09:29 +0800)] 
parser: don't trigger database IntegrityErrors on duplicate coverletters

As we've done for the Patch and Comment models, this change prevents
database errors from duplicate CoverLetters.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Stephen Finucane <stephen@that.guru>
[stephenfin: Add release note]
(cherry picked from commit 55fb26bf5bb3ca81ae35426efa9b2410e206c8b2)

5 years agoparser: don't trigger database IntegrityErrors on duplicate comments
Jeremy Kerr [Thu, 16 Apr 2020 01:29:27 +0000 (09:29 +0800)] 
parser: don't trigger database IntegrityErrors on duplicate comments

As we've done for the Patch model, this change prevents database errors
from duplicate Comments.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Reviewed-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 55aa9cd749f3ff0de430c8f04c687d691c3a703a)

5 years agoparser: prevent IntegrityErrors
Jeremy Kerr [Thu, 16 Apr 2020 01:29:26 +0000 (09:29 +0800)] 
parser: prevent IntegrityErrors

Currently, the parser relies on causing (and catching) IntegrityErrors
on patch insert to catch duplicate (msgid,project) mails.

This change performs an atomic select -> insert instead.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Stephen Finucane <stephen@that.guru>
[stephenfin: Remove 'expectedFailure' marker again]
(cherry picked from commit 947c6aae94b7b554ca701c1d7e5baf000759ed2d)

5 years agotests: ensure we don't see database errors during duplicate insert
Jeremy Kerr [Thu, 16 Apr 2020 01:29:25 +0000 (09:29 +0800)] 
tests: ensure we don't see database errors during duplicate insert

Currently, the parser causes IntegrityErrors while inserting duplicate
patches; these tend to pollute database logs.

This change adds a check, which currently fails, to ensure we do not
cause errors during a duplicate patch parse.

Conflicts:
patchwork/tests/test_parser.py

NOTE(stephenfin): Conflicts are once again due to import reordering. In
addition, we have to skip these tests on Django 1.11 since the
'connection.execute_wrapper' context manager was first added in Django
2.0 [1].

[1] https://docs.djangoproject.com/en/dev/releases/2.0/#models

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Stephen Finucane <stephen@that.guru>
[stephenfin: Add 'expectedFailure' marker to keep all tests green]
(cherry picked from commit a60e75e2c6897fd262ec95a35e0e94b9027c11d4)

5 years agotests: Add duplicate mail test
Jeremy Kerr [Thu, 16 Apr 2020 01:29:24 +0000 (09:29 +0800)] 
tests: Add duplicate mail test

Test that we get the correct DuplicateMailError from parsing the same
mail twice.

Conflicts:
patchwork/tests/test_parser.py

NOTE(stephenfin): Conflicts are due to the removal of 'six' imports on
master.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Reviewed-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit d4b5fbd1d0c743003d59cef025f54b8d97586ddf)

5 years agoparser: Don't crash when From: is list email but has weird mangle format
Andrew Donnellan [Wed, 15 Apr 2020 09:06:56 +0000 (19:06 +1000)] 
parser: Don't crash when From: is list email but has weird mangle format

get_original_sender() tries to demangle DMARC-mangled From headers, in
the case where the email's From address is the list address. It knows how
to handle Google Groups and Mailman style mangling, where the original
submitter's name will be turned into e.g. "Andrew Donnellan via
linuxppc-dev".

If an email has the From header set to the list address but has a name that
doesn't include " via ", we'll throw an exception because stripped_name
hasn't been set. Sometimes this is because the list name is seemingly
empty, resulting in a mangled name like "Andrew Donnellan via"
without the space after "via" that we detect. Handle this as well as we can
instead, and add a test.

Fixes: 8279a84238c10 ("parser: Unmangle From: headers that have been mangled for DMARC purposes")
Reported-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Andrew Donnellan <ajd@linux.ibm.com>
Reviewed-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 4698499b9704b29244af4a873efc6c8ae6ca3ff8)

5 years agoREST: Allow update of bundle without patches
Stephen Finucane [Fri, 17 Apr 2020 22:07:27 +0000 (23:07 +0100)] 
REST: Allow update of bundle without patches

Presently, when updating a patch we assume that patches are provided.
This isn't necessary - you might just want to make it public - and isn't
enforced by the API itself. However, because we make this assumption, we
see a HTTP 500. Resolve the issue and add tests to prevent a regression.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Resolves: #357
(cherry picked from commit 4fd7a739bbed62230d4166509929a35f63f6892e)

5 years agoPost-release version bump
Daniel Axtens [Tue, 14 Apr 2020 06:43:51 +0000 (16:43 +1000)] 
Post-release version bump

Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoRelease 2.2.1 v2.2.1
Daniel Axtens [Tue, 14 Apr 2020 06:43:43 +0000 (16:43 +1000)] 
Release 2.2.1

Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoapi: allow filtering patches and covers by msgid
Daniel Axtens [Tue, 14 Apr 2020 05:34:40 +0000 (15:34 +1000)] 
api: allow filtering patches and covers by msgid

In the process of fixing the previous bug, I realised that:

 a) /api/patches/msgid is a perfectly reasonable thing to attempt
 b) We have no way of finding a patch by message id in the API

We can't actualy make /api/patches/msgid work because it may not
be unique, but we can add a filter.

I'm shoehorning this into stable/2.2, even though it's technically
an API change: it's minor, not incompatible and in hindsight a
glaring hole.

Cc: Michael Ellerman <mpe@ellerman.id.au>
Tested-by: Jeremy Kerr <jk@ozlabs.org>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
Reviewed-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
(cherry picked from commit d08b6c72964898c9997a62e4ab6a721f166a56ca)

5 years agoapi: do not fetch every patch in a patch detail view 404
Daniel Axtens [Tue, 14 Apr 2020 04:26:58 +0000 (14:26 +1000)] 
api: do not fetch every patch in a patch detail view 404

mpe and jk and sfr found that the OzLabs server was melting due
to some queries downloading every patch.

Turns out if you 404 the patch detail view in the API, d-r-f attempts
to render a listbox with every single patch to fill in the 'related'
field. The bundle API also has a similar field.

Replace the multiple selection box with a text field. You can still
(AIUI) populate the relevant patch IDs manually.

This is the recommended approach per
https://www.django-rest-framework.org/topics/browsable-api/#handling-choicefield-with-large-numbers-of-items

Reported-by: Jeremy Kerr <jk@ozlabs.org>
Reported-by: Michael Ellerman <mpe@ellerman.id.au>
Reported-by: Stephen Rothwell <sfr@canb.auug.org.au>
Tested-by: Jeremy Kerr <jk@ozlabs.org>
Server-no-longer-on-fire-by: Jeremy Kerr <jk@ozlabs.org>
Reviewed-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
(cherry picked from commit 08c5856444bc2e100c4acbbea0a244cd46083c4b)

5 years agolib/sql: Update grant script for recent schema changes
Jeremy Kerr [Tue, 14 Apr 2020 05:57:53 +0000 (13:57 +0800)] 
lib/sql: Update grant script for recent schema changes

This change fixes a few omissions in the grant scripts:

- patchrelation is missing from both mysql and postgres scripts; it's
  only needed for web user access.

- event is missing from the web grants on postgres, and the mail grants
  on mysql.

Tested on postgres only.

Fixes: 27c2acf56c ("models, templates: Add patch relations")
Fixes: 34e3c9c493 ("sql: Update 'grant-all.mysql' script with missing tables")
Fixes: 234bc7c316 ("lib/sql: fix permissions for v2.0.0 on postgres")
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agodocs: Reference Patchwork 2.2 tarballs
Stephen Finucane [Wed, 8 Apr 2020 22:27:52 +0000 (23:27 +0100)] 
docs: Reference Patchwork 2.2 tarballs

This is what users will want right now.

Signed-off-by: Stephen Finucane <stephen@that.guru>
(cherry picked from commit 3d4eebde23b68daeba1b0852152243e5a6019fb8)

5 years agoPost-release version bump
Stephen Finucane [Sun, 5 Apr 2020 18:46:58 +0000 (19:46 +0100)] 
Post-release version bump

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoRelease 2.2.0 v2.2.0
Stephen Finucane [Sun, 5 Apr 2020 18:43:32 +0000 (19:43 +0100)] 
Release 2.2.0

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agotrivial: Feed 'patchwork.migrations' through black
Stephen Finucane [Thu, 19 Mar 2020 12:34:03 +0000 (12:34 +0000)] 
trivial: Feed 'patchwork.migrations' through black

Include migrations in the flake8 checks, which should catch some simple
undefined variables errors.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: Add release note for faster queries
Daniel Axtens [Tue, 17 Mar 2020 13:59:16 +0000 (00:59 +1100)] 
REST: Add release note for faster queries

Didn't quite seem like it fit anywhere else in the series. I want
the release note mostly because I hope to backport this to stable.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: extend performance improvements to other parts of the API
Daniel Axtens [Tue, 17 Mar 2020 13:59:15 +0000 (00:59 +1100)] 
REST: extend performance improvements to other parts of the API

We can trivially extend what we've just done to other parts of the API.

I haven't done much by way of benchmark but we're seeing multiple 'x's
pretty much across the board when filtering.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: fix patch listing query
Daniel Axtens [Tue, 17 Mar 2020 13:59:14 +0000 (00:59 +1100)] 
REST: fix patch listing query

The patch listing query is punishingly slow under even very simple
filters.

The new data model in 3.0 will help _a lot_, so this is a simple fix: I
did try indexes but haven't got really deeply into the weeds of what we can do
with them.

Move a number of things from select_related to prefetch_related: we trade off
one big, inefficient query for a slightly larger number of significantly more
efficient queries.

On my laptop with 2 copies of the canonical kernel team list loaded into the
database, and considering only the API view (the JSON view is always faster)
with warm caches and considering the entire set of SQL queries:

 - /api/patches/?project=1
    ~1.4-1.5s -> <100ms, something like 14x better

 - /api/patches/?project=1&since=2010-11-01T00:00:00
    ~1.7-1.8s -> <560ms, something like 3x better (now dominated by the
                         counting query only invoked on the HTML API view,
                         not the pure JSON API view.)

The things I moved:

 * project: this was generating SQL that looked like:

   INNER JOIN `patchwork_project` T5
    ON (`patchwork_submission`.`project_id` = T5.`id`)

   This is correct but we've already had to join the patchwork_submission
   table and perhaps as a result it seems to be inefficient.

 * series__project: Likewise we've already had to join the series table,
   doing another join is possibly why it is inefficient.

 * delegate: I do not know why this was tanking performance. I think it
   might relate to the strategy mysql was using.

Reported-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: massively improve the patch counting query under filters
Daniel Axtens [Tue, 17 Mar 2020 13:59:13 +0000 (00:59 +1100)] 
REST: massively improve the patch counting query under filters

The DRF web view counts the patches as part of pagination.

The query it uses is a disaster zone:

  SELECT Count(*) FROM (
    SELECT DISTINCT
      `patchwork_submission`.`id`           AS Col1,
      `patchwork_submission`.`msgid`        AS Col2,
      `patchwork_submission`.`date`         AS Col3,
      `patchwork_submission`.`submitter_id` AS Col4,
      `patchwork_submission`.`project_id`   AS Col5,
      `patchwork_submission`.`name`         AS Col6,
      `patchwork_patch`.`submission_ptr_id` AS Col7,
      `patchwork_patch`.`commit_ref`        AS Col8,
      `patchwork_patch`.`pull_url`          AS Col9,
      `patchwork_patch`.`delegate_id`       AS Col10,
      `patchwork_patch`.`state_id`          AS Col11,
      `patchwork_patch`.`archived`          AS Col12,
      `patchwork_patch`.`hash`              AS Col13,
      `patchwork_patch`.`patch_project_id`  AS Col14,
      `patchwork_patch`.`series_id`         AS Col15,
      `patchwork_patch`.`number`            AS Col16,
      `patchwork_patch`.`related_id`        AS Col17
    FROM `patchwork_patch`
    INNER JOIN `patchwork_submission`
      ON (`patchwork_patch`.`submission_ptr_id`=`patchwork_submission`.`id`)
    WHERE `patchwork_submission`.`project_id`=1
  )

This is because django-filters adds a DISTINCT qualifier on a
ModelMultiChoiceFilter by default. I guess it makes sense and they do a
decent job of justifying it, but it causes the count to be made with
this awful subquery. (The justification is that they don't know if you're
filtering on a to-many relationship, in which case there could be
duplicate values that need to be removed.)

While fixing that, we can also tell the filter to filter on patch_project
rather than submission's project, which allows us in some cases to avoid
the join entirely.

The resultant SQL is beautiful when filtering by project only:

  SELECT COUNT(*) AS `__count`
  FROM `patchwork_patch`
  WHERE `patchwork_patch`.`patch_project_id` = 1

On my test setup (2x canonical kernel mailing list in the db, warm cache,
my laptop) this query goes from >1s to ~10ms, a ~100x improvement.

If we filter by project and date the query is still nice, but still also
very slow:

  SELECT COUNT(*) AS `__count`
  FROM `patchwork_patch`
  INNER JOIN `patchwork_submission`
    ON (`patchwork_patch`.`submission_ptr_id`=`patchwork_submission`.`id`)
  WHERE (`patchwork_patch`.`patch_project_id`=1 AND `patchwork_submission`.`date`>='2010-11-01 00:00:00')

This us from ~1.3s to a bit under 400ms - still not ideal, but I'll take
the 3x improvement!

Reported-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoPatchwork v2.2.0-rc2 v2.2.0-rc2
Stephen Finucane [Thu, 27 Feb 2020 23:36:55 +0000 (23:36 +0000)] 
Patchwork v2.2.0-rc2

Signed-off-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoREST: Add patch relations
Mete Polat [Thu, 27 Feb 2020 23:29:32 +0000 (23:29 +0000)] 
REST: Add patch relations

View relations and add/update/delete them as a maintainer. Maintainers
can only create relations of patches which are part of a project they
maintain. Because this is a writable many-many nested relationship, it
behaves a little unusually. In short:

- All operations use PATCH to the 'related' field of a patch

- To relate a patch to another patch, say 7 to 19, either:

    PATCH /api/patch/7  related := [19]
    PATCH /api/patch/19 related := [7]

- To delete a patch from a relation, say 1, 21 and 42 are related but we
  only want it to be 1 and 42:

    PATCH /api/patch/21 related := []

  * You _cannot_ remove a patch from a relation by patching another
    patch in the relation: I'm trying to avoid read-modify-write loops.

  * Relations that would be left with just 1 patch are deleted. This is
    only ensured in the API - the admin interface will let you do this.

- Break-before-make: if you have [1, 12, 24] and [7, 15, 42] and you want
  to end up with [1, 12, 15, 42], you have to remove 15 from the second
  relation first:

    PATCH /api/patch/1 related := [15] will fail with 409 Conflict.

  Instead do:

    PATCH /api/patch/15 related := []
    PATCH /api/patch/1  related := [15]
       -> 200 OK, [1, 12, 15, 42] and [7, 42] are the resulting relations

Signed-off-by: Mete Polat <metepolat2000@gmail.com>
Signed-off-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agomodels, templates: Add patch relations
Mete Polat [Thu, 27 Feb 2020 23:29:31 +0000 (23:29 +0000)] 
models, templates: Add patch relations

Introduces the ability to add relations between patches. Relations are
displayed in the details page of a patch under 'Related'. Related
patches located in another projects can be viewed as well.

Changes to relations are tracked in events. Currently the display of
this is very bare in the API but that will be fixed in a subsequent patch:
this is the minimum required to avoid throwing errors when you view the
events feed.

Signed-off-by: Mete Polat <metepolat2000@gmail.com>
[dja: address some review comments from Stephen, add an admin view,
      move to using Events, misc tidy-ups.]
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agotests: Add tests for invalid cover/patch IDs
Stephen Finucane [Thu, 12 Mar 2020 15:11:09 +0000 (15:11 +0000)] 
tests: Add tests for invalid cover/patch IDs

Signed-off-by: Stephen Finucane <stephen@that.guru>
Related: #343

5 years agoviews: Return Http404 if patch not found
Andriy Gelman [Wed, 11 Mar 2020 03:20:04 +0000 (23:20 -0400)] 
views: Return Http404 if patch not found

Otherwise exception DoesNotExist shows error 500 on Apache

Signed-off-by: Andriy Gelman <andriy.gelman@gmail.com>
Signed-off-by: Stephen Finucane <stephen@that.guru>
Closes: #343
5 years agomigrations: Don't attempt to rehome patches
Stephen Finucane [Wed, 4 Mar 2020 16:52:19 +0000 (16:52 +0000)] 
migrations: Don't attempt to rehome patches

Migration 0039 attempts to move patches that have ended up in an
arbitrary series due to race conditions into the correct series.
However, there are a number of race conditions that can occur here that
make this particularly tricky to do. Given that series are really just
arbitary metadata, it's not really necessary to do this...so don't.
Instead, just delete the series references that identical message IDs
and below to the same project, allowing us to add the uniqueness
constraint and prevent the issue bubbling up in the future. This means
we're still left with orphaned series but these could be fixed manually,
if necessary.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Tested-by: Ali Alnubani <alialnu@mellanox.com>
Closes: #340
5 years agoparser: Don't group patches with different versions in a series
Stephen Finucane [Wed, 4 Mar 2020 15:48:56 +0000 (15:48 +0000)] 
parser: Don't group patches with different versions in a series

As noted in #340 [1], if a patch from a series is dropped or
miscategorised, patches from a later revision of that series can end up
included in the earlier series rather than in their own series. This was
actually intentional as part of the fix for #105 [2]. However,
completely ignoring this information can be problematic. Refine things
by checking for versions and, if they don't match, using timeboxing to
try guess if they should be kept together. This would resolve the issue
seen in #340 while preventing a regression for #105.

[1] https://github.com/getpatchwork/patchwork/issues/340
[1] https://github.com/getpatchwork/patchwork/issues/105

Signed-off-by: Stephen Finucane <stephen@that.guru>
Tested-by: Ali Alnubani <alialnu@mellanox.com>
Related: #340
Related: #105

5 years agomodels: Handle unset 'Submission.content'
Stephen Finucane [Sun, 7 Jul 2019 16:10:42 +0000 (17:10 +0100)] 
models: Handle unset 'Submission.content'

It's unlikely but 'Submission.content' is nullable and we weren't
handling this here. Fix that.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: 7f6685a2a ("Fix CRLF newlines upon submission changes")
5 years agodocs: Reference current list-id
Stephen Finucane [Fri, 28 Feb 2020 17:42:22 +0000 (17:42 +0000)] 
docs: Reference current list-id

We've updated our fixtures to use this newer version, meaning we no
longer need to pass an explicit '--list-id' argument. Lovely.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: 9a0b5992 ("fixtures: Update Patchwork list ID")
5 years agoAdd support for djangorestframework 3.11
Stephen Finucane [Thu, 27 Feb 2020 23:46:55 +0000 (23:46 +0000)] 
Add support for djangorestframework 3.11

There are no breaking changes apparent.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoUpdate jinja2 from 2.10.1 to 2.11.1
pyup-bot [Thu, 30 Jan 2020 21:13:55 +0000 (21:13 +0000)] 
Update jinja2 from 2.10.1 to 2.11.1

5 years agotox: Switch non-pyNN targets to Python 3
Stephen Finucane [Thu, 27 Feb 2020 23:13:54 +0000 (23:13 +0000)] 
tox: Switch non-pyNN targets to Python 3

This is long overdue and highlights a small issue, which is easily fixed
by use of Sphinx.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agopyenv: also install requirements for python2
Daniel Axtens [Tue, 28 Jan 2020 13:55:20 +0000 (00:55 +1100)] 
pyenv: also install requirements for python2

The first time you do a migration with python3, you get a whole
lot of seemingly null changes. This is a bit annoying so I use
py2 to generate the changes. To do that, first fix the pyenv
transition so requirements are still installed for python2.

Signed-off-by: Daniel Axtens <dja@axtens.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agodocs: Update schemas to reflect latest changes in template
Stephen Finucane [Thu, 27 Feb 2020 22:24:45 +0000 (22:24 +0000)] 
docs: Update schemas to reflect latest changes in template

Looks like I forgot to run the 'generate-schema' script beforehand. Fix
that now.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: cd3a2ce8 ("REST: Allow configuration of user settings via API")
5 years agodocker: update dependency for current build
Pranav Annam [Wed, 12 Feb 2020 03:35:47 +0000 (04:35 +0100)] 
docker: update dependency for current build

The dependency libssl1.0-dev in the Dockerfile makes docker build fail:

  The following packages have unmet dependencies:
   libmysqlclient-dev : Depends: libssl-dev (>= 1.1.1-1ubuntu2.1~18.04.5~)
  but it is not going to be installed
  E: Unable to correct problems, you have held broken packages.

There seems to be a conflict with different versions of libssl and
libmysqlclient that did not exist previously with Ubuntu 18.04.

Just use the current libssl-dev from Ubuntu 18.04 to fix the build.

Signed-off-by: Pranav Annam <pranavannam@gmail.com>
[rephrased commit message]
Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agodocs: set the GID in the .env file
Pranav Annam [Wed, 12 Feb 2020 03:36:14 +0000 (04:36 +0100)] 
docs: set the GID in the .env file

The .env file needs the UID and GID for a working docker-compose build.

If you follow the current instructions, the docker build fails with a
clear error message: 'You must define GID in .env'

It is still good to update documentation to reduce the burden on new
contributors to run into this build failure first.

Signed-off-by: Pranav Annam <pranavannam@gmail.com>
[simply provide bash command in docs, reworked commit message]
Signed-off-by: Lukas Bulwahn <lukas.bulwahn@gmail.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoREST: Fix duplicate project queries
Mete Polat [Wed, 29 Jan 2020 19:01:22 +0000 (20:01 +0100)] 
REST: Fix duplicate project queries

Eliminates duplicate project queries caused by calling
get_absolute_url() in the embedded serializers. Following foreign keys
with 'series__project' will cache the project of the series as well as
the series itself.

Signed-off-by: Mete Polat <metepolat2000@gmail.com>
Signed-off-by: Stephen Finucane <stephen@that.guru>
Closes: #335
5 years agoAdd regression tests for bug #335
Stephen Finucane [Sat, 1 Feb 2020 13:12:09 +0000 (13:12 +0000)] 
Add regression tests for bug #335

Signed-off-by: Stephen Finucane <stephen@that.guru>
Cc: Mete Polat <metepolat2000@gmail.com>
Related: #335

5 years agoHandle pull requests with random trailing space
Konstantin Ryabitsev [Mon, 27 Jan 2020 17:56:19 +0000 (12:56 -0500)] 
Handle pull requests with random trailing space

Another fix for copy-pasted pull requests, this time for cases
when something is copy-pasted from a terminal and retains all
the bogus trailing whitespace.

Example:
https://lore.kernel.org/r/043eb5b2-a302-4de6-a3e8-8238e49483b1@ti.com

Signed-off-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoPatchwork v2.2.0-rc1 v2.2.0-rc1
Stephen Finucane [Fri, 27 Dec 2019 18:11:13 +0000 (18:11 +0000)] 
Patchwork v2.2.0-rc1

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agodocs: Bump API version in docs to 1.2
Stephen Finucane [Fri, 27 Dec 2019 18:10:04 +0000 (18:10 +0000)] 
docs: Bump API version in docs to 1.2

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agotemplates: Combine series and related row
Mete Polat [Sat, 7 Dec 2019 16:46:18 +0000 (17:46 +0100)] 
templates: Combine series and related row

Move the series patch list from row 'Related' to 'Series'. This allows
us to use the 'Related' row for actually showing submission relations
instead.

Signed-off-by: Mete Polat <metepolat2000@gmail.com>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agofixtures: Fix typo in default_states
Stephen Finucane [Fri, 27 Dec 2019 16:26:40 +0000 (16:26 +0000)] 
fixtures: Fix typo in default_states

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: 42b1dfa2 ("models: Add State.slug field")
5 years agotests: Add test for broken parser
Stephen Finucane [Sun, 1 Dec 2019 17:10:45 +0000 (17:10 +0000)] 
tests: Add test for broken parser

Add tests for the recent changes we made to how we parse multiple series
received at once. These tests actually highlighted what appeared to be
the test failure that's been intermittently breaking our CI for years
now, so the 'expectedFailure' marker has been removed in the hope that
this is actually the case.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoparser: Use a second query to weed out duplicate series
Stephen Finucane [Sun, 1 Dec 2019 17:10:44 +0000 (17:10 +0000)] 
parser: Use a second query to weed out duplicate series

Annoyingly, not all email clients properly thread emails using the
message ID fields originally specified in RFC 822 [1]. Worse, some MTAs
(cough, outlook.com, cough) actually override what the client
configures, breaking the world in the process. Realising this is an
issue, Patchwork supports threading using arbitrary metadata in addition
to the RFC 822 metadata. Specifically, it uses a combination of
submitter and list-id extracted from the headers along with the series
version and total count metadata extracted from the subject. In addition
to this, we timebox things so that two or more series that match on all
of this metadata but which are sent some time apart from each other
aren't combined by accident. This does leave one edge case - duplicate
series received within the timebox will be combined. We've resigned
ourselves to this fact on the basis that it's extremely unlikely for all
of these things to go wrong at once.

Given all the above, there should be no reason that attempting to find
series by series markers should return more than one series. The
timeboxing will prevent us grouping similar looking series by accident
and the only other reason for this to happen is because we lost a race
and we should try again.

[1] https://tools.ietf.org/html/rfc822

Signed-off-by: Stephen Finucane <stephen@that.guru>
Cc: Daniel Axtens <dja@axtens.net>
5 years agomodels: Use database constraints to prevent split Series
Stephen Finucane [Sun, 1 Dec 2019 17:10:43 +0000 (17:10 +0000)] 
models: Use database constraints to prevent split Series

Currently, the 'SeriesReference' object has a unique constraint on the
two fields it has, 'series', which is a foreign key to 'Series', and
'msgid'. This is the wrong constraint. What we actually want to enforce
is that a patch, cover letter or comment is referenced by a single
series, or rather a single series per project the submission appears on.
As such, we should be enforcing uniqueness on the msgid and the project
that the patch, cover letter or comment belongs to.

This requires adding a new field to the object, 'project', since it's
not possible to do something like the following:

  unique_together = [('msgid', 'series__project')]

This is detailed here [1]. In addition, the migration needs a precursor
migration step to merge any broken series.

[1] https://stackoverflow.com/a/4440189/613428

Signed-off-by: Stephen Finucane <stephen@that.guru>
Closes: #241
Cc: Daniel Axtens <dja@axtens.net>
Cc: Petr Vorel <petr.vorel@gmail.com>
5 years agotests: Skip tests that fail on SQLite DB backend
Stephen Finucane [Sun, 1 Dec 2019 15:05:06 +0000 (15:05 +0000)] 
tests: Skip tests that fail on SQLite DB backend

These are failing due to differences in behavior of the backend. Since
this will never be used for production, we can simply skip these unit
tests and rely on the CI to catch potential issues.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agosettings: Add configuration for sqlite DB backend
Stephen Finucane [Sun, 1 Dec 2019 15:05:05 +0000 (15:05 +0000)] 
settings: Add configuration for sqlite DB backend

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agomodels: Add State.slug field
Stephen Finucane [Fri, 20 Dec 2019 10:49:21 +0000 (10:49 +0000)] 
models: Add State.slug field

This reduces a lot of the tech debt we had built up around this. This
field is populated from a slugified representation of State.name and has
a uniqueness constraint. As a result, we also need to a uniqueness
constraint to the State.name field. This shouldn't be an issue and
probably should have been used from day one.

Note that there is no REST API impact for this since we've been using
state slugs all along.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: Allow configuration of user settings via API
Stephen Finucane [Sat, 30 Nov 2019 18:48:36 +0000 (18:48 +0000)] 
REST: Allow configuration of user settings via API

Expose the embedded UserProfile field via the REST API.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agotests: Provide a way to disable API schema
Stephen Finucane [Sat, 30 Nov 2019 18:48:35 +0000 (18:48 +0000)] 
tests: Provide a way to disable API schema

The API schema validation is strict, in that it will error out with
invalid keys in either the request or response. Unfortunately the API
itself is not. We're hopefully going to fix this in a distant v2.0, but
for now we need a way to ensure that the API does what it's supposed to,
namely not set fields that don't exist or that the user isn't allowed to
set, even if proper error codes aren't raised.

This isn't actually used yet. That will come later.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agodocs: Add missing series index schema
Mete Polat [Sat, 7 Dec 2019 16:46:20 +0000 (17:46 +0100)] 
docs: Add missing series index schema

Fixes: 7d8e24bc84bd ("docs: Start documenting API using OpenAPI")
Signed-off-by: Mete Polat <metepolat2000@gmail.com>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agorequirements: Add pyup markers to prevent dumb PRs
Stephen Finucane [Sun, 1 Dec 2019 15:01:35 +0000 (15:01 +0000)] 
requirements: Add pyup markers to prevent dumb PRs

Until [1] is merged, we're going to have to override what these markers
are doing. Perhaps it would be easier to just specify the markers in the
comments as the actual marker, but I like using pip's features and the
comments *should* be temporary.

[1] https://github.com/pyupio/pyup/pull/367

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agodocs: Change category of API release note
Stephen Finucane [Sun, 1 Dec 2019 12:08:42 +0000 (12:08 +0000)] 
docs: Change category of API release note

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agodocs: Correct location of release note
Stephen Finucane [Sun, 1 Dec 2019 12:05:46 +0000 (12:05 +0000)] 
docs: Correct location of release note

Not sure how this ended up here but we both missed this. Correct the
location.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: d380219e ("api: support filtering patches by hash")
5 years agodocs: Add release notes for recently added features
Stephen Finucane [Sun, 1 Dec 2019 12:05:01 +0000 (12:05 +0000)] 
docs: Add release notes for recently added features

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: Add 'actor' field to '/events' model
Johan Herland [Sun, 1 Dec 2019 01:49:54 +0000 (02:49 +0100)] 
REST: Add 'actor' field to '/events' model

Signed-off-by: Johan Herland <johan@herland.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
Acked-by: Daniel Axtens <dja@axtens.net>
Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
Closes: #73
5 years agoInclude the responsible actor in applicable events
Johan Herland [Sun, 1 Dec 2019 01:49:53 +0000 (02:49 +0100)] 
Include the responsible actor in applicable events

We want to use the events as an audit log. An important part of this is
recording _who_ made the changes that the events represent.

To accomplish this, we need to know the current user (aka. request.user)
at the point where we create the Event instance. Event creation is
currently triggered by signals, but neither the signal handlers, nor the
model classes themselves have easy access to request.user.

For some Patch-based events (patch-state-changed, patch-delegated), we
can do the following hack: The relevant events are created in signal
handlers that are all hooked up to either the pre_save or post_save
signals sent by Patch.save(). But before calling Patch.save(),
Patchwork must naturally query Patch.is_editable() to ascertain whether
the patch can in fact be changed by the current user. Thus, we only
need a way to communicate the current user from Patch.is_editable()
to the signal handlers that create the resulting Events. The Patch
object itself is available in both places, so we simply add an
'_edited_by' attribute to the instance (which fortunately is not
detected as a persistent db field by Django).

For the check-created event the current user always happens to be the
same as the 'user' field recorded in the Check object itself.

For the other Patch-based events (patch-created, patch-completed, and
series-completed), although they are also triggered by Patch.save(),
they are triggered as a result of incoming emails, hence have no real
actor as such, so we simply leave the actor as None/NULL. The same
argument also applies to the cover-created and series-created events.

Signed-off-by: Johan Herland <johan@herland.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
5 years agomodels.Event: Add the user responsible for the event
Johan Herland [Sun, 1 Dec 2019 01:49:52 +0000 (02:49 +0100)] 
models.Event: Add the user responsible for the event

This allows using the events as a kind of audit log, to see how a
patch came to its current state/delegate.

Signed-off-by: Johan Herland <johan@herland.net>
Reviewed-by: Stephen Finucane <stephen@that.guru>
Cc: Mauro Carvalho Chehab <mchehab+samsung@kernel.org>
5 years agotemplates: Use 'en' locale
Stephen Finucane [Sat, 30 Nov 2019 17:11:13 +0000 (17:11 +0000)] 
templates: Use 'en' locale

As discussed at [1], the UI was originally written in Australian English
but as it's been through a couple of pairs of hands since the chances
are things are more than a little messed up. Just use 'en' as our locale
rather than 'en-US', 'en-AU' or anything else.

[1] https://lists.ozlabs.org/pipermail/patchwork/2019-November/006342.html

Signed-off-by: Stephen Finucane <stephen@that.guru>
Suggested-by: Daniel Axtens <dja@axtens.net>
5 years agodocs: Only include 'order' filter in '/events/' for v1.2+
Stephen Finucane [Sat, 30 Nov 2019 16:54:48 +0000 (16:54 +0000)] 
docs: Only include 'order' filter in '/events/' for v1.2+

Even though we don't actually version this thing, don't document for
older versions of the API lest people using older deployments get
confused.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoAllow ordering events by date
Jeremy Cline [Tue, 15 Oct 2019 21:30:11 +0000 (17:30 -0400)] 
Allow ordering events by date

By default, the events API orders events by date in descending order
(newest first). However, it's useful to be able to order the events by
oldest events first. For example, when a client is polling the events
API for new events since a given date and wishes to process them in
chronological order.

Signed-off-by: Jeremy Cline <jcline@redhat.com>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoREST: Exclude filters added in later version
Stephen Finucane [Sat, 30 Nov 2019 16:24:36 +0000 (16:24 +0000)] 
REST: Exclude filters added in later version

If a person requests API version 1.1, they should get the exact same
behavior regardless of the base Patchwork version. We already do this
for fields in the output, so now extend this to filters in the
querystring.

Signed-off-by: Stephen Finucane <stephen@that.guru>
Cc: Daniel Axtens <dja@axtens.net>
5 years agoapi: support filtering patches by hash
Daniel Axtens [Wed, 23 Oct 2019 14:33:42 +0000 (01:33 +1100)] 
api: support filtering patches by hash

This is a feature that the XML-RPC API has, and which is used in
the wild [1], so support it in the REST API.

I tried to version the new filter field, but it's not at all clear
how to do this with django-filters. The best way I could find
requires manually manipulating request.GET, which seems to defeat
the point of django-filters. So document it for 1.2, and have it
work on older versions as an undocumented feature.

[1] https://git.kernel.org/pub/scm/linux/kernel/git/mricon/korg-helpers.git/tree/git-patchwork-bot.py?id=104e7374e1be8458e6d2e82478625a7bf8c822ff

Cc: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Signed-off-by: Daniel Axtens <dja@axtens.net>
Acked-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
5 years agoparser: Fix style issues
Stephen Finucane [Sat, 30 Nov 2019 15:40:15 +0000 (15:40 +0000)] 
parser: Fix style issues

Signed-off-by: Stephen Finucane <stephen@that.guru>
Fixes: 8c229caa ("Improve pull request URL matching regex")
5 years agodocs: Fix note about the required Postfix rights
Ali Alnubani [Mon, 21 Oct 2019 15:06:24 +0000 (15:06 +0000)] 
docs: Fix note about the required Postfix rights

The permissions for the user running the postfix process are
not the ones used for external file or command delivery by default.
The ones defined by default_privs are (in case the aliases(5) file
that is owned by root was being used). A privileged user or the
postfix owner should not be used in this case.

See http://www.postfix.org/postconf.5.html#default_privs and
local(8).

Signed-off-by: Ali Alnubani <alialnu@mellanox.com>
Reviewed-by: Stephen Finucane <stephen@that.guru>
5 years agoDisable i18n machinery, use correct locale
Stephen Finucane [Wed, 6 Nov 2019 06:53:47 +0000 (14:53 +0800)] 
Disable i18n machinery, use correct locale

Two issues here. Firstly, the use of the 'USE_I18N'. The Django docs
describe this as such:

  A boolean that specifies whether Django’s translation system should
  be enabled. This provides an easy way to turn it off, for performance.
  If this is set to False, Django will make some optimizations so as not
  to load the translation machinery.

We don't do translations and won't until such a time as someone comes
asking for them. Optimize things accordingly by setting 'USE_I18N' to
False and removing the now-unnecessary 'LANGUAGE_CODE' setting.

Secondly, the use of en-AU is a bit of a lie since our UI is actually
written in US English (or should be). The primary reason for a lang tag
to be present is to assist screenreaders and other accessibility tools,
so make their lives easier by reflecting the truth.

Signed-off-by: Stephen Finucane <stephen@that.guru>
5 years agoImprove pull request URL matching regex
Konstantin Ryabitsev [Sat, 16 Nov 2019 16:16:00 +0000 (11:16 -0500)] 
Improve pull request URL matching regex

When git-request-pull output is pasted into a mail client instead of
mailed directly, the ref part of the pull URL may end up wrapped to the
next line.

Example: https://lore.kernel.org/r/294422a4-37b2-def5-5d32-8988f27c3a5b@gmail.com/

This change properly parses URLs both with and without newlines.

Signed-off-by: Konstantin Ryabitsev <konstantin@linuxfoundation.org>
Reviewed-by: Andrew Donnellan <ajd@linux.ibm.com>
5 years agoREADME: trivial fix
Daniel Axtens [Tue, 29 Oct 2019 07:17:07 +0000 (18:17 +1100)] 
README: trivial fix

Reviewed-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoREADME: stop trying to track supported versions
Daniel Axtens [Tue, 29 Oct 2019 07:04:14 +0000 (18:04 +1100)] 
README: stop trying to track supported versions

We're not doing a good job of it, the versions are out of date and
we keep forgetting to update the README. We are a bit better at
making release notes, so just point people there.

Reviewed-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoREADME: fix .env
Daniel Axtens [Tue, 29 Oct 2019 07:10:44 +0000 (18:10 +1100)] 
README: fix .env

The .env setup didn't do GID. It's a bit of a chore to do because
there doesn't seem to be a GID shell variable and because we need
to do a bit more work to get a multi-line thing, but this should
work.

While we're at it, change the docker-compose info, it's hopelessly
out of date.

Reviewed-by: Stephen Finucane <stephen@that.guru>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agoRevert "Remove Django 2.0 support"
Daniel Axtens [Tue, 5 Nov 2019 03:19:19 +0000 (14:19 +1100)] 
Revert "Remove Django 2.0 support"

This reverts commit f09bfd460814d7125437b0b45a183a221692584a.

5 years agoRemove Django 2.0 support
Daniel Axtens [Tue, 29 Oct 2019 06:47:21 +0000 (17:47 +1100)] 
Remove Django 2.0 support

It's no longer supported upstream, per
https://www.djangoproject.com/download/#supported-versions

Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agotemplates: Specify language
Andrew Donnellan [Thu, 31 Oct 2019 06:57:37 +0000 (17:57 +1100)] 
templates: Specify language

Specifying language in the <html> tag is recommended in HTML5.

Signed-off-by: Andrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>
5 years agotemplates: Get rid of type attribute in script tags
Andrew Donnellan [Thu, 31 Oct 2019 06:57:36 +0000 (17:57 +1100)] 
templates: Get rid of type attribute in script tags

In HTML5, the type attribute of a script tag is optional if it's
JavaScript.

Remove all occurrences. The only real gain is slightly smaller page output,
but it also shuts up validators that like to be noisy about this.

Signed-off-by: Andrew Donnellan <ajd@linux.ibm.com>
Signed-off-by: Daniel Axtens <dja@axtens.net>