As we've done for the Patch model, this change prevents database errors from duplicate Comments.
Signed-off-by: Jeremy Kerr <j...@ozlabs.org> --- patchwork/parser.py | 6 +++--- patchwork/tests/test_parser.py | 12 ++++++++++++ 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/patchwork/parser.py b/patchwork/parser.py index e03634a..406c916 100644 --- a/patchwork/parser.py +++ b/patchwork/parser.py @@ -1247,7 +1247,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, @@ -1255,8 +1257,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 c7c918a..d1a9a21 100644 --- a/patchwork/tests/test_parser.py +++ b/patchwork/tests/test_parser.py @@ -1122,3 +1122,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) -- 2.17.1 _______________________________________________ Patchwork mailing list Patchwork@lists.ozlabs.org https://lists.ozlabs.org/listinfo/patchwork