]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
parser: don't trigger database IntegrityErrors on duplicate comments
authorJeremy Kerr <jk@ozlabs.org>
Thu, 16 Apr 2020 01:29:27 +0000 (09:29 +0800)
committerStephen Finucane <stephen@that.guru>
Sat, 18 Apr 2020 11:30:39 +0000 (12:30 +0100)
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>
patchwork/parser.py
patchwork/tests/test_parser.py

index 021c034eb8cd2eea8bbeee54df0c0c95f481728c..215f48cdea6196c4e94005492b99f5cd46e30fd0 100644 (file)
@@ -1254,7 +1254,9 @@ def parse_mail(mail, list_id=None):
 
     author = get_or_create_author(mail, project)
 
-    try:
+    with transaction.atomic():
+        if Comment.objects.filter(submission=submission, msgid=msgid):
+            raise DuplicateMailError(msgid=msgid)
         comment = Comment.objects.create(
             submission=submission,
             msgid=msgid,
@@ -1262,8 +1264,6 @@ def parse_mail(mail, list_id=None):
             headers=headers,
             submitter=author,
             content=message)
-    except IntegrityError:
-        raise DuplicateMailError(msgid=msgid)
 
     logger.debug('Comment saved')
 
index b640a3a1709b710b53fb92880090a866c0d80d57..dcc77324b00bc005fa81628f2506d90bb50bc538 100644 (file)
@@ -1145,3 +1145,15 @@ class DuplicateMailTest(TestCase):
         self._test_duplicate_mail(m)
 
         self.assertEqual(Patch.objects.count(), 1)
+
+    def test_duplicate_comment(self):
+        diff = read_patch('0001-add-line.patch')
+        m1 = create_email(diff, listid=self.listid, msgid='1@example.com')
+        _parse_mail(m1)
+
+        m2 = create_email('test', listid=self.listid, msgid='2@example.com',
+                          in_reply_to='1@example.com')
+        self._test_duplicate_mail(m2)
+
+        self.assertEqual(Patch.objects.count(), 1)
+        self.assertEqual(Comment.objects.count(), 1)