Changeset View
Changeset View
Standalone View
Standalone View
swh/provenance/model.py
# Copyright (C) 2021 The Software Heritage developers | # Copyright (C) 2021 The Software Heritage developers | ||||
# See the AUTHORS file at the top-level directory of this distribution | # See the AUTHORS file at the top-level directory of this distribution | ||||
# License: GNU General Public License version 3, or any later version | # License: GNU General Public License version 3, or any later version | ||||
# See top-level LICENSE file for more information | # See top-level LICENSE file for more information | ||||
from datetime import datetime | from datetime import datetime | ||||
from typing import Iterable, Iterator, List, Optional | from typing import Iterable, Iterator, List, Optional | ||||
from swh.model.hashutil import hash_to_bytes | |||||
from swh.model.identifiers import origin_identifier | |||||
from swh.model.model import Sha1Git | |||||
from .archive import ArchiveInterface | from .archive import ArchiveInterface | ||||
class OriginEntry: | class OriginEntry: | ||||
def __init__(self, url: str, date: datetime, snapshot: bytes): | def __init__(self, url: str, snapshot: Sha1Git): | ||||
self.url = url | self.url = url | ||||
# TODO: this is probably not needed and will be removed! | self.id: Sha1Git = hash_to_bytes(origin_identifier({"url": self.url})) | ||||
# self.date = date | |||||
self.snapshot = snapshot | self.snapshot = snapshot | ||||
self._revisions: Optional[List[RevisionEntry]] = None | self._revisions: Optional[List[RevisionEntry]] = None | ||||
def retrieve_revisions(self, archive: ArchiveInterface): | def retrieve_revisions(self, archive: ArchiveInterface): | ||||
if self._revisions is None: | if self._revisions is None: | ||||
self._revisions = [ | self._revisions = [ | ||||
RevisionEntry(rev) for rev in archive.snapshot_get_heads(self.snapshot) | RevisionEntry(rev) for rev in archive.snapshot_get_heads(self.snapshot) | ||||
] | ] | ||||
@property | @property | ||||
def revisions(self) -> Iterator["RevisionEntry"]: | def revisions(self) -> Iterator["RevisionEntry"]: | ||||
if self._revisions is None: | if self._revisions is None: | ||||
raise RuntimeError( | raise RuntimeError( | ||||
"Revisions of this node has not yet been retrieved. " | "Revisions of this node has not yet been retrieved. " | ||||
"Please call retrieve_revisions() before using this property." | "Please call retrieve_revisions() before using this property." | ||||
) | ) | ||||
return (x for x in self._revisions) | return (x for x in self._revisions) | ||||
def __str__(self): | def __str__(self): | ||||
return ( | return f"<MOrigin[{self.id.hex()}] url={self.url}, snap={self.snapshot.hex()}>" | ||||
f"<MOrigin[{self.url}] " | |||||
f"snap={self.snapshot.hex()}, date={self.date.isoformat()}>" | |||||
) | |||||
class RevisionEntry: | class RevisionEntry: | ||||
def __init__( | def __init__( | ||||
self, | self, | ||||
id: bytes, | id: bytes, | ||||
date: Optional[datetime] = None, | date: Optional[datetime] = None, | ||||
root: Optional[bytes] = None, | root: Optional[bytes] = None, | ||||
▲ Show 20 Lines • Show All 111 Lines • Show Last 20 Lines |