diff --git a/swh/storage/algos/origin.py b/swh/storage/algos/origin.py --- a/swh/storage/algos/origin.py +++ b/swh/storage/algos/origin.py @@ -44,6 +44,7 @@ type: Optional[str] = None, allowed_statuses: Optional[Iterable[str]] = None, require_snapshot: bool = False, + limit: Optional[int] = 100, ) -> Optional[Tuple[OriginVisit, OriginVisitStatus]]: """Get the latest origin visit (and status) of an origin. Optionally, a combination of criteria can be provided, origin type, allowed statuses or if a visit has a @@ -69,9 +70,7 @@ status exist (and match the search criteria), None otherwise. """ - # visits order are from older visit to most recent. - visits = list(storage.origin_visit_get(origin_url)) - visits.reverse() + visits = list(storage.origin_visit_get(origin_url, order="desc", limit=limit)) if not visits: return None visit_status: Optional[OriginVisitStatus] = None diff --git a/swh/storage/algos/snapshot.py b/swh/storage/algos/snapshot.py --- a/swh/storage/algos/snapshot.py +++ b/swh/storage/algos/snapshot.py @@ -41,6 +41,7 @@ origin: str, allowed_statuses: Optional[Iterable[str]] = None, branches_count: Optional[int] = None, + limit: Optional[int] = 100, ) -> Optional[Snapshot]: """Get the latest snapshot for the given origin, optionally only from visits that have one of the given allowed_statuses. @@ -58,6 +59,7 @@ branches_count: Optional parameter to retrieve snapshot with all branches (default behavior when None) or not. If set to positive number, the snapshot will be partial with only that number of branches. + limit: Bound the search to a given limit Raises: ValueError if branches_count is not a positive value @@ -67,7 +69,11 @@ """ visit_and_status = origin_get_latest_visit_status( - storage, origin, allowed_statuses=allowed_statuses, require_snapshot=True + storage, + origin, + allowed_statuses=allowed_statuses, + limit=limit, + require_snapshot=True, ) if not visit_and_status: diff --git a/swh/storage/tests/algos/test_origin.py b/swh/storage/tests/algos/test_origin.py --- a/swh/storage/tests/algos/test_origin.py +++ b/swh/storage/tests/algos/test_origin.py @@ -309,3 +309,10 @@ assert actual_ov2.visit == ov2.visit assert actual_ov2.type == ov2.type assert actual_ovs22 == ovs22 + + # Last visit has no snapshot so only looking back with a limit of 1 visit, we don't + # find anything + visit_and_status = origin_get_latest_visit_status( + swh_storage, origin2.url, require_snapshot=True, limit=1 + ) + assert visit_and_status is None diff --git a/swh/storage/tests/algos/test_snapshot.py b/swh/storage/tests/algos/test_snapshot.py --- a/swh/storage/tests/algos/test_snapshot.py +++ b/swh/storage/tests/algos/test_snapshot.py @@ -135,20 +135,8 @@ ] ) - actual_snapshot = snapshot_get_latest(swh_storage, origin.url) - assert actual_snapshot is not None - assert actual_snapshot == complete_snapshot - - swh_storage.origin_visit_status_add( - [ - OriginVisitStatus( - origin=origin.url, - visit=visit_id, - date=date_now, - status="full", - snapshot=complete_snapshot.id, - ) - ] + swh_storage.origin_visit_add( + [OriginVisit(origin=origin.url, date=now(), type=data.type_visit1,)] ) actual_snapshot = snapshot_get_latest(swh_storage, origin.url) @@ -162,3 +150,8 @@ with pytest.raises(ValueError, match="branches_count must be a positive integer"): snapshot_get_latest(swh_storage, origin.url, branches_count="something-wrong") + + # Last visit has no snapshot so only looking back with a limit of 1 visit, we don't + # find anything + actual_snapshot = snapshot_get_latest(swh_storage, origin.url, limit=1) + assert actual_snapshot is None