]> git.ipfire.org Git - thirdparty/patchwork.git/commitdiff
parser: prevent IntegrityErrors
authorJeremy Kerr <jk@ozlabs.org>
Thu, 16 Apr 2020 01:29:26 +0000 (09:29 +0800)
committerStephen Finucane <stephen@that.guru>
Sat, 18 Apr 2020 11:57:17 +0000 (12:57 +0100)
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)

patchwork/parser.py
patchwork/tests/test_parser.py

index cf3e3cf0a70626d7a89aee407798fcdc95e4bdad..76b89d3698830b63f393f85e7df9b3f787b20cd3 100644 (file)
@@ -1092,7 +1092,10 @@ def parse_mail(mail, list_id=None):
             filenames = find_filenames(diff)
             delegate = find_delegate_by_filename(project, filenames)
 
-        try:
+        with transaction.atomic():
+            if Patch.objects.filter(project=project, msgid=msgid):
+                raise DuplicateMailError(msgid=msgid)
+
             patch = Patch.objects.create(
                 msgid=msgid,
                 project=project,
@@ -1107,8 +1110,6 @@ def parse_mail(mail, list_id=None):
                 delegate=delegate,
                 state=find_state(mail))
             logger.debug('Patch saved')
-        except IntegrityError:
-            raise DuplicateMailError(msgid=msgid)
 
         for attempt in range(1, 11):  # arbitrary retry count
             try:
index 11dcb21ff9192244591bed9e699e9170717a29d2..4041ef360fe63ad2cedc804f31909f3b0e51e927 100644 (file)
@@ -1161,7 +1161,6 @@ class DuplicateMailTest(TestCase):
 
         self.assertEqual(errors, [])
 
-    @unittest.expectedFailure
     def test_duplicate_patch(self):
         diff = read_patch('0001-add-line.patch')
         m = create_email(diff, listid=self.listid, msgid='1@example.com')