root/adminconsoleproviderpatch/0.9/admin-provider.diff
| Revision 68, 4.8 kB (checked in by athomas, 3 years ago) |
|---|
-
trac/scripts/admin.py
old new 39 39 from trac.Milestone import Milestone 40 40 from trac.perm import PermissionSystem 41 41 from trac.ticket.model import * 42 from trac.core import ComponentManager, ExtensionPoint, Interface 43 from trac.loader import load_components 42 44 45 __all__ = [ 'IAdminConsoleProvider' ] 46 43 47 try: 44 48 sum 45 49 except NameError: … … 50 54 tot += item 51 55 return tot 52 56 57 class IAdminConsoleProvider(Interface): 58 """ 59 Extension point interface for components to provide an administrative 60 interface from within trac-admin. 61 """ 53 62 63 def get_console_commands(tracadm): 64 """ 65 Return an iterable of (name, help, callable, completer) tuples. 66 67 tracadm is a TracAdmin instance. 68 69 completer can be null. help is in the same format that trac-admin 70 uses. 71 """ 72 73 class AdminCommands(trac.core.Component): 74 """ 75 Component end-point for IAdminConsoleProvider extensions 76 """ 77 admin_providers = ExtensionPoint(IAdminConsoleProvider) 78 79 def import_providers(self, env, tracadm): 80 load_components(env) 81 for provider in self.admin_providers: 82 for command in provider.get_console_commands(tracadm): 83 name, help, callback, completer = command 84 if hasattr(tracadm.__class__, 'do_' + name): 85 raise Exception("Can't use IAdminConsoleProvider %s, console command '%s' already exists" % (provider.__class__.__name__, name)) 86 setattr(tracadm.__class__, 'do_' + name, callback) 87 setattr(tracadm.__class__, '_help_' + name, help) 88 if completer: 89 setattr(tracadm.__class__, 'complete_' + name, completer) 90 54 91 class TracAdmin(cmd.Cmd): 55 92 intro = '' 56 93 license = trac.__license_long__ … … 64 101 _date_format = '%Y-%m-%d' 65 102 _datetime_format = '%Y-%m-%d %H:%M:%S' 66 103 _date_format_hint = 'YYYY-MM-DD' 104 _admin_commands = None 67 105 68 106 def __init__(self, envdir=None): 69 107 cmd.Cmd.__init__(self) … … 72 110 self.env_set(os.path.abspath(envdir)) 73 111 74 112 def docmd(self, cmd='help'): 113 self.env_check() 75 114 self.onecmd(cmd) 76 115 77 116 def emptyline(self): … … 84 123 '%(copy)s\n\n' \ 85 124 "Type: '?' or 'help' for help on commands.\n" % \ 86 125 {'ver':trac.__version__,'copy':__copyright__} 126 self.env_check() 87 127 self.cmdloop() 88 128 89 129 ## … … 99 139 def env_check(self): 100 140 try: 101 141 self.__env = Environment(self.envname) 142 try: 143 self._admin_commands = AdminCommands(self.__env) 144 self._admin_commands.import_providers(self.__env, self) 145 except Exception, e: 146 print "Failed to initialise extension points.", e 147 raise 102 148 except: 103 149 return 0 104 150 return 1 … … 117 163 try: 118 164 if not self.__env: 119 165 self.__env = Environment(self.envname) 166 self._admin_commands = AdminCommands(self.__env) 167 self._admin_commands.import_providers(self.__env, self) 120 168 return self.__env 121 169 except Exception, e: 122 170 print 'Failed to open environment.', e … … 209 257 xrange(0, (1 + len(sep)) * cnum + sum(colw))]) 210 258 print 211 259 260 261 212 262 def print_doc(self, doc, decor=False): 213 263 if not doc: return 214 264 self.print_listing(['Command', 'Description'], doc, ' --', decor) … … 299 349 except AttributeError: 300 350 print "No documentation found for '%s'" % arg[0] 301 351 else: 302 docs = (self._help_about + self._help_help + 303 self._help_initenv + self._help_hotcopy + 304 self._help_resync + self._help_upgrade + 305 self._help_wiki + 306 # self._help_config + self._help_wiki + 307 self._help_permission + self._help_component + 308 self._help_ticket_type + self._help_priority + 309 self._help_severity + self._help_version + 310 self._help_milestone) 352 # Extract documentation from all _help_* members 353 docs = [] 354 doc_strings = [doc for doc in dir(self) if doc.startswith('_help_') and doc[6:] not in ('EOF', 'exit', 'quit')] 355 for doc in doc_strings: 356 docs.extend(getattr(self, doc)) 357 docs.sort(lambda a, b: cmp(a[0], b[0])) 358 311 359 print 'trac-admin - The Trac Administration Console %s' % trac.__version__ 312 360 if not self.interactive: 313 361 print
Note: See TracBrowser for help on using the browser.
