Changeset View
Changeset View
Standalone View
Standalone View
swh/provenance/revision.py
from datetime import datetime, timezone | from datetime import datetime, timezone | ||||
import iso8601 | |||||
from itertools import islice | from itertools import islice | ||||
import threading | import threading | ||||
from typing import Iterable, Iterator, Optional, Tuple | from typing import Iterable, Iterator, Optional, Tuple | ||||
from swh.model.hashutil import hash_to_bytes | import iso8601 | ||||
from .archive import ArchiveInterface | |||||
class RevisionEntry: | |||||
def __init__( | |||||
self, | |||||
archive: ArchiveInterface, | |||||
id: bytes, | |||||
date: Optional[datetime] = None, | |||||
root: Optional[bytes] = None, | |||||
parents: Optional[list] = None, | |||||
): | |||||
self.archive = archive | |||||
self.id = id | |||||
self.date = date | |||||
assert self.date is None or self.date.tzinfo is not None | |||||
self.parents = parents | |||||
self.root = root | |||||
def __iter__(self): | |||||
if self.parents is None: | |||||
self.parents = [] | |||||
for parent in self.archive.revision_get([self.id]): | |||||
if parent is not None: | |||||
self.parents.append( | |||||
RevisionEntry( | |||||
self.archive, | |||||
parent.id, | |||||
parents=[ | |||||
RevisionEntry(self.archive, id) for id in parent.parents | |||||
], | |||||
) | |||||
) | |||||
return iter(self.parents) | |||||
from swh.model.hashutil import hash_to_bytes | |||||
from swh.provenance.archive import ArchiveInterface | |||||
from swh.provenance.model import RevisionEntry | |||||
######################################################################################## | ######################################################################################## | ||||
######################################################################################## | ######################################################################################## | ||||
class CSVRevisionIterator: | class CSVRevisionIterator: | ||||
"""Iterator over revisions typically present in the given CSV file. | """Iterator over revisions typically present in the given CSV file. | ||||
Show All 26 Lines | class CSVRevisionIterator: | ||||
def __next__(self): | def __next__(self): | ||||
with self.mutex: | with self.mutex: | ||||
id, date, root = next(self.revisions) | id, date, root = next(self.revisions) | ||||
date = iso8601.parse_date(date) | date = iso8601.parse_date(date) | ||||
if date.tzinfo is None: | if date.tzinfo is None: | ||||
date = date.replace(tzinfo=timezone.utc) | date = date.replace(tzinfo=timezone.utc) | ||||
return RevisionEntry( | return RevisionEntry( | ||||
self.archive, hash_to_bytes(id), date=date, root=hash_to_bytes(root), | hash_to_bytes(id), date=date, root=hash_to_bytes(root), | ||||
) | ) | ||||
# class ArchiveRevisionIterator(RevisionIterator): | # class ArchiveRevisionIterator(RevisionIterator): | ||||
# """Iterator over revisions present in the given database.""" | # """Iterator over revisions present in the given database.""" | ||||
# | # | ||||
# def __init__(self, conn, limit=None, chunksize=100): | # def __init__(self, conn, limit=None, chunksize=100): | ||||
# self.cur = conn.cursor() | # self.cur = conn.cursor() | ||||
▲ Show 20 Lines • Show All 91 Lines • Show Last 20 Lines |