10
14
bzrlib has a very flexible internal structure allowing plugins for many
11
15
operations. Plugins can add commands, new storage formats, diff and merge
12
16
features and more. This document provides an overview of the API and
13
17
conventions for plugin authors.
19
If you're writing a plugin and have questions not addressed by this
20
document, please ask us.
25
* `Bazaar Developer Documentation Catalog <index.html>`_.
26
* <http://bazaar-vcs.org/WritingPlugins> wiki page with many more
27
suggestions about particular APIs
18
30
Structure of a plugin
157
174
Plugin metadata after installation
158
175
==================================
160
After a plugin has been installed, metadata can be more easily obtained.
161
Currently the only metadata used is for API versioning.
177
After a plugin has been installed, metadata can be more easily obtained by
178
looking inside the module object -- in other words, for variables defined
179
in the plugin's ``__init__.py``.
181
Help and documentation
182
----------------------
184
The module docstring is used as the plugin description shown by ``bzr
185
plugins``. As with all Python docstrings, the first line should be a
186
short complete sentence summarizing the plugin. The full docstring is
187
shown by ``bzr help PLUGIN_NAME``.
189
Remember that to be effective, the module docstring must be the first
190
statement in the file. It may come after comments but it must be before
191
any import statements.
166
Please see `API versioning <api-versioning.html>`_ for details on the API
196
Plugins can and should declare that they depend on a particular version of
199
from bzrlib.api import require_api
201
require_api(bzrlib, (1, 11, 0))
203
Please see `API versioning <api-versioning.html>`_ for more details on the API
167
204
metadata protocol used by bzrlib.
209
The plugin should expose a version tuple to describe its own version.
210
Some plugins use a version number that corresponds to the version of bzr
211
they're released against, but you can use whatever you want. For example::
213
version_info = (1, 10, 0)
216
Detecting whether code's being loaded as a plugin
217
-------------------------------------------------
219
You may have a Python module that can be used as a bzr plugin and also in
220
other places. To detect whether the module is being loaded by bzr, use
221
something like this::
223
if __name__ == 'bzrlib.plugins.loggerhead':
224
# register with bzrlib...
230
Plugins should avoid doing work or loading code from the plugin or
231
external libraries, if they're just installed but not actually active,
232
because this slows down every invocation of bzr. The bzrlib APIs
233
generally allow the plugin to 'lazily' register methods to invoke if a
234
particular disk format or seen or a particular command is run.
240
The plugin ``__init__.py`` runs when the plugin is loaded during bzr
241
startup. Generally the plugin won't want to actually do anything at this
242
time other than register or override functions to be called later.
244
The plugin can import bzrlib and call any function.
245
Some interesting APIs are described in <http://bazaar-vcs.org/WritingPlugins>
248
Publishing your plugin
249
======================
251
When your plugin is basically working you might like to share it with
252
other people. Here are some steps to consider:
254
* make a project on Launchpad.net like
255
<https://launchpad.net/bzr-fastimport>
256
and publish the branches or tarballs there
258
* include the plugin in <http://bazaar-vcs.org/BzrPlugins>
260
* post about it to the ``bazaar-announce`` list at ``lists.canonical.com``
263
vim: ft=rst tw=74 ai shiftwidth=4