Edgewall Software

Ticket #781: icachechangesetlistener.diff

File icachechangesetlistener.diff, 2.6 KB (added by techtonik <techtonik@…>, 2 months ago)

ICacheChangesetListener(Interface)

  • trac/core.py

     
    1717#         Christopher Lenz <cmlenz@gmx.de> 
    1818 
    1919__all__ = ['Component', 'ExtensionPoint', 'implements', 'Interface', 
    20            'TracError'] 
     20           'TracError', 'ComponentManager'] 
    2121 
    2222 
    2323class TracError(Exception): 
  • trac/versioncontrol/cache.py

     
    1717import posixpath 
    1818from datetime import datetime 
    1919 
    20 from trac.core import TracError 
     20from trac.core import * 
    2121from trac.util.datefmt import utc, to_timestamp 
    2222from trac.util.translation import _ 
    2323from trac.versioncontrol import Changeset, Node, Repository, Authorizer, \ 
     
    3535CACHE_METADATA_KEYS = (CACHE_REPOSITORY_DIR, CACHE_YOUNGEST_REV) 
    3636 
    3737 
     38class ICacheChangesetListener(Interface): 
     39    """Cached changeset operations""" 
     40     
     41    def edit_changeset(cset): 
     42        """Called when changeset is about to be cached. 
     43           Returns altered data to cache or None if unchanged. cset usually 
     44           contains cset.date, cset.author, cset.message and cset.rev 
     45        """ 
     46 
     47class CacheManager(Component): 
     48    """Provide interface to plug-in into cache operations""" 
     49 
     50    observers = ExtensionPoint(ICacheChangesetListener) 
     51 
     52    def check_changeset(self, cset): 
     53        for observer in self.observers: 
     54            res = observer.edit_changeset(cset) 
     55            if res != None: 
     56                cset = res 
     57        return cset 
     58 
     59 
    3860class CachedRepository(Repository): 
    3961 
    4062    has_linear_changesets = False 
     
    4668        else: 
    4769            self.getdb = lambda: getdb 
    4870        self.repos = repos 
     71        self.cache_mgr = CacheManager(ComponentManager()) 
    4972 
    5073    def close(self): 
    5174        self.repos.close() 
     
    7497 
    7598    def sync_changeset(self, rev): 
    7699        cset = self.repos.get_changeset(rev) 
     100        cset = self.cache_mgr.check_changeset(cset) 
    77101        db = self.getdb() 
    78102        cursor = db.cursor() 
    79103        cursor.execute("UPDATE revision SET time=%s, author=%s, message=%s " 
     
    178202                    self.log.info("Trying to sync revision [%s]" % 
    179203                                  next_youngest) 
    180204                    cset = self.repos.get_changeset(next_youngest) 
     205                    cset = self.cache_mgr.check_changeset(cset) 
    181206                    try: 
    182207                        cursor.execute("INSERT INTO revision " 
    183208                                       " (rev,time,author,message) "