diff --git a/rhodecode/controllers/summary.py b/rhodecode/controllers/summary.py --- a/rhodecode/controllers/summary.py +++ b/rhodecode/controllers/summary.py @@ -23,23 +23,27 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . +import traceback import calendar import logging from time import mktime -from datetime import datetime, timedelta, date +from datetime import timedelta, date +from itertools import product -from vcs.exceptions import ChangesetError +from vcs.exceptions import ChangesetError, EmptyRepositoryError, \ + NodeDoesNotExistError from pylons import tmpl_context as c, request, url from pylons.i18n.translation import _ -from rhodecode.model.db import Statistics, Repository -from rhodecode.model.repo import RepoModel +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 from rhodecode.lib.utils import EmptyChangeset - +from rhodecode.lib.markup_renderer import MarkupRenderer from rhodecode.lib.celerylib import run_task from rhodecode.lib.celerylib.tasks import get_commits_stats, \ LANGUAGES_EXTENSIONS_MAP @@ -48,6 +52,9 @@ from rhodecode.lib.compat import json, O log = logging.getLogger(__name__) +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])] class SummaryController(BaseRepoController): @@ -161,8 +168,44 @@ class SummaryController(BaseRepoControll 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.rhodecode_repo) return render('summary/summary.html') + def __get_readme_data(self, repo): + + @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): download_l = [] @@ -181,3 +224,4 @@ class SummaryController(BaseRepoControll download_l.append(tags_group) return download_l +