changeset 1038:5554aa9c2480 beta

another major code rafactor, reimplemented (almost from scratch) the way caching works, Should be solid rock for now. Some code optymizations on scmModel.get() to make it don't load unneded things. Changed db cache to file that should also reduce memory size
author Marcin Kuzminski <marcin@python-works.com>
date Sun, 13 Feb 2011 00:29:31 +0100
parents b1d6478d4561
children 51b70569c330
files rhodecode/controllers/admin/repos.py rhodecode/controllers/branches.py rhodecode/controllers/changelog.py rhodecode/controllers/changeset.py rhodecode/controllers/feed.py rhodecode/controllers/files.py rhodecode/controllers/shortlog.py rhodecode/controllers/summary.py rhodecode/controllers/tags.py rhodecode/lib/base.py rhodecode/lib/helpers.py rhodecode/model/repo.py rhodecode/model/scm.py rhodecode/templates/admin/repos/repos.html rhodecode/templates/admin/users/user_edit_my_account.html rhodecode/templates/base/base.html rhodecode/templates/index.html rhodecode/templates/summary/summary.html
diffstat 18 files changed, 134 insertions(+), 150 deletions(-) [+]
line wrap: on
line diff
--- a/rhodecode/controllers/admin/repos.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/admin/repos.py	Sun Feb 13 00:29:31 2011 +0100
@@ -147,6 +147,7 @@
 
         except formencode.Invalid, errors:
             c.repo_info = repo_model.get_by_repo_name(repo_name)
+
             if c.repo_info.stats:
                 last_rev = c.repo_info.stats.stat_on_revision
             else:
@@ -281,8 +282,9 @@
     def edit(self, repo_name, format='html'):
         """GET /repos/repo_name/edit: Form to edit an existing item"""
         # url('edit_repo', repo_name=ID)
+        r = ScmModel().get(repo_name)[0]
+
         repo_model = RepoModel()
-        r = ScmModel().get(repo_name)
         c.repo_info = repo_model.get_by_repo_name(repo_name)
 
         if c.repo_info is None:
--- a/rhodecode/controllers/branches.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/branches.py	Sun Feb 13 00:29:31 2011 +0100
@@ -45,8 +45,7 @@
         super(BranchesController, self).__before__()
 
     def index(self):
-        hg_model = ScmModel()
-        c.repo_info = hg_model.get_repo(c.repo_name)
+        c.repo_info, dbrepo = ScmModel().get(c.repo_name, retval='repo')
         c.repo_branches = OrderedDict()
         for name, hash_ in c.repo_info.branches.items():
             c.repo_branches[name] = c.repo_info.get_changeset(hash_)
--- a/rhodecode/controllers/changelog.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/changelog.py	Sun Feb 13 00:29:31 2011 +0100
@@ -67,14 +67,14 @@
         else:
             c.size = int(session.get('changelog_size', default))
 
-        changesets = ScmModel().get_repo(c.repo_name)
+        repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
 
         p = int(request.params.get('page', 1))
-        c.total_cs = len(changesets)
-        c.pagination = Page(changesets, page=p, item_count=c.total_cs,
+        c.total_cs = len(repo)
+        c.pagination = Page(repo, page=p, item_count=c.total_cs,
                             items_per_page=c.size)
 
-        self._graph(changesets, c.size, p)
+        self._graph(repo, c.size, p)
 
         return render('changelog/changelog.html')
 
--- a/rhodecode/controllers/changeset.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/changeset.py	Sun Feb 13 00:29:31 2011 +0100
@@ -55,7 +55,6 @@
         super(ChangesetController, self).__before__()
 
     def index(self, revision):
-        hg_model = ScmModel()
 
         def wrap_to_table(str):
 
@@ -70,7 +69,7 @@
         rev_range = revision.split('...')[:2]
         range_limit = 50
         try:
-            repo = hg_model.get_repo(c.repo_name)
+            repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
             if len(rev_range) == 2:
                 rev_start = rev_range[0]
                 rev_end = rev_range[1]
@@ -163,12 +162,11 @@
 
     def raw_changeset(self, revision):
 
-        hg_model = ScmModel()
         method = request.GET.get('diff', 'show')
         try:
-            r = hg_model.get_repo(c.repo_name)
-            c.scm_type = r.alias
-            c.changeset = r.get_changeset(revision)
+            repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
+            c.scm_type = repo.alias
+            c.changeset = repo.get_changeset(revision)
         except RepositoryError:
             log.error(traceback.format_exc())
             return redirect(url('home'))
--- a/rhodecode/controllers/feed.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/feed.py	Sun Feb 13 00:29:31 2011 +0100
@@ -28,6 +28,7 @@
 import logging
 
 from pylons import url, response
+from pylons.i18n.translation import _
 
 from rhodecode.lib.auth import LoginRequired, HasRepoPermissionAnyDecorator
 from rhodecode.lib.base import BaseController
@@ -45,7 +46,7 @@
     def __before__(self):
         super(FeedController, self).__before__()
         #common values for feeds
-        self.description = 'Changes on %s repository'
+        self.description = _('Changes on %s repository')
         self.title = "%s feed"
         self.language = 'en-us'
         self.ttl = "5"
@@ -59,9 +60,9 @@
                          language=self.language,
                          ttl=self.ttl)
 
-        changesets = ScmModel().get_repo(repo_name)
+        repo, dbrepo = ScmModel().get(repo_name, retval='repo')
 
-        for cs in changesets[:self.feed_nr]:
+        for cs in repo[:self.feed_nr]:
             feed.add_item(title=cs.message,
                           link=url('changeset_home', repo_name=repo_name,
                                    revision=cs.raw_id, qualified=True),
@@ -79,8 +80,8 @@
                          language=self.language,
                          ttl=self.ttl)
 
-        changesets = ScmModel().get_repo(repo_name)
-        for cs in changesets[:self.feed_nr]:
+        repo, dbrepo = ScmModel().get(repo_name, retval='repo')
+        for cs in repo[:self.feed_nr]:
             feed.add_item(title=cs.message,
                           link=url('changeset_home', repo_name=repo_name,
                                    revision=cs.raw_id, qualified=True),
--- a/rhodecode/controllers/files.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/files.py	Sun Feb 13 00:29:31 2011 +0100
@@ -57,8 +57,8 @@
         c.cut_off_limit = self.cut_off_limit
 
     def index(self, repo_name, revision, f_path):
-        hg_model = ScmModel()
-        c.repo = hg_model.get_repo(c.repo_name)
+        c.repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
+
 
         try:
             #reditect to given revision from form
@@ -116,8 +116,7 @@
         return render('files/files.html')
 
     def rawfile(self, repo_name, revision, f_path):
-        hg_model = ScmModel()
-        c.repo = hg_model.get_repo(c.repo_name)
+        c.repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
         file_node = c.repo.get_changeset(revision).get_node(f_path)
         response.content_type = file_node.mimetype
         response.content_disposition = 'attachment; filename=%s' \
@@ -125,16 +124,14 @@
         return file_node.content
 
     def raw(self, repo_name, revision, f_path):
-        hg_model = ScmModel()
-        c.repo = hg_model.get_repo(c.repo_name)
+        c.repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
         file_node = c.repo.get_changeset(revision).get_node(f_path)
         response.content_type = 'text/plain'
 
         return file_node.content
 
     def annotate(self, repo_name, revision, f_path):
-        hg_model = ScmModel()
-        c.repo = hg_model.get_repo(c.repo_name)
+        c.repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
 
         try:
             c.cs = c.repo.get_changeset(revision)
@@ -163,9 +160,9 @@
                 ext = ext_data[1]
 
         try:
-            repo = ScmModel().get_repo(repo_name)
+            repo, dbrepo = ScmModel().get(repo_name)
 
-            if repo.dbrepo.enable_downloads is False:
+            if dbrepo.enable_downloads is False:
                 return _('downloads disabled')
 
             cs = repo.get_changeset(revision)
@@ -185,13 +182,12 @@
 
 
     def diff(self, repo_name, f_path):
-        hg_model = ScmModel()
         diff1 = request.GET.get('diff1')
         diff2 = request.GET.get('diff2')
         c.action = request.GET.get('diff')
         c.no_changes = diff1 == diff2
         c.f_path = f_path
-        c.repo = hg_model.get_repo(c.repo_name)
+        c.repo, dbrepo = ScmModel().get(c.repo_name, retval='repo')
 
         try:
             if diff1 not in ['', None, 'None', '0' * 12, '0' * 40]:
--- a/rhodecode/controllers/shortlog.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/shortlog.py	Sun Feb 13 00:29:31 2011 +0100
@@ -47,7 +47,7 @@
 
     def index(self):
         p = int(request.params.get('page', 1))
-        repo = ScmModel().get_repo(c.repo_name)
+        repo, dbrepo = ScmModel().get(c.repo_name, 'repo')
         c.repo_changesets = Page(repo, page=p, items_per_page=20)
         c.shortlog_data = render('shortlog/shortlog_data.html')
         if request.params.get('partial'):
--- a/rhodecode/controllers/summary.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/summary.py	Sun Feb 13 00:29:31 2011 +0100
@@ -64,13 +64,14 @@
 
     def index(self):
         scm_model = ScmModel()
-        c.repo_info = scm_model.get_repo(c.repo_name)
+        c.repo, dbrepo = scm_model.get(c.repo_name)
+        c.dbrepo = dbrepo
         c.following = scm_model.is_following_repo(c.repo_name,
                                              c.rhodecode_user.user_id)
         def url_generator(**kw):
             return url('shortlog_home', repo_name=c.repo_name, **kw)
 
-        c.repo_changesets = Page(c.repo_info, page=1, items_per_page=10,
+        c.repo_changesets = Page(c.repo, page=1, items_per_page=10,
                                  url=url_generator)
 
         e = request.environ
@@ -92,16 +93,16 @@
                                         'repo_name':c.repo_name, }
         c.clone_repo_url = uri
         c.repo_tags = OrderedDict()
-        for name, hash in c.repo_info.tags.items()[:10]:
+        for name, hash in c.repo.tags.items()[:10]:
             try:
-                c.repo_tags[name] = c.repo_info.get_changeset(hash)
+                c.repo_tags[name] = c.repo.get_changeset(hash)
             except ChangesetError:
                 c.repo_tags[name] = EmptyChangeset(hash)
 
         c.repo_branches = OrderedDict()
-        for name, hash in c.repo_info.branches.items()[:10]:
+        for name, hash in c.repo.branches.items()[:10]:
             try:
-                c.repo_branches[name] = c.repo_info.get_changeset(hash)
+                c.repo_branches[name] = c.repo.get_changeset(hash)
             except ChangesetError:
                 c.repo_branches[name] = EmptyChangeset(hash)
 
@@ -113,21 +114,21 @@
         ts_min_y = mktime(td_1y.timetuple())
         ts_max_y = mktime(td.timetuple())
 
-        if c.repo_info.dbrepo.enable_statistics:
+        if dbrepo.enable_statistics:
             c.no_data_msg = _('No data loaded yet')
-            run_task(get_commits_stats, c.repo_info.name, ts_min_y, ts_max_y)
+            run_task(get_commits_stats, c.repo.name, ts_min_y, ts_max_y)
         else:
             c.no_data_msg = _('Statistics update are disabled for this repository')
         c.ts_min = ts_min_m
         c.ts_max = ts_max_y
 
         stats = self.sa.query(Statistics)\
-            .filter(Statistics.repository == c.repo_info.dbrepo)\
+            .filter(Statistics.repository == dbrepo)\
             .scalar()
 
 
         if stats and stats.languages:
-            c.no_data = False is c.repo_info.dbrepo.enable_statistics
+            c.no_data = False is dbrepo.enable_statistics
             lang_stats = json.loads(stats.languages)
             c.commit_data = stats.commit_activity
             c.overview_data = stats.commit_activity_combined
@@ -142,9 +143,9 @@
             c.trending_languages = json.dumps({})
             c.no_data = True
 
-        c.enable_downloads = c.repo_info.dbrepo.enable_downloads
+        c.enable_downloads = dbrepo.enable_downloads
         if c.enable_downloads:
-            c.download_options = self._get_download_links(c.repo_info)
+            c.download_options = self._get_download_links(c.repo)
 
         return render('summary/summary.html')
 
--- a/rhodecode/controllers/tags.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/controllers/tags.py	Sun Feb 13 00:29:31 2011 +0100
@@ -44,8 +44,7 @@
         super(TagsController, self).__before__()
 
     def index(self):
-        hg_model = ScmModel()
-        c.repo_info = hg_model.get_repo(c.repo_name)
+        c.repo_info, dbrepo = ScmModel().get(c.repo_name, retval='repo')
         c.repo_tags = OrderedDict()
         for name, hash_ in c.repo_info.tags.items():
             c.repo_tags[name] = c.repo_info.get_changeset(hash_)
--- a/rhodecode/lib/base.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/lib/base.py	Sun Feb 13 00:29:31 2011 +0100
@@ -28,12 +28,12 @@
         #c.unread_journal = scm_model.get_unread_journal()
 
         if c.repo_name:
-            cached_repo = scm_model.get(c.repo_name)
-            if cached_repo:
-                c.repository_tags = cached_repo.tags
-                c.repository_branches = cached_repo.branches
-                c.repository_followers = scm_model.get_followers(cached_repo.dbrepo.repo_id)
-                c.repository_forks = scm_model.get_forks(cached_repo.dbrepo.repo_id)
+            repo, dbrepo = scm_model.get(c.repo_name)
+            if repo:
+                c.repository_tags = repo.tags
+                c.repository_branches = repo.branches
+                c.repository_followers = scm_model.get_followers(dbrepo.repo_id)
+                c.repository_forks = scm_model.get_forks(dbrepo.repo_id)
             else:
                 c.repository_tags = {}
                 c.repository_branches = {}
--- a/rhodecode/lib/helpers.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/lib/helpers.py	Sun Feb 13 00:29:31 2011 +0100
@@ -483,12 +483,12 @@
     def get_fork_name():
         from rhodecode.model.scm import ScmModel
         repo_name = action_params
-        repo = ScmModel().get(repo_name)
+        repo, dbrepo = ScmModel().get(repo_name)
         if repo is None:
             return repo_name
         return link_to(action_params, url('summary_home',
                                           repo_name=repo.name,),
-                                          title=repo.dbrepo.description)
+                                          title=dbrepo.description)
 
     map = {'user_deleted_repo':(_('User [deleted] repository'), None),
            'user_created_repo':(_('User [created] repository'), None),
--- a/rhodecode/model/repo.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/model/repo.py	Sun Feb 13 00:29:31 2011 +0100
@@ -87,7 +87,7 @@
         if cache:
             repo = repo.options(FromCache("sql_cache_long",
                                           "get_repo_full_%s" % repo_name))
-        if invalidate:
+        if invalidate and cache:
             repo.invalidate()
 
         return repo.scalar()
--- a/rhodecode/model/scm.py	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/model/scm.py	Sun Feb 13 00:29:31 2011 +0100
@@ -31,8 +31,6 @@
 
 from mercurial import ui
 
-from sqlalchemy.orm import joinedload
-from sqlalchemy.orm.session import make_transient
 from sqlalchemy.exc import DatabaseError
 
 from beaker.cache import cache_region, region_invalidate
@@ -45,9 +43,11 @@
 from rhodecode import BACKENDS
 from rhodecode.lib import helpers as h
 from rhodecode.lib.auth import HasRepoPermissionAny
-from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, action_logger
+from rhodecode.lib.utils import get_repos as get_filesystem_repos, make_ui, \
+    action_logger
 from rhodecode.model import BaseModel
 from rhodecode.model.user import UserModel
+from rhodecode.model.repo import RepoModel
 from rhodecode.model.db import Repository, RhodeCodeUi, CacheInvalidation, \
     UserFollowing, UserLog
 from rhodecode.model.caching_query import FromCache
@@ -82,18 +82,19 @@
 
         return q.ui_value
 
-    def repo_scan(self, repos_path, baseui):
+    def repo_scan(self, repos_path=None):
         """Listing of repositories in given path. This path should not be a 
         repository itself. Return a dictionary of repository objects
         
         :param repos_path: path to directory containing repositories
-        :param baseui: baseui instance to instantiate MercurialRepostitory with
         """
 
         log.info('scanning for repositories in %s', repos_path)
 
-        if not isinstance(baseui, ui.ui):
-            baseui = make_ui('db')
+        if repos_path is None:
+            repos_path = self.repos_path
+
+        baseui = make_ui('db')
         repos_list = {}
 
         for name, path in get_filesystem_repos(repos_path, recursive=True):
@@ -134,7 +135,7 @@
 
         for r in all_repos:
 
-            repo = self.get(r.repo_name, invalidation_list)
+            repo, dbrepo = self.get(r.repo_name, invalidation_list)
 
             if repo is not None:
                 last_change = repo.last_change
@@ -143,33 +144,34 @@
                 tmp_d = {}
                 tmp_d['name'] = r.repo_name
                 tmp_d['name_sort'] = tmp_d['name'].lower()
-                tmp_d['description'] = repo.dbrepo.description
+                tmp_d['description'] = dbrepo.description
                 tmp_d['description_sort'] = tmp_d['description']
                 tmp_d['last_change'] = last_change
                 tmp_d['last_change_sort'] = time.mktime(last_change.timetuple())
                 tmp_d['tip'] = tip.raw_id
                 tmp_d['tip_sort'] = tip.revision
                 tmp_d['rev'] = tip.revision
-                tmp_d['contact'] = repo.dbrepo.user.full_contact
+                tmp_d['contact'] = dbrepo.user.full_contact
                 tmp_d['contact_sort'] = tmp_d['contact']
                 tmp_d['owner_sort'] = tmp_d['contact']
                 tmp_d['repo_archives'] = list(repo._get_archives())
                 tmp_d['last_msg'] = tip.message
                 tmp_d['repo'] = repo
+                tmp_d['dbrepo'] = dbrepo
                 yield tmp_d
 
-    def get_repo(self, repo_name):
-        return self.get(repo_name)
-
-    def get(self, repo_name, invalidation_list=None):
-        """Get's repository from given name, creates BackendInstance and
+    def get(self, repo_name, invalidation_list=None, retval='all'):
+        """Returns a tuple of Repository,DbRepository,
+        Get's repository from given name, creates BackendInstance and
         propagates it's data from database with all additional information
         
         :param repo_name:
         :param invalidation_list: if a invalidation list is given the get
             method should not manually check if this repository needs 
             invalidation and just invalidate the repositories in list
-            
+        :param retval: string specifing what to return one of 'repo','dbrepo',
+            'all'if repo or dbrepo is given it'll just lazy load chosen type
+            and return None as the second
         """
         if not HasRepoPermissionAny('repository.read', 'repository.write',
                             'repository.admin')(repo_name, 'get repo check'):
@@ -189,58 +191,45 @@
                 backend = get_backend(alias)
             except VCSError:
                 log.error(traceback.format_exc())
-                log.error('Perhaps this repository is in db and not in filesystem'
-                          'run rescan repositories with "destroy old data "'
-                          'option from admin panel')
+                log.error('Perhaps this repository is in db and not in '
+                          'filesystem run rescan repositories with '
+                          '"destroy old data " option from admin panel')
                 return
 
             if alias == 'hg':
-                from pylons import app_globals as g
-                repo = backend(repo_path, create=False, baseui=g.baseui)
+                repo = backend(repo_path, create=False, baseui=make_ui('db'))
                 #skip hidden web repository
                 if repo._get_hidden():
                     return
             else:
                 repo = backend(repo_path, create=False)
 
-            dbrepo = self.sa.query(Repository)\
-                .options(joinedload(Repository.fork))\
-                .options(joinedload(Repository.user))\
-                .filter(Repository.repo_name == repo_name)\
-                .scalar()
-
-            self.sa.expunge_all()
-            log.debug('making transient %s', dbrepo)
-            make_transient(dbrepo)
-
-            for attr in ['user', 'forks', 'followers', 'group', 'repo_to_perm',
-                         'users_group_to_perm', 'stats', 'logs']:
-                attr = getattr(dbrepo, attr, False)
-                if attr:
-                    if isinstance(attr, list):
-                        for a in attr:
-                            log.debug('making transient %s', a)
-                            make_transient(a)
-                    else:
-                        log.debug('making transient %s', attr)
-                        make_transient(attr)
-
-            repo.dbrepo = dbrepo
             return repo
 
         pre_invalidate = True
+        dbinvalidate = False
+
         if invalidation_list is not None:
             pre_invalidate = repo_name in invalidation_list
 
         if pre_invalidate:
+            #this returns object to invalidate
             invalidate = self._should_invalidate(repo_name)
-
             if invalidate:
                 log.info('invalidating cache for repository %s', repo_name)
-                region_invalidate(_get_repo, None, repo_name)
+                #region_invalidate(_get_repo, None, repo_name)
                 self._mark_invalidated(invalidate)
+                dbinvalidate = True
 
-        return _get_repo(repo_name)
+        r, dbr = None, None
+        if retval == 'repo' or 'all':
+            r = _get_repo(repo_name)
+        if retval == 'dbrepo' or 'all':
+            dbr = RepoModel(self.sa).get_full(repo_name, cache=True,
+                                          invalidate=dbinvalidate)
+
+
+        return r, dbr
 
 
 
@@ -370,8 +359,6 @@
         """
 
         ret = self.sa.query(CacheInvalidation)\
-            .options(FromCache('sql_cache_short',
-                           'get_invalidation_%s' % repo_name))\
             .filter(CacheInvalidation.cache_key == repo_name)\
             .filter(CacheInvalidation.cache_active == False)\
             .scalar()
@@ -379,7 +366,8 @@
         return ret
 
     def _mark_invalidated(self, cache_key):
-        """ Marks all occurences of cache to invaldation as already invalidated
+        """ Marks all occurrences of cache to invalidation as already 
+        invalidated
         
         :param cache_key:
         """
--- a/rhodecode/templates/admin/repos/repos.html	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/templates/admin/repos/repos.html	Sun Feb 13 00:29:31 2011 +0100
@@ -38,26 +38,26 @@
             <tr class="parity${cnt%2}">
                  <td>
                  ## TYPE OF REPO
-                 %if repo['repo'].dbrepo.repo_type =='hg':
+                 %if repo['dbrepo'].repo_type =='hg':
                    <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
-                 %elif repo['repo'].dbrepo.repo_type =='git':
+                 %elif repo['dbrepo'].repo_type =='git':
                    <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
                  %else:
                    
                  %endif
                  
                  ## PRIVATE/PUBLIC REPO                  
-                 %if repo['repo'].dbrepo.private:
+                 %if repo['dbrepo'].private:
                     <img alt="${_('private')}" src="/images/icons/lock.png"/>
                  %else:
                     <img alt="${_('public')}" src="/images/icons/lock_open.png"/>
                  %endif         
                 ${h.link_to(repo['name'],h.url('edit_repo',repo_name=repo['name']))}
                 
-	            %if repo['repo'].dbrepo.fork:
-	            	<a href="${h.url('summary_home',repo_name=repo['repo'].dbrepo.fork.repo_name)}">
+	            %if repo['dbrepo'].fork:
+	            	<a href="${h.url('summary_home',repo_name=repo['dbrepo'].fork.repo_name)}">
 	            	<img class="icon" alt="${_('public')}"
-	            	title="${_('Fork of')} ${repo['repo'].dbrepo.fork.repo_name}" 
+	            	title="${_('Fork of')} ${repo['dbrepo'].fork.repo_name}" 
 	            	src="/images/icons/arrow_divide.png"/></a>
 	            %endif                
                 </td>
--- a/rhodecode/templates/admin/users/user_edit_my_account.html	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/templates/admin/users/user_edit_my_account.html	Sun Feb 13 00:29:31 2011 +0100
@@ -119,24 +119,24 @@
 		     %for repo in c.user_repos:
 		        <tr>
 		            <td>
-                     %if repo['repo'].dbrepo.repo_type =='hg':
+                     %if repo['dbrepo'].repo_type =='hg':
                        <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
-                     %elif repo['repo'].dbrepo.repo_type =='git':
+                     %elif repo['dbrepo'].repo_type =='git':
                        <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
                      %else:
                        
                      %endif 		            
-		             %if repo['repo'].dbrepo.private:
+		             %if repo['dbrepo'].private:
 		                <img class="icon" alt="${_('private')}" src="/images/icons/lock.png"/>
 		             %else:
 		                <img class="icon" alt="${_('public')}" src="/images/icons/lock_open.png"/>
 		             %endif
 		                                             
 		            ${h.link_to(repo['repo'].name, h.url('summary_home',repo_name=repo['repo'].name),class_="repo_name")}
-		            %if repo['repo'].dbrepo.fork:
-		            	<a href="${h.url('summary_home',repo_name=repo['repo'].dbrepo.fork.repo_name)}">
+		            %if repo['dbrepo'].fork:
+		            	<a href="${h.url('summary_home',repo_name=repo['dbrepo'].fork.repo_name)}">
 		            	<img class="icon" alt="${_('public')}"
-		            	title="${_('Fork of')} ${repo['repo'].dbrepo.fork.repo_name}" 
+		            	title="${_('Fork of')} ${repo['dbrepo'].fork.repo_name}" 
 		            	src="/images/icons/arrow_divide.png"/></a>
 		            %endif		            
 		            </td> 
--- a/rhodecode/templates/base/base.html	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/templates/base/base.html	Sun Feb 13 00:29:31 2011 +0100
@@ -142,10 +142,10 @@
 					<ul class="repo_switcher">
                         %for repo in c.cached_repo_list:
                         
-                          %if repo['repo'].dbrepo.private:
-                             <li><img src="/images/icons/lock.png" alt="${_('Private repository')}" class="repo_switcher_type"/>${h.link_to(repo['repo'].name,h.url('summary_home',repo_name=repo['repo'].name),class_="%s" % repo['repo'].dbrepo.repo_type)}</li>
+                          %if repo['dbrepo'].private:
+                             <li><img src="/images/icons/lock.png" alt="${_('Private repository')}" class="repo_switcher_type"/>${h.link_to(repo['repo'].name,h.url('summary_home',repo_name=repo['repo'].name),class_="%s" % repo['dbrepo'].repo_type)}</li>
                           %else:
-                             <li><img src="/images/icons/lock_open.png" alt="${_('Public repository')}" class="repo_switcher_type" />${h.link_to(repo['repo'].name,h.url('summary_home',repo_name=repo['repo'].name),class_="%s" % repo['repo'].dbrepo.repo_type)}</li>
+                             <li><img src="/images/icons/lock_open.png" alt="${_('Public repository')}" class="repo_switcher_type" />${h.link_to(repo['repo'].name,h.url('summary_home',repo_name=repo['repo'].name),class_="%s" % repo['dbrepo'].repo_type)}</li>
                           %endif  
                         %endfor					
 					</ul>			
--- a/rhodecode/templates/index.html	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/templates/index.html	Sun Feb 13 00:29:31 2011 +0100
@@ -60,16 +60,16 @@
 		            <td>
 		            <div style="white-space: nowrap">
 		             ## TYPE OF REPO
-		             %if repo['repo'].dbrepo.repo_type =='hg':
+		             %if repo['dbrepo'].repo_type =='hg':
 		               <img class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
-		             %elif repo['repo'].dbrepo.repo_type =='git':
+		             %elif repo['dbrepo'].repo_type =='git':
 		               <img class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
 		             %else:
 		               
 		             %endif 
 		            
 		             ##PRIVATE/PUBLIC
-		             %if repo['repo'].dbrepo.private:
+		             %if repo['dbrepo'].private:
 		                <img class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="/images/icons/lock.png"/>
 		             %else:
 		                <img class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="/images/icons/lock_open.png"/>
@@ -78,10 +78,10 @@
 		            ##NAME   
 		            ${h.link_to(repo['name'],
 		                h.url('summary_home',repo_name=repo['name']),class_="repo_name")}
-		            %if repo['repo'].dbrepo.fork:
-		            	<a href="${h.url('summary_home',repo_name=repo['repo'].dbrepo.fork.repo_name)}">
+		            %if repo['dbrepo'].fork:
+		            	<a href="${h.url('summary_home',repo_name=repo['dbrepo'].fork.repo_name)}">
 		            	<img class="icon" alt="${_('fork')}"
-		            	title="${_('Fork of')} ${repo['repo'].dbrepo.fork.repo_name}" 
+		            	title="${_('Fork of')} ${repo['dbrepo'].fork.repo_name}" 
 		            	src="/images/icons/arrow_divide.png"/></a>
 		            %endif
 		            </div>
--- a/rhodecode/templates/summary/summary.html	Sat Feb 12 21:22:30 2011 +0100
+++ b/rhodecode/templates/summary/summary.html	Sun Feb 13 00:29:31 2011 +0100
@@ -31,38 +31,38 @@
 			      <label>${_('Name')}:</label>
 			  </div>
 			  <div class="input-short">
-		         %if c.repo_info.dbrepo.repo_type =='hg':
+		         %if c.dbrepo.repo_type =='hg':
 		           <img style="margin-bottom:2px" class="icon" title="${_('Mercurial repository')}" alt="${_('Mercurial repository')}" src="/images/icons/hgicon.png"/>
 		         %endif
-		         %if c.repo_info.dbrepo.repo_type =='git':
+		         %if c.dbrepo.repo_type =='git':
 		           <img style="margin-bottom:2px" class="icon" title="${_('Git repository')}" alt="${_('Git repository')}" src="/images/icons/giticon.png"/>
 		         %endif 
                                  			  
-	             %if c.repo_info.dbrepo.private:
+	             %if c.dbrepo.private:
 	                <img style="margin-bottom:2px" class="icon" title="${_('private repository')}" alt="${_('private repository')}" src="/images/icons/lock.png"/>
 	             %else:
 	                <img style="margin-bottom:2px" class="icon" title="${_('public repository')}" alt="${_('public repository')}" src="/images/icons/lock_open.png"/>
 	             %endif
-			      <span style="font-size: 1.6em;font-weight: bold;vertical-align: baseline;">${c.repo_info.name}</span>
+			      <span style="font-size: 1.6em;font-weight: bold;vertical-align: baseline;">${c.repo.name}</span>
 			      %if c.rhodecode_user.username != 'default':
 				      %if c.following:
 	                  <span id="follow_toggle" class="following" title="${_('Stop following this repository')}"
-	                        onclick="javascript:toggleFollowingRepo(this,${c.repo_info.dbrepo.repo_id},'${str(h.get_token())}')">
+	                        onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
 	                  </span>			      
 				      %else:
 				      <span id="follow_toggle" class="follow" title="${_('Start following this repository')}"
-				            onclick="javascript:toggleFollowingRepo(this,${c.repo_info.dbrepo.repo_id},'${str(h.get_token())}')">
+				            onclick="javascript:toggleFollowingRepo(this,${c.dbrepo.repo_id},'${str(h.get_token())}')">
 				      </span>
 				      %endif
 				  %endif:
 			      <br/>
-		            %if c.repo_info.dbrepo.fork:
+		            %if c.dbrepo.fork:
 		            	<span style="margin-top:5px">
-		            	<a href="${h.url('summary_home',repo_name=c.repo_info.dbrepo.fork.repo_name)}">
+		            	<a href="${h.url('summary_home',repo_name=c.dbrepo.fork.repo_name)}">
 		            	<img class="icon" alt="${_('public')}"
-		            	title="${_('Fork of')} ${c.repo_info.dbrepo.fork.repo_name}" 
+		            	title="${_('Fork of')} ${c.dbrepo.fork.repo_name}" 
 		            	src="/images/icons/arrow_divide.png"/>
-		            	${_('Fork of')} ${c.repo_info.dbrepo.fork.repo_name}
+		            	${_('Fork of')} ${c.dbrepo.fork.repo_name}
 		            	</a>
 		            	</span>
 		            %endif			      
@@ -75,7 +75,7 @@
 			      <label>${_('Description')}:</label>
 			  </div>
 			  <div class="input-short">
-			      ${c.repo_info.dbrepo.description}
+			      ${c.dbrepo.description}
 			  </div>
 			 </div>
 			
@@ -86,11 +86,11 @@
 			  </div>
 			  <div class="input-short">
 			  	<div class="gravatar">
-			  		<img alt="gravatar" src="${h.gravatar_url(c.repo_info.dbrepo.user.email)}"/>
+			  		<img alt="gravatar" src="${h.gravatar_url(c.dbrepo.user.email)}"/>
 			  	</div>
-			  		${_('Username')}: ${c.repo_info.dbrepo.user.username}<br/>
-			  		${_('Name')}: ${c.repo_info.dbrepo.user.name} ${c.repo_info.dbrepo.user.lastname}<br/>
-			  		${_('Email')}: <a href="mailto:${c.repo_info.dbrepo.user.email}">${c.repo_info.dbrepo.user.email}</a>
+			  		${_('Username')}: ${c.dbrepo.user.username}<br/>
+			  		${_('Name')}: ${c.dbrepo.user.name} ${c.dbrepo.user.lastname}<br/>
+			  		${_('Email')}: <a href="mailto:${c.dbrepo.user.email}">${c.dbrepo.user.email}</a>
 			  </div>
 			 </div>
 			
@@ -99,8 +99,8 @@
 			      <label>${_('Last change')}:</label>
 			  </div>
 			  <div class="input-short">
-			      ${h.age(c.repo_info.last_change)} - ${c.repo_info.last_change} 
-			      ${_('by')} ${h.get_changeset_safe(c.repo_info,'tip').author} 
+			      ${h.age(c.repo.last_change)} - ${c.repo.last_change} 
+			      ${_('by')} ${h.get_changeset_safe(c.repo,'tip').author} 
 			      
 			  </div>
 			 </div>
@@ -128,7 +128,7 @@
 			      <label>${_('Download')}:</label>
 			  </div>
 			  <div class="input-short">
-		        %if len(c.repo_info.revisions) == 0:
+		        %if len(c.repo.revisions) == 0:
 		          ${_('There are no downloads yet')}
 		        %elif c.enable_downloads is False:
 		          ${_('Downloads are disabled for this repository')}
@@ -136,14 +136,14 @@
                         [${h.link_to(_('enable'),h.url('edit_repo',repo_name=c.repo_name))}]
                     %endif  		          
 		        %else:
-			        ${h.select('download_options',c.repo_info.get_changeset().raw_id,c.download_options)}
-			        %for cnt,archive in enumerate(c.repo_info._get_archives()):
+			        ${h.select('download_options',c.repo.get_changeset().raw_id,c.download_options)}
+			        %for cnt,archive in enumerate(c.repo._get_archives()):
 			             %if cnt >=1:
 			             |
 			             %endif
 			             <span class="tooltip" title="${_('Download %s as %s') %('tip',archive['type'])}" 
 			                  id="${archive['type']+'_link'}">${h.link_to(archive['type'],
-			                h.url('files_archive_home',repo_name=c.repo_info.name,
+			                h.url('files_archive_home',repo_name=c.repo.name,
 			                fname='tip'+archive['extension']),class_="archive_icon")}</span>
 			        %endfor
 			    %endif
@@ -155,8 +155,8 @@
 			      <label>${_('Feeds')}:</label>
 			  </div>
 			  <div class="input-short">
-	            ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.repo_info.name),class_='rss_icon')}
-	            ${h.link_to(_('Atom'),h.url('atom_feed_home',repo_name=c.repo_info.name),class_='atom_icon')}
+	            ${h.link_to(_('RSS'),h.url('rss_feed_home',repo_name=c.repo.name),class_='rss_icon')}
+	            ${h.link_to(_('Atom'),h.url('atom_feed_home',repo_name=c.repo.name),class_='atom_icon')}
 			  </div>
 			 </div>				 			 			 
 	  </div>		 
@@ -250,9 +250,9 @@
              YUE.on('download_options','change',function(e){
                  var new_cs = e.target.options[e.target.selectedIndex];
                  var tmpl_links = {}
-                 %for cnt,archive in enumerate(c.repo_info._get_archives()):
+                 %for cnt,archive in enumerate(c.repo._get_archives()):
                 	 tmpl_links['${archive['type']}'] = '${h.link_to(archive['type'],
-                        h.url('files_archive_home',repo_name=c.repo_info.name,
+                        h.url('files_archive_home',repo_name=c.repo.name,
                         fname='__CS__'+archive['extension']),class_="archive_icon")}';
                  %endfor