##// END OF EJS Templates
helptext: document the mechanism for extensions to report a version...
Matt Harbison -
r46574:bc1b4eb2 default
parent child Browse files
Show More
@@ -1,368 +1,377 b''
1 1 Extensions allow the creation of new features and using them directly from
2 2 the main hg command line as if they were built-in commands. The extensions
3 3 have full access to the *internal* API.
4 4
5 5 Use of Mercurial's internal API very likely makes your code subject to
6 6 Mercurial's license. Before going any further, read the License page.
7 7
8 8 There are NO guarantees that third-party code calling into Mercurial's
9 9 internals won't break from release to release. If you do use Mercurial's API
10 10 for published third-party code, we expect you to test your code before each
11 11 major Mercurial release. This will prevent various bug reports from your users
12 12 when they upgrade their copy of Mercurial.
13 13
14 14 File Layout
15 15 ===========
16 16
17 17 Extensions are usually written as simple python modules. Larger ones are
18 18 better split into multiple modules of a single package (see the convert
19 19 extension). The package root module gives its name to the extension and
20 20 implements the ``cmdtable`` and optional callbacks described below.
21 21
22 22 Command table
23 23 =============
24 24
25 25 To write your own extension, your python module can provide an optional dict
26 26 named ``cmdtable`` with entries describing each command. A command should be
27 27 registered to the ``cmdtable`` by ``@command`` decorator. All string-like
28 28 values must be the ``bytes`` type, and are thus prefixed with ``b``.
29 29
30 30 Example using ``@command`` decorator (requires Mercurial 1.9)::
31 31
32 32 from mercurial.i18n import _
33 33
34 34 cmdtable = {}
35 35 try:
36 36 from mercurial import registrar
37 37 command = registrar.command(cmdtable)
38 38 except (AttributeError, ImportError):
39 39 # Fallback to hg < 4.3 support
40 40 from mercurial import cmdutil
41 41 command = cmdutil.command(cmdtable)
42 42
43 43 @command(b'print-parents',
44 44 [(b's', b'short', None, _(b'print short form')),
45 45 (b'l', b'long', None, _(b'print long form'))],
46 46 _(b'[options] node'))
47 47 def printparents(ui, repo, node, **opts):
48 48 ...
49 49
50 50 The cmdtable dictionary
51 51 -----------------------
52 52
53 53 The ``cmdtable`` dictionary uses as key the new command names, and, as value,
54 54 a tuple containing:
55 55
56 56 1. the function to be called when the command is used.
57 57 2. a list of options the command can take.
58 58 3. a command line synopsis for the command (the function docstring is used for
59 59 the full help).
60 60
61 61 List of options
62 62 ---------------
63 63
64 64 All the command flag options are documented in the mercurial/fancyopts.py
65 65 sources.
66 66
67 67 The options list is a list of tuples containing:
68 68
69 69 1. the short option letter, or ``''`` if no short option is available
70 70 (for example, ``o`` for a ``-o`` option).
71 71 2. the long option name (for example, ``option`` for a ``--option`` option).
72 72 3. a default value for the option.
73 73 4. a help string for the option (it's possible to omit the "hg newcommand"
74 74 part and only the options and parameter substring is needed).
75 75
76 76 Command function signatures
77 77 ---------------------------
78 78
79 79 Functions that implement new commands always receive a ``ui`` and usually
80 80 a ``repo`` parameter. The rest of parameters are taken from the command line
81 81 items that don't start with a dash and are passed in the same order they were
82 82 written. If no default value is given in the parameter list they are required.
83 83
84 84 If there is no repo to be associated with the command and consequently no
85 85 ``repo`` passed, then ``norepo=True`` should be passed to the ``@command``
86 86 decorator::
87 87
88 88 @command(b'mycommand', [], norepo=True)
89 89 def mycommand(ui, **opts):
90 90 ...
91 91
92 92 For examples of ``norepo``, see the convert extension.
93 93
94 94 Command function docstrings
95 95 ===========================
96 96
97 97 The docstring of your function is used as the main help text, shown by
98 98 ``hg help mycommand``. The docstring should be formatted using a simple
99 99 subset of reStructuredText markup. The supported constructs include:
100 100
101 101 Paragraphs::
102 102
103 103 This is a paragraph.
104 104
105 105 Paragraphs are separated
106 106 by blank lines.
107 107
108 108 A verbatim block is introduced with a double colon followed by an indented
109 109 block. The double colon is turned into a single colon on display::
110 110
111 111 Some text::
112 112
113 113 verbatim
114 114 text
115 115 !!
116 116
117 117 We have field lists::
118 118
119 119 :key1: value1
120 120 :key2: value2
121 121
122 122 Bullet lists::
123 123
124 124 - foo
125 125 - bar
126 126
127 127 Enumerated lists::
128 128
129 129 1. foo
130 130 2. bar
131 131
132 132 Inline markup::
133 133
134 134 ``*bold*``, ``monospace``, :hg:`command`
135 135
136 136 Mark Mercurial commands with ``:hg:`` to make a nice link to the corresponding
137 137 documentation. We'll expand the support if new constructs can be parsed
138 138 without too much trouble.
139 139
140 140 Communicating with the user
141 141 ===========================
142 142
143 143 Besides the ``ui`` methods, like ``ui.write(*msg)`` or
144 144 ``ui.prompt(msg, default=b"y")``, an extension can add help text for each
145 145 of its commands and the extension itself.
146 146
147 147 The module docstring will be used as help string when ``hg help extensionname``
148 148 is used and, similarly, the help string for a command and the docstring
149 149 belonging to the function that's wrapped by the command will be shown when
150 150 ``hg help command`` is invoked.
151 151
152 152 Setup Callbacks
153 153 ===============
154 154
155 155 Extensions are loaded in phases. All extensions are processed in a given phase
156 156 before the next phase begins. In the first phase, all extension modules are
157 157 loaded and registered with Mercurial. This means that you can find all enabled
158 158 extensions with ``extensions.find`` in the following phases.
159 159
160 160 Extension setup
161 161 ---------------
162 162
163 163 There are two callbacks to be called when extensions are loaded, named
164 164 ``uisetup`` and ``extsetup``. ``uisetup`` is called first for each extension,
165 165 then ``extsetup`` is called. This means ``extsetup`` can be useful in case
166 166 one extension optionally depends on another extension.
167 167
168 168 Both ``uisetup`` and ``extsetup`` receive a ui object with the local
169 169 repository configuration::
170 170
171 171 def uisetup(ui):
172 172 # ...
173 173
174 174 def extsetup(ui):
175 175 # ...
176 176
177 177 Be aware that ``uisetup`` in NOT the function to configure a ``ui`` instance.
178 178 It's called only once per process, not per ``ui`` instance. Also, any changes
179 179 to the ``ui`` may be discarded because the ``ui`` here is a temporarily loaded
180 180 local configuration. So, it's generally wrong to do `ui.setconfig()` in
181 181 these callbacks. Notable exception is setting ``pre/post-<command>`` hooks
182 182 and extending ``ui.__class__``.
183 183
184 184 In Mercurial 1.3.1 or earlier, ``extsetup`` takes no argument.
185 185
186 186 Command table setup
187 187 -------------------
188 188
189 189 After ``extsetup``, the ``cmdtable`` is copied into the global command table
190 190 in Mercurial.
191 191
192 192 Ui instance setup
193 193 -----------------
194 194
195 195 The optional ``uipopulate`` is called for each ``ui`` instance after
196 196 configuration is loaded, where extensions can set up additional ui members,
197 197 update configuration by ``ui.setconfig()``, and extend the class dynamically.
198 198
199 199 Typically there are three ``ui`` instances involved in command execution:
200 200
201 201 ``req.ui`` (or ``repo.baseui``)
202 202 Only system and user configurations are loaded into it.
203 203 ``lui``
204 204 Local repository configuration is loaded as well. This will be used at
205 205 early dispatching stage where a repository isn't available.
206 206 ``repo.ui``
207 207 The fully-loaded ``ui`` used after a repository is instantiated. This
208 208 will be created from the ``req.ui`` per repository.
209 209
210 210 In command server and hgweb, this may be called more than once for the same
211 211 ``ui`` instance.
212 212
213 213 (New in Mercurial 4.9)
214 214
215 215 Repository setup
216 216 ----------------
217 217
218 218 Extensions can implement an optional callback named ``reposetup``. It is
219 219 called after the main Mercurial repository initialization, and can be used
220 220 to setup any local state the extension might need.
221 221
222 222 As other command functions it receives an ``ui`` object and a ``repo`` object
223 223 (no additional parameters for this, though)::
224 224
225 225 def reposetup(ui, repo):
226 226 #do initialization here.
227 227
228 228 It is important to take into account that the ``ui`` object that is received
229 229 by the ``reposetup`` function is not the same as the one received by the
230 230 ``uisetup`` and ``extsetup`` functions. This is particularly important when
231 231 setting up hooks as described in the following section, since not all hooks
232 232 use the same ``ui`` object and hence different hooks must be configured in
233 233 different setup functions.
234 234
235 235 Wrapping methods on the ui and repo classes
236 236 -------------------------------------------
237 237
238 238 Because extensions can be loaded *per repository*, you should avoid using
239 239 ``extensions.wrapfunction()`` on methods of the ``ui`` and ``repo`` objects.
240 240 Instead, create a subclass of the specific class of the instance passed into
241 241 the ``*setup()`` hook; e.g. use ``ui.__class__`` as the base class, then
242 242 reassign your new class to ``ui.__class__`` again. Mercurial will then use
243 243 your updated ``ui`` or ``repo`` instance only for repositories where your
244 244 extension is enabled (or copies thereof, reusing your new class).
245 245
246 246 For example::
247 247
248 248 def uisetup(ui):
249 249 class echologui(ui.__class__):
250 250 def log(self, service, *msg, **opts):
251 251 if msg:
252 252 self.write(b'%s: %s\n' % (service, msg[0] % msg[1:]))
253 253 super(echologui, self).log(service, *msg, **opts)
254 254
255 255 ui.__class__ = echologui
256 256
257 257 Configuring Hooks
258 258 =================
259 259
260 260 Some extensions must use hooks to do their work. These required hooks can
261 261 be configured manually by the user by modifying the ``[hook]`` section of
262 262 their hgrc, but they can also be configured automatically by calling the
263 263 ``ui.setconfig(b'hooks', ...)`` function in one of the setup functions
264 264 described above.
265 265
266 266 The main difference between manually modifying the hooks section in the hgrc
267 267 and using ``ui.setconfig()`` is that when using ``ui.setconfig()`` you have
268 268 access to the actual hook function object, which you can pass directly to
269 269 ``ui.setconfig()``, while when you use the hooks section of the hgrc file
270 270 you must refer to the hook function by using the
271 271 ``python:modulename.functioname`` idiom (e.g. ``python:hgext.notify.hook``).
272 272
273 273 For example::
274 274
275 275 # Define hooks -- note that the actual function name it irrelevant.
276 276 def preupdatehook(ui, repo, **kwargs):
277 277 ui.write(b"Pre-update hook triggered\n")
278 278
279 279 def updatehook(ui, repo, **kwargs):
280 280 ui.write(b"Update hook triggered\n")
281 281
282 282 def uisetup(ui):
283 283 # When pre-<cmd> and post-<cmd> hooks are configured by means of
284 284 # the ui.setconfig() function, you must use the ui object passed
285 285 # to uisetup or extsetup.
286 286 ui.setconfig(b"hooks", b"pre-update.myextension", preupdatehook)
287 287
288 288 def reposetup(ui, repo):
289 289 # Repository-specific hooks can be configured here. These include
290 290 # the update hook.
291 291 ui.setconfig(b"hooks", b"update.myextension", updatehook)
292 292
293 293 Note how different hooks may need to be configured in different setup
294 294 functions. In the example you can see that the ``update`` hook must be
295 295 configured in the ``reposetup`` function, while the ``pre-update`` hook
296 296 must be configured on the ``uisetup`` or the ``extsetup`` functions.
297 297
298 298 Marking compatible versions
299 299 ===========================
300 300
301 301 Every extension should use the ``testedwith`` variable to specify Mercurial
302 302 releases it's known to be compatible with. This helps us and users diagnose
303 303 where problems are coming from::
304 304
305 305 testedwith = b'2.0 2.0.1 2.1 2.1.1 2.1.2'
306 306
307 307 Do not use the ``internal`` marker in third-party extensions; we will
308 308 immediately drop all bug reports mentioning your extension if we catch you
309 309 doing this.
310 310
311 311 Similarly, an extension can use the ``buglink`` variable to specify how users
312 312 should report issues with the extension. This link will be included in the
313 313 error message if the extension produces errors::
314 314
315 315 buglink = b'https://bitbucket.org/USER/REPO/issues'
316 316
317 317 If an extension requires a minimum version of Mercurial, it can be declared
318 318 with the ``minimumhgversion`` variable::
319 319
320 320 minimumhgversion = b'4.6'
321 321
322 322 Older clients will print a warning that the extension requires a new version,
323 323 instead of attempting to load it.
324 324
325 The extension itself can be assigned a version value through one of two module
326 attributes, and will be displayed in crash reports and :hg:`version -v`::
327
328 * ``__version__`` is a plain value
329 * ``getversion`` is a no argument ``Callable`` that returns a value
330
331 In both cases, the value must be either a byte string, or a list or tuple of
332 numeric values which will be joined with ``.``.
333
325 334 Wrap up: what belongs where?
326 335 ============================
327 336
328 337 You will find here a list of most common tasks, based on setups from the
329 338 extensions included in Mercurial core.
330 339
331 340 uisetup
332 341 -------
333 342
334 343 * Changes to ``ui.__class__`` . The ``ui`` object that will be used to run
335 344 the command has not yet been created. Changes made here will affect ``ui``
336 345 objects created after this, and in particular the ``ui`` that will be passed
337 346 to ``runcommand``
338 347 * Command wraps (``extensions.wrapcommand``)
339 348 * Changes that need to be visible by other extensions: because initialization
340 349 occurs in phases (all extensions run ``uisetup``, then all run ``extsetup``),
341 350 a change made here will be visible by other extensions during ``extsetup``.
342 351 * Monkeypatches or function wraps (``extensions.wrapfunction``) of ``dispatch``
343 352 module members
344 353 * Set up ``pre-*`` and ``post-*`` hooks. (DEPRECATED. ``uipopulate`` is
345 354 preferred on Mercurial 4.9 and later.)
346 355 * ``pushkey`` setup
347 356
348 357 extsetup
349 358 --------
350 359
351 360 * Changes depending on the status of other extensions. (``if extensions.find(b'mq')``)
352 361 * Add a global option to all commands
353 362 * Extend revsets
354 363
355 364 uipopulate
356 365 ----------
357 366
358 367 * Modify ``ui`` instance attributes and configuration variables.
359 368 * Changes to ``ui.__class__`` per instance.
360 369 * Set up all hooks per scoped configuration.
361 370
362 371 reposetup
363 372 ---------
364 373
365 374 * Set up all hooks but ``pre-*`` and ``post-*``. (DEPRECATED. ``uipopulate`` is
366 375 preferred on Mercurial 4.9 and later.)
367 376 * Modify configuration variables
368 377 * Changes to ``repo.__class__``, ``repo.dirstate.__class__``
General Comments 0
You need to be logged in to leave comments. Login now