diff --git a/swh/web/common/service.py b/swh/web/common/service.py --- a/swh/web/common/service.py +++ b/swh/web/common/service.py @@ -1341,3 +1341,18 @@ ) return missing + + +def lookup_origins_by_sha1s(sha1s: List[str]) -> Iterator[Optional[OriginInfo]]: + """Lookup origins from the sha1 hash values of their URLs. + + Args: + sha1s: list of sha1s hexadecimal representation + + Yields: + origin information as dict + """ + sha1s_bytes = [hashutil.hash_to_bytes(sha1) for sha1 in sha1s] + origins = storage.origin_get_by_sha1(sha1s_bytes) + for origin in origins: + yield converters.from_origin(origin) diff --git a/swh/web/tests/common/test_service.py b/swh/web/tests/common/test_service.py --- a/swh/web/tests/common/test_service.py +++ b/swh/web/tests/common/test_service.py @@ -4,6 +4,7 @@ # See top-level LICENSE file for more information from collections import defaultdict +import hashlib import itertools import random @@ -16,6 +17,7 @@ from swh.model.model import Directory, DirectoryEntry, Origin, OriginVisit, Revision from swh.web.common import service from swh.web.common.exc import BadInputExc, NotFoundExc +from swh.web.common.typing import OriginInfo from swh.web.tests.conftest import ctags_json_missing, fossology_missing from swh.web.tests.data import random_content, random_sha1 from swh.web.tests.strategies import ( @@ -993,3 +995,24 @@ ) in possible_results ) + + +@given(origin(), new_origin()) +def test_lookup_origins_get_by_sha1s(origin, unknown_origin): + hasher = hashlib.sha1() + hasher.update(origin["url"].encode("ascii")) + origin_info = OriginInfo(url=origin["url"]) + origin_sha1 = hasher.hexdigest() + + hasher = hashlib.sha1() + hasher.update(unknown_origin.url.encode("ascii")) + unknown_origin_sha1 = hasher.hexdigest() + + origins = list(service.lookup_origins_by_sha1s([origin_sha1])) + assert origins == [origin_info] + + origins = list(service.lookup_origins_by_sha1s([origin_sha1, origin_sha1])) + assert origins == [origin_info, origin_info] + + origins = list(service.lookup_origins_by_sha1s([origin_sha1, unknown_origin_sha1])) + assert origins == [origin_info, None]