summary: Move logic to find a readme out

Created ReadmeFinder inside of model.repo. The ReadmeFinder will be evolved, so
that it uses a smarter algorithm to actually find the readme file.
This commit is contained in:
Johannes Bornhold 2016-09-07 10:31:20 +02:00
parent 76193ccd7d
commit b28e45e565
2 changed files with 43 additions and 13 deletions

View file

@ -44,6 +44,8 @@ from rhodecode.lib.vcs.backends.base import EmptyCommit
from rhodecode.lib.vcs.exceptions import (
CommitError, EmptyRepositoryError, NodeDoesNotExistError)
from rhodecode.model.db import Statistics, CacheKey, User
from rhodecode.model.repo import ReadmeFinder
log = logging.getLogger(__name__)
@ -63,26 +65,21 @@ class SummaryController(BaseRepoController):
readme_data = None
readme_file = None
try:
# gets the landing revision or tip if fails
# Find the landing commit
commit = db_repo.get_landing_commit()
if isinstance(commit, EmptyCommit):
raise EmptyRepositoryError()
renderer = MarkupRenderer()
for f in renderer.pick_readme_order(default_renderer):
try:
node = commit.get_node(f)
except NodeDoesNotExistError:
continue
if not node.is_file():
continue
readme_file = ReadmeFinder(default_renderer).search(commit)
readme_file = f
# Render the readme if one was found
if readme_file:
renderer = MarkupRenderer()
node = commit.get_node(readme_file)
log.debug('Found README file `%s` rendering...',
readme_file)
readme_data = renderer.render(node.content,
filename=f)
break
readme_data = renderer.render(
node.content, filename=readme_file)
except CommitError:
log.exception(
"Problem getting commit when trying to render the README.")

View file

@ -40,11 +40,13 @@ from rhodecode.lib.auth import HasUserGroupPermissionAny
from rhodecode.lib.caching_query import FromCache
from rhodecode.lib.exceptions import AttachedForksError
from rhodecode.lib.hooks_base import log_delete_repository
from rhodecode.lib.markup_renderer import MarkupRenderer
from rhodecode.lib.utils import make_db_config
from rhodecode.lib.utils2 import (
safe_str, safe_unicode, remove_prefix, obfuscate_url_pw,
get_current_rhodecode_user, safe_int, datetime_to_time, action_logger_generic)
from rhodecode.lib.vcs.backends import get_backend
from rhodecode.lib.vcs.exceptions import NodeDoesNotExistError
from rhodecode.model import BaseModel
from rhodecode.model.db import (
Repository, UserRepoToPerm, UserGroupRepoToPerm, UserRepoGroupToPerm,
@ -933,3 +935,34 @@ class RepoModel(BaseModel):
if os.path.isdir(rm_path):
shutil.move(rm_path, os.path.join(self.repos_path, _d))
class ReadmeFinder:
"""
Utility which knows how to find a readme for a specific commit.
The main idea is that this is a configurable algorithm. When creating an
instance you can define parameters, currently only the `default_renderer`.
Based on this configuration the method :meth:`search` behaves slightly
different.
"""
def __init__(self, default_renderer):
self._default_renderer = default_renderer
def search(self, commit):
"""
Try to find a readme in the given `commit`.
"""
renderer = MarkupRenderer()
for f in renderer.pick_readme_order(self._default_renderer):
log.debug("Trying README %s", f)
try:
node = commit.get_node(f)
except NodeDoesNotExistError:
continue
if not node.is_file():
continue
return f