~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/HACKING.txt

  • Committer: John Arbash Meinel
  • Author(s): Mark Hammond
  • Date: 2008-09-09 17:02:21 UTC
  • mto: This revision was merged to the branch mainline in revision 3697.
  • Revision ID: john@arbash-meinel.com-20080909170221-svim3jw2mrz0amp3
An updated transparent icon for bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
2
2
Bazaar Developer Guide
3
3
======================
4
4
 
 
5
This document describes the Bazaar internals and the development process.  
 
6
It's meant for people interested in developing Bazaar, and some parts will
 
7
also be useful to people developing Bazaar plugins.
 
8
 
 
9
If you have any questions or something seems to be incorrect, unclear or
 
10
missing, please talk to us in ``irc://irc.freenode.net/#bzr``, or write to
 
11
the Bazaar mailing list.  To propose a correction or addition to this
 
12
document, send a merge request or new text to the mailing list.
 
13
 
 
14
The current version of this document is available in the file 
 
15
``doc/developers/HACKING.txt`` in the source tree, or at
 
16
http://doc.bazaar-vcs.org/bzr.dev/en/developer-guide/HACKING.html
 
17
 
 
18
See also:
 
19
`Bazaar Developer Documentation Catalog <../../developers/index.html>`_.
 
20
 
5
21
.. contents::
6
22
 
7
 
(The current version of this document is available in the file 
8
 
``doc/developers/HACKING.txt`` in the source tree, or at
9
 
http://doc.bazaar-vcs.org/bzr.dev/en/developer-guide/HACKING.html)
10
 
 
11
23
 
12
24
Getting Started
13
25
###############
203
215
Navigating the Code Base
204
216
========================
205
217
 
206
 
TODO: List and describe in one line the purpose of each directory
207
 
inside an installation of bzr.
208
 
 
209
 
TODO: Refer to a central location holding an up to date copy of the API
210
 
documentation generated by epydoc, e.g. something like
211
 
http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html.
212
 
 
213
 
 
214
 
Testing Bazaar
215
 
##############
216
 
 
217
 
The Importance of Testing
218
 
=========================
219
 
 
220
 
Reliability is a critical success factor for any Version Control System.
221
 
We want Bazaar to be highly reliable across multiple platforms while
222
 
evolving over time to meet the needs of its community. 
223
 
 
224
 
In a nutshell, this is want we expect and encourage:
225
 
 
226
 
* New functionality should have test cases.  Preferably write the
227
 
  test before writing the code.
228
 
 
229
 
  In general, you can test at either the command-line level or the
230
 
  internal API level.  See Writing tests below for more detail.
231
 
 
232
 
* Try to practice Test-Driven Development: before fixing a bug, write a
233
 
  test case so that it does not regress.  Similarly for adding a new
234
 
  feature: write a test case for a small version of the new feature before
235
 
  starting on the code itself.  Check the test fails on the old code, then
236
 
  add the feature or fix and check it passes.
237
 
 
238
 
By doing these things, the Bazaar team gets increased confidence that
239
 
changes do what they claim to do, whether provided by the core team or
240
 
by community members. Equally importantly, we can be surer that changes
241
 
down the track do not break new features or bug fixes that you are
242
 
contributing today.
243
 
 
244
 
As of May 2007, Bazaar ships with a test suite containing over 6000 tests
245
 
and growing. We are proud of it and want to remain so. As community
246
 
members, we all benefit from it. Would you trust version control on
247
 
your project to a product *without* a test suite like Bazaar has?
248
 
 
249
 
 
250
 
Running the Test Suite
251
 
======================
252
 
 
253
 
Currently, bzr selftest is used to invoke tests.
254
 
You can provide a pattern argument to run a subset. For example, 
255
 
to run just the blackbox tests, run::
256
 
 
257
 
  ./bzr selftest -v blackbox
258
 
 
259
 
To skip a particular test (or set of tests), use the --exclude option
260
 
(shorthand -x) like so::
261
 
 
262
 
  ./bzr selftest -v -x blackbox  
263
 
 
264
 
To ensure that all tests are being run and succeeding, you can use the
265
 
--strict option which will fail if there are any missing features or known
266
 
failures, like so::
267
 
 
268
 
  ./bzr selftest --strict
269
 
 
270
 
To list tests without running them, use the --list-only option like so::
271
 
 
272
 
  ./bzr selftest --list-only
273
 
 
274
 
This option can be combined with other selftest options (like -x) and
275
 
filter patterns to understand their effect.
276
 
 
277
 
 
278
 
Writing Tests
279
 
=============
280
 
 
281
 
In general tests should be placed in a file named test_FOO.py where 
282
 
FOO is the logical thing under test. That file should be placed in the
283
 
tests subdirectory under the package being tested.
284
 
 
285
 
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
286
 
See bzrlib/tests/test_sampler.py for a template test script.
287
 
 
288
 
Tests can be written for the UI or for individual areas of the library.
289
 
Choose whichever is appropriate: if adding a new command, or a new command 
290
 
option, then you should be writing a UI test.  If you are both adding UI
291
 
functionality and library functionality, you will want to write tests for 
292
 
both the UI and the core behaviours.  We call UI tests 'blackbox' tests
293
 
and they are found in ``bzrlib/tests/blackbox/*.py``. 
294
 
 
295
 
When writing blackbox tests please honour the following conventions:
296
 
 
297
 
 1. Place the tests for the command 'name' in
298
 
    bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
299
 
    to locate the test script for a faulty command.
300
 
 
301
 
 2. Use the 'self.run_bzr("name")' utility function to invoke the command
302
 
    rather than running bzr in a subprocess or invoking the
303
 
    cmd_object.run() method directly. This is a lot faster than
304
 
    subprocesses and generates the same logging output as running it in a
305
 
    subprocess (which invoking the method directly does not).
306
 
 
307
 
 3. Only test the one command in a single test script. Use the bzrlib 
308
 
    library when setting up tests and when evaluating the side-effects of
309
 
    the command. We do this so that the library api has continual pressure
310
 
    on it to be as functional as the command line in a simple manner, and
311
 
    to isolate knock-on effects throughout the blackbox test suite when a
312
 
    command changes its name or signature. Ideally only the tests for a
313
 
    given command are affected when a given command is changed.
314
 
 
315
 
 4. If you have a test which does actually require running bzr in a
316
 
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
317
 
    process will not load plugins unless ``--allow-plugins`` is supplied.
318
 
 
319
 
 
320
 
Doctests
321
 
--------
322
 
 
323
 
We make selective use of doctests__.  In general they should provide 
324
 
*examples* within the API documentation which can incidentally be tested.  We 
325
 
don't try to test every important case using doctests -- regular Python
326
 
tests are generally a better solution.
327
 
 
328
 
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
329
 
 
330
 
  __ http://docs.python.org/lib/module-doctest.html
331
 
 
332
 
 
333
 
Skipping tests and test requirements
334
 
------------------------------------
335
 
 
336
 
In our enhancements to unittest we allow for some addition results beyond
337
 
just success or failure.
338
 
 
339
 
If a test can't be run, it can say that it's skipped.  This is typically
340
 
used in parameterized tests - for example if a transport doesn't support
341
 
setting permissions, we'll skip the tests that relating to that.  ::
342
 
 
343
 
    try:
344
 
        return self.branch_format.initialize(repo.bzrdir)
345
 
    except errors.UninitializableFormat:
346
 
        raise tests.TestSkipped('Uninitializable branch format')
347
 
 
348
 
Raising TestSkipped is a good idea when you want to make it clear that the
349
 
test was not run, rather than just returning which makes it look as if it
350
 
was run and passed.
351
 
 
352
 
Several different cases are distinguished:
353
 
 
354
 
TestSkipped
355
 
        Generic skip; the only type that was present up to bzr 0.18.
356
 
 
357
 
TestNotApplicable
358
 
        The test doesn't apply to the parameters with which it was run.
359
 
        This is typically used when the test is being applied to all
360
 
        implementations of an interface, but some aspects of the interface
361
 
        are optional and not present in particular concrete
362
 
        implementations.  (Some tests that should raise this currently
363
 
        either silently return or raise TestSkipped.)  Another option is
364
 
        to use more precise parameterization to avoid generating the test
365
 
        at all.
366
 
 
367
 
TestPlatformLimit
368
 
        **(Not implemented yet)**
369
 
        The test can't be run because of an inherent limitation of the
370
 
        environment, such as not having symlinks or not supporting
371
 
        unicode.
372
 
 
373
 
UnavailableFeature
374
 
        The test can't be run because a dependency (typically a Python
375
 
        library) is not available in the test environment.  These
376
 
        are in general things that the person running the test could fix 
377
 
        by installing the library.  It's OK if some of these occur when 
378
 
        an end user runs the tests or if we're specifically testing in a
379
 
        limited environment, but a full test should never see them.
380
 
 
381
 
KnownFailure
382
 
        The test exists but is known to fail, for example because the 
383
 
        code to fix it hasn't been run yet.  Raising this allows 
384
 
        you to distinguish these failures from the ones that are not 
385
 
        expected to fail.  This could be conditionally raised if something
386
 
        is broken on some platforms but not on others.
387
 
 
388
 
We plan to support three modes for running the test suite to control the
389
 
interpretation of these results.  Strict mode is for use in situations
390
 
like merges to the mainline and releases where we want to make sure that
391
 
everything that can be tested has been tested.  Lax mode is for use by
392
 
developers who want to temporarily tolerate some known failures.  The
393
 
default behaviour is obtained by ``bzr selftest`` with no options, and
394
 
also (if possible) by running under another unittest harness.
395
 
 
396
 
======================= ======= ======= ========
397
 
result                  strict  default lax
398
 
======================= ======= ======= ========
399
 
TestSkipped             pass    pass    pass
400
 
TestNotApplicable       pass    pass    pass
401
 
TestPlatformLimit       pass    pass    pass
402
 
TestDependencyMissing   fail    pass    pass
403
 
KnownFailure            fail    pass    pass
404
 
======================= ======= ======= ========
405
 
     
406
 
 
407
 
Test feature dependencies
408
 
-------------------------
409
 
 
410
 
Rather than manually checking the environment in each test, a test class
411
 
can declare its dependence on some test features.  The feature objects are
412
 
checked only once for each run of the whole test suite.
413
 
 
414
 
For historical reasons, as of May 2007 many cases that should depend on
415
 
features currently raise TestSkipped.)
416
 
 
417
 
::
418
 
 
419
 
    class TestStrace(TestCaseWithTransport):
420
 
 
421
 
        _test_needs_features = [StraceFeature]
422
 
 
423
 
This means all tests in this class need the feature.  The feature itself
424
 
should provide a ``_probe`` method which is called once to determine if
425
 
it's available.
426
 
 
427
 
These should generally be equivalent to either TestDependencyMissing or
428
 
sometimes TestPlatformLimit.
429
 
 
430
 
 
431
 
Known failures
432
 
--------------
433
 
 
434
 
Known failures are when a test exists but we know it currently doesn't
435
 
work, allowing the test suite to still pass.  These should be used with
436
 
care, we don't want a proliferation of quietly broken tests.  It might be
437
 
appropriate to use them if you've committed a test for a bug but not the
438
 
fix for it, or if something works on Unix but not on Windows.
439
 
 
440
 
 
441
 
Testing exceptions and errors
442
 
-----------------------------
443
 
 
444
 
It's important to test handling of errors and exceptions.  Because this
445
 
code is often not hit in ad-hoc testing it can often have hidden bugs --
446
 
it's particularly common to get NameError because the exception code
447
 
references a variable that has since been renamed.
448
 
 
449
 
.. TODO: Something about how to provoke errors in the right way?
450
 
 
451
 
In general we want to test errors at two levels:
452
 
 
453
 
1. A test in ``test_errors.py`` checking that when the exception object is
454
 
   constructed with known parameters it produces an expected string form.
455
 
   This guards against mistakes in writing the format string, or in the
456
 
   ``str`` representations of its parameters.  There should be one for
457
 
   each exception class.
458
 
 
459
 
2. Tests that when an api is called in a particular situation, it raises
460
 
   an error of the expected class.  You should typically use
461
 
   ``assertRaises``, which in the Bazaar test suite returns the exception
462
 
   object to allow you to examine its parameters.  
463
 
 
464
 
In some cases blackbox tests will also want to check error reporting.  But
465
 
it can be difficult to provoke every error through the commandline
466
 
interface, so those tests are only done as needed -- eg in response to a
467
 
particular bug or if the error is reported in an unusual way(?)  Blackbox
468
 
tests should mostly be testing how the command-line interface works, so
469
 
should only test errors if there is something particular to the cli in how
470
 
they're displayed or handled.
471
 
 
472
 
 
473
 
Testing warnings
474
 
----------------
475
 
 
476
 
The Python ``warnings`` module is used to indicate a non-fatal code
477
 
problem.  Code that's expected to raise a warning can be tested through
478
 
callCatchWarnings.
479
 
 
480
 
The test suite can be run with ``-Werror`` to check no unexpected errors
481
 
occur.
482
 
 
483
 
However, warnings should be used with discretion.  It's not an appropriate
484
 
way to give messages to the user, because the warning is normally shown
485
 
only once per source line that causes the problem.  You should also think
486
 
about whether the warning is serious enought that it should be visible to
487
 
users who may not be able to fix it.
488
 
 
489
 
 
490
 
Interface implementation testing and test scenarios
491
 
---------------------------------------------------
492
 
 
493
 
There are several cases in Bazaar of multiple implementations of a common 
494
 
conceptual interface.  ("Conceptual" because 
495
 
it's not necessary for all the implementations to share a base class,
496
 
though they often do.)  Examples include transports and the working tree,
497
 
branch and repository classes. 
498
 
 
499
 
In these cases we want to make sure that every implementation correctly
500
 
fulfils the interface requirements.  For example, every Transport should
501
 
support the ``has()`` and ``get()`` and ``clone()`` methods.  We have a
502
 
sub-suite of tests in ``test_transport_implementations``.  (Most
503
 
per-implementation tests are in submodules of ``bzrlib.tests``, but not
504
 
the transport tests at the moment.)  
505
 
 
506
 
These tests are repeated for each registered Transport, by generating a
507
 
new TestCase instance for the cross product of test methods and transport
508
 
implementations.  As each test runs, it has ``transport_class`` and
509
 
``transport_server`` set to the class it should test.  Most tests don't
510
 
access these directly, but rather use ``self.get_transport`` which returns
511
 
a transport of the appropriate type.
512
 
 
513
 
The goal is to run per-implementation only tests that relate to that
514
 
particular interface.  Sometimes we discover a bug elsewhere that happens
515
 
with only one particular transport.  Once it's isolated, we can consider 
516
 
whether a test should be added for that particular implementation,
517
 
or for all implementations of the interface.
518
 
 
519
 
The multiplication of tests for different implementations is normally 
520
 
accomplished by overriding the ``test_suite`` function used to load 
521
 
tests from a module.  This function typically loads all the tests,
522
 
then applies a TestProviderAdapter to them, which generates a longer 
523
 
suite containing all the test variations.
524
 
 
525
 
 
526
 
Test scenarios
527
 
--------------
528
 
 
529
 
Some utilities are provided for generating variations of tests.  This can
530
 
be used for per-implementation tests, or other cases where the same test
531
 
code needs to run several times on different scenarios.
532
 
 
533
 
The general approach is to define a class that provides test methods,
534
 
which depend on attributes of the test object being pre-set with the
535
 
values to which the test should be applied.  The test suite should then
536
 
also provide a list of scenarios in which to run the tests.
537
 
 
538
 
Typically ``multiply_tests_from_modules`` should be called from the test
539
 
module's ``test_suite`` function.
 
218
.. Was at <http://bazaar-vcs.org/NewDeveloperIntroduction>
 
219
 
 
220
Some of the key files in this directory are:
 
221
 
 
222
bzr
 
223
    The command you run to start Bazaar itself.  This script is pretty
 
224
    short and just does some checks then jumps into bzrlib.
 
225
 
 
226
README
 
227
    This file covers a brief introduction to Bazaar and lists some of its
 
228
    key features. 
 
229
 
 
230
NEWS
 
231
    Summary of changes in each Bazaar release that can affect users or 
 
232
    plugin developers.
 
233
 
 
234
setup.py
 
235
    Installs Bazaar system-wide or to your home directory.  To perform
 
236
    development work on Bazaar it is not required to run this file - you
 
237
    can simply run the bzr command from the top level directory of your
 
238
    development copy. Note: That if you run setup.py this will create a
 
239
    'build' directory in your development branch. There's nothing wrong
 
240
    with this but don't be confused by it. The build process puts a copy
 
241
    of the main code base into this build directory, along with some other
 
242
    files. You don't need to go in here for anything discussed in this
 
243
    guide. 
 
244
 
 
245
bzrlib
 
246
    Possibly the most exciting folder of all, bzrlib holds the main code
 
247
    base. This is where you will go to edit python files and contribute to
 
248
    Bazaar.
 
249
 
 
250
doc
 
251
    Holds documentation on a whole range of things on Bazaar from the
 
252
    origination of ideas within the project to information on Bazaar
 
253
    features and use cases.  Within this directory there is a subdirectory
 
254
    for each translation into a human language.  All the documentation 
 
255
    is in the ReStructuredText markup language.
 
256
 
 
257
doc/developers 
 
258
    Documentation specifically targetted at Bazaar and plugin developers.
 
259
    (Including this document.)
 
260
    
 
261
        
 
262
 
 
263
Automatically-generated API reference information is available at 
 
264
<http://starship.python.net/crew/mwh/bzrlibapi/>.  
 
265
(There is an experimental editable version at 
 
266
<http://starship.python.net/crew/mwh/bzrlibapi-oe/>.)
 
267
See also the `Essential Domain Classes`_
 
268
section of this guide.
540
269
 
541
270
 
542
271
Essential Domain Classes
608
337
the form of URL components.
609
338
 
610
339
 
611
 
Core Topics
612
 
###########
613
 
 
614
 
Evolving Interfaces
615
 
===================
616
 
 
617
 
We have a commitment to 6 months API stability - any supported symbol in a
618
 
release of bzr MUST NOT be altered in any way that would result in
619
 
breaking existing code that uses it. That means that method names,
620
 
parameter ordering, parameter names, variable and attribute names etc must
621
 
not be changed without leaving a 'deprecated forwarder' behind. This even
622
 
applies to modules and classes.
623
 
 
624
 
If you wish to change the behaviour of a supported API in an incompatible
625
 
way, you need to change its name as well. For instance, if I add an optional keyword
626
 
parameter to branch.commit - that's fine. On the other hand, if I add a
627
 
keyword parameter to branch.commit which is a *required* transaction
628
 
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
629
 
 
630
 
When renaming such supported API's, be sure to leave a deprecated_method (or
631
 
_function or ...) behind which forwards to the new API. See the
632
 
bzrlib.symbol_versioning module for decorators that take care of the
633
 
details for you - such as updating the docstring, and issuing a warning
634
 
when the old api is used.
635
 
 
636
 
For unsupported API's, it does not hurt to follow this discipline, but it's
637
 
not required. Minimally though, please try to rename things so that
638
 
callers will at least get an AttributeError rather than weird results.
639
 
 
640
 
 
641
 
Deprecation decorators
642
 
----------------------
643
 
 
644
 
``bzrlib.symbol_versioning`` provides decorators that can be attached to
645
 
methods, functions, and other interfaces to indicate that they should no
646
 
longer be used.
647
 
 
648
 
To deprecate a static method you must call ``deprecated_function``
649
 
(**not** method), after the staticmethod call::
650
 
 
651
 
    @staticmethod
652
 
    @deprecated_function(zero_ninetyone)
653
 
    def create_repository(base, shared=False, format=None):
654
 
 
655
 
When you deprecate an API, you should not just delete its tests, because
656
 
then we might introduce bugs in them.  If the API is still present at all,
657
 
it should still work.  The basic approach is to use
658
 
``TestCase.applyDeprecated`` which in one step checks that the API gives
659
 
the expected deprecation message, and also returns the real result from
660
 
the method, so that tests can keep running.
661
 
 
662
340
Coding Style Guidelines
663
 
=======================
 
341
#######################
 
342
 
 
343
hasattr and getattr
 
344
===================
 
345
 
 
346
``hasattr`` should not be used because it swallows exceptions including
 
347
``KeyboardInterrupt``.  Instead, say something like ::
 
348
 
 
349
  if getattr(thing, 'name', None) is None
 
350
 
664
351
 
665
352
Code layout
666
 
-----------
 
353
===========
667
354
 
668
355
Please write PEP-8__ compliant code.  
669
356
 
752
439
 
753
440
 
754
441
Module Imports
755
 
--------------
 
442
==============
756
443
 
757
444
* Imports should be done at the top-level of the file, unless there is
758
445
  a strong reason to have them lazily loaded when a particular
764
451
 
765
452
 
766
453
Naming
767
 
------
 
454
======
768
455
 
769
456
Functions, methods or members that are "private" to bzrlib are given
770
457
a leading underscore prefix.  Names without a leading underscore are
787
474
 
788
475
 
789
476
Standard Names
790
 
--------------
 
477
==============
791
478
 
792
479
``revision_id`` not ``rev_id`` or ``revid``
793
480
 
796
483
 
797
484
 
798
485
Destructors
799
 
-----------
 
486
===========
800
487
 
801
488
Python destructors (``__del__``) work differently to those of other
802
489
languages.  In particular, bear in mind that destructors may be called
804
491
later time, or possibly never at all.  Therefore we have restrictions on
805
492
what can be done inside them.
806
493
 
807
 
 0. Never use a __del__ method without asking Martin/Robert first.
 
494
 0. If you think you need to use a ``__del__`` method ask another
 
495
    developer for alternatives.  If you do need to use one, explain
 
496
    why in a comment.
808
497
 
809
498
 1. Never rely on a ``__del__`` method running.  If there is code that
810
499
    must run, do it from a ``finally`` block instead.
818
507
 
819
508
 
820
509
Factories
821
 
---------
 
510
=========
822
511
 
823
512
In some places we have variables which point to callables that construct
824
513
new instances.  That is to say, they can be used a lot like class objects,
833
522
 
834
523
 
835
524
Registries
836
 
----------
 
525
==========
837
526
 
838
527
Several places in Bazaar use (or will use) a registry, which is a 
839
528
mapping from names to objects or classes.  The registry allows for 
841
530
associated information such as a help string or description.
842
531
 
843
532
 
 
533
InterObject and multiple dispatch
 
534
=================================
 
535
 
 
536
The ``InterObject`` provides for two-way `multiple dispatch`__: matching
 
537
up for example a source and destination repository to find the right way
 
538
to transfer data between them. 
 
539
 
 
540
.. __: http://en.wikipedia.org/wiki/Multiple_dispatch
 
541
 
 
542
There is a subclass ``InterObject`` classes for each type of object that is
 
543
dispatched this way, e.g. ``InterRepository``.  Calling ``.get()`` on this
 
544
class will return an ``InterObject`` instance providing the best match for 
 
545
those parameters, and this instance then has methods for operations
 
546
between the objects.
 
547
 
 
548
  inter = InterRepository.get(source_repo, target_repo)
 
549
  inter.fetch(revision_id)
 
550
 
 
551
``InterRepository`` also acts as a registry-like object for its
 
552
subclasses, and they can be added through ``.register_optimizer``.  The
 
553
right one to run is selected by asking each class, in reverse order of
 
554
registration, whether it ``.is_compatible`` with the relevant objects.
 
555
 
844
556
Lazy Imports
845
 
------------
 
557
============
846
558
 
847
559
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
848
560
delay importing modules until they are actually used. ``lazy_import`` uses
872
584
the variable is a module, and these object should be hidden anyway, since
873
585
they shouldn't be imported into other namespaces.
874
586
 
875
 
 
876
 
Modules versus Members
877
 
~~~~~~~~~~~~~~~~~~~~~~
878
 
 
879
587
While it is possible for ``lazy_import()`` to import members of a module
880
588
when using the ``from module import member`` syntax, it is recommended to
881
589
only use that syntax to load sub modules ``from module import submodule``.
892
600
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
893
601
object, rather than the real class.
894
602
 
895
 
 
896
 
Passing to Other Variables
897
 
~~~~~~~~~~~~~~~~~~~~~~~~~~
898
 
 
899
603
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
900
604
Because the replacer only knows about the original name, it is unable to
901
605
replace other variables. The ``ImportReplacer`` class will raise an
905
609
 
906
610
 
907
611
The Null revision
908
 
-----------------
 
612
=================
909
613
 
910
614
The null revision is the ancestor of all revisions.  Its revno is 0, its
911
615
revision-id is ``null:``, and its tree is the empty tree.  When referring
914
618
being phased out.
915
619
 
916
620
 
 
621
Object string representations
 
622
=============================
 
623
 
 
624
Python prints objects using their ``__repr__`` method when they are
 
625
written to logs, exception tracebacks, or the debugger.  We want
 
626
objects to have useful representations to help in determining what went
 
627
wrong.
 
628
 
 
629
If you add a new class you should generally add a ``__repr__`` method
 
630
unless there is an adequate method in a parent class.  There should be a
 
631
test for the repr.  
 
632
 
 
633
Representations should typically look like Python constructor syntax, but
 
634
they don't need to include every value in the object and they don't need
 
635
to be able to actually execute.  They're to be read by humans, not
 
636
machines.  Don't hardcode the classname in the format, so that we get the
 
637
correct value if the method is inherited by a subclass.  If you're
 
638
printing attributes of the object, including strings, you should normally
 
639
use ``%r`` syntax (to call their repr in turn).
 
640
 
 
641
Try to avoid the representation becoming more than one or two lines long.
 
642
(But balance this against including useful information, and simplicity of
 
643
implementation.)
 
644
 
 
645
Because repr methods are often called when something has already gone
 
646
wrong, they should be written somewhat more defensively than most code.
 
647
The object may be half-initialized or in some other way in an illegal
 
648
state.  The repr method shouldn't raise an exception, or it may hide the
 
649
(probably more useful) underlying exception.
 
650
 
 
651
Example::
 
652
 
 
653
    def __repr__(self):
 
654
        return '%s(%r)' % (self.__class__.__name__,
 
655
                           self._transport)
 
656
 
 
657
 
 
658
Exception handling
 
659
==================
 
660
 
 
661
A bare ``except`` statement will catch all exceptions, including ones that
 
662
really should terminate the program such as ``MemoryError`` and
 
663
``KeyboardInterrupt``.  They should rarely be used unless the exception is
 
664
later re-raised.  Even then, think about whether catching just
 
665
``Exception`` (which excludes system errors in Python2.5 and later) would
 
666
be better.
 
667
 
 
668
 
 
669
Test coverage
 
670
=============
 
671
 
 
672
All code should be exercised by the test suite.  See `Guide to Testing
 
673
Bazaar <testing.html>`_ for detailed information about writing tests.
 
674
 
 
675
 
 
676
Core Topics
 
677
###########
 
678
 
 
679
Evolving Interfaces
 
680
===================
 
681
 
 
682
We have a commitment to 6 months API stability - any supported symbol in a
 
683
release of bzr MUST NOT be altered in any way that would result in
 
684
breaking existing code that uses it. That means that method names,
 
685
parameter ordering, parameter names, variable and attribute names etc must
 
686
not be changed without leaving a 'deprecated forwarder' behind. This even
 
687
applies to modules and classes.
 
688
 
 
689
If you wish to change the behaviour of a supported API in an incompatible
 
690
way, you need to change its name as well. For instance, if I add an optional keyword
 
691
parameter to branch.commit - that's fine. On the other hand, if I add a
 
692
keyword parameter to branch.commit which is a *required* transaction
 
693
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
 
694
 
 
695
When renaming such supported API's, be sure to leave a deprecated_method (or
 
696
_function or ...) behind which forwards to the new API. See the
 
697
bzrlib.symbol_versioning module for decorators that take care of the
 
698
details for you - such as updating the docstring, and issuing a warning
 
699
when the old api is used.
 
700
 
 
701
For unsupported API's, it does not hurt to follow this discipline, but it's
 
702
not required. Minimally though, please try to rename things so that
 
703
callers will at least get an AttributeError rather than weird results.
 
704
 
 
705
 
 
706
Deprecation decorators
 
707
----------------------
 
708
 
 
709
``bzrlib.symbol_versioning`` provides decorators that can be attached to
 
710
methods, functions, and other interfaces to indicate that they should no
 
711
longer be used.  For example::
 
712
 
 
713
   @deprecated_method(deprecated_in((0, 1, 4)))
 
714
   def foo(self):
 
715
        return self._new_foo()
 
716
 
 
717
To deprecate a static method you must call ``deprecated_function``
 
718
(**not** method), after the staticmethod call::
 
719
 
 
720
    @staticmethod
 
721
    @deprecated_function(deprecated_in((0, 1, 4)))
 
722
    def create_repository(base, shared=False, format=None):
 
723
 
 
724
When you deprecate an API, you should not just delete its tests, because
 
725
then we might introduce bugs in them.  If the API is still present at all,
 
726
it should still work.  The basic approach is to use
 
727
``TestCase.applyDeprecated`` which in one step checks that the API gives
 
728
the expected deprecation message, and also returns the real result from
 
729
the method, so that tests can keep running.
 
730
 
 
731
Deprecation warnings will be suppressed for final releases, but not for
 
732
development versions or release candidates, or when running ``bzr
 
733
selftest``. This gives developers information about whether their code is
 
734
using deprecated functions, but avoids confusing users about things they
 
735
can't fix.
 
736
 
 
737
 
917
738
Getting Input
918
739
=============
919
740
 
992
813
sentences.
993
814
 
994
815
 
995
 
Writing tests
996
 
=============
997
 
 
998
 
In general tests should be placed in a file named test_FOO.py where 
999
 
FOO is the logical thing under test. That file should be placed in the
1000
 
tests subdirectory under the package being tested.
1001
 
 
1002
 
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
1003
 
See bzrlib/tests/test_sampler.py for a template test script.
1004
 
 
1005
 
Tests can be written for the UI or for individual areas of the library.
1006
 
Choose whichever is appropriate: if adding a new command, or a new command 
1007
 
option, then you should be writing a UI test.  If you are both adding UI
1008
 
functionality and library functionality, you will want to write tests for 
1009
 
both the UI and the core behaviours.  We call UI tests 'blackbox' tests
1010
 
and they are found in ``bzrlib/tests/blackbox/*.py``. 
1011
 
 
1012
 
When writing blackbox tests please honour the following conventions:
1013
 
 
1014
 
 1. Place the tests for the command 'name' in
1015
 
    bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
1016
 
    to locate the test script for a faulty command.
1017
 
 
1018
 
 2. Use the 'self.run_bzr("name")' utility function to invoke the command
1019
 
    rather than running bzr in a subprocess or invoking the
1020
 
    cmd_object.run() method directly. This is a lot faster than
1021
 
    subprocesses and generates the same logging output as running it in a
1022
 
    subprocess (which invoking the method directly does not).
1023
 
 
1024
 
 3. Only test the one command in a single test script. Use the bzrlib 
1025
 
    library when setting up tests and when evaluating the side-effects of
1026
 
    the command. We do this so that the library api has continual pressure
1027
 
    on it to be as functional as the command line in a simple manner, and
1028
 
    to isolate knock-on effects throughout the blackbox test suite when a
1029
 
    command changes its name or signature. Ideally only the tests for a
1030
 
    given command are affected when a given command is changed.
1031
 
 
1032
 
 4. If you have a test which does actually require running bzr in a
1033
 
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
1034
 
    process will not load plugins unless ``--allow-plugins`` is supplied.
1035
 
 
1036
 
 
1037
 
Test support
1038
 
------------
1039
 
 
1040
 
We have a rich collection of tools to support writing tests. Please use
1041
 
them in preference to ad-hoc solutions as they provide portability and
1042
 
performance benefits.
1043
 
 
1044
 
TreeBuilder
1045
 
~~~~~~~~~~~
1046
 
 
1047
 
The ``TreeBuilder`` interface allows the construction of arbitrary trees
1048
 
with a declarative interface. A sample session might look like::
1049
 
 
1050
 
  tree = self.make_branch_and_tree('path')
1051
 
  builder = TreeBuilder()
1052
 
  builder.start_tree(tree)
1053
 
  builder.build(['foo', "bar/", "bar/file"])
1054
 
  tree.commit('commit the tree')
1055
 
  builder.finish_tree()
1056
 
 
1057
 
Please see bzrlib.treebuilder for more details.
1058
 
 
1059
 
BranchBuilder
1060
 
~~~~~~~~~~~~~
1061
 
 
1062
 
The ``BranchBuilder`` interface allows the creation of test branches in a
1063
 
quick and easy manner. A sample session::
1064
 
 
1065
 
  builder = BranchBuilder(self.get_transport().clone('relpath'))
1066
 
  builder.build_commit()
1067
 
  builder.build_commit()
1068
 
  builder.build_commit()
1069
 
  branch = builder.get_branch()
1070
 
 
1071
 
Please see bzrlib.branchbuilder for more details.
1072
 
 
1073
 
Doctests
1074
 
--------
1075
 
 
1076
 
We make selective use of doctests__.  In general they should provide 
1077
 
*examples* within the API documentation which can incidentally be tested.  We 
1078
 
don't try to test every important case using doctests -- regular Python
1079
 
tests are generally a better solution.
1080
 
 
1081
 
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
1082
 
 
1083
 
  __ http://docs.python.org/lib/module-doctest.html
1084
 
 
1085
 
 
1086
 
Running tests
1087
 
=============
1088
 
Currently, bzr selftest is used to invoke tests.
1089
 
You can provide a pattern argument to run a subset. For example, 
1090
 
to run just the blackbox tests, run::
1091
 
 
1092
 
  ./bzr selftest -v blackbox
1093
 
 
1094
 
To skip a particular test (or set of tests), use the --exclude option
1095
 
(shorthand -x) like so::
1096
 
 
1097
 
  ./bzr selftest -v -x blackbox  
1098
 
 
1099
 
To list tests without running them, use the --list-only option like so::
1100
 
 
1101
 
  ./bzr selftest --list-only
1102
 
 
1103
 
This option can be combined with other selftest options (like -x) and
1104
 
filter patterns to understand their effect.
1105
 
 
1106
 
 
1107
816
Handling Errors and Exceptions
1108
817
==============================
1109
818
 
1156
865
final fullstop.  If long, they may contain newlines to break the text.
1157
866
 
1158
867
 
 
868
Assertions
 
869
==========
 
870
 
 
871
Do not use the Python ``assert`` statement, either in tests or elsewhere.
 
872
A source test checks that it is not used.  It is ok to explicitly raise
 
873
AssertionError.
 
874
 
 
875
Rationale:
 
876
 
 
877
 * It makes the behaviour vary depending on whether bzr is run with -O
 
878
   or not, therefore giving a chance for bugs that occur in one case or
 
879
   the other, several of which have already occurred: assertions with
 
880
   side effects, code which can't continue unless the assertion passes,
 
881
   cases where we should give the user a proper message rather than an
 
882
   assertion failure.
 
883
 * It's not that much shorter than an explicit if/raise.
 
884
 * It tends to lead to fuzzy thinking about whether the check is
 
885
   actually needed or not, and whether it's an internal error or not
 
886
 * It tends to cause look-before-you-leap patterns.
 
887
 * It's unsafe if the check is needed to protect the integrity of the
 
888
   user's data.
 
889
 * It tends to give poor messages since the developer can get by with
 
890
   no explanatory text at all.
 
891
 * We can't rely on people always running with -O in normal use, so we
 
892
   can't use it for tests that are actually expensive.
 
893
 * Expensive checks that help developers are better turned on from the
 
894
   test suite or a -D flag.
 
895
 * If used instead of ``self.assert*()`` in tests it makes them falsely pass with -O.
 
896
 
 
897
 
1159
898
Documenting Changes
1160
899
===================
1161
900
 
1424
1163
* reviewing changes
1425
1164
* reviewing blueprints
1426
1165
* planning releases
1427
 
* managing releases.
 
1166
* managing releases (see the `Releasing Bazaar <../../developers/releasing.html>`_)
1428
1167
 
1429
1168
.. note::
1430
1169
  Removing barriers to community participation is a key reason for adopting
1435
1174
  differences between core and non-core contributors to a minimum.
1436
1175
 
1437
1176
 
1438
 
The Development Lifecycle
1439
 
-------------------------
1440
 
 
1441
 
As a rule, Bazaar development follows a 4 week cycle:
1442
 
 
1443
 
* 2 weeks - general changes
1444
 
* 1 week - feature freeze
1445
 
* 1 week+ - Release Candidate stabilization
1446
 
 
1447
 
During the FeatureFreeze week, the trunk (bzr.dev) is open in a limited
1448
 
way: only low risk changes, critical and high priority fixes are accepted
1449
 
during this time. At the end of FeatureFreeze, a branch is created for the
1450
 
first Release Candidate and the trunk is reopened for general development
1451
 
on the *next* release. A week or so later, the final release is packaged
1452
 
assuming no serious problems were encountered with the one or more Release
1453
 
Candidates.
1454
 
 
1455
 
.. note::
1456
 
  There is a one week overlap between the start of one release and
1457
 
  the end of the previous one.
1458
 
 
1459
 
 
1460
1177
Communicating and Coordinating
1461
1178
------------------------------
1462
1179
 
1737
1454
.. note::
1738
1455
  As well as prioritizing bugs and nominating them against a
1739
1456
  target milestone, Launchpad lets core developers offer to mentor others in
1740
 
  fixing them. Nice.
1741
 
 
1742
 
 
1743
 
Managing a Release
1744
 
==================
1745
 
 
1746
 
Starting a Release
1747
 
------------------
1748
 
 
1749
 
TODO: Things to cover:
1750
 
 
1751
 
* RFI on release objectives
1752
 
* RFI on higher risk things that are best done early, e.g. changes to file
1753
 
  format defaults
1754
 
* Communication of proposed dates
1755
 
 
1756
 
 
1757
 
Weekly Status Updates
1758
 
---------------------
1759
 
 
1760
 
TODO: Things to cover:
1761
 
 
1762
 
* Early communication to downstream teams (e.g. Launchpad) about changes in dependencies.
1763
 
* Reminder re lifecycle and where we're up to right now
1764
 
* Summary of recent successes and pending work
1765
 
* Reminder re release objectives
1766
 
* Reminder re things needing attention, e.g. bug triage, reviews, testing of certain things, etc.
1767
 
 
1768
 
 
1769
 
Feature Freeze
1770
 
--------------
1771
 
 
1772
 
TODO: Get material from http://bazaar-vcs.org/FeatureFreeze.
1773
 
 
1774
 
 
1775
 
Release Candidates
1776
 
------------------
1777
 
 
1778
 
TODO: Get material from http://bazaar-vcs.org/ReleaseChecklist and clean
1779
 
it up to make it clearer what the RC vs final vs both tasks are.
1780
 
 
1781
 
 
1782
 
The Final Release
1783
 
-----------------
1784
 
 
1785
 
TODO: Get material from http://bazaar-vcs.org/ReleaseChecklist and clean
1786
 
it up to make it clearer what the RC vs final vs both tasks are.
 
1457
  fixing them. 
 
1458
 
1787
1459
 
1788
1460
..
1789
1461
   vim: ft=rst tw=74 ai