diff options
author | Jeremy Kerr <jk@ozlabs.org> | 2020-04-16 09:29:28 +0800 |
---|---|---|
committer | Stephen Finucane <stephen@that.guru> | 2020-04-18 12:30:39 +0100 |
commit | 55fb26bf5bb3ca81ae35426efa9b2410e206c8b2 (patch) | |
tree | 7047c0c21ff4fdf0c8f8d64ba39d18d295f199e9 | |
parent | 55aa9cd749f3ff0de430c8f04c687d691c3a703a (diff) | |
download | patchwork-55fb26bf5bb3ca81ae35426efa9b2410e206c8b2.tar patchwork-55fb26bf5bb3ca81ae35426efa9b2410e206c8b2.tar.gz |
parser: don't trigger database IntegrityErrors on duplicate coverletters
As we've done for the Patch and Comment models, this change prevents
database errors from duplicate CoverLetters.
Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
Signed-off-by: Stephen Finucane <stephen@that.guru>
[stephenfin: Add release note]
-rw-r--r-- | patchwork/parser.py | 7 | ||||
-rw-r--r-- | patchwork/tests/test_parser.py | 10 | ||||
-rw-r--r-- | releasenotes/notes/issue-358-7d664318a19385fa.yaml | 7 |
3 files changed, 21 insertions, 3 deletions
diff --git a/patchwork/parser.py b/patchwork/parser.py index 215f48c..63ff680 100644 --- a/patchwork/parser.py +++ b/patchwork/parser.py @@ -1227,7 +1227,10 @@ def parse_mail(mail, list_id=None): SeriesReference.objects.create( msgid=msgid, project=project, series=series) - try: + with transaction.atomic(): + if CoverLetter.objects.filter(project=project, msgid=msgid): + raise DuplicateMailError(msgid=msgid) + cover_letter = CoverLetter.objects.create( msgid=msgid, project=project, @@ -1236,8 +1239,6 @@ def parse_mail(mail, list_id=None): headers=headers, submitter=author, content=message) - except IntegrityError: - raise DuplicateMailError(msgid=msgid) logger.debug('Cover letter saved') diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py index dcc7732..07c2b97 100644 --- a/patchwork/tests/test_parser.py +++ b/patchwork/tests/test_parser.py @@ -21,6 +21,7 @@ from patchwork.models import Comment from patchwork.models import Patch from patchwork.models import Person from patchwork.models import State +from patchwork.models import CoverLetter from patchwork.parser import clean_subject from patchwork.parser import get_or_create_author from patchwork.parser import find_patch_content as find_content @@ -1157,3 +1158,12 @@ class DuplicateMailTest(TestCase): self.assertEqual(Patch.objects.count(), 1) self.assertEqual(Comment.objects.count(), 1) + + def test_duplicate_coverletter(self): + m = create_email('test', listid=self.listid, msgid='1@example.com') + del m['Subject'] + m['Subject'] = '[PATCH 0/1] test cover letter' + + self._test_duplicate_mail(m) + + self.assertEqual(CoverLetter.objects.count(), 1) diff --git a/releasenotes/notes/issue-358-7d664318a19385fa.yaml b/releasenotes/notes/issue-358-7d664318a19385fa.yaml new file mode 100644 index 0000000..a0eeaa0 --- /dev/null +++ b/releasenotes/notes/issue-358-7d664318a19385fa.yaml @@ -0,0 +1,7 @@ +--- +fixes: + - | + The parser module now uses an atomic select-insert when creating new patch, + cover letter and comment entries. This prevents the integrity errors from + being logged in the DB logs. + (`#358 <https://github.com/getpatchwork/patchwork/issues/358>`__) |