From: Jeremy Kerr Date: Thu, 16 Apr 2020 01:29:27 +0000 (+0800) Subject: parser: don't trigger database IntegrityErrors on duplicate comments X-Git-Tag: v2.2.2~4 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=69cd420b4ec3c95a47bb80eed2415d8ba01d84fb;p=thirdparty%2Fpatchwork.git 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 Reviewed-by: Stephen Finucane (cherry picked from commit 55aa9cd749f3ff0de430c8f04c687d691c3a703a) --- diff --git a/patchwork/parser.py b/patchwork/parser.py index 76b89d36..0f21e0f7 100644 --- a/patchwork/parser.py +++ b/patchwork/parser.py @@ -1277,7 +1277,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, @@ -1285,8 +1287,6 @@ def parse_mail(mail, list_id=None): headers=headers, submitter=author, content=message) - except IntegrityError: - raise DuplicateMailError(msgid=msgid) logger.debug('Comment saved') diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py index 4041ef36..f06a6f8e 100644 --- a/patchwork/tests/test_parser.py +++ b/patchwork/tests/test_parser.py @@ -1168,3 +1168,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)