diff --git a/swh/storage/sql/40-swh-func.sql b/swh/storage/sql/40-swh-func.sql --- a/swh/storage/sql/40-swh-func.sql +++ b/swh/storage/sql/40-swh-func.sql @@ -623,7 +623,7 @@ union select committer_fullname as fullname, committer_name as name, committer_email as email from tmp_revision ) insert into person (fullname, name, email) - select distinct fullname, name, email from t + select distinct on (fullname) fullname, name, email from t where not exists ( select 1 from person p @@ -662,7 +662,7 @@ select distinct author_fullname as fullname, author_name as name, author_email as email from tmp_release where author_fullname is not null ) insert into person (fullname, name, email) - select fullname, name, email from t + select distinct on (fullname) fullname, name, email from t where not exists ( select 1 from person p diff --git a/swh/storage/tests/test_storage.py b/swh/storage/tests/test_storage.py --- a/swh/storage/tests/test_storage.py +++ b/swh/storage/tests/test_storage.py @@ -1004,6 +1004,22 @@ actual_result = self.storage.revision_add([self.revision]) self.assertEqual(actual_result, {'revision:add': 0}) + def test_revision_add_name_clash(self): + revision1 = self.revision.copy() + revision2 = self.revision2.copy() + revision1['author'] = { + 'fullname': b'John Doe ', + 'name': b'John Doe', + 'email': b'john.doe@example.com' + } + revision2['author'] = { + 'fullname': b'John Doe ', + 'name': b'John Doe ', + 'email': b'john.doe@example.com ' + } + actual_result = self.storage.revision_add([revision1, revision2]) + self.assertEqual(actual_result, {'revision:add': 2}) + def test_revision_log(self): # given # self.revision4 -is-child-of-> self.revision3 @@ -1145,6 +1161,22 @@ self.assertEqual(list(self.journal_writer.objects), [('release', release)]) + def test_release_add_name_clash(self): + release1 = self.release.copy() + release2 = self.release2.copy() + release1['author'] = { + 'fullname': b'John Doe ', + 'name': b'John Doe', + 'email': b'john.doe@example.com' + } + release2['author'] = { + 'fullname': b'John Doe ', + 'name': b'John Doe ', + 'email': b'john.doe@example.com ' + } + actual_result = self.storage.release_add([release1, release2]) + self.assertEqual(actual_result, {'release:add': 2}) + def test_release_get(self): # given self.storage.release_add([self.release, self.release2])