~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/HACKING.txt

  • Committer: Ian Clatworthy
  • Date: 2007-08-10 07:43:06 UTC
  • mto: (2733.1.1 ianc-integration)
  • mto: This revision was merged to the branch mainline in revision 2734.
  • Revision ID: ian.clatworthy@internode.on.net-20070810074306-z03x48acfm8tcw94
teach Makefile and .bzrignore re new doc structure

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 
 
5
.. contents::
 
6
 
 
7
(The current version of this document is available in the file 
15
8
``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
 
.. contents::
 
9
http://doc.bazaar-vcs.org/bzr.dev/developers/HACKING.html)
19
10
 
20
11
 
21
12
Getting Started
250
241
down the track do not break new features or bug fixes that you are
251
242
contributing today.
252
243
 
253
 
As of May 2008, Bazaar ships with a test suite containing over 12000 tests
 
244
As of May 2007, Bazaar ships with a test suite containing over 6000 tests
254
245
and growing. We are proud of it and want to remain so. As community
255
246
members, we all benefit from it. Would you trust version control on
256
247
your project to a product *without* a test suite like Bazaar has?
283
274
This option can be combined with other selftest options (like -x) and
284
275
filter patterns to understand their effect.
285
276
 
286
 
Once you understand how to create a list of tests, you can use the --load-list
287
 
option to run only a restricted set of tests that you kept in a file, one test
288
 
id by line. Keep in mind that this will never be sufficient to validate your
289
 
modifications, you still need to run the full test suite for that, but using it
290
 
can help in some cases (like running only the failed tests for some time)::
291
 
 
292
 
  ./bzr selftest -- load-list my_failing_tests
293
 
 
294
 
This option can also be combined with other selftest options, including
295
 
patterns. It has some drawbacks though, the list can become out of date pretty
296
 
quick when doing Test Driven Development.
297
 
 
298
 
To address this concern, there is another way to run a restricted set of tests:
299
 
the --starting-with option will run only the tests whose name starts with the
300
 
specified string. It will also avoid loading the other tests and as a
301
 
consequence starts running your tests quicker::
302
 
 
303
 
  ./bzr selftest --starting-with bzrlib.blackbox
304
 
 
305
 
This option can be combined with all the other selftest options including
306
 
--load-list. The later is rarely used but allows to run a subset of a list of
307
 
failing tests for example.
308
 
 
309
 
Test suite debug flags
310
 
----------------------
311
 
 
312
 
Similar to the global ``-Dfoo`` debug options, bzr selftest accepts
313
 
``-E=foo`` debug flags.  These flags are:
314
 
 
315
 
:allow_debug: do *not* clear the global debug flags when running a test.
316
 
  This can provide useful logging to help debug test failures when used
317
 
  with e.g. ``bzr -Dhpss selftest -E=allow_debug``
318
 
 
319
277
 
320
278
Writing Tests
321
279
=============
391
349
test was not run, rather than just returning which makes it look as if it
392
350
was run and passed.
393
351
 
394
 
Several different cases are distinguished:
395
 
 
396
 
TestSkipped
397
 
        Generic skip; the only type that was present up to bzr 0.18.
398
 
 
399
 
TestNotApplicable
400
 
        The test doesn't apply to the parameters with which it was run.
401
 
        This is typically used when the test is being applied to all
402
 
        implementations of an interface, but some aspects of the interface
403
 
        are optional and not present in particular concrete
404
 
        implementations.  (Some tests that should raise this currently
405
 
        either silently return or raise TestSkipped.)  Another option is
406
 
        to use more precise parameterization to avoid generating the test
407
 
        at all.
408
 
 
409
 
TestPlatformLimit
410
 
        **(Not implemented yet)**
411
 
        The test can't be run because of an inherent limitation of the
412
 
        environment, such as not having symlinks or not supporting
413
 
        unicode.
414
 
 
415
 
UnavailableFeature
416
 
        The test can't be run because a dependency (typically a Python
417
 
        library) is not available in the test environment.  These
418
 
        are in general things that the person running the test could fix 
419
 
        by installing the library.  It's OK if some of these occur when 
420
 
        an end user runs the tests or if we're specifically testing in a
421
 
        limited environment, but a full test should never see them.
422
 
 
423
 
KnownFailure
424
 
        The test exists but is known to fail, for example because the 
425
 
        code to fix it hasn't been run yet.  Raising this allows 
426
 
        you to distinguish these failures from the ones that are not 
427
 
        expected to fail.  This could be conditionally raised if something
428
 
        is broken on some platforms but not on others.
429
 
 
430
 
We plan to support three modes for running the test suite to control the
431
 
interpretation of these results.  Strict mode is for use in situations
432
 
like merges to the mainline and releases where we want to make sure that
433
 
everything that can be tested has been tested.  Lax mode is for use by
434
 
developers who want to temporarily tolerate some known failures.  The
435
 
default behaviour is obtained by ``bzr selftest`` with no options, and
436
 
also (if possible) by running under another unittest harness.
437
 
 
438
 
======================= ======= ======= ========
439
 
result                  strict  default lax
440
 
======================= ======= ======= ========
441
 
TestSkipped             pass    pass    pass
442
 
TestNotApplicable       pass    pass    pass
443
 
TestPlatformLimit       pass    pass    pass
444
 
TestDependencyMissing   fail    pass    pass
445
 
KnownFailure            fail    pass    pass
446
 
======================= ======= ======= ========
447
 
     
448
 
 
449
 
Test feature dependencies
450
 
-------------------------
451
 
 
452
 
Rather than manually checking the environment in each test, a test class
453
 
can declare its dependence on some test features.  The feature objects are
454
 
checked only once for each run of the whole test suite.
455
 
 
456
 
For historical reasons, as of May 2007 many cases that should depend on
457
 
features currently raise TestSkipped.)
458
 
 
459
 
::
 
352
A subtly different case is a test that should run, but can't run in the
 
353
current environment.  This covers tests that can only run in particular
 
354
operating systems or locales, or that depend on external libraries.  Here
 
355
we want to inform the user that they didn't get full test coverage, but
 
356
they possibly could if they installed more libraries.  These are expressed
 
357
as a dependency on a feature so we can summarise them, and so that the
 
358
test for the feature is done only once.  (For historical reasons, as of
 
359
May 2007 many cases that should depend on features currently raise
 
360
TestSkipped.)  The typical use is::
460
361
 
461
362
    class TestStrace(TestCaseWithTransport):
462
363
 
463
364
        _test_needs_features = [StraceFeature]
464
365
 
465
 
This means all tests in this class need the feature.  The feature itself
 
366
which means all tests in this class need the feature.  The feature itself
466
367
should provide a ``_probe`` method which is called once to determine if
467
368
it's available.
468
369
 
469
 
These should generally be equivalent to either TestDependencyMissing or
470
 
sometimes TestPlatformLimit.
471
 
 
472
370
 
473
371
Known failures
474
372
--------------
512
410
they're displayed or handled.
513
411
 
514
412
 
515
 
Testing warnings
516
 
----------------
517
 
 
518
 
The Python ``warnings`` module is used to indicate a non-fatal code
519
 
problem.  Code that's expected to raise a warning can be tested through
520
 
callCatchWarnings.
521
 
 
522
 
The test suite can be run with ``-Werror`` to check no unexpected errors
523
 
occur.
524
 
 
525
 
However, warnings should be used with discretion.  It's not an appropriate
526
 
way to give messages to the user, because the warning is normally shown
527
 
only once per source line that causes the problem.  You should also think
528
 
about whether the warning is serious enought that it should be visible to
529
 
users who may not be able to fix it.
530
 
 
531
 
 
532
 
Interface implementation testing and test scenarios
533
 
---------------------------------------------------
534
 
 
535
 
There are several cases in Bazaar of multiple implementations of a common 
536
 
conceptual interface.  ("Conceptual" because 
537
 
it's not necessary for all the implementations to share a base class,
538
 
though they often do.)  Examples include transports and the working tree,
539
 
branch and repository classes. 
540
 
 
541
 
In these cases we want to make sure that every implementation correctly
542
 
fulfils the interface requirements.  For example, every Transport should
543
 
support the ``has()`` and ``get()`` and ``clone()`` methods.  We have a
544
 
sub-suite of tests in ``test_transport_implementations``.  (Most
545
 
per-implementation tests are in submodules of ``bzrlib.tests``, but not
546
 
the transport tests at the moment.)  
547
 
 
548
 
These tests are repeated for each registered Transport, by generating a
549
 
new TestCase instance for the cross product of test methods and transport
550
 
implementations.  As each test runs, it has ``transport_class`` and
551
 
``transport_server`` set to the class it should test.  Most tests don't
552
 
access these directly, but rather use ``self.get_transport`` which returns
553
 
a transport of the appropriate type.
554
 
 
555
 
The goal is to run per-implementation only tests that relate to that
556
 
particular interface.  Sometimes we discover a bug elsewhere that happens
557
 
with only one particular transport.  Once it's isolated, we can consider 
558
 
whether a test should be added for that particular implementation,
559
 
or for all implementations of the interface.
560
 
 
561
 
The multiplication of tests for different implementations is normally 
562
 
accomplished by overriding the ``test_suite`` function used to load 
563
 
tests from a module.  This function typically loads all the tests,
564
 
then applies a TestProviderAdapter to them, which generates a longer 
565
 
suite containing all the test variations.
566
 
 
567
 
 
568
 
Test scenarios
569
 
--------------
570
 
 
571
 
Some utilities are provided for generating variations of tests.  This can
572
 
be used for per-implementation tests, or other cases where the same test
573
 
code needs to run several times on different scenarios.
574
 
 
575
 
The general approach is to define a class that provides test methods,
576
 
which depend on attributes of the test object being pre-set with the
577
 
values to which the test should be applied.  The test suite should then
578
 
also provide a list of scenarios in which to run the tests.
579
 
 
580
 
Typically ``multiply_tests_from_modules`` should be called from the test
581
 
module's ``test_suite`` function.
582
 
 
583
 
 
584
413
Essential Domain Classes
585
414
########################
586
415
 
650
479
the form of URL components.
651
480
 
652
481
 
 
482
Core Topics
 
483
###########
 
484
 
 
485
Evolving Interfaces
 
486
===================
 
487
 
 
488
We have a commitment to 6 months API stability - any supported symbol in a
 
489
release of bzr MUST NOT be altered in any way that would result in
 
490
breaking existing code that uses it. That means that method names,
 
491
parameter ordering, parameter names, variable and attribute names etc must
 
492
not be changed without leaving a 'deprecated forwarder' behind. This even
 
493
applies to modules and classes.
 
494
 
 
495
If you wish to change the behaviour of a supported API in an incompatible
 
496
way, you need to change its name as well. For instance, if I add an optional keyword
 
497
parameter to branch.commit - that's fine. On the other hand, if I add a
 
498
keyword parameter to branch.commit which is a *required* transaction
 
499
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
 
500
 
 
501
When renaming such supported API's, be sure to leave a deprecated_method (or
 
502
_function or ...) behind which forwards to the new API. See the
 
503
bzrlib.symbol_versioning module for decorators that take care of the
 
504
details for you - such as updating the docstring, and issuing a warning
 
505
when the old api is used.
 
506
 
 
507
For unsupported API's, it does not hurt to follow this discipline, but it's
 
508
not required. Minimally though, please try to rename things so that
 
509
callers will at least get an AttributeError rather than weird results.
 
510
 
 
511
 
653
512
Coding Style Guidelines
654
 
#######################
655
 
 
656
 
hasattr and getattr
657
 
===================
658
 
 
659
 
``hasattr`` should not be used because it swallows exceptions including
660
 
``KeyboardInterrupt``.  Instead, say something like ::
661
 
 
662
 
  if getattr(thing, 'name', None) is None
663
 
 
664
 
 
665
 
Code layout
666
 
===========
 
513
=======================
667
514
 
668
515
Please write PEP-8__ compliant code.  
669
516
 
670
 
__ http://www.python.org/peps/pep-0008.html
671
 
 
672
517
One often-missed requirement is that the first line of docstrings
673
518
should be a self-contained one-sentence summary.
674
519
 
675
 
We use 4 space indents for blocks, and never use tab characters.  (In vim,
676
 
``set expandtab``.)
677
 
 
678
 
Lines should be no more than 79 characters if at all possible.
679
 
Lines that continue a long statement may be indented in either of 
680
 
two ways:
681
 
 
682
 
within the parenthesis or other character that opens the block, e.g.::
683
 
 
684
 
    my_long_method(arg1,
685
 
                   arg2,
686
 
                   arg3)
687
 
 
688
 
or indented by four spaces::
689
 
 
690
 
    my_long_method(arg1,
691
 
        arg2,
692
 
        arg3)
693
 
 
694
 
The first is considered clearer by some people; however it can be a bit
695
 
harder to maintain (e.g. when the method name changes), and it does not
696
 
work well if the relevant parenthesis is already far to the right.  Avoid
697
 
this::
698
 
 
699
 
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
700
 
                                                     two,
701
 
                                                     three)
702
 
 
703
 
but rather ::
704
 
 
705
 
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
706
 
         two,
707
 
         three)
708
 
 
709
 
or ::
710
 
 
711
 
     self.legbone.kneebone.shinbone.toebone.shake_it(
712
 
         one, two, three)
713
 
 
714
 
For long lists, we like to add a trailing comma and put the closing
715
 
character on the following line.  This makes it easier to add new items in
716
 
future::
717
 
 
718
 
    from bzrlib.goo import (
719
 
        jam,
720
 
        jelly,
721
 
        marmalade,
722
 
        )
723
 
 
724
 
There should be spaces between function paramaters, but not between the
725
 
keyword name and the value::
726
 
 
727
 
    call(1, 3, cheese=quark)
728
 
 
729
 
In emacs::
730
 
 
731
 
    ;(defface my-invalid-face
732
 
    ;  '((t (:background "Red" :underline t)))
733
 
    ;  "Face used to highlight invalid constructs or other uglyties"
734
 
    ;  )
735
 
 
736
 
    (defun my-python-mode-hook ()
737
 
     ;; setup preferred indentation style.
738
 
     (setq fill-column 79)
739
 
     (setq indent-tabs-mode nil) ; no tabs, never, I will not repeat
740
 
    ;  (font-lock-add-keywords 'python-mode
741
 
    ;                         '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs
742
 
    ;                            ("[ \t]+$" . 'my-invalid-face)  ; Trailing spaces
743
 
    ;                            ("^[ \t]+$" . 'my-invalid-face)); Spaces only
744
 
    ;                          )
745
 
     )
746
 
 
747
 
    (add-hook 'python-mode-hook 'my-python-mode-hook)
748
 
 
749
 
The lines beginning with ';' are comments. They can be activated
750
 
if one want to have a strong notice of some tab/space usage
751
 
violations.
 
520
__ http://www.python.org/peps/pep-0008.html
752
521
 
753
522
 
754
523
Module Imports
755
 
==============
 
524
--------------
756
525
 
757
526
* Imports should be done at the top-level of the file, unless there is
758
527
  a strong reason to have them lazily loaded when a particular
764
533
 
765
534
 
766
535
Naming
767
 
======
 
536
------
768
537
 
769
538
Functions, methods or members that are "private" to bzrlib are given
770
539
a leading underscore prefix.  Names without a leading underscore are
787
556
 
788
557
 
789
558
Standard Names
790
 
==============
 
559
--------------
791
560
 
792
561
``revision_id`` not ``rev_id`` or ``revid``
793
562
 
796
565
 
797
566
 
798
567
Destructors
799
 
===========
 
568
-----------
800
569
 
801
570
Python destructors (``__del__``) work differently to those of other
802
571
languages.  In particular, bear in mind that destructors may be called
804
573
later time, or possibly never at all.  Therefore we have restrictions on
805
574
what can be done inside them.
806
575
 
807
 
 0. If you think you need to use a ``__del__`` method ask another
808
 
    developer for alternatives.  If you do need to use one, explain
809
 
    why in a comment.
 
576
 0. Never use a __del__ method without asking Martin/Robert first.
810
577
 
811
578
 1. Never rely on a ``__del__`` method running.  If there is code that
812
579
    must run, do it from a ``finally`` block instead.
820
587
 
821
588
 
822
589
Factories
823
 
=========
 
590
---------
824
591
 
825
592
In some places we have variables which point to callables that construct
826
593
new instances.  That is to say, they can be used a lot like class objects,
835
602
 
836
603
 
837
604
Registries
838
 
==========
 
605
----------
839
606
 
840
607
Several places in Bazaar use (or will use) a registry, which is a 
841
608
mapping from names to objects or classes.  The registry allows for 
844
611
 
845
612
 
846
613
Lazy Imports
847
 
============
 
614
------------
848
615
 
849
616
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
850
617
delay importing modules until they are actually used. ``lazy_import`` uses
874
641
the variable is a module, and these object should be hidden anyway, since
875
642
they shouldn't be imported into other namespaces.
876
643
 
 
644
 
 
645
Modules versus Members
 
646
~~~~~~~~~~~~~~~~~~~~~~
 
647
 
877
648
While it is possible for ``lazy_import()`` to import members of a module
878
649
when using the ``from module import member`` syntax, it is recommended to
879
650
only use that syntax to load sub modules ``from module import submodule``.
890
661
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
891
662
object, rather than the real class.
892
663
 
 
664
 
 
665
Passing to Other Variables
 
666
~~~~~~~~~~~~~~~~~~~~~~~~~~
 
667
 
893
668
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
894
669
Because the replacer only knows about the original name, it is unable to
895
670
replace other variables. The ``ImportReplacer`` class will raise an
899
674
 
900
675
 
901
676
The Null revision
902
 
=================
 
677
-----------------
903
678
 
904
679
The null revision is the ancestor of all revisions.  Its revno is 0, its
905
680
revision-id is ``null:``, and its tree is the empty tree.  When referring
908
683
being phased out.
909
684
 
910
685
 
911
 
Object string representations
912
 
=============================
913
 
 
914
 
Python prints objects using their ``__repr__`` method when they are
915
 
written to logs, exception tracebacks, or the debugger.  We want
916
 
objects to have useful representations to help in determining what went
917
 
wrong.
918
 
 
919
 
If you add a new class you should generally add a ``__repr__`` method
920
 
unless there is an adequate method in a parent class.  There should be a
921
 
test for the repr.  
922
 
 
923
 
Representations should typically look like Python constructor syntax, but
924
 
they don't need to include every value in the object and they don't need
925
 
to be able to actually execute.  They're to be read by humans, not
926
 
machines.  Don't hardcode the classname in the format, so that we get the
927
 
correct value if the method is inherited by a subclass.  If you're
928
 
printing attributes of the object, including strings, you should normally
929
 
use ``%r`` syntax (to call their repr in turn).
930
 
 
931
 
Try to avoid the representation becoming more than one or two lines long.
932
 
(But balance this against including useful information, and simplicity of
933
 
implementation.)
934
 
 
935
 
Because repr methods are often called when something has already gone
936
 
wrong, they should be written more defensively than most code.  The object
937
 
may be half-initialized or in some other way in an illegal state.  The
938
 
repr method shouldn't raise an exception, or it may hide the (probably
939
 
more useful) underlying exception.
940
 
 
941
 
Example::
942
 
 
943
 
    def __repr__(self):
944
 
        try:
945
 
            return '%s(%r)' % (self.__class__.__name__,
946
 
                               self._transport)
947
 
        except:
948
 
            return 'FooObject(**unprintable**)'
949
 
 
950
 
 
951
 
Core Topics
952
 
###########
953
 
 
954
 
Evolving Interfaces
955
 
===================
956
 
 
957
 
We have a commitment to 6 months API stability - any supported symbol in a
958
 
release of bzr MUST NOT be altered in any way that would result in
959
 
breaking existing code that uses it. That means that method names,
960
 
parameter ordering, parameter names, variable and attribute names etc must
961
 
not be changed without leaving a 'deprecated forwarder' behind. This even
962
 
applies to modules and classes.
963
 
 
964
 
If you wish to change the behaviour of a supported API in an incompatible
965
 
way, you need to change its name as well. For instance, if I add an optional keyword
966
 
parameter to branch.commit - that's fine. On the other hand, if I add a
967
 
keyword parameter to branch.commit which is a *required* transaction
968
 
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
969
 
 
970
 
When renaming such supported API's, be sure to leave a deprecated_method (or
971
 
_function or ...) behind which forwards to the new API. See the
972
 
bzrlib.symbol_versioning module for decorators that take care of the
973
 
details for you - such as updating the docstring, and issuing a warning
974
 
when the old api is used.
975
 
 
976
 
For unsupported API's, it does not hurt to follow this discipline, but it's
977
 
not required. Minimally though, please try to rename things so that
978
 
callers will at least get an AttributeError rather than weird results.
979
 
 
980
 
 
981
 
Deprecation decorators
982
 
----------------------
983
 
 
984
 
``bzrlib.symbol_versioning`` provides decorators that can be attached to
985
 
methods, functions, and other interfaces to indicate that they should no
986
 
longer be used.  For example::
987
 
 
988
 
   @deprecated_method(deprecated_in((0, 1, 4)))
989
 
   def foo(self):
990
 
        return self._new_foo()
991
 
 
992
 
To deprecate a static method you must call ``deprecated_function``
993
 
(**not** method), after the staticmethod call::
994
 
 
995
 
    @staticmethod
996
 
    @deprecated_function(deprecated_in((0, 1, 4)))
997
 
    def create_repository(base, shared=False, format=None):
998
 
 
999
 
When you deprecate an API, you should not just delete its tests, because
1000
 
then we might introduce bugs in them.  If the API is still present at all,
1001
 
it should still work.  The basic approach is to use
1002
 
``TestCase.applyDeprecated`` which in one step checks that the API gives
1003
 
the expected deprecation message, and also returns the real result from
1004
 
the method, so that tests can keep running.
1005
 
 
1006
 
Deprecation warnings will be suppressed for final releases, but not for
1007
 
development versions or release candidates, or when running ``bzr
1008
 
selftest``. This gives developers information about whether their code is
1009
 
using deprecated functions, but avoids confusing users about things they
1010
 
can't fix.
1011
 
 
1012
 
 
1013
686
Getting Input
1014
687
=============
1015
688
 
1215
888
    2. Unrepresentable diff changes (i.e. binary files that we cannot show 
1216
889
       a diff of).
1217
890
    3. An error or exception has occurred.
1218
 
    4. An internal error occurred (one that shows a traceback.)
1219
891
 
1220
892
Errors are handled through Python exceptions. Exceptions should be defined
1221
893
inside bzrlib.errors, so that we can see the whole tree at a glance.
1252
924
final fullstop.  If long, they may contain newlines to break the text.
1253
925
 
1254
926
 
1255
 
Assertions
1256
 
==========
1257
 
 
1258
 
Do not use the Python ``assert`` statement, either in tests or elsewhere.
1259
 
A source test checks that it is not used.  It is ok to explicitly raise
1260
 
AssertionError.
1261
 
 
1262
 
Rationale:
1263
 
 
1264
 
 * It makes the behaviour vary depending on whether bzr is run with -O
1265
 
   or not, therefore giving a chance for bugs that occur in one case or
1266
 
   the other, several of which have already occurred: assertions with
1267
 
   side effects, code which can't continue unless the assertion passes,
1268
 
   cases where we should give the user a proper message rather than an
1269
 
   assertion failure.
1270
 
 * It's not that much shorter than an explicit if/raise.
1271
 
 * It tends to lead to fuzzy thinking about whether the check is
1272
 
   actually needed or not, and whether it's an internal error or not
1273
 
 * It tends to cause look-before-you-leap patterns.
1274
 
 * It's unsafe if the check is needed to protect the integrity of the
1275
 
   user's data.
1276
 
 * It tends to give poor messages since the developer can get by with
1277
 
   no explanatory text at all.
1278
 
 * We can't rely on people always running with -O in normal use, so we
1279
 
   can't use it for tests that are actually expensive.
1280
 
 * Expensive checks that help developers are better turned on from the
1281
 
   test suite or a -D flag.
1282
 
 * If used instead of ``self.assert*()`` in tests it makes them falsely pass with -O.
1283
 
 
1284
 
 
1285
927
Documenting Changes
1286
928
===================
1287
929
 
1533
1175
http://bazaar-vcs.org/BzrWin32Installer
1534
1176
 
1535
1177
 
1536
 
Core Developer Tasks
1537
 
####################
1538
 
 
1539
 
Overview
1540
 
========
1541
 
 
1542
 
What is a Core Developer?
1543
 
-------------------------
1544
 
 
1545
 
While everyone in the Bazaar community is welcome and encouraged to
1546
 
propose and submit changes, a smaller team is reponsible for pulling those
1547
 
changes together into a cohesive whole. In addition to the general developer
1548
 
stuff covered above, "core" developers have responsibility for:
1549
 
 
1550
 
* reviewing changes
1551
 
* reviewing blueprints
1552
 
* planning releases
1553
 
* managing releases.
1554
 
 
1555
 
.. note::
1556
 
  Removing barriers to community participation is a key reason for adopting
1557
 
  distributed VCS technology. While DVCS removes many technical barriers,
1558
 
  a small number of social barriers are often necessary instead.
1559
 
  By documenting how the above things are done, we hope to
1560
 
  encourage more people to participate in these activities, keeping the
1561
 
  differences between core and non-core contributors to a minimum.
1562
 
 
1563
 
 
1564
 
The Development Lifecycle
1565
 
-------------------------
1566
 
 
1567
 
As a rule, Bazaar development follows a 4 week cycle:
1568
 
 
1569
 
* 2 weeks - general changes
1570
 
* 1 week - feature freeze
1571
 
* 1 week+ - Release Candidate stabilization
1572
 
 
1573
 
During the FeatureFreeze week, the trunk (bzr.dev) is open in a limited
1574
 
way: only low risk changes, critical and high priority fixes are accepted
1575
 
during this time. At the end of FeatureFreeze, a branch is created for the
1576
 
first Release Candidate and the trunk is reopened for general development
1577
 
on the *next* release. A week or so later, the final release is packaged
1578
 
assuming no serious problems were encountered with the one or more Release
1579
 
Candidates.
1580
 
 
1581
 
.. note::
1582
 
  There is a one week overlap between the start of one release and
1583
 
  the end of the previous one.
1584
 
 
1585
 
 
1586
 
Communicating and Coordinating
1587
 
------------------------------
1588
 
 
1589
 
While it has many advantages, one of the challenges of distributed
1590
 
development is keeping everyone else aware of what you're working on.
1591
 
There are numerous ways to do this:
1592
 
 
1593
 
#. Assign bugs to yourself in Launchpad
1594
 
#. Mention it on the mailing list
1595
 
#. Mention it on IRC
1596
 
 
1597
 
As well as the email notifcations that occur when merge requests are sent
1598
 
and reviewed, you can keep others informed of where you're spending your
1599
 
energy by emailing the **bazaar-commits** list implicitly. To do this,
1600
 
install and configure the Email plugin. One way to do this is add these
1601
 
configuration settings to your central configuration file (e.g.
1602
 
``~/.bazaar/bazaar.conf`` on Linux)::
1603
 
 
1604
 
  [DEFAULT]
1605
 
  email = Joe Smith <joe.smith@internode.on.net>
1606
 
  smtp_server = mail.internode.on.net:25
1607
 
 
1608
 
Then add these lines for the relevant branches in ``locations.conf``::
1609
 
 
1610
 
  post_commit_to = bazaar-commits@lists.canonical.com
1611
 
  post_commit_mailer = smtplib
1612
 
 
1613
 
While attending a sprint, RobertCollins' Dbus plugin is useful for the
1614
 
same reason. See the documentation within the plugin for information on
1615
 
how to set it up and configure it.
1616
 
 
1617
 
 
1618
 
Reviewing Changes
1619
 
=================
1620
 
 
1621
 
Setting Up Your Workspace for Reviews
1622
 
-------------------------------------
1623
 
 
1624
 
TODO: Incorporate John Arbash Meinel's detailed email to Ian C on the
1625
 
numerous ways of setting up integration branches.
1626
 
 
1627
 
 
1628
 
The Review Checklist
1629
 
--------------------
1630
 
 
1631
 
See `A Closer Look at the Merge & Review Process`_
1632
 
for information on the gates used to decide whether code can be merged
1633
 
or not and details on how review results are recorded and communicated.
1634
 
 
1635
 
 
1636
 
The Importance of Timely Reviews
1637
 
--------------------------------
1638
 
 
1639
 
Good reviews do take time. They also regularly require a solid
1640
 
understanding of the overall code base. In practice, this means a small
1641
 
number of people often have a large review burden - with knowledge comes
1642
 
responsibility. No one like their merge requests sitting in a queue going
1643
 
nowhere, so reviewing sooner rather than later is strongly encouraged.
1644
 
 
1645
 
 
1646
 
Submitting Changes
1647
 
==================
1648
 
 
1649
 
An Overview of PQM
1650
 
------------------
1651
 
 
1652
 
Of the many workflows supported by Bazaar, the one adopted for Bazaar
1653
 
development itself is known as "Decentralized with automatic gatekeeper".
1654
 
To repeat the explanation of this given on
1655
 
http://bazaar-vcs.org/Workflows:
1656
 
 
1657
 
.. pull-quote::
1658
 
  In this workflow, each developer has their own branch or
1659
 
  branches, plus read-only access to the mainline. A software gatekeeper
1660
 
  (e.g. PQM) has commit rights to the main branch. When a developer wants
1661
 
  their work merged, they request the gatekeeper to merge it. The gatekeeper
1662
 
  does a merge, a compile, and runs the test suite. If the code passes, it
1663
 
  is merged into the mainline.
1664
 
 
1665
 
In a nutshell, here's the overall submission process:
1666
 
 
1667
 
#. get your work ready (including review except for trivial changes)
1668
 
#. push to a public location
1669
 
#. ask PQM to merge from that location
1670
 
 
1671
 
.. note::
1672
 
  At present, PQM always takes the changes to merge from a branch
1673
 
  at a URL that can be read by it. For Bazaar, that means a public,
1674
 
  typically http, URL.
1675
 
 
1676
 
As a result, the following things are needed to use PQM for submissions:
1677
 
 
1678
 
#. A publicly available web server
1679
 
#. Your OpenPGP key registered with PQM (contact RobertCollins for this)
1680
 
#. The PQM plugin installed and configured (not strictly required but
1681
 
   highly recommended).
1682
 
 
1683
 
 
1684
 
Selecting a Public Branch Location
1685
 
----------------------------------
1686
 
 
1687
 
If you don't have your own web server running, branches can always be
1688
 
pushed to Launchpad. Here's the process for doing that:
1689
 
 
1690
 
Depending on your location throughout the world and the size of your
1691
 
repository though, it is often quicker to use an alternative public
1692
 
location to Launchpad, particularly if you can set up your own repo and
1693
 
push into that. By using an existing repo, push only needs to send the
1694
 
changes, instead of the complete repository every time. Note that it is
1695
 
easy to register branches in other locations with Launchpad so no benefits
1696
 
are lost by going this way.
1697
 
 
1698
 
.. note::
1699
 
  For Canonical staff, http://people.ubuntu.com/~<user>/ is one
1700
 
  suggestion for public http branches. Contact your manager for information
1701
 
  on accessing this system if required.
1702
 
 
1703
 
It should also be noted that best practice in this area is subject to
1704
 
change as things evolve. For example, once the Bazaar smart server on
1705
 
Launchpad supports server-side branching, the performance situation will
1706
 
be very different to what it is now (Jun 2007).
1707
 
 
1708
 
 
1709
 
Configuring the PQM Plug-In
1710
 
---------------------------
1711
 
 
1712
 
While not strictly required, the PQM plugin automates a few things and
1713
 
reduces the chance of error. Before looking at the plugin, it helps to
1714
 
understand  a little more how PQM operates. Basically, PQM requires an
1715
 
email indicating what you want it to do. The email typically looks like
1716
 
this::
1717
 
 
1718
 
  star-merge source-branch target-branch
1719
 
 
1720
 
For example::
1721
 
 
1722
 
  star-merge http://bzr.arbash-meinel.com/branches/bzr/jam-integration http://bazaar-vcs.org/bzr/bzr.dev
1723
 
 
1724
 
Note that the command needs to be on one line. The subject of the email
1725
 
will be used for the commit message. The email also needs to be ``gpg``
1726
 
signed with a key that PQM accepts.
1727
 
 
1728
 
The advantages of using the PQM plugin are:
1729
 
 
1730
 
#. You can use the config policies to make it easy to set up public
1731
 
   branches, so you don't have to ever type the full paths you want to merge
1732
 
   from or into.
1733
 
 
1734
 
#. It checks to make sure the public branch last revision matches the
1735
 
   local last revision so you are submitting what you think you are.
1736
 
 
1737
 
#. It uses the same public_branch and smtp sending settings as bzr-email,
1738
 
   so if you have one set up, you have the other mostly set up.
1739
 
 
1740
 
#. Thunderbird refuses to not wrap lines, and request lines are usually
1741
 
   pretty long (you have 2 long URLs in there).
1742
 
 
1743
 
Here are sample configuration settings for the PQM plugin. Here are the
1744
 
lines in bazaar.conf::
1745
 
 
1746
 
  [DEFAULT]
1747
 
  email = Joe Smith <joe.smith@internode.on.net>
1748
 
  smtp_server=mail.internode.on.net:25
1749
 
 
1750
 
And here are the lines in ``locations.conf`` (or ``branch.conf`` for
1751
 
dirstate-tags branches)::
1752
 
 
1753
 
  [/home/joe/bzr/my-integration]
1754
 
  push_location = sftp://joe-smith@bazaar.launchpad.net/%7Ejoe-smith/bzr/my-integration/
1755
 
  push_location:policy = norecurse
1756
 
  public_branch = http://bazaar.launchpad.net/~joe-smith/bzr/my-integration/
1757
 
  public_branch:policy = appendpath
1758
 
  pqm_email = Bazaar PQM <pqm@bazaar-vcs.org>
1759
 
  pqm_branch = http://bazaar-vcs.org/bzr/bzr.dev
1760
 
 
1761
 
Note that the push settings will be added by the first ``push`` on
1762
 
a branch. Indeed the preferred way to generate the lines above is to use
1763
 
``push`` with an argument, then copy-and-paste the other lines into
1764
 
the relevant file.
1765
 
 
1766
 
 
1767
 
Submitting a Change
1768
 
-------------------
1769
 
 
1770
 
Here is one possible recipe once the above environment is set up:
1771
 
 
1772
 
#. pull bzr.dev => my-integration
1773
 
#. merge patch => my-integration
1774
 
#. fix up any final merge conflicts (NEWS being the big killer here).
1775
 
#. commit
1776
 
#. push
1777
 
#. pqm-submit
1778
 
 
1779
 
.. note::
1780
 
  The ``push`` step is not required if ``my-integration`` is a checkout of
1781
 
  a public branch.
1782
 
 
1783
 
  Because of defaults, you can type a single message into commit and
1784
 
  pqm-commit will reuse that.
1785
 
 
1786
 
 
1787
 
Tracking Change Acceptance
1788
 
--------------------------
1789
 
 
1790
 
The web interface to PQM is https://pqm.bazaar-vcs.org/. After submitting
1791
 
a change, you can visit this URL to confirm it was received and placed in
1792
 
PQM's queue.
1793
 
 
1794
 
When PQM completes processing a change, an email is sent to you with the
1795
 
results.
1796
 
 
1797
 
 
1798
 
Reviewing Blueprints
1799
 
====================
1800
 
 
1801
 
Blueprint Tracking Using Launchpad
1802
 
----------------------------------
1803
 
 
1804
 
New features typically require a fair amount of discussion, design and
1805
 
debate. For Bazaar, that information is often captured in a so-called
1806
 
"blueprint" on our Wiki. Overall tracking of blueprints and their status
1807
 
is done using Launchpad's relevant tracker,
1808
 
https://blueprints.launchpad.net/bzr/. Once a blueprint for ready for
1809
 
review, please announce it on the mailing list.
1810
 
 
1811
 
Alternatively, send an email begining with [RFC] with the proposal to the
1812
 
list. In some cases, you may wish to attach proposed code  or a proposed
1813
 
developer document if that best communicates the idea. Debate can then
1814
 
proceed using the normal merge review processes.
1815
 
 
1816
 
 
1817
 
Recording Blueprint Review Feedback
1818
 
-----------------------------------
1819
 
 
1820
 
Unlike its Bug Tracker, Launchpad's Blueprint Tracker doesn't currently
1821
 
(Jun 2007) support a chronological list of comment responses. Review
1822
 
feedback can either be recorded on the Wiki hosting the blueprints or by
1823
 
using Launchpad's whiteboard feature.
1824
 
 
1825
 
 
1826
 
Planning Releases
1827
 
=================
1828
 
 
1829
 
Roadmaps
1830
 
--------
1831
 
 
1832
 
As the two senior developers, Martin Pool and Robert Collins coordinate
1833
 
the overall Bazaar product development roadmap. Core developers provide
1834
 
input and review into this, particularly during sprints. It's totally
1835
 
expected that community members ought to be working on things that
1836
 
interest them the most. The roadmap is valuable though because it provides
1837
 
context for understanding where the product is going as a whole and why.
1838
 
 
1839
 
 
1840
 
Using Releases and Milestones in Launchpad
1841
 
------------------------------------------
1842
 
 
1843
 
TODO ... (Exact policies still under discussion)
1844
 
 
1845
 
 
1846
 
Bug Triage
1847
 
----------
1848
 
 
1849
 
Keeping on top of bugs reported is an important part of ongoing release
1850
 
planning. Everyone in the community is welcome and encouraged to raise
1851
 
bugs, confirm bugs raised by others, and nominate a priority. Practically
1852
 
though, a good percentage of bug triage is often done by the core
1853
 
developers, partially because of their depth of product knowledge.
1854
 
 
1855
 
With respect to bug triage, core developers are encouraged to play an
1856
 
active role with particular attention to the following tasks:
1857
 
 
1858
 
* keeping the number of unconfirmed bugs low
1859
 
* ensuring the priorities are generally right (everything as critical - or
1860
 
  medium - is meaningless)
1861
 
* looking out for regressions and turning those around sooner rather than later.
1862
 
 
1863
 
.. note::
1864
 
  As well as prioritizing bugs and nominating them against a
1865
 
  target milestone, Launchpad lets core developers offer to mentor others in
1866
 
  fixing them. 
1867
 
 
1868
 
 
1869
1178
..
1870
1179
   vim: ft=rst tw=74 ai