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 @@ -13,6 +13,7 @@ from swh.model import hashutil from swh.model.identifiers import CONTENT, DIRECTORY, RELEASE, REVISION, SNAPSHOT from swh.storage.algos import diff, revisions_walker +from swh.storage.algos.origin import origin_get_latest_visit_status from swh.storage.algos.snapshot import snapshot_get_latest from swh.vault.exc import NotFoundExc as VaultNotFoundExc from swh.web import config @@ -903,7 +904,7 @@ def lookup_origin_visit_latest( origin_url: str, require_snapshot: bool -) -> OriginVisitInfo: +) -> Optional[OriginVisitInfo]: """Return the origin's latest visit Args: @@ -911,13 +912,20 @@ require_snapshot (bool): filter out origins without a snapshot Returns: - dict: The origin_visit concerned + The origin_visit as dict if found """ - visit = storage.origin_visit_get_latest( - origin_url, require_snapshot=require_snapshot + + visit_and_status = origin_get_latest_visit_status( + storage, origin_url, require_snapshot=require_snapshot + ) + return ( + converters.from_origin_visit( + {**visit_and_status[0].to_dict(), **visit_and_status[1].to_dict()} + ) + if visit_and_status + else None ) - return converters.from_origin_visit(visit) def lookup_origin_visit(origin_url: str, visit_id: int) -> OriginVisitInfo: diff --git a/swh/web/tests/api/views/test_origin.py b/swh/web/tests/api/views/test_origin.py --- a/swh/web/tests/api/views/test_origin.py +++ b/swh/web/tests/api/views/test_origin.py @@ -343,9 +343,11 @@ archive_data.snapshot_add([new_snapshots[0]]) + # Add snapshot to the latest visit + visit_id = visit_ids[-1] visit_status = OriginVisitStatus( origin=new_origin.url, - visit=visit_ids[0], + visit=visit_id, date=now(), status="full", snapshot=new_snapshots[0].id, @@ -363,7 +365,9 @@ assert rv.status_code == 200, rv.data assert rv["Content-Type"] == "application/json" - expected_visit = archive_data.origin_visit_get_by(new_origin.url, visit_ids[0]) + expected_visit = archive_data.origin_visit_status_get_latest( + new_origin.url, type="git", require_snapshot=True + ) expected_visit = enrich_origin_visit( expected_visit, diff --git a/swh/web/tests/conftest.py b/swh/web/tests/conftest.py --- a/swh/web/tests/conftest.py +++ b/swh/web/tests/conftest.py @@ -9,6 +9,7 @@ import sys from subprocess import run, PIPE +from typing import Optional, Iterable import pytest @@ -19,6 +20,7 @@ from swh.model.hashutil import ALGORITHMS, hash_to_bytes from swh.web.common import converters from swh.web.tests.data import get_tests_data, override_storages +from swh.storage.algos.origin import origin_get_latest_visit_status from swh.storage.algos.snapshot import snapshot_get_latest # Used to skip some tests @@ -232,6 +234,28 @@ visit = self.storage.origin_visit_get_by(origin_url, visit_id) return converters.from_origin_visit(visit) + def origin_visit_status_get_latest( + self, + origin_url, + type: Optional[str] = None, + allowed_statuses: Optional[Iterable[str]] = None, + require_snapshot: bool = False, + ): + visit_and_status = origin_get_latest_visit_status( + self.storage, + origin_url, + type=type, + allowed_statuses=allowed_statuses, + require_snapshot=require_snapshot, + ) + return ( + converters.from_origin_visit( + {**visit_and_status[0].to_dict(), **visit_and_status[1].to_dict()} + ) + if visit_and_status + else None + ) + def snapshot_get(self, snapshot_id): snp = self.storage.snapshot_get(hash_to_bytes(snapshot_id)) return converters.from_snapshot(snp)