73
73
Bazaar Development in a Nutshell
74
74
================================
76
.. was from http://wiki.bazaar.canonical.com/BzrGivingBack
78
One of the fun things about working on a version control system like Bazaar is
79
that the users have a high level of proficiency in contributing back into
80
the tool. Consider the following very brief introduction to contributing back
81
to Bazaar. More detailed instructions are in the following sections.
86
First, get a local copy of the development mainline (See `Why make a local
92
$ bzr branch lp:bzr bzr.dev
94
Now make your own branch::
96
$ bzr branch bzr.dev 123456-my-bugfix
98
This will give you a branch called "123456-my-bugfix" that you can work on
99
and commit in. Here, you can study the code, make a fix or a new feature.
100
Feel free to commit early and often (after all, it's your branch!).
102
Documentation improvements are an easy place to get started giving back to the
103
Bazaar project. The documentation is in the `doc/` subdirectory of the Bazaar
106
When you are done, make sure that you commit your last set of changes as well!
107
Once you are happy with your changes, ask for them to be merged, as described
110
Making a Merge Proposal
111
-----------------------
113
The Bazaar developers use Launchpad to further enable a truly distributed
114
style of development. Anyone can propose a branch for merging into the Bazaar
115
trunk. To start this process, you need to push your branch to Launchpad. To
116
do this, you will need a Launchpad account and user name, e.g.
117
`your_lp_username`. You can push your branch to Launchpad directly from
120
$ bzr push lp:~your_lp_username/bzr/meaningful_name_here
122
After you have pushed your branch, you will need to propose it for merging to
123
the Bazaar trunk. Go to
124
<https://launchpad.net/your_lp_username/bzr/meaningful_name_here> and choose
125
"Propose for merging into another branch". Select "~bzr/bzr/trunk" to hand
126
your changes off to the Bazaar developers for review and merging.
128
Alternatively, after pushing you can use the ``lp-propose`` command to
129
create the merge proposal.
131
Using a meaningful name for your branch will help you and the reviewer(s)
132
better track the submission. Use a very succint description of your submission
133
and prefix it with bug number if needed (lp:~mbp/bzr/484558-merge-directory
134
for example). Alternatively, you can suffix with the bug number
135
(lp:~jameinel/bzr/export-file-511987).
141
Please put a "cover letter" on your merge request explaining:
143
* the reason **why** you're making this change
145
* **how** this change achieves this purpose
147
* anything else you may have fixed in passing
149
* anything significant that you thought of doing, such as a more
150
extensive fix or a different approach, but didn't or couldn't do now
152
A good cover letter makes reviewers' lives easier because they can decide
153
from the letter whether they agree with the purpose and approach, and then
154
assess whether the patch actually does what the cover letter says.
155
Explaining any "drive-by fixes" or roads not taken may also avoid queries
156
from the reviewer. All in all this should give faster and better reviews.
157
Sometimes writing the cover letter helps the submitter realize something
158
else they need to do. The size of the cover letter should be proportional
159
to the size and complexity of the patch.
162
Why make a local copy of bzr.dev?
163
---------------------------------
165
Making a local mirror of bzr.dev is not strictly necessary, but it means
167
- You can use that copy of bzr.dev as your main bzr executable, and keep it
168
up-to-date using ``bzr pull``.
169
- Certain operations are faster, and can be done when offline. For example:
172
- ``bzr diff -r ancestor:...``
175
- When it's time to create your next branch, it's more convenient. When you
176
have further contributions to make, you should do them in their own branch::
179
$ bzr branch bzr.dev additional_fixes
180
$ cd additional_fixes # hack, hack, hack
76
Looking for a 10 minute introduction to submitting a change?
77
See http://bazaar-vcs.org/BzrGivingBack.
79
TODO: Merge that Wiki page into this document.
184
82
Understanding the Development Process
278
178
Holds documentation on a whole range of things on Bazaar from the
279
179
origination of ideas within the project to information on Bazaar
280
180
features and use cases. Within this directory there is a subdirectory
281
for each translation into a human language. All the documentation
181
for each translation into a human language. All the documentation
282
182
is in the ReStructuredText markup language.
285
Documentation specifically targeted at Bazaar and plugin developers.
185
Documentation specifically targetted at Bazaar and plugin developers.
286
186
(Including this document.)
290
Automatically-generated API reference information is available at
291
<http://starship.python.net/crew/mwh/bzrlibapi/>.
293
See also the `Bazaar Architectural Overview
294
<http://doc.bazaar.canonical.com/developers/overview.html>`_.
190
Automatically-generated API reference information is available at
191
<http://starship.python.net/crew/mwh/bzrlibapi/>.
193
See also the `Bazaar Architectural Overview <../../developers/overview.html>`_.
196
The Code Review Process
197
#######################
199
All code changes coming in to Bazaar are reviewed by someone else.
200
Normally changes by core contributors are reviewed by one other core
201
developer, and changes from other people are reviewed by two core
202
developers. Use intelligent discretion if the patch is trivial.
204
Good reviews do take time. They also regularly require a solid
205
understanding of the overall code base. In practice, this means a small
206
number of people often have a large review burden - with knowledge comes
207
responsibility. No one like their merge requests sitting in a queue going
208
nowhere, so reviewing sooner rather than later is strongly encouraged.
212
Sending patches for review
213
==========================
215
If you'd like to propose a change, please post to the
216
bazaar@lists.canonical.com list with a bundle, patch, or link to a
217
branch. Put ``[PATCH]`` or ``[MERGE]`` in the subject so Bundle Buggy
218
can pick it out, and explain the change in the email message text.
219
Remember to update the NEWS file as part of your change if it makes any
220
changes visible to users or plugin developers. Please include a diff
221
against mainline if you're giving a link to a branch.
223
You can generate a merge request like this::
225
bzr send -o bug-1234.patch
227
A ``.patch`` extension is recommended instead of .bundle as many mail clients
228
will send the latter as a binary file.
230
``bzr send`` can also send mail directly if you prefer; see the help.
232
Please do **NOT** put [PATCH] or [MERGE] in the subject line if you don't
233
want it to be merged. If you want comments from developers rather than
234
to be merged, you can put ``[RFC]`` in the subject line.
236
If this change addresses a bug, please put the bug number in the subject
237
line too, in the form ``[#1]`` so that Bundle Buggy can recognize it.
239
If the change is intended for a particular release mark that in the
240
subject too, e.g. ``[1.6]``.
246
Please put a "cover letter" on your merge request explaining:
248
* the reason **why** you're making this change
250
* **how** this change achieves this purpose
252
* anything else you may have fixed in passing
254
* anything significant that you thought of doing, such as a more
255
extensive fix or a different approach, but didn't or couldn't do now
257
A good cover letter makes reviewers' lives easier because they can decide
258
from the letter whether they agree with the purpose and approach, and then
259
assess whether the patch actually does what the cover letter says.
260
Explaining any "drive-by fixes" or roads not taken may also avoid queries
261
from the reviewer. All in all this should give faster and better reviews.
262
Sometimes writing the cover letter helps the submitter realize something
263
else they need to do. The size of the cover letter should be proportional
264
to the size and complexity of the patch.
267
Reviewing proposed changes
268
==========================
270
Anyone is welcome to review code, and reply to the thread with their
273
The simplest way to review a proposed change is to just read the patch on
274
the list or in Bundle Buggy. For more complex changes it may be useful
275
to make a new working tree or branch from trunk, and merge the proposed
276
change into it, so you can experiment with the code or look at a wider
279
There are three main requirements for code to get in:
281
* Doesn't reduce test coverage: if it adds new methods or commands,
282
there should be tests for them. There is a good test framework
283
and plenty of examples to crib from, but if you are having trouble
284
working out how to test something feel free to post a draft patch
287
* Doesn't reduce design clarity, such as by entangling objects
288
we're trying to separate. This is mostly something the more
289
experienced reviewers need to help check.
291
* Improves bugs, features, speed, or code simplicity.
293
Code that goes in should not degrade any of these aspects. Patches are
294
welcome that only cleanup the code without changing the external
295
behaviour. The core developers take care to keep the code quality high
296
and understandable while recognising that perfect is sometimes the enemy
299
It is easy for reviews to make people notice other things which should be
300
fixed but those things should not hold up the original fix being accepted.
301
New things can easily be recorded in the Bug Tracker instead.
303
It's normally much easier to review several smaller patches than one large
304
one. You might want to use ``bzr-loom`` to maintain threads of related
305
work, or submit a preparatory patch that will make your "real" change
309
Checklist for reviewers
310
=======================
312
* Do you understand what the code's doing and why?
314
* Will it perform reasonably for large inputs, both in memory size and
315
run time? Are there some scenarios where performance should be
318
* Is it tested, and are the tests at the right level? Are there both
319
blackbox (command-line level) and API-oriented tests?
321
* If this change will be visible to end users or API users, is it
322
appropriately documented in NEWS?
324
* Does it meet the coding standards below?
326
* If it changes the user-visible behaviour, does it update the help
327
strings and user documentation?
329
* If it adds a new major concept or standard practice, does it update the
330
developer documentation?
332
* (your ideas here...)
335
Bundle Buggy and review outcomes
336
================================
338
Anyone can "vote" on the mailing list by expressing an opinion. Core
339
developers can also vote using Bundle Buggy. Here are the voting codes and
342
:approve: Reviewer wants this submission merged.
343
:tweak: Reviewer wants this submission merged with small changes. (No
345
:abstain: Reviewer does not intend to vote on this patch.
346
:resubmit: Please make changes and resubmit for review.
347
:reject: Reviewer doesn't want this kind of change merged.
348
:comment: Not really a vote. Reviewer just wants to comment, for now.
350
If a change gets two approvals from core reviewers, and no rejections,
351
then it's OK to come in. Any of the core developers can bring it into the
352
bzr.dev trunk and backport it to maintenance branches if required. The
353
Release Manager will merge the change into the branch for a pending
354
release, if any. As a guideline, core developers usually merge their own
355
changes and volunteer to merge other contributions if they were the second
356
reviewer to agree to a change.
358
To track the progress of proposed changes, use Bundle Buggy. See
359
http://bundlebuggy.aaronbentley.com/help for a link to all the
360
outstanding merge requests together with an explanation of the columns.
361
Bundle Buggy will also mail you a link to track just your change.
363
Coding Style Guidelines
364
#######################
369
``hasattr`` should not be used because it swallows exceptions including
370
``KeyboardInterrupt``. Instead, say something like ::
372
if getattr(thing, 'name', None) is None
378
Please write PEP-8__ compliant code.
380
__ http://www.python.org/peps/pep-0008.html
382
One often-missed requirement is that the first line of docstrings
383
should be a self-contained one-sentence summary.
385
We use 4 space indents for blocks, and never use tab characters. (In vim,
388
Trailing white space should be avoided, but is allowed.
389
You should however not make lots of unrelated white space changes.
391
Unix style newlines (LF) are used.
393
Each file must have a newline at the end of it.
395
Lines should be no more than 79 characters if at all possible.
396
Lines that continue a long statement may be indented in either of
399
within the parenthesis or other character that opens the block, e.g.::
405
or indented by four spaces::
411
The first is considered clearer by some people; however it can be a bit
412
harder to maintain (e.g. when the method name changes), and it does not
413
work well if the relevant parenthesis is already far to the right. Avoid
416
self.legbone.kneebone.shinbone.toebone.shake_it(one,
422
self.legbone.kneebone.shinbone.toebone.shake_it(one,
428
self.legbone.kneebone.shinbone.toebone.shake_it(
431
For long lists, we like to add a trailing comma and put the closing
432
character on the following line. This makes it easier to add new items in
435
from bzrlib.goo import (
441
There should be spaces between function paramaters, but not between the
442
keyword name and the value::
444
call(1, 3, cheese=quark)
448
;(defface my-invalid-face
449
; '((t (:background "Red" :underline t)))
450
; "Face used to highlight invalid constructs or other uglyties"
453
(defun my-python-mode-hook ()
454
;; setup preferred indentation style.
455
(setq fill-column 79)
456
(setq indent-tabs-mode nil) ; no tabs, never, I will not repeat
457
; (font-lock-add-keywords 'python-mode
458
; '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs
459
; ("[ \t]+$" . 'my-invalid-face) ; Trailing spaces
460
; ("^[ \t]+$" . 'my-invalid-face)); Spaces only
464
(add-hook 'python-mode-hook 'my-python-mode-hook)
466
The lines beginning with ';' are comments. They can be activated
467
if one want to have a strong notice of some tab/space usage
474
* Imports should be done at the top-level of the file, unless there is
475
a strong reason to have them lazily loaded when a particular
476
function runs. Import statements have a cost, so try to make sure
477
they don't run inside hot functions.
479
* Module names should always be given fully-qualified,
480
i.e. ``bzrlib.hashcache`` not just ``hashcache``.
486
Functions, methods or members that are "private" to bzrlib are given
487
a leading underscore prefix. Names without a leading underscore are
488
public not just across modules but to programmers using bzrlib as an
489
API. As a consequence, a leading underscore is appropriate for names
490
exposed across modules but that are not to be exposed to bzrlib API
493
We prefer class names to be concatenated capital words (``TestCase``)
494
and variables, methods and functions to be lowercase words joined by
495
underscores (``revision_id``, ``get_revision``).
497
For the purposes of naming some names are treated as single compound
498
words: "filename", "revno".
500
Consider naming classes as nouns and functions/methods as verbs.
502
Try to avoid using abbreviations in names, because there can be
503
inconsistency if other people use the full name.
509
``revision_id`` not ``rev_id`` or ``revid``
511
Functions that transform one thing to another should be named ``x_to_y``
512
(not ``x2y`` as occurs in some old code.)
518
Python destructors (``__del__``) work differently to those of other
519
languages. In particular, bear in mind that destructors may be called
520
immediately when the object apparently becomes unreferenced, or at some
521
later time, or possibly never at all. Therefore we have restrictions on
522
what can be done inside them.
524
0. If you think you need to use a ``__del__`` method ask another
525
developer for alternatives. If you do need to use one, explain
528
1. Never rely on a ``__del__`` method running. If there is code that
529
must run, do it from a ``finally`` block instead.
531
2. Never ``import`` from inside a ``__del__`` method, or you may crash the
534
3. In some places we raise a warning from the destructor if the object
535
has not been cleaned up or closed. This is considered OK: the warning
536
may not catch every case but it's still useful sometimes.
542
In some places we have variables which point to callables that construct
543
new instances. That is to say, they can be used a lot like class objects,
544
but they shouldn't be *named* like classes:
546
> I think that things named FooBar should create instances of FooBar when
547
> called. Its plain confusing for them to do otherwise. When we have
548
> something that is going to be used as a class - that is, checked for via
549
> isinstance or other such idioms, them I would call it foo_class, so that
550
> it is clear that a callable is not sufficient. If it is only used as a
551
> factory, then yes, foo_factory is what I would use.
557
Several places in Bazaar use (or will use) a registry, which is a
558
mapping from names to objects or classes. The registry allows for
559
loading in registered code only when it's needed, and keeping
560
associated information such as a help string or description.
563
InterObject and multiple dispatch
564
=================================
566
The ``InterObject`` provides for two-way `multiple dispatch`__: matching
567
up for example a source and destination repository to find the right way
568
to transfer data between them.
570
.. __: http://en.wikipedia.org/wiki/Multiple_dispatch
572
There is a subclass ``InterObject`` classes for each type of object that is
573
dispatched this way, e.g. ``InterRepository``. Calling ``.get()`` on this
574
class will return an ``InterObject`` instance providing the best match for
575
those parameters, and this instance then has methods for operations
578
inter = InterRepository.get(source_repo, target_repo)
579
inter.fetch(revision_id)
581
``InterRepository`` also acts as a registry-like object for its
582
subclasses, and they can be added through ``.register_optimizer``. The
583
right one to run is selected by asking each class, in reverse order of
584
registration, whether it ``.is_compatible`` with the relevant objects.
589
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
590
delay importing modules until they are actually used. ``lazy_import`` uses
591
the same syntax as regular python imports. So to import a few modules in a
594
from bzrlib.lazy_import import lazy_import
595
lazy_import(globals(), """
604
revision as _mod_revision,
606
import bzrlib.transport
610
At this point, all of these exist as a ``ImportReplacer`` object, ready to
611
be imported once a member is accessed. Also, when importing a module into
612
the local namespace, which is likely to clash with variable names, it is
613
recommended to prefix it as ``_mod_<module>``. This makes it clearer that
614
the variable is a module, and these object should be hidden anyway, since
615
they shouldn't be imported into other namespaces.
617
While it is possible for ``lazy_import()`` to import members of a module
618
when using the ``from module import member`` syntax, it is recommended to
619
only use that syntax to load sub modules ``from module import submodule``.
620
This is because variables and classes can frequently be used without
621
needing a sub-member for example::
623
lazy_import(globals(), """
624
from module import MyClass
628
return isinstance(x, MyClass)
630
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
631
object, rather than the real class.
633
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
634
Because the replacer only knows about the original name, it is unable to
635
replace other variables. The ``ImportReplacer`` class will raise an
636
``IllegalUseOfScopeReplacer`` exception if it can figure out that this
637
happened. But it requires accessing a member more than once from the new
638
variable, so some bugs are not detected right away.
644
The null revision is the ancestor of all revisions. Its revno is 0, its
645
revision-id is ``null:``, and its tree is the empty tree. When referring
646
to the null revision, please use ``bzrlib.revision.NULL_REVISION``. Old
647
code sometimes uses ``None`` for the null revision, but this practice is
651
Object string representations
652
=============================
654
Python prints objects using their ``__repr__`` method when they are
655
written to logs, exception tracebacks, or the debugger. We want
656
objects to have useful representations to help in determining what went
659
If you add a new class you should generally add a ``__repr__`` method
660
unless there is an adequate method in a parent class. There should be a
663
Representations should typically look like Python constructor syntax, but
664
they don't need to include every value in the object and they don't need
665
to be able to actually execute. They're to be read by humans, not
666
machines. Don't hardcode the classname in the format, so that we get the
667
correct value if the method is inherited by a subclass. If you're
668
printing attributes of the object, including strings, you should normally
669
use ``%r`` syntax (to call their repr in turn).
671
Try to avoid the representation becoming more than one or two lines long.
672
(But balance this against including useful information, and simplicity of
675
Because repr methods are often called when something has already gone
676
wrong, they should be written somewhat more defensively than most code.
677
The object may be half-initialized or in some other way in an illegal
678
state. The repr method shouldn't raise an exception, or it may hide the
679
(probably more useful) underlying exception.
684
return '%s(%r)' % (self.__class__.__name__,
691
A bare ``except`` statement will catch all exceptions, including ones that
692
really should terminate the program such as ``MemoryError`` and
693
``KeyboardInterrupt``. They should rarely be used unless the exception is
694
later re-raised. Even then, think about whether catching just
695
``Exception`` (which excludes system errors in Python2.5 and later) would
702
All code should be exercised by the test suite. See `Guide to Testing
703
Bazaar <../../developers/testing.html>`_ for detailed information about writing tests.
771
Processing Command Lines
772
------------------------
774
bzrlib has a standard framework for parsing command lines and calling
775
processing routines associated with various commands. See builtins.py
776
for numerous examples.
779
Standard Parameter Types
780
------------------------
782
There are some common requirements in the library: some parameters need to be
783
unicode safe, some need byte strings, and so on. At the moment we have
784
only codified one specific pattern: Parameters that need to be unicode
785
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
786
input into unicode in a consistent fashion, allowing trivial strings to be
787
used for programmer convenience, but not performing unpredictably in the
788
presence of different locales.
794
(The strategy described here is what we want to get to, but it's not
795
consistently followed in the code at the moment.)
797
bzrlib is intended to be a generically reusable library. It shouldn't
798
write messages to stdout or stderr, because some programs that use it
799
might want to display that information through a GUI or some other
802
We can distinguish two types of output from the library:
804
1. Structured data representing the progress or result of an
805
operation. For example, for a commit command this will be a list
806
of the modified files and the finally committed revision number
809
These should be exposed either through the return code or by calls
810
to a callback parameter.
812
A special case of this is progress indicators for long-lived
813
operations, where the caller should pass a ProgressBar object.
815
2. Unstructured log/debug messages, mostly for the benefit of the
816
developers or users trying to debug problems. This should always
817
be sent through ``bzrlib.trace`` and Python ``logging``, so that
818
it can be redirected by the client.
820
The distinction between the two is a bit subjective, but in general if
821
there is any chance that a library would want to see something as
822
structured data, we should make it so.
824
The policy about how output is presented in the text-mode client
825
should be only in the command-line tool.
828
Progress and Activity Indications
829
---------------------------------
831
bzrlib has a way for code to display to the user that stuff is happening
832
during a long operation. There are two particular types: *activity* which
833
means that IO is happening on a Transport, and *progress* which means that
834
higher-level application work is occurring. Both are drawn together by
837
Transport objects are responsible for calling `report_transport_activity`
840
Progress uses a model/view pattern: application code acts on a
841
`ProgressTask` object, which notifies the UI when it needs to be
842
displayed. Progress tasks form a stack. To create a new progress task on
843
top of the stack, call `bzrlib.ui.ui_factory.nested_progress_bar()`, then
844
call `update()` on the returned ProgressTask. It can be updated with just
845
a text description, with a numeric count, or with a numeric count and
846
expected total count. If an expected total count is provided the view
847
can show the progress moving along towards the expected total.
849
The user should call `finish` on the `ProgressTask` when the logical
850
operation has finished, so it can be removed from the stack.
852
Progress tasks have a complex relatioship with generators: it's a very
853
good place to use them, but because python2.4 does not allow ``finally``
854
blocks in generators it's hard to clean them up properly. In this case
855
it's probably better to have the code calling the generator allocate a
856
progress task for its use and then call `finalize` when it's done, which
857
will close it if it was not already closed. The generator should also
858
finish the progress task when it exits, because it may otherwise be a long
859
time until the finally block runs.
865
Bazaar has online help for various topics through ``bzr help COMMAND`` or
866
equivalently ``bzr command -h``. We also have help on command options,
867
and on other help topics. (See ``help_topics.py``.)
869
As for python docstrings, the first paragraph should be a single-sentence
870
synopsis of the command.
872
The help for options should be one or more proper sentences, starting with
873
a capital letter and finishing with a full stop (period).
875
All help messages and documentation should have two spaces between
879
Handling Errors and Exceptions
880
==============================
882
Commands should return non-zero when they encounter circumstances that
883
the user should really pay attention to - which includes trivial shell
886
Recommended values are:
889
1. Conflicts in merge-like operations, or changes are present in
890
diff-like operations.
891
2. Unrepresentable diff changes (i.e. binary files that we cannot show
893
3. An error or exception has occurred.
894
4. An internal error occurred (one that shows a traceback.)
896
Errors are handled through Python exceptions. Exceptions should be defined
897
inside bzrlib.errors, so that we can see the whole tree at a glance.
899
We broadly classify errors as either being either internal or not,
900
depending on whether ``internal_error`` is set or not. If we think it's our
901
fault, we show a backtrace, an invitation to report the bug, and possibly
902
other details. This is the default for errors that aren't specifically
903
recognized as being caused by a user error. Otherwise we show a briefer
904
message, unless -Derror was given.
906
Many errors originate as "environmental errors" which are raised by Python
907
or builtin libraries -- for example IOError. These are treated as being
908
our fault, unless they're caught in a particular tight scope where we know
909
that they indicate a user errors. For example if the repository format
910
is not found, the user probably gave the wrong path or URL. But if one of
911
the files inside the repository is not found, then it's our fault --
912
either there's a bug in bzr, or something complicated has gone wrong in
913
the environment that means one internal file was deleted.
915
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors
916
to be added near the place where they are used.
918
Exceptions are formatted for the user by conversion to a string
919
(eventually calling their ``__str__`` method.) As a convenience the
920
``._fmt`` member can be used as a template which will be mapped to the
921
error's instance dict.
923
New exception classes should be defined when callers might want to catch
924
that exception specifically, or when it needs a substantially different
927
#. If it is something that a caller can recover from, a custom exception
930
#. If it is a data consistency issue, using a builtin like
931
``ValueError``/``TypeError`` is reasonable.
933
#. If it is a programmer error (using an api incorrectly)
934
``AssertionError`` is reasonable.
936
#. Otherwise, use ``BzrError`` or ``InternalBzrError``.
938
Exception strings should start with a capital letter and should not have a
939
final fullstop. If long, they may contain newlines to break the text.
945
Do not use the Python ``assert`` statement, either in tests or elsewhere.
946
A source test checks that it is not used. It is ok to explicitly raise
951
* It makes the behaviour vary depending on whether bzr is run with -O
952
or not, therefore giving a chance for bugs that occur in one case or
953
the other, several of which have already occurred: assertions with
954
side effects, code which can't continue unless the assertion passes,
955
cases where we should give the user a proper message rather than an
957
* It's not that much shorter than an explicit if/raise.
958
* It tends to lead to fuzzy thinking about whether the check is
959
actually needed or not, and whether it's an internal error or not
960
* It tends to cause look-before-you-leap patterns.
961
* It's unsafe if the check is needed to protect the integrity of the
963
* It tends to give poor messages since the developer can get by with
964
no explanatory text at all.
965
* We can't rely on people always running with -O in normal use, so we
966
can't use it for tests that are actually expensive.
967
* Expensive checks that help developers are better turned on from the
968
test suite or a -D flag.
969
* If used instead of ``self.assert*()`` in tests it makes them falsely pass with -O.
362
972
Documenting Changes
363
973
===================
685
1302
how to set it up and configure it.
1311
Of the many workflows supported by Bazaar, the one adopted for Bazaar
1312
development itself is known as "Decentralized with automatic gatekeeper".
1313
To repeat the explanation of this given on
1314
http://bazaar-vcs.org/Workflows:
1317
In this workflow, each developer has their own branch or
1318
branches, plus read-only access to the mainline. A software gatekeeper
1319
(e.g. PQM) has commit rights to the main branch. When a developer wants
1320
their work merged, they request the gatekeeper to merge it. The gatekeeper
1321
does a merge, a compile, and runs the test suite. If the code passes, it
1322
is merged into the mainline.
1324
In a nutshell, here's the overall submission process:
1326
#. get your work ready (including review except for trivial changes)
1327
#. push to a public location
1328
#. ask PQM to merge from that location
1331
At present, PQM always takes the changes to merge from a branch
1332
at a URL that can be read by it. For Bazaar, that means a public,
1333
typically http, URL.
1335
As a result, the following things are needed to use PQM for submissions:
1337
#. A publicly available web server
1338
#. Your OpenPGP key registered with PQM (contact RobertCollins for this)
1339
#. The PQM plugin installed and configured (not strictly required but
1340
highly recommended).
1343
Selecting a Public Branch Location
1344
----------------------------------
1346
If you don't have your own web server running, branches can always be
1347
pushed to Launchpad. Here's the process for doing that:
1349
Depending on your location throughout the world and the size of your
1350
repository though, it is often quicker to use an alternative public
1351
location to Launchpad, particularly if you can set up your own repo and
1352
push into that. By using an existing repo, push only needs to send the
1353
changes, instead of the complete repository every time. Note that it is
1354
easy to register branches in other locations with Launchpad so no benefits
1355
are lost by going this way.
1358
For Canonical staff, http://people.ubuntu.com/~<user>/ is one
1359
suggestion for public http branches. Contact your manager for information
1360
on accessing this system if required.
1362
It should also be noted that best practice in this area is subject to
1363
change as things evolve. For example, once the Bazaar smart server on
1364
Launchpad supports server-side branching, the performance situation will
1365
be very different to what it is now (Jun 2007).
1368
Configuring the PQM Plug-In
1369
---------------------------
1371
While not strictly required, the PQM plugin automates a few things and
1372
reduces the chance of error. Before looking at the plugin, it helps to
1373
understand a little more how PQM operates. Basically, PQM requires an
1374
email indicating what you want it to do. The email typically looks like
1377
star-merge source-branch target-branch
1381
star-merge http://bzr.arbash-meinel.com/branches/bzr/jam-integration http://bazaar-vcs.org/bzr/bzr.dev
1383
Note that the command needs to be on one line. The subject of the email
1384
will be used for the commit message. The email also needs to be ``gpg``
1385
signed with a key that PQM accepts.
1387
The advantages of using the PQM plugin are:
1389
#. You can use the config policies to make it easy to set up public
1390
branches, so you don't have to ever type the full paths you want to merge
1393
#. It checks to make sure the public branch last revision matches the
1394
local last revision so you are submitting what you think you are.
1396
#. It uses the same public_branch and smtp sending settings as bzr-email,
1397
so if you have one set up, you have the other mostly set up.
1399
#. Thunderbird refuses to not wrap lines, and request lines are usually
1400
pretty long (you have 2 long URLs in there).
1402
Here are sample configuration settings for the PQM plugin. Here are the
1403
lines in bazaar.conf::
1406
email = Joe Smith <joe.smith@internode.on.net>
1407
smtp_server=mail.internode.on.net:25
1409
And here are the lines in ``locations.conf`` (or ``branch.conf`` for
1410
dirstate-tags branches)::
1412
[/home/joe/bzr/my-integration]
1413
push_location = sftp://joe-smith@bazaar.launchpad.net/%7Ejoe-smith/bzr/my-integration/
1414
push_location:policy = norecurse
1415
public_branch = http://bazaar.launchpad.net/~joe-smith/bzr/my-integration/
1416
public_branch:policy = appendpath
1417
pqm_email = Bazaar PQM <pqm@bazaar-vcs.org>
1418
pqm_branch = http://bazaar-vcs.org/bzr/bzr.dev
1420
Note that the push settings will be added by the first ``push`` on
1421
a branch. Indeed the preferred way to generate the lines above is to use
1422
``push`` with an argument, then copy-and-paste the other lines into
1429
Here is one possible recipe once the above environment is set up:
1431
#. pull bzr.dev => my-integration
1432
#. merge patch => my-integration
1433
#. fix up any final merge conflicts (NEWS being the big killer here).
1439
The ``push`` step is not required if ``my-integration`` is a checkout of
1442
Because of defaults, you can type a single message into commit and
1443
pqm-commit will reuse that.
1446
Tracking Change Acceptance
1447
--------------------------
1449
The web interface to PQM is https://pqm.bazaar-vcs.org/. After submitting
1450
a change, you can visit this URL to confirm it was received and placed in
1453
When PQM completes processing a change, an email is sent to you with the
1457
Reviewing Blueprints
1458
====================
1460
Blueprint Tracking Using Launchpad
1461
----------------------------------
1463
New features typically require a fair amount of discussion, design and
1464
debate. For Bazaar, that information is often captured in a so-called
1465
"blueprint" on our Wiki. Overall tracking of blueprints and their status
1466
is done using Launchpad's relevant tracker,
1467
https://blueprints.launchpad.net/bzr/. Once a blueprint for ready for
1468
review, please announce it on the mailing list.
1470
Alternatively, send an email begining with [RFC] with the proposal to the
1471
list. In some cases, you may wish to attach proposed code or a proposed
1472
developer document if that best communicates the idea. Debate can then
1473
proceed using the normal merge review processes.
1476
Recording Blueprint Review Feedback
1477
-----------------------------------
1479
Unlike its Bug Tracker, Launchpad's Blueprint Tracker doesn't currently
1480
(Jun 2007) support a chronological list of comment responses. Review
1481
feedback can either be recorded on the Wiki hosting the blueprints or by
1482
using Launchpad's whiteboard feature.
689
1485
Planning Releases
690
1486
=================
1491
As the two senior developers, Martin Pool and Robert Collins coordinate
1492
the overall Bazaar product development roadmap. Core developers provide
1493
input and review into this, particularly during sprints. It's totally
1494
expected that community members ought to be working on things that
1495
interest them the most. The roadmap is valuable though because it provides
1496
context for understanding where the product is going as a whole and why.
1499
Using Releases and Milestones in Launchpad
1500
------------------------------------------
1502
TODO ... (Exact policies still under discussion)