# HG changeset patch # User Marcin Kuzminski # Date 1274402680 -7200 # Node ID 52bbeb1e813fddb443506bd035752817e1661651 # Parent f9e8920958af73bf341a0a1c10fbdcf759f07010 Added universal cache invalidator for two cached functions. added invalidation when repository was added or deleted, and another invalidation when there was a mercurial command involved. diff -r f9e8920958af -r 52bbeb1e813f pylons_app/controllers/admin.py --- a/pylons_app/controllers/admin.py Fri May 21 02:18:54 2010 +0200 +++ b/pylons_app/controllers/admin.py Fri May 21 02:44:40 2010 +0200 @@ -82,7 +82,7 @@ c.new_repo = new_repo c.msg = 'added repo' #clear our cached list for refresh with new repo - invalidate_cache('repo_list_2') + invalidate_cache('cached_repo_list') except Exception as e: c.new_repo = 'Exception when adding: %s' % new_repo c.msg = str(e) diff -r f9e8920958af -r 52bbeb1e813f pylons_app/lib/simplehg.py --- a/pylons_app/lib/simplehg.py Fri May 21 02:18:54 2010 +0200 +++ b/pylons_app/lib/simplehg.py Fri May 21 02:44:40 2010 +0200 @@ -1,7 +1,7 @@ import os from mercurial.hgweb import hgweb from mercurial.hgweb.request import wsgiapplication -from pylons_app.lib.utils import make_ui +from pylons_app.lib.utils import make_ui, invalidate_cache from pylons.controllers.util import abort from webob.exc import HTTPNotFound class SimpleHg(object): @@ -22,12 +22,17 @@ #since we wrap into hgweb, just reset the path environ['PATH_INFO'] = '/' self.baseui = make_ui() - self.basepath = self.baseui.configitems('paths')[0][1].replace('*', '') + self.basepath = self.baseui.configitems('paths')[0][1]\ + .replace('*', '') self.repo_path = os.path.join(self.basepath, repo_name) try: app = wsgiapplication(self._make_app) except Exception as e: return HTTPNotFound()(environ, start_response) + + """we know that some change was made to repositories and we should + invalidate the cache to see the changes right away""" + invalidate_cache('full_changelog', repo_name) return app(environ, start_response) def _make_app(self): diff -r f9e8920958af -r 52bbeb1e813f pylons_app/lib/utils.py --- a/pylons_app/lib/utils.py Fri May 21 02:18:54 2010 +0200 +++ b/pylons_app/lib/utils.py Fri May 21 02:44:40 2010 +0200 @@ -90,14 +90,25 @@ return baseui -def invalidate_cache(name): +def invalidate_cache(name, *args): from beaker.cache import region_invalidate - if name == 'repo_list_2': - log.info('INVALIDATING CACHE FOR %s', name) - from pylons_app.lib.base import _get_repos - #clear our cached list for refresh with new repo - region_invalidate(_get_repos, None, 'repo_list_2') - + log.info('INVALIDATING CACHE FOR %s', name) + + """propaget our arguments to make sure invalidation works. First + argument has to be the name of cached func name give to cache decorator + without that the invalidation would not work""" + tmp = [name] + tmp.extend(args) + args = tuple(tmp) + + if name == 'cached_repo_list': + from pylons_app.lib.base import _get_repos_cached + region_invalidate(_get_repos_cached, None, *args) + + if name == 'full_changelog': + from pylons_app.controllers.changelog import _full_changelog_cached + region_invalidate(_full_changelog_cached, None, *args) + from vcs.backends.base import BaseChangeset from vcs.utils.lazy import LazyProperty class EmptyChangeset(BaseChangeset):