aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Kerr <jk@ozlabs.org>2020-04-16 09:29:26 +0800
committerStephen Finucane <stephen@that.guru>2020-04-18 12:30:35 +0100
commit947c6aae94b7b554ca701c1d7e5baf000759ed2d (patch)
treea2aa87bfb40fb71221a9aa1fc74c6a7d88fd0974
parenta60e75e2c6897fd262ec95a35e0e94b9027c11d4 (diff)
downloadpatchwork-947c6aae94b7b554ca701c1d7e5baf000759ed2d.tar
patchwork-947c6aae94b7b554ca701c1d7e5baf000759ed2d.tar.gz
parser: prevent IntegrityErrors
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]
-rw-r--r--patchwork/parser.py7
-rw-r--r--patchwork/tests/test_parser.py1
2 files changed, 4 insertions, 4 deletions
diff --git a/patchwork/parser.py b/patchwork/parser.py
index dce03a4..021c034 100644
--- a/patchwork/parser.py
+++ b/patchwork/parser.py
@@ -1069,7 +1069,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,
@@ -1084,8 +1087,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:
diff --git a/patchwork/tests/test_parser.py b/patchwork/tests/test_parser.py
index 0122fb8..b640a3a 100644
--- a/patchwork/tests/test_parser.py
+++ b/patchwork/tests/test_parser.py
@@ -1138,7 +1138,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')