bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 1 | # Copyright (C) 2004, 2005 by Canonical Ltd
 | 
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 2 | #
 | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 3 | # This program is free software; you can redistribute it and/or modify
 | 
| 4 | # it under the terms of the GNU General Public License as published by
 | |
| 5 | # the Free Software Foundation; either version 2 of the License, or
 | |
| 6 | # (at your option) any later version.
 | |
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 7 | #
 | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 8 | # This program is distributed in the hope that it will be useful,
 | 
| 9 | # but WITHOUT ANY WARRANTY; without even the implied warranty of
 | |
| 10 | # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 | |
| 11 | # GNU General Public License for more details.
 | |
| 1887.1.1
by Adeodato Simó Do not separate paragraphs in the copyright statement with blank lines, | 12 | #
 | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 13 | # You should have received a copy of the GNU General Public License
 | 
| 14 | # along with this program; if not, write to the Free Software
 | |
| 15 | # Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 | |
| 16 | ||
| 17 | ||
| 1185.16.83
by mbp at sourcefrog - notes on testability of plugins | 18 | """bzr python plugin support
 | 
| 19 | ||
| 20 | Any python module in $BZR_PLUGIN_PATH will be imported upon initialization of
 | |
| 1485
by Robert Collins touch up plugin.py docstring | 21 | bzrlib. The module will be imported as 'bzrlib.plugins.$BASENAME(PLUGIN)'.
 | 
| 22 | In the plugin's main body, it should update any bzrlib registries it wants to
 | |
| 23 | extend; for example, to add new commands, import bzrlib.commands and add your
 | |
| 24 | new command to the plugin_cmds variable.
 | |
| 1185.16.83
by mbp at sourcefrog - notes on testability of plugins | 25 | """
 | 
| 26 | ||
| 27 | # TODO: Refactor this to make it more testable.  The main problem at the
 | |
| 28 | # moment is that loading plugins affects the global process state -- for bzr
 | |
| 29 | # in general use it's a reasonable assumption that all plugins are loaded at
 | |
| 30 | # startup and then stay loaded, but this is less good for testing.
 | |
| 31 | # 
 | |
| 32 | # Several specific issues:
 | |
| 33 | #  - plugins can't be unloaded and will continue to effect later tests
 | |
| 34 | #  - load_plugins does nothing if called a second time
 | |
| 35 | #  - plugin hooks can't be removed
 | |
| 36 | #
 | |
| 37 | # Our options are either to remove these restrictions, or work around them by
 | |
| 38 | # loading the plugins into a different space than the one running the tests.
 | |
| 39 | # That could be either a separate Python interpreter or perhaps a new
 | |
| 40 | # namespace inside this interpreter.
 | |
| 731
by Martin Pool - merge plugin patch from john | 41 | |
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 42 | import imp | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 43 | import os | 
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 44 | import sys | 
| 1516
by Robert Collins * bzrlib.plugin.all_plugins has been changed from an attribute to a | 45 | import types | 
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 46 | |
| 1442.1.23
by Robert Collins Plugins are now loaded under bzrlib.plugins, not bzrlib.plugin. | 47 | import bzrlib | 
| 1442.1.1
by Robert Collins move config_dir into bzrlib.config | 48 | from bzrlib.config import config_dir | 
| 1740.5.1
by Martin Pool When an unhandled exception occurs, write the traceback to stderr. | 49 | from bzrlib.trace import log_error, mutter, warning, \ | 
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 50 |         log_exception_quietly
 | 
| 51 | from bzrlib.errors import BzrError | |
| 52 | from bzrlib import plugins | |
| 1185.31.32
by John Arbash Meinel Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \ | 53 | from bzrlib.osutils import pathjoin | 
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 54 | |
| 1185.31.32
by John Arbash Meinel Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \ | 55 | DEFAULT_PLUGIN_PATH = pathjoin(config_dir(), 'plugins') | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 56 | |
| 57 | _loaded = False | |
| 58 | ||
| 59 | ||
| 1516
by Robert Collins * bzrlib.plugin.all_plugins has been changed from an attribute to a | 60 | def all_plugins(): | 
| 61 | """Return a dictionary of the plugins.""" | |
| 62 | result = {} | |
| 63 | for name, plugin in bzrlib.plugins.__dict__.items(): | |
| 64 | if isinstance(plugin, types.ModuleType): | |
| 65 | result[name] = plugin | |
| 66 | return result | |
| 67 | ||
| 68 | ||
| 1551.3.11
by Aaron Bentley Merge from Robert | 69 | def disable_plugins(): | 
| 70 | """Disable loading plugins. | |
| 71 | ||
| 72 |     Future calls to load_plugins() will be ignored.
 | |
| 73 |     """
 | |
| 74 |     # TODO: jam 20060131 This should probably also disable
 | |
| 75 |     #       load_from_dirs()
 | |
| 76 | global _loaded | |
| 77 | _loaded = True | |
| 78 | ||
| 79 | ||
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 80 | def load_plugins(): | 
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 81 | """Load bzrlib plugins. | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 82 | |
| 83 |     The environment variable BZR_PLUGIN_PATH is considered a delimited
 | |
| 84 |     set of paths to look through. Each entry is searched for *.py
 | |
| 85 |     files (and whatever other extensions are used in the platform,
 | |
| 86 |     such as *.pyd).
 | |
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 87 | |
| 88 |     load_from_dirs() provides the underlying mechanism and is called with
 | |
| 89 |     the default directory list to provide the normal behaviour.
 | |
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 90 |     """
 | 
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 91 | global _loaded | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 92 | if _loaded: | 
| 93 |         # People can make sure plugins are loaded, they just won't be twice
 | |
| 94 |         return
 | |
| 95 |         #raise BzrError("plugins already initialized")
 | |
| 96 | _loaded = True | |
| 97 | ||
| 1185.38.10
by John Arbash Meinel [patch] Alexander Belchenko patch #12: use os.pathsep for BZR_PLUGIN_PATH | 98 | dirs = os.environ.get('BZR_PLUGIN_PATH', DEFAULT_PLUGIN_PATH).split(os.pathsep) | 
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 99 | dirs.insert(0, os.path.dirname(plugins.__file__)) | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 100 | |
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 101 | load_from_dirs(dirs) | 
| 102 | ||
| 1516
by Robert Collins * bzrlib.plugin.all_plugins has been changed from an attribute to a | 103 | |
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 104 | def load_from_dirs(dirs): | 
| 105 | """Load bzrlib plugins found in each dir in dirs. | |
| 106 | ||
| 107 |     Loading a plugin means importing it into the python interpreter.
 | |
| 108 |     The plugin is expected to make calls to register commands when
 | |
| 109 |     it's loaded (or perhaps access other hooks in future.)
 | |
| 110 | ||
| 111 |     Plugins are loaded into bzrlib.plugins.NAME, and can be found there
 | |
| 112 |     for future reference.
 | |
| 113 |     """
 | |
| 1864.6.1
by John Arbash Meinel Use the correct suffixes for loading plugins (bug #51810) | 114 |     # Get the list of valid python suffixes for __init__.py?
 | 
| 115 |     # this includes .py, .pyc, and .pyo (depending on if we are running -O)
 | |
| 116 |     # but it doesn't include compiled modules (.so, .dll, etc)
 | |
| 117 | valid_suffixes = [suffix for suffix, mod_type, flags in imp.get_suffixes() | |
| 118 | if flags in (imp.PY_SOURCE, imp.PY_COMPILED)] | |
| 119 | package_entries = ['__init__'+suffix for suffix in valid_suffixes] | |
| 974.1.26
by aaron.bentley at utoronto merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 | 120 | for d in dirs: | 
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 121 | if not d: | 
| 122 |             continue
 | |
| 1185.31.4
by John Arbash Meinel Fixing mutter() calls to not have to do string processing. | 123 | mutter('looking for plugins in %s', d) | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 124 | plugin_names = set() | 
| 125 | if not os.path.isdir(d): | |
| 126 |             continue
 | |
| 127 | for f in os.listdir(d): | |
| 1185.31.32
by John Arbash Meinel Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \ | 128 | path = pathjoin(d, f) | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 129 | if os.path.isdir(path): | 
| 130 | for entry in package_entries: | |
| 131 |                     # This directory should be a package, and thus added to
 | |
| 132 |                     # the list
 | |
| 1185.31.32
by John Arbash Meinel Updated the bzr sourcecode to use bzrlib.osutils.pathjoin rather than os.path.join to enforce internal use of / instead of \ | 133 | if os.path.isfile(pathjoin(path, entry)): | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 134 |                         break
 | 
| 135 | else: # This directory is not a package | |
| 136 |                     continue
 | |
| 137 | else: | |
| 1864.6.1
by John Arbash Meinel Use the correct suffixes for loading plugins (bug #51810) | 138 | for suffix_info in imp.get_suffixes(): | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 139 | if f.endswith(suffix_info[0]): | 
| 140 | f = f[:-len(suffix_info[0])] | |
| 141 | if suffix_info[2] == imp.C_EXTENSION and f.endswith('module'): | |
| 142 | f = f[:-len('module')] | |
| 143 |                         break
 | |
| 144 | else: | |
| 145 |                     continue
 | |
| 1515
by Robert Collins * Plugins with the same name in different directories in the bzr plugin | 146 | if getattr(bzrlib.plugins, f, None): | 
| 147 | mutter('Plugin name %s already loaded', f) | |
| 148 | else: | |
| 149 | mutter('add plugin name %s', f) | |
| 150 | plugin_names.add(f) | |
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 151 | |
| 152 | plugin_names = list(plugin_names) | |
| 153 | plugin_names.sort() | |
| 154 | for name in plugin_names: | |
| 155 | try: | |
| 156 | plugin_info = imp.find_module(name, [d]) | |
| 1185.31.4
by John Arbash Meinel Fixing mutter() calls to not have to do string processing. | 157 | mutter('load plugin %r', plugin_info) | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 158 | try: | 
| 1442.1.23
by Robert Collins Plugins are now loaded under bzrlib.plugins, not bzrlib.plugin. | 159 | plugin = imp.load_module('bzrlib.plugins.' + name, | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 160 | *plugin_info) | 
| 1442.1.23
by Robert Collins Plugins are now loaded under bzrlib.plugins, not bzrlib.plugin. | 161 | setattr(bzrlib.plugins, name, plugin) | 
| 1393.2.1
by John Arbash Meinel Merged in split-storage-2 branch. Need to cleanup a little bit more still. | 162 | finally: | 
| 163 | if plugin_info[0] is not None: | |
| 164 | plugin_info[0].close() | |
| 165 | ||
| 166 | mutter('loaded succesfully') | |
| 1492
by Robert Collins Support decoration of commands. | 167 | except KeyboardInterrupt: | 
| 168 |                 raise
 | |
| 169 | except Exception, e: | |
| 170 |                 ## import pdb; pdb.set_trace()
 | |
| 1185.16.82
by mbp at sourcefrog - give a quieter warning if a plugin can't be loaded | 171 | warning('Unable to load plugin %r from %r' % (name, d)) | 
| 172 | log_exception_quietly() |