Changeset 42

Show
Ignore:
Timestamp:
2008年08月25日 18时22分44秒 (4 years ago)
Author:
jiangx
Message:

See #9: add model for svn plugins management.

Location:
trunk/pysvnmanager
Files:
9 added
2 modified

Legend:

Unmodified
Added
Removed
  • trunk/pysvnmanager/model/repos.py

    r41 r42  
    22# -*- coding: utf-8 -*- 
    33 
    4 """Subversion authz config file management. 
     4"""Subversion repos management. 
    55 
    6 Basic classes used for Subversion authz management. 
     6Basic classes used for Subversion repository add/remove. 
    77""" 
    88 
     
    1414log = logging.getLogger(__name__) 
    1515 
     16from pylons import config 
     17config_path = config["here"] + '/config' 
     18if config_path not in sys.path: 
     19    sys.path.insert(0, config_path) 
     20from localconfig import LocalConfig as cfg 
     21 
     22sys.path.insert(0,os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__))))) 
     23from pysvnmanager import hooks 
     24 
    1625# i18n works only as pysvnmanager (a pylons app) model. 
    17 from pylons import config 
    1826if config.get('package') and not config.has_key('unittest'): 
    1927    from pylons.i18n import _ 
     
    6068     
    6169    def hooks_init(self, repos_name): 
    62         version = self.svnversion() 
    63         repos_path = "%(root)s/%(entry)s" % { "root": self.repos_root, "entry": repos_name} 
     70        import distutils.version as dv 
     71        version = '.'.join(self.svnversion()) 
     72        matched = 'default' 
     73        for ver in sorted(hooks.init.svn_hooks_init_dict.keys(), 
     74                          cmp = lambda x,y: cmp(dv.LooseVersion(x), dv.LooseVersion(y)), 
     75                          reverse=True): 
     76            if dv.LooseVersion(version) >= dv.LooseVersion(ver): 
     77                matched = ver 
     78                break 
     79         
     80        #log.debug('Hooks version matched: %s' % matched) 
     81        #log.debug('svn_hooks_init_base: %s' % hooks.init.svn_hooks_init_base) 
     82         
     83        # copy hook-scripts from matched hooks templates directory. 
     84        src = hooks.init.svn_hooks_init_base + '/' + hooks.init.svn_hooks_init_dict[matched] 
     85        dest = "%(root)s/%(entry)s/hooks" % { "root": self.repos_root, "entry": repos_name} 
     86         
     87        log.debug('Now copy hooks from \n\t%s to \n\t%s' % (src, dest)) 
     88        import shutil 
     89        shutil.rmtree(dest) 
     90        shutil.copytree(src, dest, symlinks=True) 
     91         
    6492     
    6593    def svnversion(self): 
     
    94122             
    95123    def delete(self, repos_name): 
    96         if self.is_blank_svn_repos(repos_name): 
    97             repos_path = "%(root)s/%(entry)s" % { "root": self.repos_root, "entry": repos_name} 
    98             from svn import repos as _repos 
    99             _repos.delete(repos_path) 
    100         else: 
    101             raise Exception, _("Repos %s is not a blank repository.") % repos_name 
     124        repos_path = "%(root)s/%(entry)s" % { "root": self.repos_root, "entry": repos_name} 
     125        if os.path.exists(repos_path): 
     126            if self.is_blank_svn_repos(repos_name): 
     127                from svn import repos as _repos 
     128                _repos.delete(repos_path) 
     129            else: 
     130                raise Exception, _("Repos %s is not a blank repository.") % repos_name 
    102131         
    103132 
  • trunk/pysvnmanager/tests/test_repos.py

    r41 r42  
    99from pysvnmanager import model 
    1010from pysvnmanager.model import repos 
     11from pysvnmanager.model import hooks 
     12from pysvnmanager.hooks import plugins 
     13 
    1114import StringIO 
    1215from pprint import pprint 
     
    1518     
    1619    def __init__(self, *args): 
    17         repos_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + '/svnroot' 
    18         self.repos = repos.Repos(repos_root) 
     20        self.repos_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + '/svnroot' 
     21        self.repos = repos.Repos(self.repos_root) 
    1922        super(TestRepos, self).__init__(*args) 
    2023 
     
    2730        pass 
    2831     
     32    def testReposCreate(self): 
     33        self.assertRaises(Exception, self.repos.create, 'repos1') 
     34        self.repos.delete('repos3') 
     35        self.repos.create('repos3') 
     36        self.assert_(sorted(self.repos.repos_list) == ['repos1', 'repos2', 'repos3'], self.repos.repos_list) 
     37 
     38    def testReposDelete(self): 
     39        self.assertRaises(Exception, self.repos.delete, 'repos1') 
     40     
    2941    def testReposRoot(self): 
    3042        repos.Repos('/tmp') 
     
    3244 
    3345    def testReposlist(self): 
    34         self.assert_(sorted(self.repos.repos_list) == ['repos1', 'repos2'], u','.join(self.repos.repos_list).encode('utf-8')) 
     46        self.assert_(sorted(self.repos.repos_list) == ['repos1', 'repos2', 'repos3'], u','.join(self.repos.repos_list).encode('utf-8')) 
    3547 
    36     def testReposCreate(self): 
    37         self.assertRaises(Exception, self.repos.create, 'repos1') 
    38         self.repos.create('repos3') 
    39         self.assert_(sorted(self.repos.repos_list) == ['repos1', 'repos2', 'repos3'], self.repos.repos_list) 
    40         self.repos.delete('repos3') 
    41  
    42     def testReposDelete(self): 
    43         self.assertRaises(Exception, self.repos.delete, 'repos1') 
    44      
    4548    def testSvnVersion(self): 
    4649        svnversion = self.repos.svnversion() 
    4750        self.assert_(svnversion[0]!='', svnversion[0]) 
    4851        self.assert_(svnversion[1]!='', svnversion[1]) 
     52 
     53class TestReposPlugin(TestController): 
    4954     
     55    def __init__(self, *args): 
     56        self.repos_root = os.path.dirname(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) + '/svnroot' 
     57        super(TestReposPlugin, self).__init__(*args) 
     58 
     59    def setUp(self): 
     60        #print '+'*40, 'setup' 
     61        pass 
     62 
     63    def tearDown(self): 
     64        #print '+'*40, 'teardown' 
     65        pass 
     66 
     67    def testPluginList(self): 
     68        self.assert_(plugins.modules==['CaseInsensitive', 'EolStyleCheck'], plugins.modules) 
     69       
     70    def testPluginImport(self): 
     71        self.assertRaises(Exception,  plugins.getHandler("CaseInsensitive"), "") 
     72        module_ci = plugins.getHandler("CaseInsensitive")(self.repos_root + '/repos1') 
     73        self.assert_(module_ci.name=="check case insensitive", module_ci.name) 
     74        self.assert_(module_ci.description!="", module_ci.description) 
     75       
     76    def testPluginSetting(self): 
     77        m = plugins.getHandler("CaseInsensitive")(self.repos_root + '/repos1') 
     78        self.assert_(m.is_set()==False) 
     79        m.set_plugin() 
     80        self.assert_(m.is_set()==True) 
     81        m.delete_plugin() 
     82        self.assert_(m.is_set()==False) 
     83       
     84    def testHooks(self): 
     85        # self.repos_root is not a repository. 
     86        self.assertRaises(AssertionError, hooks.Hooks, self.repos_root) 
     87         
     88        myhooks = hooks.Hooks(self.repos_root + '/repos1') 
     89        self.assert_(myhooks.pluginnames==['CaseInsensitive', 'EolStyleCheck'], myhooks.pluginnames) 
     90        self.assert_(myhooks.unapplied_plugins==['CaseInsensitive', 'EolStyleCheck'], myhooks.unapplied_plugins) 
     91         
     92        m = myhooks.plugins['CaseInsensitive'] 
     93        self.assert_(m.name=="check case insensitive", m.name) 
     94        self.assert_(m.description!="", m.description) 
     95     
     96    def testHooksSetting(self): 
     97        myhooks = hooks.Hooks(self.repos_root + '/repos1') 
     98 
     99        m = myhooks.plugins['CaseInsensitive'] 
     100        self.assert_(m.is_set()==False) 
     101        self.assert_(myhooks.applied_plugins==[], myhooks.applied_plugins) 
     102        self.assert_(myhooks.unapplied_plugins==['CaseInsensitive', 'EolStyleCheck'], myhooks.unapplied_plugins) 
     103 
     104        m.set_plugin() 
     105        self.assert_(m.is_set()==True) 
     106        self.assert_(myhooks.applied_plugins==['CaseInsensitive'], myhooks.applied_plugins) 
     107        self.assert_(myhooks.unapplied_plugins==['EolStyleCheck'], myhooks.unapplied_plugins) 
     108 
     109        m.delete_plugin() 
     110        self.assert_(m.is_set()==False) 
     111        self.assert_(myhooks.applied_plugins==[], myhooks.applied_plugins) 
     112        self.assert_(myhooks.unapplied_plugins==['CaseInsensitive', 'EolStyleCheck'], myhooks.unapplied_plugins) 
     113 
     114 
    50115if __name__ == '__main__':  
    51116    import unittest