diff --git a/swh/storage/storage.py b/swh/storage/storage.py --- a/swh/storage/storage.py +++ b/swh/storage/storage.py @@ -17,6 +17,7 @@ from .exc import StorageDBError from swh.model.hashutil import ALGORITHMS +from swh.model.toposort import toposort from swh.objstorage import get_objstorage from swh.objstorage.exc import ObjNotFoundError @@ -597,27 +598,41 @@ yield data @db_transaction_generator - def revision_log(self, revisions, limit=None, cur=None): + def revision_log(self, revisions, limit=None, order=None, cur=None): """Fetch revision entry from the given root revisions. Args: revisions: array of root revision to lookup limit: limitation on the output result. Default to None. + order: ordering of the log. The following orders are currently + supported: + + - None (do not sort the revisions) + - 'topological': sort by a topological order Yields: List of revision log from such revisions root. """ - db = self.db + if order == 'topological': + log = self.revision_log(revisions, limit=limit, order=None, + cur=cur) + yield from toposort(log) - for line in db.revision_log(revisions, limit, cur): - data = converters.db_to_revision( - dict(zip(db.revision_get_cols, line)) - ) - if not data['type']: - yield None - continue - yield data + elif order is None: + db = self.db + + for line in db.revision_log(revisions, limit, cur): + data = converters.db_to_revision( + dict(zip(db.revision_get_cols, line)) + ) + if not data['type']: + yield None + continue + yield data + + else: + raise ValueError("Unknown order: {}".format(order)) @db_transaction_generator def revision_shortlog(self, revisions, limit=None, cur=None):