view commitwatcher/store.py @ 25:a5b4025f2455

commitwatcher/web.py
author Jeff Hammel <jhammel@mozilla.com>
date Wed, 02 Oct 2013 18:41:59 -0700
parents 60a67934c64e
children 4c53f4cc6ffe
line wrap: on
line source

from abc import abstractmethod

__all__ = ['CommitStore', 'MemoryStore']

class CommitStore(object):
    """
    ABC for commits
    """

    @abstractmethod
    def add(self, commit):
        """adds a commit to the store"""

    @abstractmethod
    def paths(self, *commits):
        """return all paths touched for a given commit"""

    def ancestry(self, path):
        sep = '/' # unix/url-style separators
        path = path.split('/')
        paths = []
        while path:
            paths.append(sep.join(path))
            path.pop()
        return paths


class MemoryStore(CommitStore):
    """store in volatile memory"""
    # volatile!

    def __init__(self):
        self.path_to_commit = {}
        self._commits = []

    def add(self, commit):
        raise NotImplementedError()

    def paths(self, *commits):
        """
        return paths touched by commits
        """

        paths = set()
        for commit in commits:
            for f in commit.files:
                for path in self.ancestry(f):
                    self.path_to_commit.set_default(path, []).append(commit)
                    # TODO: worry about commit order