diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2020-04-16 09:29:27 +0800 |
---|---|---|
committer | Stephen Finucane <stephen@that.guru> | 2020-04-18 12:30:39 +0100 |
commit | 55aa9cd749f3ff0de430c8f04c687d691c3a703a (patch) | |
tree | 8ed3d53f91f5c6802003e23dc9d8ed5144dba665 | |
parent | 947c6aae94b7b554ca701c1d7e5baf000759ed2d (diff) | |
download | patchwork-55aa9cd749f3ff0de430c8f04c687d691c3a703a.tar patchwork-55aa9cd749f3ff0de430c8f04c687d691c3a703a.tar.gz |
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 <jk@ozlabs.org>
Reviewed-by: Stephen Finucane <stephen@that.guru>
-rw-r--r-- | patchwork/parser.py | 6 | ||||
-rw-r--r-- | patchwork/tests/test_parser.py | 12 |
2 files changed, 15 insertions, 3 deletions
diff --git a/patchwork/parser.py b/patchwork/parser.py index 021c034..215f48c 100644 --- a/patchwork/parser.py +++ b/patchwork/parser.py @@ -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') diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py index b640a3a..dcc7732 100644 --- a/patchwork/tests/test_parser.py +++ b/patchwork/tests/test_parser.py @@ -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) |