Author: jure
Date: Wed Mar 20 09:00:25 2013
New Revision: 1458692

URL: http://svn.apache.org/r1458692
Log:
Productize repositories, monkey patch 
trac.versioncontrol.api.DbRepositoryProvider and 
trac.versioncontrol.api.RepositoryManager, towards #470


Added:
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/versioncontrol.py
Modified:
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
    
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py

Modified: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py?rev=1458692&r1=1458691&r2=1458692&view=diff
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
 (original)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/hooks.py
 Wed Mar 20 09:00:25 2013
@@ -15,9 +15,11 @@
 #  specific language governing permissions and limitations
 #  under the License.
 
-# these two imports monkey patch required classes
+# these import monkey patch classes required to enable
+# multi product support
 import multiproduct.env
 import multiproduct.dbcursor
+import multiproduct.versioncontrol
 
 import re
 

Modified: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py?rev=1458692&r1=1458691&r2=1458692&view=diff
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py
 (original)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/util.py
 Wed Mar 20 09:00:25 2013
@@ -22,6 +22,38 @@ from genshi.builder import tag
 
 from trac.util.text import unquote_label
 from trac.wiki.formatter import LinkFormatter
+from trac.core import Component, ComponentMeta
+
+#----------------------------
+# Component replacement base
+#----------------------------
+
+class ReplacementComponentMeta(ComponentMeta):
+    """Component replacement meta class"""
+    def __new__(mcs, name, bases, d):
+        base_class = bases[0]
+        if base_class != Component:
+            # undo what has been done by ComponentMeta.__new___ for the
+            # replacement component base class
+
+            # remove implemented interfaces from registry for the base class
+            for itf in base_class._implements:
+                ComponentMeta._registry[itf] = filter(lambda c: c != 
base_class,
+                                                      
ComponentMeta._registry[itf])
+
+            # remove base class from components list
+            ComponentMeta._components = filter(lambda c: c != base_class,
+                                               ComponentMeta._components)
+
+            base_class._implements = []
+            base_class.abstract = True
+
+        return ComponentMeta.__new__(mcs, name, bases, d)
+
+class ReplacementComponent(Component):
+    """Base class for components that replace existing trac
+    implementations"""
+    __metaclass__ = ReplacementComponentMeta
 
 #--------------------------
 # Custom wiki formatters

Added: 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/versioncontrol.py
URL: 
http://svn.apache.org/viewvc/incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/versioncontrol.py?rev=1458692&view=auto
==============================================================================
--- 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/versioncontrol.py
 (added)
+++ 
incubator/bloodhound/branches/bep_0003_multiproduct/bloodhound_multiproduct/multiproduct/versioncontrol.py
 Wed Mar 20 09:00:25 2013
@@ -0,0 +1,80 @@
+#  Licensed to the Apache Software Foundation (ASF) under one
+#  or more contributor license agreements.  See the NOTICE file
+#  distributed with this work for additional information
+#  regarding copyright ownership.  The ASF licenses this file
+#  to you under the Apache License, Version 2.0 (the
+#  "License"); you may not use this file except in compliance
+#  with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+#  Unless required by applicable law or agreed to in writing,
+#  software distributed under the License is distributed on an
+#  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+#  KIND, either express or implied.  See the License for the
+#  specific language governing permissions and limitations
+#  under the License.
+
+"""Bloodhound version control support"""
+
+import os.path
+
+from trac.util.concurrency import threading
+from trac.core import implements
+import trac.versioncontrol.api
+import trac.admin
+import trac.web.api
+import trac.resource
+from multiproduct.util import ReplacementComponent
+
+class DbRepositoryProvider(trac.versioncontrol.api.DbRepositoryProvider, 
ReplacementComponent):
+    """Inplace replacement for trac.versioncontrol.api.DbRepositoryProvider. 
Filters
+    repositories based on soft-links to products. Soft links are stored in 
'product'
+    repository attribute, separated by comma."""
+
+    repository_attrs = 
trac.versioncontrol.api.DbRepositoryProvider.repository_attrs + 
tuple(['product'])
+
+    implements(trac.versioncontrol.api.IRepositoryProvider,
+               trac.admin.IAdminCommandProvider)
+
+    # IRepositoryProvider methods
+    def get_repositories(self):
+        """Retrieve list of repositories specified in the repository
+        table for current product environment
+        """
+        from multiproduct.env import ProductEnvironment
+        if isinstance(self.env, ProductEnvironment):
+            repos = {}
+            for id, name, value in self.env.db_direct_query(
+                "SELECT id, name, value FROM repository WHERE name IN (%s)"
+                % ",".join("'%s'" % each for each in self.repository_attrs)):
+                if value is not None:
+                    repos.setdefault(id, {})[name] = value
+            reponames = {}
+            for id, info in repos.iteritems():
+                if 'product' in info and \
+                   not self.env.product.prefix in info['product'].split(','):
+                    # skip repository if not soft linked from the current
+                    # product environment
+                    continue
+                if 'product' in info:
+                    del info['product']
+                if 'name' in info and ('dir' in info or 'alias' in info):
+                    info['id'] = id
+                    reponames[info['name']] = info
+            return reponames.iteritems()
+        else:
+            return super(DbRepositoryProvider, self).get_repositories()
+
+trac.versioncontrol.api.DbRepositoryProvider = DbRepositoryProvider
+
+class RepositoryManager(trac.versioncontrol.api.RepositoryManager, 
ReplacementComponent):
+
+    implements(trac.web.api.IRequestFilter,
+               trac.resource.IResourceManager,
+               trac.versioncontrol.api.IRepositoryProvider)
+
+    def __init__(self):
+        super(RepositoryManager, self).__init__()
+
+trac.versioncontrol.api.RepositoryManager = RepositoryManager


Reply via email to