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]
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,
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:
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')