Switch to side-by-side view

--- a/ForgeSVN/forgesvn/svn_main.py
+++ b/ForgeSVN/forgesvn/svn_main.py
@@ -1,124 +1,51 @@
 #-*- python -*-
 import logging
-import sys
-import shutil
-
-sys.path.append('/usr/lib/python2.6/dist-packages')
 
 # Non-stdlib imports
 import pkg_resources
-from pylons import c, g
-from tg import redirect, expose
-from tg.decorators import with_trailing_slash, without_trailing_slash
+from pylons import g
+
+from ming.utils import LazyProperty
+from ming.orm.ormsession import ThreadLocalORMSession
 
 # Pyforge-specific imports
-from allura import model as M
-from allura.app import Application, SitemapEntry, DefaultAdminController
-from allura.lib import helpers as h
-from allura.lib.decorators import audit
-from allura.lib.security import has_artifact_access
+from allura.controllers.repository import RepoRootController
+from allura.lib.repository import RepositoryApp
 
 # Local imports
-from forgesvn import model
-from forgesvn import version
-from .reactors import reactors
+from . import model as SM
+from . import version
 from .controllers import BranchBrowser
 
 log = logging.getLogger(__name__)
 
-class ForgeSVNApp(Application):
+class ForgeSVNApp(RepositoryApp):
     '''This is the SVN app for PyForge'''
     __version__ = version.__version__
-    permissions = [ 'read', 'write', 'create', 'admin', 'configure' ]
     tool_label='SVN'
     default_mount_label='SVN'
     default_mount_point='svn'
     ordinal=4
+    forkable=False
+    default_branch_name=''
 
     def __init__(self, project, config):
-        Application.__init__(self, project, config)
+        super(ForgeSVNApp, self).__init__(project, config)
         self.root = BranchBrowser()
-        self.admin = SVNAdminController(self)
+        default_root = RepoRootController()
+        self.root.refresh = default_root.refresh
 
-    @property
-    @h.exceptionless([], log)
-    def sitemap(self):
-        menu_id = self.config.options.mount_label.title()
-        with h.push_config(c, app=self):
-            return [
-                SitemapEntry(menu_id, '.')[self.sidebar_menu()] ]
-
-    def admin_menu(self):
-        admin_url = c.project.url()+'admin/'+self.config.options.mount_point+'/'
-        links = [SitemapEntry('Viewable Files', admin_url + 'extensions', className='nav_child')]
-        # if self.permissions and has_artifact_access('configure', app=self)():
-        #     links.append(SitemapEntry('Permissions', admin_url + 'permissions', className='nav_child'))
-        return links
-
-    def sidebar_menu(self):
-        links = []
-        if c.app.repo.latest:
-            links.append(SitemapEntry('Browse',c.app.url+"LATEST/tree/", ui_icon='folder-collapsed'))
-            links.append(SitemapEntry('History',c.app.url+"log/", ui_icon='document-b', small=c.app.repo.count()))
-        if has_artifact_access('admin', app=c.app)():
-            links.append(SitemapEntry('Admin', c.project.url()+'admin/'+self.config.options.mount_point, ui_icon='tool-admin'))
-        return links
-
-    @property
+    @LazyProperty
     def repo(self):
-        return model.SVNRepository.query.get(app_config_id=self.config._id)
+        return SM.Repository.query.get(app_config_id=self.config._id)
 
     def install(self, project):
-        'Set up any default permissions and roles here'
-        self.config.options['project_name'] = project.name
+        '''Create repo object for this tool'''
         super(ForgeSVNApp, self).install(project)
-        # Setup permissions
-        role_developer = M.ProjectRole.query.get(name='Developer')._id
-        self.config.acl.update(
-            configure=c.project.acl['tool'],
-            read=c.project.acl['read'],
-            create=[role_developer],
-            write=[role_developer],
-            admin=c.project.acl['tool'])
-        repo = model.SVNRepository(
+        repo = SM.Repository(
             name=self.config.options.mount_point,
-            tool = 'svn',
-            status = 'creating')
-        g.publish('audit', 'scm.svn.init', dict(repo_name=repo.name, repo_path=repo.fs_path))
-
-    def uninstall(self, project):
-        g.publish('audit', 'scm.svn.uninstall', dict(project_id=project._id))
-
-    @audit('scm.svn.uninstall')
-    def _uninstall(self, routing_key, data):
-        "Remove all the tool's artifacts and the physical repository"
-        repo = self.repo
-        if repo is not None:
-            shutil.rmtree(repo.full_fs_path, ignore_errors=True)
-        model.SVNRepository.query.remove(dict(app_config_id=self.config._id))
-        super(ForgeSVNApp, self).uninstall(project_id=data['project_id'])
-
-
-class SVNAdminController(DefaultAdminController):
-
-    def __init__(self, app):
-        self.app = app
-        self.repo = app.repo
-
-    @with_trailing_slash
-    def index(self, **kw):
-        redirect('permissions')
-
-    @without_trailing_slash
-    @expose('jinja:svn/admin_extensions.html')
-    def extensions(self, **kw):
-        return dict(app=self.app,
-                    allow_config=has_artifact_access('configure', app=self.app)(),
-                    additional_viewable_extensions=getattr(self.repo, 'additional_viewable_extensions', ''))
-
-    @without_trailing_slash
-    @expose()
-    def set_extensions(self, **post_data):
-        self.repo.additional_viewable_extensions = post_data['additional_viewable_extensions']
-
-h.mixin_reactors(ForgeSVNApp, reactors)
+            tool='svn',
+            status='initing')
+        ThreadLocalORMSession.flush_all()
+        g.publish('audit', 'repo.init',
+                  dict(repo_name=repo.name, repo_path=repo.fs_path))