summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2020-04-16 09:29:28 +0800
committerStephen Finucane <stephen@that.guru>2020-04-18 12:30:39 +0100
commit55fb26bf5bb3ca81ae35426efa9b2410e206c8b2 (patch)
tree7047c0c21ff4fdf0c8f8d64ba39d18d295f199e9
parent55aa9cd749f3ff0de430c8f04c687d691c3a703a (diff)
downloadpatchwork-55fb26bf5bb3ca81ae35426efa9b2410e206c8b2.tar
patchwork-55fb26bf5bb3ca81ae35426efa9b2410e206c8b2.tar.gz
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]
-rw-r--r--patchwork/parser.py7
-rw-r--r--patchwork/tests/test_parser.py10
-rw-r--r--releasenotes/notes/issue-358-7d664318a19385fa.yaml7
3 files changed, 21 insertions, 3 deletions
diff --git a/patchwork/parser.py b/patchwork/parser.py
index 215f48c..63ff680 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -1227,7 +1227,10 @@ def parse_mail(mail, list_id=None):
SeriesReference.objects.create(
msgid=msgid, project=project, series=series)
- try:
+ with transaction.atomic():
+ if CoverLetter.objects.filter(project=project, msgid=msgid):
+ raise DuplicateMailError(msgid=msgid)
+
cover_letter = CoverLetter.objects.create(
msgid=msgid,
project=project,
@@ -1236,8 +1239,6 @@ def parse_mail(mail, list_id=None):
headers=headers,
submitter=author,
content=message)
- except IntegrityError:
- raise DuplicateMailError(msgid=msgid)
logger.debug('Cover letter saved')
diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py
index dcc7732..07c2b97 100644
--- a/patchwork/tests/test_parser.py
+++ b/patchwork/tests/test_parser.py
@@ -21,6 +21,7 @@ from patchwork.models import Comment
from patchwork.models import Patch
from patchwork.models import Person
from patchwork.models import State
+from patchwork.models import CoverLetter
from patchwork.parser import clean_subject
from patchwork.parser import get_or_create_author
from patchwork.parser import find_patch_content as find_content
@@ -1157,3 +1158,12 @@ class DuplicateMailTest(TestCase):
self.assertEqual(Patch.objects.count(), 1)
self.assertEqual(Comment.objects.count(), 1)
+
+ def test_duplicate_coverletter(self):
+ m = create_email('test', listid=self.listid, msgid='1@example.com')
+ del m['Subject']
+ m['Subject'] = '[PATCH 0/1] test cover letter'
+
+ self._test_duplicate_mail(m)
+
+ self.assertEqual(CoverLetter.objects.count(), 1)
diff --git a/releasenotes/notes/issue-358-7d664318a19385fa.yaml b/releasenotes/notes/issue-358-7d664318a19385fa.yaml
new file mode 100644
index 0000000..a0eeaa0
--- /dev/null
+++ b/releasenotes/notes/issue-358-7d664318a19385fa.yaml
@@ -0,0 +1,7 @@
+---
+fixes:
+ - |
+ The parser module now uses an atomic select-insert when creating new patch,
+ cover letter and comment entries. This prevents the integrity errors from
+ being logged in the DB logs.
+ (`#358 <https://github.com/getpatchwork/patchwork/issues/358>`__)