Mercurial > kallithea
diff rhodecode/controllers/summary.py @ 1607:e886f91fcb71 beta
Cached readme generation
- cleaned up cache system
author | Marcin Kuzminski <marcin@python-works.com> |
---|---|
date | Fri, 28 Oct 2011 02:40:22 +0200 |
parents | df59c0503636 |
children | 8384eaabeb19 |
line wrap: on
line diff
--- a/rhodecode/controllers/summary.py Thu Oct 27 19:05:37 2011 +0200 +++ b/rhodecode/controllers/summary.py Fri Oct 28 02:40:22 2011 +0200 @@ -36,7 +36,9 @@ from pylons import tmpl_context as c, request, url from pylons.i18n.translation import _ -from rhodecode.model.db import Statistics +from beaker.cache import cache_region, region_invalidate + +from rhodecode.model.db import Statistics, CacheInvalidation from rhodecode.lib import ALL_READMES, ALL_EXTS from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator from rhodecode.lib.base import BaseRepoController, render @@ -50,7 +52,7 @@ log = logging.getLogger(__name__) -README_FILES = [''.join([x[0][0], x[1][0]]) for x in +README_FILES = [''.join([x[0][0], x[1][0]]) for x in sorted(list(product(ALL_READMES, ALL_EXTS)), key=lambda y:y[0][1] + y[1][1])] @@ -166,32 +168,43 @@ if c.enable_downloads: c.download_options = self._get_download_links(c.rhodecode_repo) - c.readme_data,c.readme_file = self.__get_readme_data() + c.readme_data, c.readme_file = self.__get_readme_data(c.rhodecode_repo) return render('summary/summary.html') - def __get_readme_data(self): - readme_data = None - readme_file = None - - try: - cs = c.rhodecode_repo.get_changeset('tip') - renderer = MarkupRenderer() - for f in README_FILES: - try: - readme = cs.get_node(f) - readme_file = f - readme_data = renderer.render(readme.content, f) - break - except NodeDoesNotExistError: - continue - except ChangesetError: - pass - except EmptyRepositoryError: - pass - except Exception: - log.error(traceback.format_exc()) + def __get_readme_data(self, repo): - return readme_data, readme_file + @cache_region('long_term') + def _get_readme_from_cache(key): + readme_data = None + readme_file = None + log.debug('Fetching readme file') + try: + cs = repo.get_changeset('tip') + renderer = MarkupRenderer() + for f in README_FILES: + try: + readme = cs.get_node(f) + readme_file = f + readme_data = renderer.render(readme.content, f) + log.debug('Found readme %s' % readme_file) + break + except NodeDoesNotExistError: + continue + except ChangesetError: + pass + except EmptyRepositoryError: + pass + except Exception: + log.error(traceback.format_exc()) + + return readme_data, readme_file + + key = repo.name + '_README' + inv = CacheInvalidation.invalidate(key) + if inv is not None: + region_invalidate(_get_readme_from_cache, None, key) + CacheInvalidation.set_valid(inv.cache_key) + return _get_readme_from_cache(key) def _get_download_links(self, repo):