Mercurial > hg > CommitWatcher
view commitwatcher/store.py @ 30:4c53f4cc6ffe
commitwatcher/commit.py commitwatcher/store.py
author | Jeff Hammel <jhammel@mozilla.com> |
---|---|
date | Wed, 09 Oct 2013 14:50:07 -0700 |
parents | 60a67934c64e |
children | 3edb91cfd3c1 |
line wrap: on
line source
from abc import abstractmethod __all__ = ['CommitStore', 'MemoryStore'] class CommitStore(object): """ ABC for commits """ def __init__(self, verbose=True): self.verbose = verbose @abstractmethod def __contains__(self, revision): """if a particular revision is already added""" @abstractmethod def store(self, commit): """store a commit""" def add(self, commit): """adds a commit to the store""" if commit.revision not in self: return self.store(commit) @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