~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/HACKING.txt

  • Committer: John Arbash Meinel
  • Date: 2008-08-25 21:50:11 UTC
  • mfrom: (0.11.3 tools)
  • mto: This revision was merged to the branch mainline in revision 3659.
  • Revision ID: john@arbash-meinel.com-20080825215011-de9esmzgkue3e522
Merge in Lukáš's helper scripts.
Update the packaging documents to describe how to do the releases
using bzr-builddeb to package all distro platforms
simultaneously.

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
 
Interface implementation testing and test scenarios
474
 
---------------------------------------------------
475
 
 
476
 
There are several cases in Bazaar of multiple implementations of a common 
477
 
conceptual interface.  ("Conceptual" because 
478
 
it's not necessary for all the implementations to share a base class,
479
 
though they often do.)  Examples include transports and the working tree,
480
 
branch and repository classes. 
481
 
 
482
 
In these cases we want to make sure that every implementation correctly
483
 
fulfils the interface requirements.  For example, every Transport should
484
 
support the ``has()`` and ``get()`` and ``clone()`` methods.  We have a
485
 
sub-suite of tests in ``test_transport_implementations``.  (Most
486
 
per-implementation tests are in submodules of ``bzrlib.tests``, but not
487
 
the transport tests at the moment.)  
488
 
 
489
 
These tests are repeated for each registered Transport, by generating a
490
 
new TestCase instance for the cross product of test methods and transport
491
 
implementations.  As each test runs, it has ``transport_class`` and
492
 
``transport_server`` set to the class it should test.  Most tests don't
493
 
access these directly, but rather use ``self.get_transport`` which returns
494
 
a transport of the appropriate type.
495
 
 
496
 
The goal is to run per-implementation only tests that relate to that
497
 
particular interface.  Sometimes we discover a bug elsewhere that happens
498
 
with only one particular transport.  Once it's isolated, we can consider 
499
 
whether a test should be added for that particular implementation,
500
 
or for all implementations of the interface.
501
 
 
502
 
The multiplication of tests for different implementations is normally 
503
 
accomplished by overriding the ``test_suite`` function used to load 
504
 
tests from a module.  This function typically loads all the tests,
505
 
then applies a TestProviderAdapter to them, which generates a longer 
506
 
suite containing all the test variations.
507
 
 
508
 
 
509
 
Test scenarios
510
 
--------------
511
 
 
512
 
Some utilities are provided for generating variations of tests.  This can
513
 
be used for per-implementation tests, or other cases where the same test
514
 
code needs to run several times on different scenarios.
515
 
 
516
 
The general approach is to define a class that provides test methods,
517
 
which depend on attributes of the test object being pre-set with the
518
 
values to which the test should be applied.  The test suite should then
519
 
also provide a list of scenarios in which to run the tests.
520
 
 
521
 
Typically ``multiply_tests_from_modules`` should be called from the test
522
 
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.
523
269
 
524
270
 
525
271
Essential Domain Classes
591
337
the form of URL components.
592
338
 
593
339
 
594
 
Core Topics
595
 
###########
596
 
 
597
 
Evolving Interfaces
598
 
===================
599
 
 
600
 
We have a commitment to 6 months API stability - any supported symbol in a
601
 
release of bzr MUST NOT be altered in any way that would result in
602
 
breaking existing code that uses it. That means that method names,
603
 
parameter ordering, parameter names, variable and attribute names etc must
604
 
not be changed without leaving a 'deprecated forwarder' behind. This even
605
 
applies to modules and classes.
606
 
 
607
 
If you wish to change the behaviour of a supported API in an incompatible
608
 
way, you need to change its name as well. For instance, if I add an optional keyword
609
 
parameter to branch.commit - that's fine. On the other hand, if I add a
610
 
keyword parameter to branch.commit which is a *required* transaction
611
 
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
612
 
 
613
 
When renaming such supported API's, be sure to leave a deprecated_method (or
614
 
_function or ...) behind which forwards to the new API. See the
615
 
bzrlib.symbol_versioning module for decorators that take care of the
616
 
details for you - such as updating the docstring, and issuing a warning
617
 
when the old api is used.
618
 
 
619
 
For unsupported API's, it does not hurt to follow this discipline, but it's
620
 
not required. Minimally though, please try to rename things so that
621
 
callers will at least get an AttributeError rather than weird results.
622
 
 
623
 
 
624
 
Deprecation decorators
625
 
----------------------
626
 
 
627
 
``bzrlib.symbol_versioning`` provides decorators that can be attached to
628
 
methods, functions, and other interfaces to indicate that they should no
629
 
longer be used.
630
 
 
631
 
To deprecate a static method you must call ``deprecated_function``
632
 
(**not** method), after the staticmethod call::
633
 
 
634
 
    @staticmethod
635
 
    @deprecated_function(zero_ninetyone)
636
 
    def create_repository(base, shared=False, format=None):
637
 
 
638
 
When you deprecate an API, you should not just delete its tests, because
639
 
then we might introduce bugs in them.  If the API is still present at all,
640
 
it should still work.  The basic approach is to use
641
 
``TestCase.applyDeprecated`` which in one step checks that the API gives
642
 
the expected deprecation message, and also returns the real result from
643
 
the method, so that tests can keep running.
644
 
 
645
340
Coding Style Guidelines
646
 
=======================
 
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
 
647
351
 
648
352
Code layout
649
 
-----------
 
353
===========
650
354
 
651
355
Please write PEP-8__ compliant code.  
652
356
 
735
439
 
736
440
 
737
441
Module Imports
738
 
--------------
 
442
==============
739
443
 
740
444
* Imports should be done at the top-level of the file, unless there is
741
445
  a strong reason to have them lazily loaded when a particular
747
451
 
748
452
 
749
453
Naming
750
 
------
 
454
======
751
455
 
752
456
Functions, methods or members that are "private" to bzrlib are given
753
457
a leading underscore prefix.  Names without a leading underscore are
770
474
 
771
475
 
772
476
Standard Names
773
 
--------------
 
477
==============
774
478
 
775
479
``revision_id`` not ``rev_id`` or ``revid``
776
480
 
779
483
 
780
484
 
781
485
Destructors
782
 
-----------
 
486
===========
783
487
 
784
488
Python destructors (``__del__``) work differently to those of other
785
489
languages.  In particular, bear in mind that destructors may be called
787
491
later time, or possibly never at all.  Therefore we have restrictions on
788
492
what can be done inside them.
789
493
 
790
 
 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.
791
497
 
792
498
 1. Never rely on a ``__del__`` method running.  If there is code that
793
499
    must run, do it from a ``finally`` block instead.
801
507
 
802
508
 
803
509
Factories
804
 
---------
 
510
=========
805
511
 
806
512
In some places we have variables which point to callables that construct
807
513
new instances.  That is to say, they can be used a lot like class objects,
816
522
 
817
523
 
818
524
Registries
819
 
----------
 
525
==========
820
526
 
821
527
Several places in Bazaar use (or will use) a registry, which is a 
822
528
mapping from names to objects or classes.  The registry allows for 
824
530
associated information such as a help string or description.
825
531
 
826
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
 
827
556
Lazy Imports
828
 
------------
 
557
============
829
558
 
830
559
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
831
560
delay importing modules until they are actually used. ``lazy_import`` uses
855
584
the variable is a module, and these object should be hidden anyway, since
856
585
they shouldn't be imported into other namespaces.
857
586
 
858
 
 
859
 
Modules versus Members
860
 
~~~~~~~~~~~~~~~~~~~~~~
861
 
 
862
587
While it is possible for ``lazy_import()`` to import members of a module
863
588
when using the ``from module import member`` syntax, it is recommended to
864
589
only use that syntax to load sub modules ``from module import submodule``.
875
600
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
876
601
object, rather than the real class.
877
602
 
878
 
 
879
 
Passing to Other Variables
880
 
~~~~~~~~~~~~~~~~~~~~~~~~~~
881
 
 
882
603
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
883
604
Because the replacer only knows about the original name, it is unable to
884
605
replace other variables. The ``ImportReplacer`` class will raise an
888
609
 
889
610
 
890
611
The Null revision
891
 
-----------------
 
612
=================
892
613
 
893
614
The null revision is the ancestor of all revisions.  Its revno is 0, its
894
615
revision-id is ``null:``, and its tree is the empty tree.  When referring
897
618
being phased out.
898
619
 
899
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
 
900
738
Getting Input
901
739
=============
902
740
 
975
813
sentences.
976
814
 
977
815
 
978
 
Writing tests
979
 
=============
980
 
 
981
 
In general tests should be placed in a file named test_FOO.py where 
982
 
FOO is the logical thing under test. That file should be placed in the
983
 
tests subdirectory under the package being tested.
984
 
 
985
 
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
986
 
See bzrlib/tests/test_sampler.py for a template test script.
987
 
 
988
 
Tests can be written for the UI or for individual areas of the library.
989
 
Choose whichever is appropriate: if adding a new command, or a new command 
990
 
option, then you should be writing a UI test.  If you are both adding UI
991
 
functionality and library functionality, you will want to write tests for 
992
 
both the UI and the core behaviours.  We call UI tests 'blackbox' tests
993
 
and they are found in ``bzrlib/tests/blackbox/*.py``. 
994
 
 
995
 
When writing blackbox tests please honour the following conventions:
996
 
 
997
 
 1. Place the tests for the command 'name' in
998
 
    bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
999
 
    to locate the test script for a faulty command.
1000
 
 
1001
 
 2. Use the 'self.run_bzr("name")' utility function to invoke the command
1002
 
    rather than running bzr in a subprocess or invoking the
1003
 
    cmd_object.run() method directly. This is a lot faster than
1004
 
    subprocesses and generates the same logging output as running it in a
1005
 
    subprocess (which invoking the method directly does not).
1006
 
 
1007
 
 3. Only test the one command in a single test script. Use the bzrlib 
1008
 
    library when setting up tests and when evaluating the side-effects of
1009
 
    the command. We do this so that the library api has continual pressure
1010
 
    on it to be as functional as the command line in a simple manner, and
1011
 
    to isolate knock-on effects throughout the blackbox test suite when a
1012
 
    command changes its name or signature. Ideally only the tests for a
1013
 
    given command are affected when a given command is changed.
1014
 
 
1015
 
 4. If you have a test which does actually require running bzr in a
1016
 
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
1017
 
    process will not load plugins unless ``--allow-plugins`` is supplied.
1018
 
 
1019
 
 
1020
 
Test support
1021
 
------------
1022
 
 
1023
 
We have a rich collection of tools to support writing tests. Please use
1024
 
them in preference to ad-hoc solutions as they provide portability and
1025
 
performance benefits.
1026
 
 
1027
 
TreeBuilder
1028
 
~~~~~~~~~~~
1029
 
 
1030
 
The ``TreeBuilder`` interface allows the construction of arbitrary trees
1031
 
with a declarative interface. A sample session might look like::
1032
 
 
1033
 
  tree = self.make_branch_and_tree('path')
1034
 
  builder = TreeBuilder()
1035
 
  builder.start_tree(tree)
1036
 
  builder.build(['foo', "bar/", "bar/file"])
1037
 
  tree.commit('commit the tree')
1038
 
  builder.finish_tree()
1039
 
 
1040
 
Please see bzrlib.treebuilder for more details.
1041
 
 
1042
 
BranchBuilder
1043
 
~~~~~~~~~~~~~
1044
 
 
1045
 
The ``BranchBuilder`` interface allows the creation of test branches in a
1046
 
quick and easy manner. A sample session::
1047
 
 
1048
 
  builder = BranchBuilder(self.get_transport().clone('relpath'))
1049
 
  builder.build_commit()
1050
 
  builder.build_commit()
1051
 
  builder.build_commit()
1052
 
  branch = builder.get_branch()
1053
 
 
1054
 
Please see bzrlib.branchbuilder for more details.
1055
 
 
1056
 
Doctests
1057
 
--------
1058
 
 
1059
 
We make selective use of doctests__.  In general they should provide 
1060
 
*examples* within the API documentation which can incidentally be tested.  We 
1061
 
don't try to test every important case using doctests -- regular Python
1062
 
tests are generally a better solution.
1063
 
 
1064
 
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
1065
 
 
1066
 
  __ http://docs.python.org/lib/module-doctest.html
1067
 
 
1068
 
 
1069
 
Running tests
1070
 
=============
1071
 
Currently, bzr selftest is used to invoke tests.
1072
 
You can provide a pattern argument to run a subset. For example, 
1073
 
to run just the blackbox tests, run::
1074
 
 
1075
 
  ./bzr selftest -v blackbox
1076
 
 
1077
 
To skip a particular test (or set of tests), use the --exclude option
1078
 
(shorthand -x) like so::
1079
 
 
1080
 
  ./bzr selftest -v -x blackbox  
1081
 
 
1082
 
To list tests without running them, use the --list-only option like so::
1083
 
 
1084
 
  ./bzr selftest --list-only
1085
 
 
1086
 
This option can be combined with other selftest options (like -x) and
1087
 
filter patterns to understand their effect.
1088
 
 
1089
 
 
1090
816
Handling Errors and Exceptions
1091
817
==============================
1092
818
 
1139
865
final fullstop.  If long, they may contain newlines to break the text.
1140
866
 
1141
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
 
1142
898
Documenting Changes
1143
899
===================
1144
900
 
1407
1163
* reviewing changes
1408
1164
* reviewing blueprints
1409
1165
* planning releases
1410
 
* managing releases.
 
1166
* managing releases (see the `Releasing Bazaar <../../developers/releasing.html>`_)
1411
1167
 
1412
1168
.. note::
1413
1169
  Removing barriers to community participation is a key reason for adopting
1418
1174
  differences between core and non-core contributors to a minimum.
1419
1175
 
1420
1176
 
1421
 
The Development Lifecycle
1422
 
-------------------------
1423
 
 
1424
 
As a rule, Bazaar development follows a 4 week cycle:
1425
 
 
1426
 
* 2 weeks - general changes
1427
 
* 1 week - feature freeze
1428
 
* 1 week+ - Release Candidate stabilization
1429
 
 
1430
 
During the FeatureFreeze week, the trunk (bzr.dev) is open in a limited
1431
 
way: only low risk changes, critical and high priority fixes are accepted
1432
 
during this time. At the end of FeatureFreeze, a branch is created for the
1433
 
first Release Candidate and the trunk is reopened for general development
1434
 
on the *next* release. A week or so later, the final release is packaged
1435
 
assuming no serious problems were encountered with the one or more Release
1436
 
Candidates.
1437
 
 
1438
 
.. note::
1439
 
  There is a one week overlap between the start of one release and
1440
 
  the end of the previous one.
1441
 
 
1442
 
 
1443
1177
Communicating and Coordinating
1444
1178
------------------------------
1445
1179
 
1720
1454
.. note::
1721
1455
  As well as prioritizing bugs and nominating them against a
1722
1456
  target milestone, Launchpad lets core developers offer to mentor others in
1723
 
  fixing them. Nice.
1724
 
 
1725
 
 
1726
 
Managing a Release
1727
 
==================
1728
 
 
1729
 
Starting a Release
1730
 
------------------
1731
 
 
1732
 
TODO: Things to cover:
1733
 
 
1734
 
* RFI on release objectives
1735
 
* RFI on higher risk things that are best done early, e.g. changes to file
1736
 
  format defaults
1737
 
* Communication of proposed dates
1738
 
 
1739
 
 
1740
 
Weekly Status Updates
1741
 
---------------------
1742
 
 
1743
 
TODO: Things to cover:
1744
 
 
1745
 
* Early communication to downstream teams (e.g. Launchpad) about changes in dependencies.
1746
 
* Reminder re lifecycle and where we're up to right now
1747
 
* Summary of recent successes and pending work
1748
 
* Reminder re release objectives
1749
 
* Reminder re things needing attention, e.g. bug triage, reviews, testing of certain things, etc.
1750
 
 
1751
 
 
1752
 
Feature Freeze
1753
 
--------------
1754
 
 
1755
 
TODO: Get material from http://bazaar-vcs.org/FeatureFreeze.
1756
 
 
1757
 
 
1758
 
Release Candidates
1759
 
------------------
1760
 
 
1761
 
TODO: Get material from http://bazaar-vcs.org/ReleaseChecklist and clean
1762
 
it up to make it clearer what the RC vs final vs both tasks are.
1763
 
 
1764
 
 
1765
 
The Final Release
1766
 
-----------------
1767
 
 
1768
 
TODO: Get material from http://bazaar-vcs.org/ReleaseChecklist and clean
1769
 
it up to make it clearer what the RC vs final vs both tasks are.
 
1457
  fixing them. 
 
1458
 
1770
1459
 
1771
1460
..
1772
1461
   vim: ft=rst tw=74 ai