Source code for swh.model.toposort

# Copyright (C) 2017-2018  The Software Heritage developers
# See the AUTHORS file at the top-level directory of this distribution
# License: GNU General Public License version 3, or any later version
# See top-level LICENSE file for more information

import collections


[docs] def toposort(revision_log): """Perform a topological sort on a revision log graph. Complexity: O(N) (linear in the length of the revision log) Args: revision_log: Revision log as returned by swh.storage.Storage.revision_log(). Yields: The revision log sorted by a topological order """ in_degree = {} # rev_id -> numbers of parents left to compute children = collections.defaultdict(list) # rev_id -> children # Compute the in_degrees and the parents of all the revisions. # Add the roots to the processing queue. queue = collections.deque() for rev in revision_log: parents = rev["parents"] in_degree[rev["id"]] = len(parents) if not parents: queue.append(rev) for parent in parents: children[parent].append(rev) # Topological sort: yield the 'ready' nodes, decrease the in degree of # their children and add the 'ready' ones to the queue. while queue: rev = queue.popleft() yield rev for child in children[rev["id"]]: in_degree[child["id"]] -= 1 if in_degree[child["id"]] == 0: queue.append(child)