~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/HACKING.txt

  • Committer: Canonical.com Patch Queue Manager
  • Date: 2008-05-12 05:23:58 UTC
  • mfrom: (3350.4.4 remove-deprecations)
  • Revision ID: pqm@pqm.ubuntu.com-20080512052358-68borsc013lplzz2
(robertc) Remove many deprecated methods from VersionedFile,
        Repository and bzrlib.revision. (Robert Collins)

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.
 
5
This document describes the Bazaar internals and the development process.  
6
6
It's meant for people interested in developing Bazaar, and some parts will
7
7
also be useful to people developing Bazaar plugins.
8
8
 
11
11
the Bazaar mailing list.  To propose a correction or addition to this
12
12
document, send a merge request or new text to the mailing list.
13
13
 
14
 
The latest developer documentation can be found online at
15
 
http://doc.bazaar.canonical.com/developers/.
 
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
.. contents::
 
19
 
16
20
 
17
21
Getting Started
18
22
###############
28
32
To answer these questions and more, take a moment to explore the
29
33
overall Bazaar Platform. Here are some links to browse:
30
34
 
31
 
* The Plugins page on the Wiki - http://wiki.bazaar.canonical.com/BzrPlugins
 
35
* The Plugins page on the Wiki - http://bazaar-vcs.org/BzrPlugins
32
36
 
33
37
* The Bazaar product family on Launchpad - https://launchpad.net/bazaar
34
38
 
35
39
* Bug Tracker for the core product - https://bugs.launchpad.net/bzr/
36
40
 
 
41
* Blueprint Tracker for the core product - https://blueprints.launchpad.net/bzr/
 
42
 
37
43
If nothing else, perhaps you'll find inspiration in how other developers
38
44
have solved their challenges.
39
45
 
40
 
Finding Something To Do
41
 
=======================
42
 
 
43
 
Ad-hoc performance work can also be done. One useful tool is the 'evil' debug
44
 
flag. For instance running ``bzr -Devil commit -m "test"`` will log a backtrace
45
 
to the bzr log file for every method call which triggers a slow or non-scalable
46
 
part of the bzr library. So checking that a given command with ``-Devil`` has
47
 
no backtraces logged to the log file is a good way to find problem function
48
 
calls that might be nested deep in the code base.
49
46
 
50
47
Planning and Discussing Changes
51
48
===============================
52
49
 
53
50
There is a very active community around Bazaar. Mostly we meet on IRC
54
51
(#bzr on irc.freenode.net) and on the mailing list. To join the Bazaar
55
 
community, see http://wiki.bazaar.canonical.com/BzrSupport.
 
52
community, see http://bazaar-vcs.org/BzrSupport.
56
53
 
57
54
If you are planning to make a change, it's a very good idea to mention it
58
55
on the IRC channel and/or on the mailing list. There are many advantages
59
56
to involving the community before you spend much time on a change.
60
57
These include:
61
58
 
62
 
* you get to build on the wisdom of others, saving time
 
59
* you get to build on the wisdom on others, saving time
63
60
 
64
 
* if others can direct you to similar code, it minimises the work to be done
 
61
* if others can direct you to similar code, it minimises the work to be done 
65
62
 
66
63
* it assists everyone in coordinating direction, priorities and effort.
67
64
 
73
70
Bazaar Development in a Nutshell
74
71
================================
75
72
 
76
 
.. was from http://wiki.bazaar.canonical.com/BzrGivingBack
77
 
 
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.
82
 
 
83
 
Making the change
84
 
-----------------
85
 
 
86
 
First, get a local copy of the development mainline (See `Why make a local
87
 
copy of bzr.dev?`_.)
88
 
::
89
 
 
90
 
 $ bzr init-repo ~/bzr
91
 
 $ cd ~/bzr
92
 
 $ bzr branch lp:bzr bzr.dev
93
 
 
94
 
Now make your own branch::
95
 
 
96
 
 $ bzr branch bzr.dev 123456-my-bugfix
97
 
 
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!).
101
 
 
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
104
 
source tree.
105
 
 
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
108
 
below.
109
 
 
110
 
Making a Merge Proposal
111
 
-----------------------
112
 
 
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
118
 
Bazaar::
119
 
 
120
 
  $ bzr push lp:~your_lp_username/bzr/meaningful_name_here
121
 
 
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.
127
 
 
128
 
Alternatively, after pushing you can use the ``lp-propose`` command to 
129
 
create the merge proposal.
130
 
 
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).
136
 
 
137
 
 
138
 
Review cover letters
139
 
--------------------
140
 
 
141
 
Please put a "cover letter" on your merge request explaining:
142
 
 
143
 
* the reason **why** you're making this change
144
 
 
145
 
* **how** this change achieves this purpose
146
 
 
147
 
* anything else you may have fixed in passing
148
 
 
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
151
 
 
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.
160
 
 
161
 
 
162
 
Why make a local copy of bzr.dev?
163
 
---------------------------------
164
 
 
165
 
Making a local mirror of bzr.dev is not strictly necessary, but it means
166
 
 
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:
170
 
 
171
 
  - ``bzr bundle``
172
 
  - ``bzr diff -r ancestor:...``
173
 
  - ``bzr merge``
174
 
 
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::
177
 
 
178
 
    $ cd ~/bzr
179
 
    $ bzr branch bzr.dev additional_fixes
180
 
    $ cd additional_fixes # hack, hack, hack
181
 
 
 
73
Looking for a 10 minute introduction to submitting a change?
 
74
See http://bazaar-vcs.org/BzrGivingBack.
 
75
 
 
76
TODO: Merge that Wiki page into this document.
182
77
 
183
78
 
184
79
Understanding the Development Process
185
80
=====================================
186
81
 
187
 
The development team follows many practices including:
 
82
The development team follows many best-practices including:
188
83
 
189
84
* a public roadmap and planning process in which anyone can participate
190
85
 
201
96
 
202
97
* Launchpad - https://launchpad.net/
203
98
 
204
 
* Bazaar - http://bazaar.canonical.com/
 
99
* Bazaar - http://bazaar-vcs.org/
 
100
 
 
101
* Bundle Buggy - http://bundlebuggy.aaronbentley.com/
205
102
 
206
103
* Patch Queue Manager - https://launchpad.net/pqm/
207
104
 
208
 
For further information, see <http://wiki.bazaar.canonical.com/BzrDevelopment>.
209
 
 
210
 
 
 
105
For further information, see http://bazaar-vcs.org/BzrDevelopment.
 
106
 
 
107
 
 
108
A Closer Look at the Merge & Review Process
 
109
===========================================
 
110
 
 
111
If you'd like to propose a change, please post to the
 
112
bazaar@lists.canonical.com list with a bundle, patch, or link to a
 
113
branch. Put '[PATCH]' or '[MERGE]' in the subject so Bundle Buggy
 
114
can pick it out, and explain the change in the email message text.
 
115
Remember to update the NEWS file as part of your change if it makes any
 
116
changes visible to users or plugin developers. Please include a diff
 
117
against mainline if you're giving a link to a branch.
 
118
 
 
119
You can generate a bundle like this::
 
120
 
 
121
  bzr bundle > mybundle.patch
 
122
  
 
123
A .patch extension is recommended instead of .bundle as many mail clients
 
124
will send the latter as a binary file. If a bundle would be too long or your
 
125
mailer mangles whitespace (e.g. implicitly converts Unix newlines to DOS
 
126
newlines), use the merge-directive command instead like this::
 
127
 
 
128
  bzr merge-directive http://bazaar-vcs.org http://example.org/my_branch > my_directive.patch
 
129
 
 
130
See the help for details on the arguments to merge-directive.
 
131
 
 
132
Please do **NOT** put [PATCH] or [MERGE] in the subject line if you don't
 
133
want it to be merged. If you want comments from developers rather than
 
134
to be merged, you can put '[RFC]' in the subject line.
 
135
 
 
136
Anyone is welcome to review code.  There are broadly three gates for
 
137
code to get in:
 
138
 
 
139
 * Doesn't reduce test coverage: if it adds new methods or commands,
 
140
   there should be tests for them.  There is a good test framework
 
141
   and plenty of examples to crib from, but if you are having trouble
 
142
   working out how to test something feel free to post a draft patch
 
143
   and ask for help.
 
144
 
 
145
 * Doesn't reduce design clarity, such as by entangling objects
 
146
   we're trying to separate.  This is mostly something the more
 
147
   experienced reviewers need to help check.
 
148
 
 
149
 * Improves bugs, features, speed, or code simplicity.
 
150
 
 
151
Code that goes in should pass all three. The core developers take care
 
152
to keep the code quality high and understandable while recognising that
 
153
perfect is sometimes the enemy of good. (It is easy for reviews to make
 
154
people notice other things which should be fixed but those things should
 
155
not hold up the original fix being accepted. New things can easily be
 
156
recorded in the Bug Tracker instead.)
 
157
 
 
158
Anyone can "vote" on the mailing list. Core developers can also vote using
 
159
Bundle Buggy. Here are the voting codes and their explanations.
 
160
 
 
161
:approve:  Reviewer wants this submission merged.
 
162
:tweak:    Reviewer wants this submission merged with small changes. (No
 
163
  re-review required.)
 
164
:abstain:  Reviewer does not intend to vote on this patch.
 
165
:resubmit: Please make changes and resubmit for review.
 
166
:reject:   Reviewer doesn't want this kind of change merged.
 
167
:comment:  Not really a vote. Reviewer just wants to comment, for now.
 
168
 
 
169
If a change gets two approvals from core reviewers, and no rejections,
 
170
then it's OK to come in.  Any of the core developers can bring it into the
 
171
bzr.dev trunk and backport it to maintenance branches if required.  The
 
172
Release Manager will merge the change into the branch for a pending
 
173
release, if any. As a guideline, core developers usually merge their own
 
174
changes and volunteer to merge other contributions if they were the second
 
175
reviewer to agree to a change.
 
176
 
 
177
To track the progress of proposed changes, use Bundle Buggy. See
 
178
http://bundlebuggy.aaronbentley.com/help for a link to all the
 
179
outstanding merge requests together with an explanation of the columns.
 
180
Bundle Buggy will also mail you a link to track just your change.
211
181
 
212
182
 
213
183
Preparing a Sandbox for Making Changes to Bazaar
214
184
================================================
215
185
 
216
186
Bazaar supports many ways of organising your work. See
217
 
http://wiki.bazaar.canonical.com/SharedRepositoryLayouts for a summary of the
 
187
http://bazaar-vcs.org/SharedRepositoryLayouts for a summary of the
218
188
popular alternatives.
219
189
 
220
190
Of course, the best choice for you will depend on numerous factors:
223
193
 
224
194
* create a local copy of the main development branch (bzr.dev) by using
225
195
  this command::
226
 
 
227
 
    bzr branch lp:bzr bzr.dev
228
 
 
229
 
* keep your copy of bzr.dev pristine (by not developing in it) and keep
 
196
  
 
197
    bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev
 
198
   
 
199
* keep your copy of bzr.dev prestine (by not developing in it) and keep
230
200
  it up to date (by using bzr pull)
231
201
 
232
202
* create a new branch off your local bzr.dev copy for each issue
234
204
 
235
205
This approach makes it easy to go back and make any required changes
236
206
after a code review. Resubmitting the change is then simple with no
237
 
risk of accidentally including edits related to other issues you may
 
207
risk of accidentially including edits related to other issues you may
238
208
be working on. After the changes for an issue are accepted and merged,
239
209
the associated branch can be deleted or archived as you wish.
240
210
 
242
212
Navigating the Code Base
243
213
========================
244
214
 
245
 
.. Was at <http://wiki.bazaar.canonical.com/NewDeveloperIntroduction>
246
 
 
247
 
Some of the key files in this directory are:
248
 
 
249
 
bzr
250
 
    The command you run to start Bazaar itself.  This script is pretty
251
 
    short and just does some checks then jumps into bzrlib.
252
 
 
253
 
README
254
 
    This file covers a brief introduction to Bazaar and lists some of its
255
 
    key features.
256
 
 
257
 
NEWS
258
 
    Summary of changes in each Bazaar release that can affect users or
259
 
    plugin developers.
260
 
 
261
 
setup.py
262
 
    Installs Bazaar system-wide or to your home directory.  To perform
263
 
    development work on Bazaar it is not required to run this file - you
264
 
    can simply run the bzr command from the top level directory of your
265
 
    development copy. Note: That if you run setup.py this will create a
266
 
    'build' directory in your development branch. There's nothing wrong
267
 
    with this but don't be confused by it. The build process puts a copy
268
 
    of the main code base into this build directory, along with some other
269
 
    files. You don't need to go in here for anything discussed in this
270
 
    guide.
271
 
 
272
 
bzrlib
273
 
    Possibly the most exciting folder of all, bzrlib holds the main code
274
 
    base. This is where you will go to edit python files and contribute to
275
 
    Bazaar.
276
 
 
277
 
doc
278
 
    Holds documentation on a whole range of things on Bazaar from the
279
 
    origination of ideas within the project to information on Bazaar
280
 
    features and use cases.  Within this directory there is a subdirectory
281
 
    for each translation into a human language.  All the documentation
282
 
    is in the ReStructuredText markup language.
283
 
 
284
 
doc/developers
285
 
    Documentation specifically targeted at Bazaar and plugin developers.
286
 
    (Including this document.)
287
 
 
288
 
 
289
 
 
290
 
Automatically-generated API reference information is available at
291
 
<http://starship.python.net/crew/mwh/bzrlibapi/>.
292
 
 
293
 
See also the `Bazaar Architectural Overview
294
 
<http://doc.bazaar.canonical.com/developers/overview.html>`_.
 
215
TODO: List and describe in one line the purpose of each directory
 
216
inside an installation of bzr.
 
217
 
 
218
TODO: Refer to a central location holding an up to date copy of the API
 
219
documentation generated by epydoc, e.g. something like
 
220
http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html.
 
221
 
 
222
 
 
223
Testing Bazaar
 
224
##############
 
225
 
 
226
The Importance of Testing
 
227
=========================
 
228
 
 
229
Reliability is a critical success factor for any Version Control System.
 
230
We want Bazaar to be highly reliable across multiple platforms while
 
231
evolving over time to meet the needs of its community. 
 
232
 
 
233
In a nutshell, this is want we expect and encourage:
 
234
 
 
235
* New functionality should have test cases.  Preferably write the
 
236
  test before writing the code.
 
237
 
 
238
  In general, you can test at either the command-line level or the
 
239
  internal API level.  See Writing tests below for more detail.
 
240
 
 
241
* Try to practice Test-Driven Development: before fixing a bug, write a
 
242
  test case so that it does not regress.  Similarly for adding a new
 
243
  feature: write a test case for a small version of the new feature before
 
244
  starting on the code itself.  Check the test fails on the old code, then
 
245
  add the feature or fix and check it passes.
 
246
 
 
247
By doing these things, the Bazaar team gets increased confidence that
 
248
changes do what they claim to do, whether provided by the core team or
 
249
by community members. Equally importantly, we can be surer that changes
 
250
down the track do not break new features or bug fixes that you are
 
251
contributing today.
 
252
 
 
253
As of May 2007, Bazaar ships with a test suite containing over 6000 tests
 
254
and growing. We are proud of it and want to remain so. As community
 
255
members, we all benefit from it. Would you trust version control on
 
256
your project to a product *without* a test suite like Bazaar has?
 
257
 
 
258
 
 
259
Running the Test Suite
 
260
======================
 
261
 
 
262
Currently, bzr selftest is used to invoke tests.
 
263
You can provide a pattern argument to run a subset. For example, 
 
264
to run just the blackbox tests, run::
 
265
 
 
266
  ./bzr selftest -v blackbox
 
267
 
 
268
To skip a particular test (or set of tests), use the --exclude option
 
269
(shorthand -x) like so::
 
270
 
 
271
  ./bzr selftest -v -x blackbox  
 
272
 
 
273
To ensure that all tests are being run and succeeding, you can use the
 
274
--strict option which will fail if there are any missing features or known
 
275
failures, like so::
 
276
 
 
277
  ./bzr selftest --strict
 
278
 
 
279
To list tests without running them, use the --list-only option like so::
 
280
 
 
281
  ./bzr selftest --list-only
 
282
 
 
283
This option can be combined with other selftest options (like -x) and
 
284
filter patterns to understand their effect.
 
285
 
 
286
 
 
287
Test suite debug flags
 
288
----------------------
 
289
 
 
290
Similar to the global ``-Dfoo`` debug options, bzr selftest accepts
 
291
``-E=foo`` debug flags.  These flags are:
 
292
 
 
293
:allow_debug: do *not* clear the global debug flags when running a test.
 
294
  This can provide useful logging to help debug test failures when used
 
295
  with e.g. ``bzr -Dhpss selftest -E=allow_debug``
 
296
 
 
297
 
 
298
Writing Tests
 
299
=============
 
300
 
 
301
In general tests should be placed in a file named test_FOO.py where 
 
302
FOO is the logical thing under test. That file should be placed in the
 
303
tests subdirectory under the package being tested.
 
304
 
 
305
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
 
306
See bzrlib/tests/test_sampler.py for a template test script.
 
307
 
 
308
Tests can be written for the UI or for individual areas of the library.
 
309
Choose whichever is appropriate: if adding a new command, or a new command 
 
310
option, then you should be writing a UI test.  If you are both adding UI
 
311
functionality and library functionality, you will want to write tests for 
 
312
both the UI and the core behaviours.  We call UI tests 'blackbox' tests
 
313
and they are found in ``bzrlib/tests/blackbox/*.py``. 
 
314
 
 
315
When writing blackbox tests please honour the following conventions:
 
316
 
 
317
 1. Place the tests for the command 'name' in
 
318
    bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
 
319
    to locate the test script for a faulty command.
 
320
 
 
321
 2. Use the 'self.run_bzr("name")' utility function to invoke the command
 
322
    rather than running bzr in a subprocess or invoking the
 
323
    cmd_object.run() method directly. This is a lot faster than
 
324
    subprocesses and generates the same logging output as running it in a
 
325
    subprocess (which invoking the method directly does not).
 
326
 
 
327
 3. Only test the one command in a single test script. Use the bzrlib 
 
328
    library when setting up tests and when evaluating the side-effects of
 
329
    the command. We do this so that the library api has continual pressure
 
330
    on it to be as functional as the command line in a simple manner, and
 
331
    to isolate knock-on effects throughout the blackbox test suite when a
 
332
    command changes its name or signature. Ideally only the tests for a
 
333
    given command are affected when a given command is changed.
 
334
 
 
335
 4. If you have a test which does actually require running bzr in a
 
336
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
 
337
    process will not load plugins unless ``--allow-plugins`` is supplied.
 
338
 
 
339
 
 
340
Doctests
 
341
--------
 
342
 
 
343
We make selective use of doctests__.  In general they should provide 
 
344
*examples* within the API documentation which can incidentally be tested.  We 
 
345
don't try to test every important case using doctests -- regular Python
 
346
tests are generally a better solution.
 
347
 
 
348
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
 
349
 
 
350
  __ http://docs.python.org/lib/module-doctest.html
 
351
 
 
352
 
 
353
Skipping tests and test requirements
 
354
------------------------------------
 
355
 
 
356
In our enhancements to unittest we allow for some addition results beyond
 
357
just success or failure.
 
358
 
 
359
If a test can't be run, it can say that it's skipped.  This is typically
 
360
used in parameterized tests - for example if a transport doesn't support
 
361
setting permissions, we'll skip the tests that relating to that.  ::
 
362
 
 
363
    try:
 
364
        return self.branch_format.initialize(repo.bzrdir)
 
365
    except errors.UninitializableFormat:
 
366
        raise tests.TestSkipped('Uninitializable branch format')
 
367
 
 
368
Raising TestSkipped is a good idea when you want to make it clear that the
 
369
test was not run, rather than just returning which makes it look as if it
 
370
was run and passed.
 
371
 
 
372
Several different cases are distinguished:
 
373
 
 
374
TestSkipped
 
375
        Generic skip; the only type that was present up to bzr 0.18.
 
376
 
 
377
TestNotApplicable
 
378
        The test doesn't apply to the parameters with which it was run.
 
379
        This is typically used when the test is being applied to all
 
380
        implementations of an interface, but some aspects of the interface
 
381
        are optional and not present in particular concrete
 
382
        implementations.  (Some tests that should raise this currently
 
383
        either silently return or raise TestSkipped.)  Another option is
 
384
        to use more precise parameterization to avoid generating the test
 
385
        at all.
 
386
 
 
387
TestPlatformLimit
 
388
        **(Not implemented yet)**
 
389
        The test can't be run because of an inherent limitation of the
 
390
        environment, such as not having symlinks or not supporting
 
391
        unicode.
 
392
 
 
393
UnavailableFeature
 
394
        The test can't be run because a dependency (typically a Python
 
395
        library) is not available in the test environment.  These
 
396
        are in general things that the person running the test could fix 
 
397
        by installing the library.  It's OK if some of these occur when 
 
398
        an end user runs the tests or if we're specifically testing in a
 
399
        limited environment, but a full test should never see them.
 
400
 
 
401
KnownFailure
 
402
        The test exists but is known to fail, for example because the 
 
403
        code to fix it hasn't been run yet.  Raising this allows 
 
404
        you to distinguish these failures from the ones that are not 
 
405
        expected to fail.  This could be conditionally raised if something
 
406
        is broken on some platforms but not on others.
 
407
 
 
408
We plan to support three modes for running the test suite to control the
 
409
interpretation of these results.  Strict mode is for use in situations
 
410
like merges to the mainline and releases where we want to make sure that
 
411
everything that can be tested has been tested.  Lax mode is for use by
 
412
developers who want to temporarily tolerate some known failures.  The
 
413
default behaviour is obtained by ``bzr selftest`` with no options, and
 
414
also (if possible) by running under another unittest harness.
 
415
 
 
416
======================= ======= ======= ========
 
417
result                  strict  default lax
 
418
======================= ======= ======= ========
 
419
TestSkipped             pass    pass    pass
 
420
TestNotApplicable       pass    pass    pass
 
421
TestPlatformLimit       pass    pass    pass
 
422
TestDependencyMissing   fail    pass    pass
 
423
KnownFailure            fail    pass    pass
 
424
======================= ======= ======= ========
 
425
     
 
426
 
 
427
Test feature dependencies
 
428
-------------------------
 
429
 
 
430
Rather than manually checking the environment in each test, a test class
 
431
can declare its dependence on some test features.  The feature objects are
 
432
checked only once for each run of the whole test suite.
 
433
 
 
434
For historical reasons, as of May 2007 many cases that should depend on
 
435
features currently raise TestSkipped.)
 
436
 
 
437
::
 
438
 
 
439
    class TestStrace(TestCaseWithTransport):
 
440
 
 
441
        _test_needs_features = [StraceFeature]
 
442
 
 
443
This means all tests in this class need the feature.  The feature itself
 
444
should provide a ``_probe`` method which is called once to determine if
 
445
it's available.
 
446
 
 
447
These should generally be equivalent to either TestDependencyMissing or
 
448
sometimes TestPlatformLimit.
 
449
 
 
450
 
 
451
Known failures
 
452
--------------
 
453
 
 
454
Known failures are when a test exists but we know it currently doesn't
 
455
work, allowing the test suite to still pass.  These should be used with
 
456
care, we don't want a proliferation of quietly broken tests.  It might be
 
457
appropriate to use them if you've committed a test for a bug but not the
 
458
fix for it, or if something works on Unix but not on Windows.
 
459
 
 
460
 
 
461
Testing exceptions and errors
 
462
-----------------------------
 
463
 
 
464
It's important to test handling of errors and exceptions.  Because this
 
465
code is often not hit in ad-hoc testing it can often have hidden bugs --
 
466
it's particularly common to get NameError because the exception code
 
467
references a variable that has since been renamed.
 
468
 
 
469
.. TODO: Something about how to provoke errors in the right way?
 
470
 
 
471
In general we want to test errors at two levels:
 
472
 
 
473
1. A test in ``test_errors.py`` checking that when the exception object is
 
474
   constructed with known parameters it produces an expected string form.
 
475
   This guards against mistakes in writing the format string, or in the
 
476
   ``str`` representations of its parameters.  There should be one for
 
477
   each exception class.
 
478
 
 
479
2. Tests that when an api is called in a particular situation, it raises
 
480
   an error of the expected class.  You should typically use
 
481
   ``assertRaises``, which in the Bazaar test suite returns the exception
 
482
   object to allow you to examine its parameters.  
 
483
 
 
484
In some cases blackbox tests will also want to check error reporting.  But
 
485
it can be difficult to provoke every error through the commandline
 
486
interface, so those tests are only done as needed -- eg in response to a
 
487
particular bug or if the error is reported in an unusual way(?)  Blackbox
 
488
tests should mostly be testing how the command-line interface works, so
 
489
should only test errors if there is something particular to the cli in how
 
490
they're displayed or handled.
 
491
 
 
492
 
 
493
Testing warnings
 
494
----------------
 
495
 
 
496
The Python ``warnings`` module is used to indicate a non-fatal code
 
497
problem.  Code that's expected to raise a warning can be tested through
 
498
callCatchWarnings.
 
499
 
 
500
The test suite can be run with ``-Werror`` to check no unexpected errors
 
501
occur.
 
502
 
 
503
However, warnings should be used with discretion.  It's not an appropriate
 
504
way to give messages to the user, because the warning is normally shown
 
505
only once per source line that causes the problem.  You should also think
 
506
about whether the warning is serious enought that it should be visible to
 
507
users who may not be able to fix it.
 
508
 
 
509
 
 
510
Interface implementation testing and test scenarios
 
511
---------------------------------------------------
 
512
 
 
513
There are several cases in Bazaar of multiple implementations of a common 
 
514
conceptual interface.  ("Conceptual" because 
 
515
it's not necessary for all the implementations to share a base class,
 
516
though they often do.)  Examples include transports and the working tree,
 
517
branch and repository classes. 
 
518
 
 
519
In these cases we want to make sure that every implementation correctly
 
520
fulfils the interface requirements.  For example, every Transport should
 
521
support the ``has()`` and ``get()`` and ``clone()`` methods.  We have a
 
522
sub-suite of tests in ``test_transport_implementations``.  (Most
 
523
per-implementation tests are in submodules of ``bzrlib.tests``, but not
 
524
the transport tests at the moment.)  
 
525
 
 
526
These tests are repeated for each registered Transport, by generating a
 
527
new TestCase instance for the cross product of test methods and transport
 
528
implementations.  As each test runs, it has ``transport_class`` and
 
529
``transport_server`` set to the class it should test.  Most tests don't
 
530
access these directly, but rather use ``self.get_transport`` which returns
 
531
a transport of the appropriate type.
 
532
 
 
533
The goal is to run per-implementation only tests that relate to that
 
534
particular interface.  Sometimes we discover a bug elsewhere that happens
 
535
with only one particular transport.  Once it's isolated, we can consider 
 
536
whether a test should be added for that particular implementation,
 
537
or for all implementations of the interface.
 
538
 
 
539
The multiplication of tests for different implementations is normally 
 
540
accomplished by overriding the ``test_suite`` function used to load 
 
541
tests from a module.  This function typically loads all the tests,
 
542
then applies a TestProviderAdapter to them, which generates a longer 
 
543
suite containing all the test variations.
 
544
 
 
545
 
 
546
Test scenarios
 
547
--------------
 
548
 
 
549
Some utilities are provided for generating variations of tests.  This can
 
550
be used for per-implementation tests, or other cases where the same test
 
551
code needs to run several times on different scenarios.
 
552
 
 
553
The general approach is to define a class that provides test methods,
 
554
which depend on attributes of the test object being pre-set with the
 
555
values to which the test should be applied.  The test suite should then
 
556
also provide a list of scenarios in which to run the tests.
 
557
 
 
558
Typically ``multiply_tests_from_modules`` should be called from the test
 
559
module's ``test_suite`` function.
 
560
 
 
561
 
 
562
Essential Domain Classes
 
563
########################
 
564
 
 
565
Introducing the Object Model
 
566
============================
 
567
 
 
568
The core domain objects within the bazaar model are:
 
569
 
 
570
* Transport
 
571
 
 
572
* Branch
 
573
 
 
574
* Repository
 
575
 
 
576
* WorkingTree
 
577
 
 
578
Transports are explained below. See http://bazaar-vcs.org/Classes/
 
579
for an introduction to the other key classes.
 
580
 
 
581
Using Transports
 
582
================
 
583
 
 
584
The ``Transport`` layer handles access to local or remote directories.
 
585
Each Transport object acts like a logical connection to a particular
 
586
directory, and it allows various operations on files within it.  You can
 
587
*clone* a transport to get a new Transport connected to a subdirectory or
 
588
parent directory.
 
589
 
 
590
Transports are not used for access to the working tree.  At present
 
591
working trees are always local and they are accessed through the regular
 
592
Python file io mechanisms.
 
593
 
 
594
Filenames vs URLs
 
595
-----------------
 
596
 
 
597
Transports work in URLs.  Take note that URLs are by definition only
 
598
ASCII - the decision of how to encode a Unicode string into a URL must be
 
599
taken at a higher level, typically in the Store.  (Note that Stores also
 
600
escape filenames which cannot be safely stored on all filesystems, but
 
601
this is a different level.)
 
602
 
 
603
The main reason for this is that it's not possible to safely roundtrip a
 
604
URL into Unicode and then back into the same URL.  The URL standard
 
605
gives a way to represent non-ASCII bytes in ASCII (as %-escapes), but
 
606
doesn't say how those bytes represent non-ASCII characters.  (They're not
 
607
guaranteed to be UTF-8 -- that is common but doesn't happen everywhere.)
 
608
 
 
609
For example if the user enters the url ``http://example/%e0`` there's no
 
610
way to tell whether that character represents "latin small letter a with
 
611
grave" in iso-8859-1, or "latin small letter r with acute" in iso-8859-2
 
612
or malformed UTF-8.  So we can't convert their URL to Unicode reliably.
 
613
 
 
614
Equally problematic if we're given a url-like string containing non-ascii
 
615
characters (such as the accented a) we can't be sure how to convert that
 
616
to the correct URL, because we don't know what encoding the server expects
 
617
for those characters.  (Although this is not totally reliable we might still
 
618
accept these and assume they should be put into UTF-8.)
 
619
 
 
620
A similar edge case is that the url ``http://foo/sweet%2Fsour`` contains
 
621
one directory component whose name is "sweet/sour".  The escaped slash is
 
622
not a directory separator.  If we try to convert URLs to regular Unicode
 
623
paths this information will be lost.
 
624
 
 
625
This implies that Transports must natively deal with URLs; for simplicity
 
626
they *only* deal with URLs and conversion of other strings to URLs is done
 
627
elsewhere.  Information they return, such as from ``list_dir``, is also in
 
628
the form of URL components.
295
629
 
296
630
 
297
631
Core Topics
300
634
Evolving Interfaces
301
635
===================
302
636
 
303
 
We don't change APIs in stable branches: any supported symbol in a stable
304
 
release of bzr must not be altered in any way that would result in
 
637
We have a commitment to 6 months API stability - any supported symbol in a
 
638
release of bzr MUST NOT be altered in any way that would result in
305
639
breaking existing code that uses it. That means that method names,
306
640
parameter ordering, parameter names, variable and attribute names etc must
307
641
not be changed without leaving a 'deprecated forwarder' behind. This even
311
645
way, you need to change its name as well. For instance, if I add an optional keyword
312
646
parameter to branch.commit - that's fine. On the other hand, if I add a
313
647
keyword parameter to branch.commit which is a *required* transaction
314
 
object, I should rename the API - i.e. to 'branch.commit_transaction'.
315
 
 
316
 
  (Actually, that may break code that provides a new implementation of
317
 
  ``commit`` and doesn't expect to receive the parameter.)
 
648
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
318
649
 
319
650
When renaming such supported API's, be sure to leave a deprecated_method (or
320
651
_function or ...) behind which forwards to the new API. See the
321
652
bzrlib.symbol_versioning module for decorators that take care of the
322
653
details for you - such as updating the docstring, and issuing a warning
323
 
when the old API is used.
 
654
when the old api is used.
324
655
 
325
656
For unsupported API's, it does not hurt to follow this discipline, but it's
326
657
not required. Minimally though, please try to rename things so that
332
663
 
333
664
``bzrlib.symbol_versioning`` provides decorators that can be attached to
334
665
methods, functions, and other interfaces to indicate that they should no
335
 
longer be used.  For example::
336
 
 
337
 
   @deprecated_method(deprecated_in((0, 1, 4)))
338
 
   def foo(self):
339
 
        return self._new_foo()
 
666
longer be used.
340
667
 
341
668
To deprecate a static method you must call ``deprecated_function``
342
669
(**not** method), after the staticmethod call::
343
670
 
344
671
    @staticmethod
345
 
    @deprecated_function(deprecated_in((0, 1, 4)))
 
672
    @deprecated_function(zero_ninetyone)
346
673
    def create_repository(base, shared=False, format=None):
347
674
 
348
675
When you deprecate an API, you should not just delete its tests, because
352
679
the expected deprecation message, and also returns the real result from
353
680
the method, so that tests can keep running.
354
681
 
355
 
Deprecation warnings will be suppressed for final releases, but not for
356
 
development versions or release candidates, or when running ``bzr
357
 
selftest``. This gives developers information about whether their code is
358
 
using deprecated functions, but avoids confusing users about things they
359
 
can't fix.
 
682
Coding Style Guidelines
 
683
=======================
 
684
 
 
685
hasattr and getattr
 
686
-------------------
 
687
 
 
688
``hasattr`` should not be used because it swallows exceptions including
 
689
``KeyboardInterrupt``.  Instead, say something like ::
 
690
 
 
691
  if getattr(thing, 'name', None) is None
 
692
 
 
693
 
 
694
Code layout
 
695
-----------
 
696
 
 
697
Please write PEP-8__ compliant code.  
 
698
 
 
699
__ http://www.python.org/peps/pep-0008.html
 
700
 
 
701
One often-missed requirement is that the first line of docstrings
 
702
should be a self-contained one-sentence summary.
 
703
 
 
704
We use 4 space indents for blocks, and never use tab characters.  (In vim,
 
705
``set expandtab``.)
 
706
 
 
707
Lines should be no more than 79 characters if at all possible.
 
708
Lines that continue a long statement may be indented in either of 
 
709
two ways:
 
710
 
 
711
within the parenthesis or other character that opens the block, e.g.::
 
712
 
 
713
    my_long_method(arg1,
 
714
                   arg2,
 
715
                   arg3)
 
716
 
 
717
or indented by four spaces::
 
718
 
 
719
    my_long_method(arg1,
 
720
        arg2,
 
721
        arg3)
 
722
 
 
723
The first is considered clearer by some people; however it can be a bit
 
724
harder to maintain (e.g. when the method name changes), and it does not
 
725
work well if the relevant parenthesis is already far to the right.  Avoid
 
726
this::
 
727
 
 
728
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
 
729
                                                     two,
 
730
                                                     three)
 
731
 
 
732
but rather ::
 
733
 
 
734
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
 
735
         two,
 
736
         three)
 
737
 
 
738
or ::
 
739
 
 
740
     self.legbone.kneebone.shinbone.toebone.shake_it(
 
741
         one, two, three)
 
742
 
 
743
For long lists, we like to add a trailing comma and put the closing
 
744
character on the following line.  This makes it easier to add new items in
 
745
future::
 
746
 
 
747
    from bzrlib.goo import (
 
748
        jam,
 
749
        jelly,
 
750
        marmalade,
 
751
        )
 
752
 
 
753
There should be spaces between function paramaters, but not between the
 
754
keyword name and the value::
 
755
 
 
756
    call(1, 3, cheese=quark)
 
757
 
 
758
In emacs::
 
759
 
 
760
    ;(defface my-invalid-face
 
761
    ;  '((t (:background "Red" :underline t)))
 
762
    ;  "Face used to highlight invalid constructs or other uglyties"
 
763
    ;  )
 
764
 
 
765
    (defun my-python-mode-hook ()
 
766
     ;; setup preferred indentation style.
 
767
     (setq fill-column 79)
 
768
     (setq indent-tabs-mode nil) ; no tabs, never, I will not repeat
 
769
    ;  (font-lock-add-keywords 'python-mode
 
770
    ;                         '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs
 
771
    ;                            ("[ \t]+$" . 'my-invalid-face)  ; Trailing spaces
 
772
    ;                            ("^[ \t]+$" . 'my-invalid-face)); Spaces only
 
773
    ;                          )
 
774
     )
 
775
 
 
776
    (add-hook 'python-mode-hook 'my-python-mode-hook)
 
777
 
 
778
The lines beginning with ';' are comments. They can be activated
 
779
if one want to have a strong notice of some tab/space usage
 
780
violations.
 
781
 
 
782
 
 
783
Module Imports
 
784
--------------
 
785
 
 
786
* Imports should be done at the top-level of the file, unless there is
 
787
  a strong reason to have them lazily loaded when a particular
 
788
  function runs.  Import statements have a cost, so try to make sure
 
789
  they don't run inside hot functions.
 
790
 
 
791
* Module names should always be given fully-qualified,
 
792
  i.e. ``bzrlib.hashcache`` not just ``hashcache``.
 
793
 
 
794
 
 
795
Naming
 
796
------
 
797
 
 
798
Functions, methods or members that are "private" to bzrlib are given
 
799
a leading underscore prefix.  Names without a leading underscore are
 
800
public not just across modules but to programmers using bzrlib as an
 
801
API. As a consequence, a leading underscore is appropriate for names
 
802
exposed across modules but that are not to be exposed to bzrlib API
 
803
programmers.
 
804
 
 
805
We prefer class names to be concatenated capital words (``TestCase``)
 
806
and variables, methods and functions to be lowercase words joined by
 
807
underscores (``revision_id``, ``get_revision``).
 
808
 
 
809
For the purposes of naming some names are treated as single compound
 
810
words: "filename", "revno".
 
811
 
 
812
Consider naming classes as nouns and functions/methods as verbs.
 
813
 
 
814
Try to avoid using abbreviations in names, because there can be
 
815
inconsistency if other people use the full name.
 
816
 
 
817
 
 
818
Standard Names
 
819
--------------
 
820
 
 
821
``revision_id`` not ``rev_id`` or ``revid``
 
822
 
 
823
Functions that transform one thing to another should be named ``x_to_y``
 
824
(not ``x2y`` as occurs in some old code.)
 
825
 
 
826
 
 
827
Destructors
 
828
-----------
 
829
 
 
830
Python destructors (``__del__``) work differently to those of other
 
831
languages.  In particular, bear in mind that destructors may be called
 
832
immediately when the object apparently becomes unreferenced, or at some
 
833
later time, or possibly never at all.  Therefore we have restrictions on
 
834
what can be done inside them.
 
835
 
 
836
 0. Never use a __del__ method without asking Martin/Robert first.
 
837
 
 
838
 1. Never rely on a ``__del__`` method running.  If there is code that
 
839
    must run, do it from a ``finally`` block instead.
 
840
 
 
841
 2. Never ``import`` from inside a ``__del__`` method, or you may crash the
 
842
    interpreter!!
 
843
 
 
844
 3. In some places we raise a warning from the destructor if the object
 
845
    has not been cleaned up or closed.  This is considered OK: the warning
 
846
    may not catch every case but it's still useful sometimes.
 
847
 
 
848
 
 
849
Factories
 
850
---------
 
851
 
 
852
In some places we have variables which point to callables that construct
 
853
new instances.  That is to say, they can be used a lot like class objects,
 
854
but they shouldn't be *named* like classes:
 
855
 
 
856
> I think that things named FooBar should create instances of FooBar when
 
857
> called. Its plain confusing for them to do otherwise. When we have
 
858
> something that is going to be used as a class - that is, checked for via
 
859
> isinstance or other such idioms, them I would call it foo_class, so that
 
860
> it is clear that a callable is not sufficient. If it is only used as a
 
861
> factory, then yes, foo_factory is what I would use.
 
862
 
 
863
 
 
864
Registries
 
865
----------
 
866
 
 
867
Several places in Bazaar use (or will use) a registry, which is a 
 
868
mapping from names to objects or classes.  The registry allows for 
 
869
loading in registered code only when it's needed, and keeping
 
870
associated information such as a help string or description.
 
871
 
 
872
 
 
873
Lazy Imports
 
874
------------
 
875
 
 
876
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
 
877
delay importing modules until they are actually used. ``lazy_import`` uses
 
878
the same syntax as regular python imports. So to import a few modules in a
 
879
lazy fashion do::
 
880
 
 
881
  from bzrlib.lazy_import import lazy_import
 
882
  lazy_import(globals(), """
 
883
  import os
 
884
  import subprocess
 
885
  import sys
 
886
  import time
 
887
 
 
888
  from bzrlib import (
 
889
     errors,
 
890
     transport,
 
891
     revision as _mod_revision,
 
892
     )
 
893
  import bzrlib.transport
 
894
  import bzrlib.xml5
 
895
  """)
 
896
 
 
897
At this point, all of these exist as a ``ImportReplacer`` object, ready to
 
898
be imported once a member is accessed. Also, when importing a module into
 
899
the local namespace, which is likely to clash with variable names, it is
 
900
recommended to prefix it as ``_mod_<module>``. This makes it clearer that
 
901
the variable is a module, and these object should be hidden anyway, since
 
902
they shouldn't be imported into other namespaces.
 
903
 
 
904
 
 
905
Modules versus Members
 
906
~~~~~~~~~~~~~~~~~~~~~~
 
907
 
 
908
While it is possible for ``lazy_import()`` to import members of a module
 
909
when using the ``from module import member`` syntax, it is recommended to
 
910
only use that syntax to load sub modules ``from module import submodule``.
 
911
This is because variables and classes can frequently be used without
 
912
needing a sub-member for example::
 
913
 
 
914
  lazy_import(globals(), """
 
915
  from module import MyClass
 
916
  """)
 
917
 
 
918
  def test(x):
 
919
      return isinstance(x, MyClass)
 
920
 
 
921
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
 
922
object, rather than the real class.
 
923
 
 
924
 
 
925
Passing to Other Variables
 
926
~~~~~~~~~~~~~~~~~~~~~~~~~~
 
927
 
 
928
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
 
929
Because the replacer only knows about the original name, it is unable to
 
930
replace other variables. The ``ImportReplacer`` class will raise an
 
931
``IllegalUseOfScopeReplacer`` exception if it can figure out that this
 
932
happened. But it requires accessing a member more than once from the new
 
933
variable, so some bugs are not detected right away.
 
934
 
 
935
 
 
936
The Null revision
 
937
-----------------
 
938
 
 
939
The null revision is the ancestor of all revisions.  Its revno is 0, its
 
940
revision-id is ``null:``, and its tree is the empty tree.  When referring
 
941
to the null revision, please use ``bzrlib.revision.NULL_REVISION``.  Old
 
942
code sometimes uses ``None`` for the null revision, but this practice is
 
943
being phased out.
 
944
 
 
945
 
 
946
Getting Input
 
947
=============
 
948
 
 
949
Processing Command Lines
 
950
------------------------
 
951
 
 
952
bzrlib has a standard framework for parsing command lines and calling
 
953
processing routines associated with various commands. See builtins.py
 
954
for numerous examples.
 
955
 
 
956
 
 
957
Standard Parameter Types
 
958
------------------------
 
959
 
 
960
There are some common requirements in the library: some parameters need to be
 
961
unicode safe, some need byte strings, and so on. At the moment we have
 
962
only codified one specific pattern: Parameters that need to be unicode
 
963
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
 
964
input into unicode in a consistent fashion, allowing trivial strings to be
 
965
used for programmer convenience, but not performing unpredictably in the
 
966
presence of different locales.
 
967
 
 
968
 
 
969
Writing Output
 
970
==============
 
971
 
 
972
(The strategy described here is what we want to get to, but it's not
 
973
consistently followed in the code at the moment.)
 
974
 
 
975
bzrlib is intended to be a generically reusable library.  It shouldn't
 
976
write messages to stdout or stderr, because some programs that use it
 
977
might want to display that information through a GUI or some other
 
978
mechanism.
 
979
 
 
980
We can distinguish two types of output from the library:
 
981
 
 
982
 1. Structured data representing the progress or result of an
 
983
    operation.  For example, for a commit command this will be a list
 
984
    of the modified files and the finally committed revision number
 
985
    and id.
 
986
 
 
987
    These should be exposed either through the return code or by calls
 
988
    to a callback parameter.
 
989
 
 
990
    A special case of this is progress indicators for long-lived
 
991
    operations, where the caller should pass a ProgressBar object.
 
992
 
 
993
 2. Unstructured log/debug messages, mostly for the benefit of the
 
994
    developers or users trying to debug problems.  This should always
 
995
    be sent through ``bzrlib.trace`` and Python ``logging``, so that
 
996
    it can be redirected by the client.
 
997
 
 
998
The distinction between the two is a bit subjective, but in general if
 
999
there is any chance that a library would want to see something as
 
1000
structured data, we should make it so.
 
1001
 
 
1002
The policy about how output is presented in the text-mode client
 
1003
should be only in the command-line tool.
 
1004
 
 
1005
 
 
1006
 
 
1007
Displaying help
 
1008
===============
 
1009
 
 
1010
Bazaar has online help for various topics through ``bzr help COMMAND`` or
 
1011
equivalently ``bzr command -h``.  We also have help on command options,
 
1012
and on other help topics.  (See ``help_topics.py``.)
 
1013
 
 
1014
As for python docstrings, the first paragraph should be a single-sentence
 
1015
synopsis of the command.
 
1016
 
 
1017
The help for options should be one or more proper sentences, starting with
 
1018
a capital letter and finishing with a full stop (period).
 
1019
 
 
1020
All help messages and documentation should have two spaces between
 
1021
sentences.
 
1022
 
 
1023
 
 
1024
Writing tests
 
1025
=============
 
1026
 
 
1027
In general tests should be placed in a file named test_FOO.py where 
 
1028
FOO is the logical thing under test. That file should be placed in the
 
1029
tests subdirectory under the package being tested.
 
1030
 
 
1031
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
 
1032
See bzrlib/tests/test_sampler.py for a template test script.
 
1033
 
 
1034
Tests can be written for the UI or for individual areas of the library.
 
1035
Choose whichever is appropriate: if adding a new command, or a new command 
 
1036
option, then you should be writing a UI test.  If you are both adding UI
 
1037
functionality and library functionality, you will want to write tests for 
 
1038
both the UI and the core behaviours.  We call UI tests 'blackbox' tests
 
1039
and they are found in ``bzrlib/tests/blackbox/*.py``. 
 
1040
 
 
1041
When writing blackbox tests please honour the following conventions:
 
1042
 
 
1043
 1. Place the tests for the command 'name' in
 
1044
    bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
 
1045
    to locate the test script for a faulty command.
 
1046
 
 
1047
 2. Use the 'self.run_bzr("name")' utility function to invoke the command
 
1048
    rather than running bzr in a subprocess or invoking the
 
1049
    cmd_object.run() method directly. This is a lot faster than
 
1050
    subprocesses and generates the same logging output as running it in a
 
1051
    subprocess (which invoking the method directly does not).
 
1052
 
 
1053
 3. Only test the one command in a single test script. Use the bzrlib 
 
1054
    library when setting up tests and when evaluating the side-effects of
 
1055
    the command. We do this so that the library api has continual pressure
 
1056
    on it to be as functional as the command line in a simple manner, and
 
1057
    to isolate knock-on effects throughout the blackbox test suite when a
 
1058
    command changes its name or signature. Ideally only the tests for a
 
1059
    given command are affected when a given command is changed.
 
1060
 
 
1061
 4. If you have a test which does actually require running bzr in a
 
1062
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
 
1063
    process will not load plugins unless ``--allow-plugins`` is supplied.
 
1064
 
 
1065
 
 
1066
Test support
 
1067
------------
 
1068
 
 
1069
We have a rich collection of tools to support writing tests. Please use
 
1070
them in preference to ad-hoc solutions as they provide portability and
 
1071
performance benefits.
 
1072
 
 
1073
TreeBuilder
 
1074
~~~~~~~~~~~
 
1075
 
 
1076
The ``TreeBuilder`` interface allows the construction of arbitrary trees
 
1077
with a declarative interface. A sample session might look like::
 
1078
 
 
1079
  tree = self.make_branch_and_tree('path')
 
1080
  builder = TreeBuilder()
 
1081
  builder.start_tree(tree)
 
1082
  builder.build(['foo', "bar/", "bar/file"])
 
1083
  tree.commit('commit the tree')
 
1084
  builder.finish_tree()
 
1085
 
 
1086
Please see bzrlib.treebuilder for more details.
 
1087
 
 
1088
BranchBuilder
 
1089
~~~~~~~~~~~~~
 
1090
 
 
1091
The ``BranchBuilder`` interface allows the creation of test branches in a
 
1092
quick and easy manner. A sample session::
 
1093
 
 
1094
  builder = BranchBuilder(self.get_transport().clone('relpath'))
 
1095
  builder.build_commit()
 
1096
  builder.build_commit()
 
1097
  builder.build_commit()
 
1098
  branch = builder.get_branch()
 
1099
 
 
1100
Please see bzrlib.branchbuilder for more details.
 
1101
 
 
1102
Doctests
 
1103
--------
 
1104
 
 
1105
We make selective use of doctests__.  In general they should provide 
 
1106
*examples* within the API documentation which can incidentally be tested.  We 
 
1107
don't try to test every important case using doctests -- regular Python
 
1108
tests are generally a better solution.
 
1109
 
 
1110
Most of these are in ``bzrlib/doc/api``.  More additions are welcome.
 
1111
 
 
1112
  __ http://docs.python.org/lib/module-doctest.html
 
1113
 
 
1114
 
 
1115
Running tests
 
1116
=============
 
1117
Currently, bzr selftest is used to invoke tests.
 
1118
You can provide a pattern argument to run a subset. For example, 
 
1119
to run just the blackbox tests, run::
 
1120
 
 
1121
  ./bzr selftest -v blackbox
 
1122
 
 
1123
To skip a particular test (or set of tests), use the --exclude option
 
1124
(shorthand -x) like so::
 
1125
 
 
1126
  ./bzr selftest -v -x blackbox  
 
1127
 
 
1128
To list tests without running them, use the --list-only option like so::
 
1129
 
 
1130
  ./bzr selftest --list-only
 
1131
 
 
1132
This option can be combined with other selftest options (like -x) and
 
1133
filter patterns to understand their effect.
 
1134
 
 
1135
 
 
1136
Handling Errors and Exceptions
 
1137
==============================
 
1138
 
 
1139
Commands should return non-zero when they encounter circumstances that
 
1140
the user should really pay attention to - which includes trivial shell
 
1141
pipelines.
 
1142
 
 
1143
Recommended values are:
 
1144
 
 
1145
    0. OK.
 
1146
    1. Conflicts in merge-like operations, or changes are present in
 
1147
       diff-like operations. 
 
1148
    2. Unrepresentable diff changes (i.e. binary files that we cannot show 
 
1149
       a diff of).
 
1150
    3. An error or exception has occurred.
 
1151
    4. An internal error occurred (one that shows a traceback.)
 
1152
 
 
1153
Errors are handled through Python exceptions. Exceptions should be defined
 
1154
inside bzrlib.errors, so that we can see the whole tree at a glance.
 
1155
 
 
1156
We broadly classify errors as either being either internal or not,
 
1157
depending on whether ``internal_error`` is set or not.  If we think it's our
 
1158
fault, we show a backtrace, an invitation to report the bug, and possibly
 
1159
other details.  This is the default for errors that aren't specifically
 
1160
recognized as being caused by a user error.  Otherwise we show a briefer
 
1161
message, unless -Derror was given.
 
1162
 
 
1163
Many errors originate as "environmental errors" which are raised by Python
 
1164
or builtin libraries -- for example IOError.  These are treated as being
 
1165
our fault, unless they're caught in a particular tight scope where we know
 
1166
that they indicate a user errors.  For example if the repository format
 
1167
is not found, the user probably gave the wrong path or URL.  But if one of
 
1168
the files inside the repository is not found, then it's our fault --
 
1169
either there's a bug in bzr, or something complicated has gone wrong in
 
1170
the environment that means one internal file was deleted.
 
1171
 
 
1172
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors
 
1173
to be added near the place where they are used.
 
1174
 
 
1175
Exceptions are formatted for the user by conversion to a string
 
1176
(eventually calling their ``__str__`` method.)  As a convenience the
 
1177
``._fmt`` member can be used as a template which will be mapped to the
 
1178
error's instance dict.
 
1179
 
 
1180
New exception classes should be defined when callers might want to catch
 
1181
that exception specifically, or when it needs a substantially different
 
1182
format string.
 
1183
 
 
1184
Exception strings should start with a capital letter and should not have a
 
1185
final fullstop.  If long, they may contain newlines to break the text.
 
1186
 
 
1187
 
 
1188
Assertions
 
1189
----------
 
1190
 
 
1191
Do not use the Python ``assert`` statement, either in tests or elsewhere.
 
1192
A source test checks that it is not used.  It is ok to explicitly raise
 
1193
AssertionError.
 
1194
 
 
1195
Rationale:
 
1196
 
 
1197
 * It makes the behaviour vary depending on whether bzr is run with -O
 
1198
   or not, therefore giving a chance for bugs that occur in one case or
 
1199
   the other, several of which have already occurred: assertions with
 
1200
   side effects, code which can't continue unless the assertion passes,
 
1201
   cases where we should give the user a proper message rather than an
 
1202
   assertion failure.
 
1203
 * It's not that much shorter than an explicit if/raise.
 
1204
 * It tends to lead to fuzzy thinking about whether the check is
 
1205
   actually needed or not, and whether it's an internal error or not
 
1206
 * It tends to cause look-before-you-leap patterns.
 
1207
 * It's unsafe if the check is needed to protect the integrity of the
 
1208
   user's data.
 
1209
 * It tends to give poor messages since the developer can get by with
 
1210
   no explanatory text at all.
 
1211
 * We can't rely on people always running with -O in normal use, so we
 
1212
   can't use it for tests that are actually expensive.
 
1213
 * Expensive checks that help developers are better turned on from the
 
1214
   test suite or a -D flag.
 
1215
 * If used instead of ``self.assert*()`` in tests it makes them falsely pass with -O.
 
1216
 
 
1217
 
 
1218
Documenting Changes
 
1219
===================
 
1220
 
 
1221
When you change bzrlib, please update the relevant documentation for the
 
1222
change you made: Changes to commands should update their help, and
 
1223
possibly end user tutorials; changes to the core library should be
 
1224
reflected in API documentation.
 
1225
 
 
1226
NEWS File
 
1227
---------
 
1228
 
 
1229
If you make a user-visible change, please add a note to the NEWS file.
 
1230
The description should be written to make sense to someone who's just
 
1231
a user of bzr, not a developer: new functions or classes shouldn't be
 
1232
mentioned, but new commands, changes in behaviour or fixed nontrivial
 
1233
bugs should be listed.  See the existing entries for an idea of what
 
1234
should be done.
 
1235
 
 
1236
Within each release, entries in the news file should have the most
 
1237
user-visible changes first.  So the order should be approximately:
 
1238
 
 
1239
 * changes to existing behaviour - the highest priority because the 
 
1240
   user's existing knowledge is incorrect
 
1241
 * new features - should be brought to their attention
 
1242
 * bug fixes - may be of interest if the bug was affecting them, and
 
1243
   should include the bug number if any
 
1244
 * major documentation changes
 
1245
 * changes to internal interfaces
 
1246
 
 
1247
People who made significant contributions to each change are listed in
 
1248
parenthesis.  This can include reporting bugs (particularly with good
 
1249
details or reproduction recipes), submitting patches, etc.
 
1250
 
 
1251
Commands
 
1252
--------
 
1253
 
 
1254
The docstring of a command is used by ``bzr help`` to generate help output
 
1255
for the command. The list 'takes_options' attribute on a command is used by
 
1256
``bzr help`` to document the options for the command - the command
 
1257
docstring does not need to document them. Finally, the '_see_also'
 
1258
attribute on a command can be used to reference other related help topics.
 
1259
 
 
1260
API Documentation
 
1261
-----------------
 
1262
 
 
1263
Functions, methods, classes and modules should have docstrings
 
1264
describing how they are used. 
 
1265
 
 
1266
The first line of the docstring should be a self-contained sentence.
 
1267
 
 
1268
For the special case of Command classes, this acts as the user-visible
 
1269
documentation shown by the help command.
 
1270
 
 
1271
The docstrings should be formatted as reStructuredText_ (like this
 
1272
document), suitable for processing using the epydoc_ tool into HTML
 
1273
documentation.
 
1274
 
 
1275
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
 
1276
.. _epydoc: http://epydoc.sourceforge.net/
360
1277
 
361
1278
 
362
1279
General Guidelines
375
1292
    We had the problem that lots of our files were "Copyright Canonical
376
1293
    Development Ltd" which is not a real company, and some other variations
377
1294
    on this theme. Also, some files were missing the GPL statements.
378
 
 
 
1295
    
379
1296
    I want to be clear about the intent of this patch, since copyright can
380
1297
    be a little controversial.
381
 
 
 
1298
    
382
1299
    1) The big motivation for this is not to shut out the community, but
383
1300
    just to clean up all of the invalid copyright statements.
384
 
 
 
1301
    
385
1302
    2) It has been the general policy for bzr that we want a single
386
1303
    copyright holder for all of the core code. This is following the model
387
1304
    set by the FSF, which makes it easier to update the code to a new
394
1311
    I'm sure Canonical would do the same).
395
1312
    As such, Canonical has requested copyright assignments from all of the
396
1313
    major contributers.
397
 
 
 
1314
    
398
1315
    3) If someone wants to add code and not attribute it to Canonical, there
399
1316
    is a specific list of files that are excluded from this check. And the
400
1317
    test failure indicates where that is, and how to update it.
401
 
 
 
1318
    
402
1319
    4) If anyone feels that I changed a copyright statement incorrectly, just
403
1320
    let me know, and I'll be happy to correct it. Whenever you have large
404
1321
    mechanical changes like this, it is possible to make some mistakes.
405
 
 
 
1322
    
406
1323
    Just to reiterate, this is a community project, and it is meant to stay
407
1324
    that way. Core bzr code is copyright Canonical for legal reasons, and
408
1325
    the tests are just there to help us maintain that.
419
1336
 
420
1337
.. _pdb: http://docs.python.org/lib/debugger-commands.html
421
1338
 
422
 
If the ``BZR_PDB`` environment variable is set
 
1339
If the ``BZR_PDB`` environment variable is set 
423
1340
then bzr will go into pdb post-mortem mode when an unhandled exception
424
1341
occurs.
425
1342
 
426
 
If you send a SIGQUIT or SIGBREAK signal to bzr then it will drop into the
427
 
debugger immediately. SIGQUIT can be generated by pressing Ctrl-\\ on
428
 
Unix.  SIGBREAK is generated with Ctrl-Pause on Windows (some laptops have
429
 
this as Fn-Pause).  You can continue execution by typing ``c``.  This can
430
 
be disabled if necessary by setting the environment variable
431
 
``BZR_SIGQUIT_PDB=0``.
432
 
 
433
 
 
434
 
Debug Flags
435
 
===========
436
 
 
437
 
Bazaar accepts some global options starting with ``-D`` such as
438
 
``-Dhpss``.  These set a value in `bzrlib.debug.debug_flags`, and
439
 
typically cause more information to be written to the trace file.  Most
440
 
`mutter` calls should be guarded by a check of those flags so that we
441
 
don't write out too much information if it's not needed.
442
 
 
443
 
Debug flags may have effects other than just emitting trace messages.
444
 
 
445
 
Run ``bzr help global-options`` to see them all.
446
 
 
447
 
These flags may also be set as a comma-separated list in the
448
 
``debug_flags`` option in e.g.  ``~/.bazaar/bazaar.conf``.  (Note that it
449
 
must be in this global file, not in the branch or location configuration,
450
 
because it's currently only loaded at startup time.)  For instance you may
451
 
want to always record hpss traces and to see full error tracebacks::
452
 
 
453
 
    debug_flags = hpss, error
 
1343
If you send a SIGQUIT signal to bzr, which can be done by pressing
 
1344
Ctrl-\\ on Unix, bzr will go into the debugger immediately.  You can
 
1345
continue execution by typing ``c``.  This can be disabled if necessary
 
1346
by setting the environment variable ``BZR_SIGQUIT_PDB=0``.
454
1347
 
455
1348
 
456
1349
Jargon
487
1380
    for automated processing.
488
1381
    For example: ``bzr log`` should not fail if one of the entries has text
489
1382
    that cannot be displayed.
490
 
 
 
1383
  
491
1384
  strict
492
1385
    Attempting to print an unprintable character will cause a UnicodeError.
493
1386
    This is for commands that are intended more as scripting support, rather
494
1387
    than plain user review.
495
 
    For example: ``bzr ls`` is designed to be used with shell scripting. One
496
 
    use would be ``bzr ls --null --unknowns | xargs -0 rm``.  If ``bzr``
 
1388
    For exampl: ``bzr ls`` is designed to be used with shell scripting. One
 
1389
    use would be ``bzr ls --null --unknows | xargs -0 rm``.  If ``bzr``
497
1390
    printed a filename with a '?', the wrong file could be deleted. (At the
498
1391
    very least, the correct file would not be deleted). An error is used to
499
1392
    indicate that the requested action could not be performed.
500
 
 
 
1393
  
501
1394
  exact
502
1395
    Do not attempt to automatically convert Unicode strings. This is used
503
1396
    for commands that must handle conversion themselves.
517
1410
valid characters are generated where possible.
518
1411
 
519
1412
 
 
1413
Portability Tips
 
1414
================
 
1415
 
 
1416
The ``bzrlib.osutils`` module has many useful helper functions, including
 
1417
some more portable variants of functions in the standard library.
 
1418
 
 
1419
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it
 
1420
to fail on Windows if some files are readonly or still open elsewhere.
 
1421
Use ``bzrlib.osutils.rmtree`` instead.
 
1422
 
 
1423
 
520
1424
C Extension Modules
521
1425
===================
522
1426
 
540
1444
 
541
1445
To create an extension, add rules to setup.py for building it with pyrex,
542
1446
and with distutils. Now start with an empty .pyx file. At the top add
543
 
"include 'yourmodule.py'". This will import the contents of foo.py into this
 
1447
"include 'yourmodule.py'". This will import the contents of foo.py into this 
544
1448
file at build time - remember that only one module will be loaded at
545
1449
runtime. Now you can subclass classes, or replace functions, and only your
546
1450
changes need to be present in the .pyx file.
547
1451
 
548
1452
Note that pyrex does not support all 2.4 programming idioms, so some
549
 
syntax changes may be required. I.e.
 
1453
syntax changes may be required. I.e. 
550
1454
 
551
 
 - 'from foo import (bar, gam)' needs to change to not use the brackets.
552
 
 - 'import foo.bar as bar' needs to be 'import foo.bar; bar = foo.bar'
 
1455
 - 'from foo import (bar, gam)' needs to change to not use the brackets. 
 
1456
 - 'import foo.bar as bar' needs to be 'import foo.bar; bar = foo.bar' 
553
1457
 
554
1458
If the changes are too dramatic, consider
555
1459
maintaining the python code twice - once in the .pyx, and once in the .py,
559
1463
Making Installers for OS Windows
560
1464
================================
561
1465
To build a win32 installer, see the instructions on the wiki page:
562
 
http://wiki.bazaar.canonical.com/BzrWin32Installer
 
1466
http://bazaar-vcs.org/BzrWin32Installer
 
1467
 
563
1468
 
564
1469
Core Developer Tasks
565
1470
####################
578
1483
* reviewing changes
579
1484
* reviewing blueprints
580
1485
* planning releases
581
 
* managing releases (see `Releasing Bazaar <http://doc.bazaar.canonical.com/developers/releasing.html>`_)
 
1486
* managing releases.
582
1487
 
583
1488
.. note::
584
1489
  Removing barriers to community participation is a key reason for adopting
589
1494
  differences between core and non-core contributors to a minimum.
590
1495
 
591
1496
 
 
1497
The Development Lifecycle
 
1498
-------------------------
 
1499
 
 
1500
As a rule, Bazaar development follows a 4 week cycle:
 
1501
 
 
1502
* 2 weeks - general changes
 
1503
* 1 week - feature freeze
 
1504
* 1 week+ - Release Candidate stabilization
 
1505
 
 
1506
During the FeatureFreeze week, the trunk (bzr.dev) is open in a limited
 
1507
way: only low risk changes, critical and high priority fixes are accepted
 
1508
during this time. At the end of FeatureFreeze, a branch is created for the
 
1509
first Release Candidate and the trunk is reopened for general development
 
1510
on the *next* release. A week or so later, the final release is packaged
 
1511
assuming no serious problems were encountered with the one or more Release
 
1512
Candidates.
 
1513
 
 
1514
.. note::
 
1515
  There is a one week overlap between the start of one release and
 
1516
  the end of the previous one.
 
1517
 
 
1518
 
592
1519
Communicating and Coordinating
593
1520
------------------------------
594
1521
 
605
1532
energy by emailing the **bazaar-commits** list implicitly. To do this,
606
1533
install and configure the Email plugin. One way to do this is add these
607
1534
configuration settings to your central configuration file (e.g.
608
 
``~/.bazaar/bazaar.conf``)::
 
1535
``~/.bazaar/bazaar.conf`` on Linux)::
609
1536
 
610
1537
  [DEFAULT]
611
1538
  email = Joe Smith <joe.smith@internode.on.net>
621
1548
how to set it up and configure it.
622
1549
 
623
1550
 
 
1551
Reviewing Changes
 
1552
=================
 
1553
 
 
1554
Setting Up Your Workspace for Reviews
 
1555
-------------------------------------
 
1556
 
 
1557
TODO: Incorporate John Arbash Meinel's detailed email to Ian C on the
 
1558
numerous ways of setting up integration branches.
 
1559
 
 
1560
 
 
1561
The Review Checklist
 
1562
--------------------
 
1563
 
 
1564
See `A Closer Look at the Merge & Review Process`_
 
1565
for information on the gates used to decide whether code can be merged
 
1566
or not and details on how review results are recorded and communicated.
 
1567
 
 
1568
 
 
1569
The Importance of Timely Reviews
 
1570
--------------------------------
 
1571
 
 
1572
Good reviews do take time. They also regularly require a solid
 
1573
understanding of the overall code base. In practice, this means a small
 
1574
number of people often have a large review burden - with knowledge comes
 
1575
responsibility. No one like their merge requests sitting in a queue going
 
1576
nowhere, so reviewing sooner rather than later is strongly encouraged.
 
1577
 
 
1578
 
 
1579
Submitting Changes
 
1580
==================
 
1581
 
 
1582
An Overview of PQM
 
1583
------------------
 
1584
 
 
1585
Of the many workflows supported by Bazaar, the one adopted for Bazaar
 
1586
development itself is known as "Decentralized with automatic gatekeeper".
 
1587
To repeat the explanation of this given on
 
1588
http://bazaar-vcs.org/Workflows:
 
1589
 
 
1590
.. pull-quote::
 
1591
  In this workflow, each developer has their own branch or
 
1592
  branches, plus read-only access to the mainline. A software gatekeeper
 
1593
  (e.g. PQM) has commit rights to the main branch. When a developer wants
 
1594
  their work merged, they request the gatekeeper to merge it. The gatekeeper
 
1595
  does a merge, a compile, and runs the test suite. If the code passes, it
 
1596
  is merged into the mainline.
 
1597
 
 
1598
In a nutshell, here's the overall submission process:
 
1599
 
 
1600
#. get your work ready (including review except for trivial changes)
 
1601
#. push to a public location
 
1602
#. ask PQM to merge from that location
 
1603
 
 
1604
.. note::
 
1605
  At present, PQM always takes the changes to merge from a branch
 
1606
  at a URL that can be read by it. For Bazaar, that means a public,
 
1607
  typically http, URL.
 
1608
 
 
1609
As a result, the following things are needed to use PQM for submissions:
 
1610
 
 
1611
#. A publicly available web server
 
1612
#. Your OpenPGP key registered with PQM (contact RobertCollins for this)
 
1613
#. The PQM plugin installed and configured (not strictly required but
 
1614
   highly recommended).
 
1615
 
 
1616
 
 
1617
Selecting a Public Branch Location
 
1618
----------------------------------
 
1619
 
 
1620
If you don't have your own web server running, branches can always be
 
1621
pushed to Launchpad. Here's the process for doing that:
 
1622
 
 
1623
Depending on your location throughout the world and the size of your
 
1624
repository though, it is often quicker to use an alternative public
 
1625
location to Launchpad, particularly if you can set up your own repo and
 
1626
push into that. By using an existing repo, push only needs to send the
 
1627
changes, instead of the complete repository every time. Note that it is
 
1628
easy to register branches in other locations with Launchpad so no benefits
 
1629
are lost by going this way.
 
1630
 
 
1631
.. note::
 
1632
  For Canonical staff, http://people.ubuntu.com/~<user>/ is one
 
1633
  suggestion for public http branches. Contact your manager for information
 
1634
  on accessing this system if required.
 
1635
 
 
1636
It should also be noted that best practice in this area is subject to
 
1637
change as things evolve. For example, once the Bazaar smart server on
 
1638
Launchpad supports server-side branching, the performance situation will
 
1639
be very different to what it is now (Jun 2007).
 
1640
 
 
1641
 
 
1642
Configuring the PQM Plug-In
 
1643
---------------------------
 
1644
 
 
1645
While not strictly required, the PQM plugin automates a few things and
 
1646
reduces the chance of error. Before looking at the plugin, it helps to
 
1647
understand  a little more how PQM operates. Basically, PQM requires an
 
1648
email indicating what you want it to do. The email typically looks like
 
1649
this::
 
1650
 
 
1651
  star-merge source-branch target-branch
 
1652
 
 
1653
For example::
 
1654
 
 
1655
  star-merge http://bzr.arbash-meinel.com/branches/bzr/jam-integration http://bazaar-vcs.org/bzr/bzr.dev
 
1656
 
 
1657
Note that the command needs to be on one line. The subject of the email
 
1658
will be used for the commit message. The email also needs to be ``gpg``
 
1659
signed with a key that PQM accepts.
 
1660
 
 
1661
The advantages of using the PQM plugin are:
 
1662
 
 
1663
#. You can use the config policies to make it easy to set up public
 
1664
   branches, so you don't have to ever type the full paths you want to merge
 
1665
   from or into.
 
1666
 
 
1667
#. It checks to make sure the public branch last revision matches the
 
1668
   local last revision so you are submitting what you think you are.
 
1669
 
 
1670
#. It uses the same public_branch and smtp sending settings as bzr-email,
 
1671
   so if you have one set up, you have the other mostly set up.
 
1672
 
 
1673
#. Thunderbird refuses to not wrap lines, and request lines are usually
 
1674
   pretty long (you have 2 long URLs in there).
 
1675
 
 
1676
Here are sample configuration settings for the PQM plugin. Here are the
 
1677
lines in bazaar.conf::
 
1678
 
 
1679
  [DEFAULT]
 
1680
  email = Joe Smith <joe.smith@internode.on.net>
 
1681
  smtp_server=mail.internode.on.net:25
 
1682
 
 
1683
And here are the lines in ``locations.conf`` (or ``branch.conf`` for
 
1684
dirstate-tags branches)::
 
1685
 
 
1686
  [/home/joe/bzr/my-integration]
 
1687
  push_location = sftp://joe-smith@bazaar.launchpad.net/%7Ejoe-smith/bzr/my-integration/
 
1688
  push_location:policy = norecurse
 
1689
  public_branch = http://bazaar.launchpad.net/~joe-smith/bzr/my-integration/
 
1690
  public_branch:policy = appendpath
 
1691
  pqm_email = Bazaar PQM <pqm@bazaar-vcs.org>
 
1692
  pqm_branch = http://bazaar-vcs.org/bzr/bzr.dev
 
1693
 
 
1694
Note that the push settings will be added by the first ``push`` on
 
1695
a branch. Indeed the preferred way to generate the lines above is to use
 
1696
``push`` with an argument, then copy-and-paste the other lines into
 
1697
the relevant file.
 
1698
 
 
1699
 
 
1700
Submitting a Change
 
1701
-------------------
 
1702
 
 
1703
Here is one possible recipe once the above environment is set up:
 
1704
 
 
1705
#. pull bzr.dev => my-integration
 
1706
#. merge patch => my-integration
 
1707
#. fix up any final merge conflicts (NEWS being the big killer here).
 
1708
#. commit
 
1709
#. push
 
1710
#. pqm-submit
 
1711
 
 
1712
.. note::
 
1713
  The ``push`` step is not required if ``my-integration`` is a checkout of
 
1714
  a public branch.
 
1715
 
 
1716
  Because of defaults, you can type a single message into commit and
 
1717
  pqm-commit will reuse that.
 
1718
 
 
1719
 
 
1720
Tracking Change Acceptance
 
1721
--------------------------
 
1722
 
 
1723
The web interface to PQM is https://pqm.bazaar-vcs.org/. After submitting
 
1724
a change, you can visit this URL to confirm it was received and placed in
 
1725
PQM's queue.
 
1726
 
 
1727
When PQM completes processing a change, an email is sent to you with the
 
1728
results.
 
1729
 
 
1730
 
 
1731
Reviewing Blueprints
 
1732
====================
 
1733
 
 
1734
Blueprint Tracking Using Launchpad
 
1735
----------------------------------
 
1736
 
 
1737
New features typically require a fair amount of discussion, design and
 
1738
debate. For Bazaar, that information is often captured in a so-called
 
1739
"blueprint" on our Wiki. Overall tracking of blueprints and their status
 
1740
is done using Launchpad's relevant tracker,
 
1741
https://blueprints.launchpad.net/bzr/. Once a blueprint for ready for
 
1742
review, please announce it on the mailing list.
 
1743
 
 
1744
Alternatively, send an email begining with [RFC] with the proposal to the
 
1745
list. In some cases, you may wish to attach proposed code  or a proposed
 
1746
developer document if that best communicates the idea. Debate can then
 
1747
proceed using the normal merge review processes.
 
1748
 
 
1749
 
 
1750
Recording Blueprint Review Feedback
 
1751
-----------------------------------
 
1752
 
 
1753
Unlike its Bug Tracker, Launchpad's Blueprint Tracker doesn't currently
 
1754
(Jun 2007) support a chronological list of comment responses. Review
 
1755
feedback can either be recorded on the Wiki hosting the blueprints or by
 
1756
using Launchpad's whiteboard feature.
 
1757
 
624
1758
 
625
1759
Planning Releases
626
1760
=================
627
1761
 
 
1762
Roadmaps
 
1763
--------
 
1764
 
 
1765
As the two senior developers, Martin Pool and Robert Collins coordinate
 
1766
the overall Bazaar product development roadmap. Core developers provide
 
1767
input and review into this, particularly during sprints. It's totally
 
1768
expected that community members ought to be working on things that
 
1769
interest them the most. The roadmap is valuable though because it provides
 
1770
context for understanding where the product is going as a whole and why.
 
1771
 
 
1772
 
 
1773
Using Releases and Milestones in Launchpad
 
1774
------------------------------------------
 
1775
 
 
1776
TODO ... (Exact policies still under discussion)
 
1777
 
628
1778
 
629
1779
Bug Triage
630
1780
----------
646
1796
.. note::
647
1797
  As well as prioritizing bugs and nominating them against a
648
1798
  target milestone, Launchpad lets core developers offer to mentor others in
649
 
  fixing them.
 
1799
  fixing them. 
650
1800
 
651
1801
 
652
1802
..