Changeset View
Changeset View
Standalone View
Standalone View
swh/provenance/storage/archive.py
from typing import Any, Dict, Iterable, Set | from typing import Any, Dict, Iterable, Set | ||||
from swh.model.model import ObjectType, Revision, Sha1, TargetType | from swh.model.model import ObjectType, Revision, Sha1Git, TargetType | ||||
from swh.storage.interface import StorageInterface | from swh.storage.interface import StorageInterface | ||||
class ArchiveStorage: | class ArchiveStorage: | ||||
def __init__(self, storage: StorageInterface): | def __init__(self, storage: StorageInterface): | ||||
self.storage = storage | self.storage = storage | ||||
def directory_ls(self, id: Sha1) -> Iterable[Dict[str, Any]]: | def directory_ls(self, id: Sha1Git) -> Iterable[Dict[str, Any]]: | ||||
# TODO: filter unused fields | # TODO: filter unused fields | ||||
yield from self.storage.directory_ls(id) | yield from self.storage.directory_ls(id) | ||||
def revision_get(self, ids: Iterable[Sha1]) -> Iterable[Revision]: | def revision_get(self, ids: Iterable[Sha1Git]) -> Iterable[Revision]: | ||||
# TODO: filter unused fields | # TODO: filter unused fields | ||||
yield from ( | yield from ( | ||||
rev for rev in self.storage.revision_get(list(ids)) if rev is not None | rev for rev in self.storage.revision_get(list(ids)) if rev is not None | ||||
) | ) | ||||
def snapshot_get_heads(self, id: Sha1) -> Iterable[Sha1]: | def snapshot_get_heads(self, id: Sha1Git) -> Iterable[Sha1Git]: | ||||
from swh.core.utils import grouper | from swh.core.utils import grouper | ||||
from swh.storage.algos.snapshot import snapshot_get_all_branches | from swh.storage.algos.snapshot import snapshot_get_all_branches | ||||
snapshot = snapshot_get_all_branches(self.storage, id) | snapshot = snapshot_get_all_branches(self.storage, id) | ||||
assert snapshot is not None | assert snapshot is not None | ||||
targets_set = set() | targets_set = set() | ||||
releases_set = set() | releases_set = set() | ||||
if snapshot is not None: | if snapshot is not None: | ||||
for branch in snapshot.branches: | for branch in snapshot.branches: | ||||
if snapshot.branches[branch].target_type == TargetType.REVISION: | if snapshot.branches[branch].target_type == TargetType.REVISION: | ||||
targets_set.add(snapshot.branches[branch].target) | targets_set.add(snapshot.branches[branch].target) | ||||
elif snapshot.branches[branch].target_type == TargetType.RELEASE: | elif snapshot.branches[branch].target_type == TargetType.RELEASE: | ||||
releases_set.add(snapshot.branches[branch].target) | releases_set.add(snapshot.branches[branch].target) | ||||
batchsize = 100 | batchsize = 100 | ||||
for releases in grouper(releases_set, batchsize): | for releases in grouper(releases_set, batchsize): | ||||
targets_set.update( | targets_set.update( | ||||
release.target | release.target | ||||
for release in self.storage.release_get(list(releases)) | for release in self.storage.release_get(list(releases)) | ||||
if release is not None and release.target_type == ObjectType.REVISION | if release is not None and release.target_type == ObjectType.REVISION | ||||
) | ) | ||||
revisions: Set[Sha1] = set() | revisions: Set[Sha1Git] = set() | ||||
for targets in grouper(targets_set, batchsize): | for targets in grouper(targets_set, batchsize): | ||||
revisions.update( | revisions.update( | ||||
revision.id | revision.id | ||||
for revision in self.storage.revision_get(list(targets)) | for revision in self.storage.revision_get(list(targets)) | ||||
if revision is not None | if revision is not None | ||||
) | ) | ||||
yield from revisions | yield from revisions |