bzr branch
http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1 |
======================
|
2 |
Bazaar Developer Guide |
|
3 |
======================
|
|
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
4 |
|
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
5 |
.. contents:: |
6 |
||
7 |
(The current version of this document is available in the file ``HACKING`` |
|
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
8 |
in the source tree, or at http://doc.bazaar-vcs.org/bzr.dev/hacking.html) |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
9 |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
10 |
|
11 |
Getting Started |
|
12 |
###############
|
|
13 |
||
14 |
Exploring the Bazaar Platform |
|
15 |
=============================
|
|
16 |
||
17 |
Before making changes, it's a good idea to explore the work already |
|
18 |
done by others. Perhaps the new feature or improvement you're looking |
|
19 |
for is available in another plug-in already? If you find a bug, |
|
20 |
perhaps someone else has already fixed it? |
|
21 |
||
22 |
To answer these questions and more, take a moment to explore the |
|
23 |
overall Bazaar Platform. Here are some links to browse: |
|
24 |
||
25 |
* The Plugins page on the Wiki - http://bazaar-vcs.org/BzrPlugins |
|
26 |
||
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
27 |
* The Bazaar product family on Launchpad - https://launchpad.net/bazaar |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
28 |
|
29 |
* Bug Tracker for the core product - https://bugs.launchpad.net/bzr/ |
|
30 |
||
31 |
* Blueprint Tracker for the core product - https://blueprints.launchpad.net/bzr/ |
|
32 |
||
33 |
If nothing else, perhaps you'll find inspiration in how other developers |
|
34 |
have solved their challenges.
|
|
35 |
||
36 |
||
37 |
Planning and Discussing Changes
|
|
38 |
===============================
|
|
39 |
||
40 |
There is a very active community around Bazaar. Mostly we meet on IRC
|
|
41 |
(#bzr on irc.freenode.net) and on the mailing list. To join the Bazaar
|
|
42 |
community, see http://bazaar-vcs.org/BzrSupport.
|
|
43 |
||
44 |
If you are planning to make a change, it's a very good idea to mention it |
|
45 |
on the IRC channel and/or on the mailing list. There are many advantages |
|
46 |
to involving the community before you spend much time on a change. |
|
47 |
These include: |
|
48 |
||
49 |
* you get to build on the wisdom on others, saving time |
|
50 |
||
51 |
* if others can direct you to similar code, it minimises the work to be done |
|
52 |
||
53 |
* it assists everyone in coordinating direction, priorities and effort. |
|
54 |
||
55 |
In summary, maximising the input from others typically minimises the |
|
56 |
total effort required to get your changes merged. The community is |
|
57 |
friendly, helpful and always keen to welcome newcomers. |
|
58 |
||
59 |
||
60 |
Bazaar Development in a Nutshell |
|
61 |
================================
|
|
62 |
||
63 |
Looking for a 10 minute introduction to submitting a change? |
|
64 |
See http://bazaar-vcs.org/BzrGivingBack. |
|
65 |
||
66 |
TODO: Merge that Wiki page into this document. |
|
67 |
||
68 |
||
69 |
Understanding the Development Process |
|
70 |
=====================================
|
|
71 |
||
72 |
The development team follows many best-practices including: |
|
73 |
||
74 |
* a public roadmap and planning process in which anyone can participate |
|
75 |
||
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
76 |
* time based milestones everyone can work towards and plan around |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
77 |
|
78 |
* extensive code review and feedback to contributors |
|
79 |
||
80 |
* complete and rigorous test coverage on any code contributed |
|
81 |
||
82 |
* automated validation that all tests still pass before code is merged |
|
83 |
into the main code branch. |
|
84 |
||
85 |
The key tools we use to enable these practices are: |
|
86 |
||
87 |
* Launchpad - https://launchpad.net/ |
|
88 |
||
89 |
* Bazaar - http://bazaar-vcs.org/ |
|
90 |
||
91 |
* Bundle Buggy - http://bundlebuggy.aaronbentley.com/ |
|
92 |
||
93 |
* Patch Queue Manager - https://launchpad.net/pqm/ |
|
94 |
||
95 |
For further information, see http://bazaar-vcs.org/BzrDevelopment. |
|
96 |
||
97 |
||
98 |
A Closer Look at the Merge & Review Process |
|
99 |
===========================================
|
|
100 |
||
101 |
If you'd like to propose a change, please post to the |
|
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
102 |
bazaar@lists.canonical.com list with a bundle, patch, or link to a
|
103 |
branch. Put '[PATCH]' or '[MERGE]' in the subject so Bundle Buggy |
|
104 |
can pick it out, and explain the change in the email message text.
|
|
105 |
Remember to update the NEWS file as part of your change if it makes any
|
|
106 |
changes visible to users or plugin developers. Please include a diff
|
|
107 |
against mainline if you're giving a link to a branch. |
|
108 |
||
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
109 |
You can generate a bundle like this:: |
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
110 |
|
111 |
bzr bundle > mybundle.patch |
|
112 |
|
|
113 |
A .patch extension is recommended instead of .bundle as many mail clients |
|
114 |
will send the latter as a binary file. If a bundle would be too long or your |
|
115 |
mailer mangles whitespace (e.g. implicitly converts Unix newlines to DOS |
|
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
116 |
newlines), use the merge-directive command instead like this:: |
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
117 |
|
118 |
bzr merge-directive http://bazaar-vcs.org http://example.org/my_branch > my_directive.patch |
|
119 |
||
120 |
See the help for details on the arguments to merge-directive. |
|
121 |
||
122 |
Please do **NOT** put [PATCH] or [MERGE] in the subject line if you don't |
|
123 |
want it to be merged. If you want comments from developers rather than
|
|
124 |
to be merged, you can put '[RFC]' in the subject line. |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
125 |
|
126 |
Anyone is welcome to review code. There are broadly three gates for
|
|
127 |
code to get in:
|
|
128 |
||
129 |
* Doesn't reduce test coverage: if it adds new methods or commands, |
|
130 |
there should be tests for them. There is a good test framework |
|
131 |
and plenty of examples to crib from, but if you are having trouble |
|
132 |
working out how to test something feel free to post a draft patch |
|
133 |
and ask for help. |
|
134 |
||
135 |
* Doesn't reduce design clarity, such as by entangling objects |
|
136 |
we're trying to separate. This is mostly something the more |
|
137 |
experienced reviewers need to help check. |
|
138 |
||
139 |
* Improves bugs, features, speed, or code simplicity. |
|
140 |
||
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
141 |
Code that goes in should pass all three. The core developers take care |
142 |
to keep the code quality high and understandable while recognising that |
|
143 |
perfect is sometimes the enemy of good. (It is easy for reviews to make |
|
144 |
people notice other things which should be fixed but those things should |
|
145 |
not hold up the original fix being accepted. New things can easily be |
|
146 |
recorded in the Bug Tracker instead.) |
|
147 |
||
148 |
Anyone can "vote" on the mailing list. Core developers can also vote using |
|
149 |
Bundle Buggy. Here are the voting codes and their explanations. |
|
150 |
||
151 |
-1 really don't want it in current form |
|
152 |
-0 somewhat uncomfortable
|
|
153 |
+0 comfortable but resubmission after changes requested
|
|
154 |
+1 conditional good to go after some minor changes
|
|
155 |
+1 good to go
|
|
156 |
||
157 |
+1 conditional is used as a way to avoid another submit/review cycle for
|
|
158 |
patches that need small changes.
|
|
159 |
||
160 |
If a change gets two +1 votes from core reviewers, and no
|
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
161 |
vetos, then it's OK to come in. Any of the core developers can bring it |
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
162 |
into the bzr.dev trunk and backport it to maintenance branches if required. |
163 |
The Release Manager will merge the change into the branch for a pending |
|
164 |
release, if any. As a guideline, core developers usually merge their own |
|
165 |
changes and volunteer to merge other contributions if they were the second |
|
166 |
reviewer to agree to a change. |
|
167 |
||
168 |
To track the progress of proposed changes, use Bundle Buggy. See |
|
169 |
http://bundlebuggy.aaronbentley.com/help for a link to all the |
|
170 |
outstanding merge requests together with an explanation of the columns. |
|
171 |
Bundle Buggy will also mail you a link to track just your change. |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
172 |
|
173 |
||
174 |
Preparing a Sandbox for Making Changes to Bazaar |
|
175 |
================================================
|
|
176 |
||
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
177 |
Bazaar supports many ways of organising your work. See |
178 |
http://bazaar-vcs.org/SharedRepositoryLayouts for a summary of the |
|
179 |
popular alternatives. |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
180 |
|
181 |
Of course, the best choice for you will depend on numerous factors: |
|
182 |
the number of changes you may be making, the complexity of the changes, etc. |
|
183 |
As a starting suggestion though: |
|
184 |
||
185 |
* create a local copy of the main development branch (bzr.dev) by using |
|
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
186 |
this command:: |
187 |
|
|
188 |
bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
189 |
|
190 |
* keep your copy of bzr.dev prestine (by not developing in it) and keep |
|
191 |
it up to date (by using bzr pull) |
|
192 |
||
193 |
* create a new branch off your local bzr.dev copy for each issue |
|
194 |
(bug or feature) you are working on. |
|
195 |
||
196 |
This approach makes it easy to go back and make any required changes |
|
197 |
after a code review. Resubmitting the change is then simple with no |
|
198 |
risk of accidentially including edits related to other issues you may |
|
199 |
be working on. After the changes for an issue are accepted and merged, |
|
200 |
the associated branch can be deleted or archived as you wish. |
|
201 |
||
202 |
||
203 |
Navigating the Code Base |
|
204 |
========================
|
|
205 |
||
206 |
TODO: List and describe in one line the purpose of each directory |
|
207 |
inside an installation of bzr. |
|
208 |
||
209 |
TODO: Refer to a central location holding an up to date copy of the API |
|
210 |
documentation generated by epydoc, e.g. something like |
|
211 |
http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html. |
|
212 |
||
213 |
||
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
214 |
Testing Bazaar |
215 |
##############
|
|
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
216 |
|
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
217 |
The Importance of Testing |
218 |
=========================
|
|
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
219 |
|
220 |
Reliability is a critical success factor for any Version Control System. |
|
221 |
We want Bazaar to be highly reliable across multiple platforms while |
|
222 |
evolving over time to meet the needs of its community. |
|
223 |
||
224 |
In a nutshell, this is want we expect and encourage: |
|
225 |
||
226 |
* New functionality should have test cases. Preferably write the |
|
227 |
test before writing the code. |
|
228 |
||
229 |
In general, you can test at either the command-line level or the |
|
|
2466.7.2
by Robert Collins
Document the user of TreeBuilder somewhat. |
230 |
internal API level. See Writing tests below for more detail. |
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
231 |
|
232 |
* Try to practice Test-Driven Development: before fixing a bug, write a |
|
233 |
test case so that it does not regress. Similarly for adding a new |
|
234 |
feature: write a test case for a small version of the new feature before |
|
235 |
starting on the code itself. Check the test fails on the old code, then |
|
236 |
add the feature or fix and check it passes. |
|
237 |
||
238 |
By doing these things, the Bazaar team gets increased confidence that |
|
239 |
changes do what they claim to do, whether provided by the core team or |
|
240 |
by community members. Equally importantly, we can be surer that changes |
|
241 |
down the track do not break new features or bug fixes that you are |
|
242 |
contributing today. |
|
243 |
||
244 |
As of May 2007, Bazaar ships with a test suite containing over 6000 tests |
|
245 |
and growing. We are proud of it and want to remain so. As community |
|
246 |
members, we all benefit from it. Would you trust version control on |
|
247 |
your project to a product *without* a test suite like Bazaar has? |
|
248 |
||
249 |
||
250 |
Running the Test Suite |
|
251 |
======================
|
|
252 |
||
253 |
Currently, bzr selftest is used to invoke tests. |
|
254 |
You can provide a pattern argument to run a subset. For example, |
|
255 |
to run just the blackbox tests, run:: |
|
256 |
||
257 |
./bzr selftest -v blackbox |
|
258 |
||
259 |
To skip a particular test (or set of tests), use the --exclude option |
|
260 |
(shorthand -x) like so:: |
|
261 |
||
262 |
./bzr selftest -v -x blackbox |
|
263 |
||
264 |
To list tests without running them, use the --list-only option like so:: |
|
265 |
||
266 |
./bzr selftest --list-only |
|
267 |
||
268 |
This option can be combined with other selftest options (like -x) and |
|
269 |
filter patterns to understand their effect. |
|
270 |
||
271 |
||
272 |
Writing Tests |
|
273 |
=============
|
|
274 |
||
275 |
In general tests should be placed in a file named test_FOO.py where |
|
276 |
FOO is the logical thing under test. That file should be placed in the |
|
277 |
tests subdirectory under the package being tested. |
|
278 |
||
279 |
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py. |
|
280 |
See bzrlib/tests/test_sampler.py for a template test script. |
|
281 |
||
282 |
Tests can be written for the UI or for individual areas of the library. |
|
283 |
Choose whichever is appropriate: if adding a new command, or a new command |
|
284 |
option, then you should be writing a UI test. If you are both adding UI |
|
285 |
functionality and library functionality, you will want to write tests for |
|
286 |
both the UI and the core behaviours. We call UI tests 'blackbox' tests |
|
287 |
and they are found in ``bzrlib/tests/blackbox/*.py``. |
|
288 |
||
289 |
When writing blackbox tests please honour the following conventions:
|
|
290 |
||
291 |
1. Place the tests for the command 'name' in
|
|
292 |
bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
|
|
293 |
to locate the test script for a faulty command.
|
|
294 |
||
295 |
2. Use the 'self.run_bzr("name")' utility function to invoke the command
|
|
296 |
rather than running bzr in a subprocess or invoking the
|
|
297 |
cmd_object.run() method directly. This is a lot faster than
|
|
298 |
subprocesses and generates the same logging output as running it in a
|
|
299 |
subprocess (which invoking the method directly does not).
|
|
300 |
|
|
301 |
3. Only test the one command in a single test script. Use the bzrlib
|
|
302 |
library when setting up tests and when evaluating the side-effects of
|
|
303 |
the command. We do this so that the library api has continual pressure
|
|
304 |
on it to be as functional as the command line in a simple manner, and
|
|
305 |
to isolate knock-on effects throughout the blackbox test suite when a
|
|
306 |
command changes its name or signature. Ideally only the tests for a
|
|
307 |
given command are affected when a given command is changed.
|
|
308 |
||
309 |
4. If you have a test which does actually require running bzr in a
|
|
310 |
subprocess you can use ``run_bzr_subprocess``. By default the spawned
|
|
311 |
process will not load plugins unless ``--allow-plugins`` is supplied.
|
|
312 |
||
313 |
||
314 |
Doctests
|
|
315 |
--------
|
|
316 |
||
317 |
We make selective use of doctests__. In general they should provide
|
|
318 |
*examples* within the API documentation which can incidentally be tested. We
|
|
319 |
don't try to test every important case using doctests -- regular Python
|
|
320 |
tests are generally a better solution.
|
|
321 |
||
322 |
Most of these are in ``bzrlib/doc/api``. More additions are welcome.
|
|
323 |
||
324 |
__ http://docs.python.org/lib/module-doctest.html
|
|
325 |
||
326 |
||
|
2475.2.3
by Martin Pool
Merge ian's HACKING updates |
327 |
Skipping tests and test requirements
|
328 |
------------------------------------
|
|
329 |
||
330 |
In our enhancements to unittest we allow for some addition results beyond
|
|
331 |
just success or failure.
|
|
332 |
||
333 |
If a test can't be run, it can say that it's skipped. This is typically
|
|
334 |
used in parameterized tests - for example if a transport doesn't support
|
|
335 |
setting permissions, we'll skip the tests that relating to that. ::
|
|
336 |
||
337 |
try:
|
|
338 |
return self.branch_format.initialize(repo.bzrdir)
|
|
339 |
except errors.UninitializableFormat:
|
|
340 |
raise tests.TestSkipped('Uninitializable branch format')
|
|
341 |
||
342 |
Raising TestSkipped is a good idea when you want to make it clear that the
|
|
343 |
test was not run, rather than just returning which makes it look as if it
|
|
344 |
was run and passed.
|
|
345 |
||
346 |
A subtly different case is a test that should run, but can't run in the
|
|
347 |
current environment. This covers tests that can only run in particular
|
|
348 |
operating systems or locales, or that depend on external libraries. Here
|
|
349 |
we want to inform the user that they didn't get full test coverage, but
|
|
350 |
they possibly could if they installed more libraries. These are expressed
|
|
351 |
as a dependency on a feature so we can summarise them, and so that the
|
|
352 |
test for the feature is done only once. (For historical reasons, as of
|
|
353 |
May 2007 many cases that should depend on features currently raise
|
|
354 |
TestSkipped.) The typical use is::
|
|
355 |
||
356 |
class TestStrace(TestCaseWithTransport):
|
|
357 |
||
358 |
_test_needs_features = [StraceFeature]
|
|
359 |
||
360 |
which means all tests in this class need the feature. The feature itself
|
|
361 |
should provide a ``_probe`` method which is called once to determine if
|
|
362 |
it's available.
|
|
363 |
||
364 |
||
365 |
Known failures
|
|
366 |
--------------
|
|
367 |
||
368 |
Known failures are when a test exists but we know it currently doesn't
|
|
369 |
work, allowing the test suite to still pass. These should be used with
|
|
370 |
care, we don't want a proliferation of quietly broken tests. It might be
|
|
371 |
appropriate to use them if you've committed a test for a bug but not the
|
|
372 |
fix for it, or if something works on Unix but not on Windows.
|
|
373 |
||
374 |
||
375 |
||
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
376 |
Essential Domain Classes
|
377 |
########################
|
|
378 |
||
379 |
Introducing the Object Model
|
|
380 |
============================
|
|
381 |
||
382 |
The core domain objects within the bazaar model are:
|
|
383 |
||
384 |
* Transport
|
|
385 |
||
386 |
* Branch
|
|
387 |
||
388 |
* Repository
|
|
389 |
||
390 |
* WorkingTree
|
|
391 |
||
392 |
Transports are explained below. See http://bazaar-vcs.org/Classes/
|
|
393 |
for an introduction to the other key classes.
|
|
394 |
||
395 |
Using Transports
|
|
396 |
================
|
|
397 |
||
398 |
The ``Transport`` layer handles access to local or remote directories.
|
|
399 |
Each Transport object acts like a logical connection to a particular
|
|
400 |
directory, and it allows various operations on files within it. You can
|
|
401 |
*clone* a transport to get a new Transport connected to a subdirectory or
|
|
402 |
parent directory.
|
|
403 |
||
404 |
Transports are not used for access to the working tree. At present
|
|
405 |
working trees are always local and they are accessed through the regular
|
|
406 |
Python file io mechanisms.
|
|
407 |
||
408 |
Filenames vs URLs
|
|
409 |
-----------------
|
|
410 |
||
411 |
Transports work in URLs. Take note that URLs are by definition only
|
|
412 |
ASCII - the decision of how to encode a Unicode string into a URL must be
|
|
413 |
taken at a higher level, typically in the Store. (Note that Stores also
|
|
414 |
escape filenames which cannot be safely stored on all filesystems, but
|
|
415 |
this is a different level.)
|
|
416 |
||
417 |
The main reason for this is that it's not possible to safely roundtrip a
|
|
418 |
URL into Unicode and then back into the same URL. The URL standard
|
|
419 |
gives a way to represent non-ASCII bytes in ASCII (as %-escapes), but
|
|
420 |
doesn't say how those bytes represent non-ASCII characters. (They're not
|
|
421 |
guaranteed to be UTF-8 -- that is common but doesn't happen everywhere.)
|
|
422 |
||
423 |
For example if the user enters the url ``http://example/%e0`` there's no
|
|
424 |
way to tell whether that character represents "latin small letter a with
|
|
425 |
grave" in iso-8859-1, or "latin small letter r with acute" in iso-8859-2
|
|
426 |
or malformed UTF-8. So we can't convert their URL to Unicode reliably.
|
|
427 |
||
428 |
Equally problematic if we're given a url-like string containing non-ascii
|
|
429 |
characters (such as the accented a) we can't be sure how to convert that
|
|
430 |
to the correct URL, because we don't know what encoding the server expects
|
|
431 |
for those characters. (Although this is not totally reliable we might still
|
|
432 |
accept these and assume they should be put into UTF-8.)
|
|
433 |
||
434 |
A similar edge case is that the url ``http://foo/sweet%2Fsour`` contains
|
|
435 |
one directory component whose name is "sweet/sour". The escaped slash is
|
|
436 |
not a directory separator. If we try to convert URLs to regular Unicode
|
|
437 |
paths this information will be lost.
|
|
438 |
||
439 |
This implies that Transports must natively deal with URLs; for simplicity
|
|
440 |
they *only* deal with URLs and conversion of other strings to URLs is done
|
|
441 |
elsewhere. Information they return, such as from ``list_dir``, is also in
|
|
442 |
the form of URL components.
|
|
443 |
||
444 |
||
445 |
Core Topics
|
|
446 |
###########
|
|
447 |
||
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
448 |
Evolving Interfaces
|
449 |
===================
|
|
|
1393.1.54
by Martin Pool
- more hacking notes on evolving interfaces |
450 |
|
|
1534.2.4
by Robert Collins
Update NEWS and HACKING for the symbol_versioning module. |
451 |
We have a commitment to 6 months API stability - any supported symbol in a
|
452 |
release of bzr MUST NOT be altered in any way that would result in
|
|
453 |
breaking existing code that uses it. That means that method names,
|
|
454 |
parameter ordering, parameter names, variable and attribute names etc must
|
|
455 |
not be changed without leaving a 'deprecated forwarder' behind. This even
|
|
456 |
applies to modules and classes.
|
|
457 |
||
458 |
If you wish to change the behaviour of a supported API in an incompatible
|
|
|
2063.3.1
by wang
fix typos |
459 |
way, you need to change its name as well. For instance, if I add an optional keyword
|
|
1534.2.4
by Robert Collins
Update NEWS and HACKING for the symbol_versioning module. |
460 |
parameter to branch.commit - that's fine. On the other hand, if I add a
|
461 |
keyword parameter to branch.commit which is a *required* transaction
|
|
462 |
object, I should rename the API - i.e. to 'branch.commit_transaction'.
|
|
463 |
||
464 |
When renaming such supported API's, be sure to leave a deprecated_method (or
|
|
465 |
_function or ...) behind which forwards to the new API. See the
|
|
466 |
bzrlib.symbol_versioning module for decorators that take care of the
|
|
467 |
details for you - such as updating the docstring, and issuing a warning
|
|
468 |
when the old api is used.
|
|
469 |
||
|
2063.3.1
by wang
fix typos |
470 |
For unsupported API's, it does not hurt to follow this discipline, but it's
|
|
1534.2.4
by Robert Collins
Update NEWS and HACKING for the symbol_versioning module. |
471 |
not required. Minimally though, please try to rename things so that
|
472 |
callers will at least get an AttributeError rather than weird results.
|
|
473 |
||
|
1393.1.54
by Martin Pool
- more hacking notes on evolving interfaces |
474 |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
475 |
Coding Style Guidelines
|
476 |
=======================
|
|
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
477 |
|
478 |
Please write PEP-8__ compliant code.
|
|
479 |
||
480 |
One often-missed requirement is that the first line of docstrings
|
|
481 |
should be a self-contained one-sentence summary.
|
|
482 |
||
483 |
__ http://www.python.org/peps/pep-0008.html
|
|
484 |
||
485 |
||
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
486 |
Module Imports
|
487 |
--------------
|
|
488 |
||
489 |
* Imports should be done at the top-level of the file, unless there is
|
|
490 |
a strong reason to have them lazily loaded when a particular
|
|
491 |
function runs. Import statements have a cost, so try to make sure
|
|
492 |
they don't run inside hot functions.
|
|
493 |
||
494 |
* Module names should always be given fully-qualified,
|
|
495 |
i.e. ``bzrlib.hashcache`` not just ``hashcache``.
|
|
496 |
||
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
497 |
|
498 |
Naming
|
|
499 |
------
|
|
500 |
||
501 |
Functions, methods or members that are in some sense "private" are given
|
|
502 |
a leading underscore prefix. This is just a hint that code outside the
|
|
503 |
implementation should probably not use that interface.
|
|
504 |
||
505 |
We prefer class names to be concatenated capital words (``TestCase``)
|
|
506 |
and variables, methods and functions to be lowercase words joined by
|
|
507 |
underscores (``revision_id``, ``get_revision``).
|
|
508 |
||
509 |
For the purposes of naming some names are treated as single compound
|
|
510 |
words: "filename", "revno".
|
|
511 |
||
512 |
Consider naming classes as nouns and functions/methods as verbs.
|
|
513 |
||
|
2221.4.7
by Aaron Bentley
Add suggestion to HACKING |
514 |
Try to avoid using abbreviations in names, because there can be
|
515 |
inconsistency if other people use the full name.
|
|
516 |
||
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
517 |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
518 |
Standard Names
|
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
519 |
--------------
|
520 |
||
521 |
``revision_id`` not ``rev_id`` or ``revid``
|
|
522 |
||
523 |
Functions that transform one thing to another should be named ``x_to_y``
|
|
524 |
(not ``x2y`` as occurs in some old code.)
|
|
525 |
||
|
1098
by Martin Pool
- notes on how output is written |
526 |
|
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
527 |
Destructors
|
528 |
-----------
|
|
529 |
||
|
1185.16.150
by Martin Pool
Improved description of python exception policies |
530 |
Python destructors (``__del__``) work differently to those of other
|
531 |
languages. In particular, bear in mind that destructors may be called
|
|
532 |
immediately when the object apparently becomes unreferenced, or at some
|
|
533 |
later time, or possibly never at all. Therefore we have restrictions on
|
|
534 |
what can be done inside them.
|
|
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
535 |
|
536 |
0. Never use a __del__ method without asking Martin/Robert first.
|
|
537 |
||
538 |
1. Never rely on a ``__del__`` method running. If there is code that
|
|
539 |
must run, do it from a ``finally`` block instead.
|
|
540 |
||
541 |
2. Never ``import`` from inside a ``__del__`` method, or you may crash the
|
|
542 |
interpreter!!
|
|
543 |
||
544 |
3. In some places we raise a warning from the destructor if the object
|
|
545 |
has not been cleaned up or closed. This is considered OK: the warning
|
|
546 |
may not catch every case but it's still useful sometimes.
|
|
547 |
||
548 |
||
|
1740.2.5
by Aaron Bentley
Merge from bzr.dev |
549 |
Factories
|
550 |
---------
|
|
551 |
||
552 |
In some places we have variables which point to callables that construct
|
|
553 |
new instances. That is to say, they can be used a lot like class objects,
|
|
554 |
but they shouldn't be *named* like classes:
|
|
555 |
||
556 |
> I think that things named FooBar should create instances of FooBar when
|
|
557 |
> called. Its plain confusing for them to do otherwise. When we have
|
|
558 |
> something that is going to be used as a class - that is, checked for via
|
|
559 |
> isinstance or other such idioms, them I would call it foo_class, so that
|
|
560 |
> it is clear that a callable is not sufficient. If it is only used as a
|
|
561 |
> factory, then yes, foo_factory is what I would use.
|
|
562 |
||
563 |
||
|
1911.4.15
by John Arbash Meinel
Updated HACKING and docstrings per Martin's suggestions |
564 |
Registries
|
565 |
----------
|
|
566 |
||
567 |
Several places in Bazaar use (or will use) a registry, which is a
|
|
568 |
mapping from names to objects or classes. The registry allows for
|
|
569 |
loading in registered code only when it's needed, and keeping
|
|
570 |
associated information such as a help string or description.
|
|
571 |
||
572 |
||
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
573 |
Lazy Imports
|
574 |
------------
|
|
575 |
||
576 |
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
|
|
577 |
delay importing modules until they are actually used. ``lazy_import`` uses
|
|
578 |
the same syntax as regular python imports. So to import a few modules in a
|
|
579 |
lazy fashion do::
|
|
580 |
||
581 |
from bzrlib.lazy_import import lazy_import
|
|
582 |
lazy_import(globals(), """
|
|
583 |
import os
|
|
584 |
import subprocess
|
|
585 |
import sys
|
|
586 |
import time
|
|
587 |
||
588 |
from bzrlib import (
|
|
589 |
errors,
|
|
590 |
transport,
|
|
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
591 |
revision as _mod_revision,
|
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
592 |
)
|
593 |
import bzrlib.transport
|
|
594 |
import bzrlib.xml5
|
|
595 |
""")
|
|
596 |
||
597 |
At this point, all of these exist as a ``ImportReplacer`` object, ready to
|
|
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
598 |
be imported once a member is accessed. Also, when importing a module into
|
599 |
the local namespace, which is likely to clash with variable names, it is
|
|
|
2370.1.1
by Ian Clatworthy
Minor corrections to HACKING |
600 |
recommended to prefix it as ``_mod_<module>``. This makes it clearer that
|
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
601 |
the variable is a module, and these object should be hidden anyway, since
|
602 |
they shouldn't be imported into other namespaces.
|
|
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
603 |
|
604 |
||
605 |
Modules versus Members
|
|
606 |
~~~~~~~~~~~~~~~~~~~~~~
|
|
607 |
||
608 |
While it is possible for ``lazy_import()`` to import members of a module
|
|
|
2063.3.1
by wang
fix typos |
609 |
when using the ``from module import member`` syntax, it is recommended to
|
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
610 |
only use that syntax to load sub modules ``from module import submodule``.
|
611 |
This is because variables and classes can frequently be used without
|
|
612 |
needing a sub-member for example::
|
|
613 |
||
614 |
lazy_import(globals(), """
|
|
615 |
from module import MyClass
|
|
616 |
""")
|
|
617 |
||
618 |
def test(x):
|
|
619 |
return isinstance(x, MyClass)
|
|
620 |
||
621 |
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
|
|
622 |
object, rather than the real class.
|
|
623 |
||
624 |
||
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
625 |
Passing to Other Variables
|
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
626 |
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
627 |
||
|
1996.1.26
by John Arbash Meinel
Update HACKING and docstrings |
628 |
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
|
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
629 |
Because the replacer only knows about the original name, it is unable to
|
630 |
replace other variables. The ``ImportReplacer`` class will raise an
|
|
|
1996.1.26
by John Arbash Meinel
Update HACKING and docstrings |
631 |
``IllegalUseOfScopeReplacer`` exception if it can figure out that this
|
632 |
happened. But it requires accessing a member more than once from the new
|
|
633 |
variable, so some bugs are not detected right away.
|
|
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
634 |
|
635 |
||
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
636 |
Getting Input
|
637 |
=============
|
|
638 |
||
639 |
Processing Command Lines
|
|
640 |
------------------------
|
|
641 |
||
642 |
bzrlib has a standard framework for parsing command lines and calling
|
|
643 |
processing routines associated with various commands. See builtins.py
|
|
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
644 |
for numerous examples.
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
645 |
|
646 |
||
647 |
Standard Parameter Types
|
|
648 |
------------------------
|
|
649 |
||
650 |
There are some common requirements in the library: some parameters need to be
|
|
651 |
unicode safe, some need byte strings, and so on. At the moment we have
|
|
652 |
only codified one specific pattern: Parameters that need to be unicode
|
|
653 |
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
|
|
654 |
input into unicode in a consistent fashion, allowing trivial strings to be
|
|
655 |
used for programmer convenience, but not performing unpredictably in the
|
|
656 |
presence of different locales.
|
|
657 |
||
658 |
||
659 |
Writing Output
|
|
|
1098
by Martin Pool
- notes on how output is written |
660 |
==============
|
661 |
||
662 |
(The strategy described here is what we want to get to, but it's not
|
|
663 |
consistently followed in the code at the moment.)
|
|
664 |
||
665 |
bzrlib is intended to be a generically reusable library. It shouldn't
|
|
666 |
write messages to stdout or stderr, because some programs that use it
|
|
667 |
might want to display that information through a GUI or some other
|
|
668 |
mechanism.
|
|
669 |
||
670 |
We can distinguish two types of output from the library:
|
|
671 |
||
672 |
1. Structured data representing the progress or result of an
|
|
673 |
operation. For example, for a commit command this will be a list
|
|
674 |
of the modified files and the finally committed revision number
|
|
675 |
and id.
|
|
676 |
||
677 |
These should be exposed either through the return code or by calls
|
|
678 |
to a callback parameter.
|
|
679 |
||
680 |
A special case of this is progress indicators for long-lived
|
|
681 |
operations, where the caller should pass a ProgressBar object.
|
|
682 |
||
683 |
2. Unstructured log/debug messages, mostly for the benefit of the
|
|
684 |
developers or users trying to debug problems. This should always
|
|
685 |
be sent through ``bzrlib.trace`` and Python ``logging``, so that
|
|
686 |
it can be redirected by the client.
|
|
687 |
||
688 |
The distinction between the two is a bit subjective, but in general if
|
|
689 |
there is any chance that a library would want to see something as
|
|
690 |
structured data, we should make it so.
|
|
691 |
||
692 |
The policy about how output is presented in the text-mode client
|
|
693 |
should be only in the command-line tool.
|
|
|
1092.1.22
by Robert Collins
update hacking with some test foo |
694 |
|
|
1418
by Robert Collins
merge martins latest |
695 |
|
|
1092.1.22
by Robert Collins
update hacking with some test foo |
696 |
Writing tests
|
697 |
=============
|
|
|
2067.2.2
by John Arbash Meinel
Review comments from Robert |
698 |
|
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
699 |
In general tests should be placed in a file named test_FOO.py where
|
|
1092.1.22
by Robert Collins
update hacking with some test foo |
700 |
FOO is the logical thing under test. That file should be placed in the
|
701 |
tests subdirectory under the package being tested.
|
|
702 |
||
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
703 |
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
|
|
2370.1.1
by Ian Clatworthy
Minor corrections to HACKING |
704 |
See bzrlib/tests/test_sampler.py for a template test script.
|
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
705 |
|
706 |
Tests can be written for the UI or for individual areas of the library.
|
|
707 |
Choose whichever is appropriate: if adding a new command, or a new command
|
|
708 |
option, then you should be writing a UI test. If you are both adding UI
|
|
709 |
functionality and library functionality, you will want to write tests for
|
|
710 |
both the UI and the core behaviours. We call UI tests 'blackbox' tests
|
|
|
1711.2.94
by John Arbash Meinel
Update HACKING to be rst compliant |
711 |
and they are found in ``bzrlib/tests/blackbox/*.py``.
|
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
712 |
|
713 |
When writing blackbox tests please honour the following conventions:
|
|
714 |
||
715 |
1. Place the tests for the command 'name' in
|
|
716 |
bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
|
|
717 |
to locate the test script for a faulty command.
|
|
718 |
||
719 |
2. Use the 'self.run_bzr("name")' utility function to invoke the command
|
|
720 |
rather than running bzr in a subprocess or invoking the
|
|
721 |
cmd_object.run() method directly. This is a lot faster than
|
|
722 |
subprocesses and generates the same logging output as running it in a
|
|
723 |
subprocess (which invoking the method directly does not).
|
|
724 |
|
|
725 |
3. Only test the one command in a single test script. Use the bzrlib
|
|
726 |
library when setting up tests and when evaluating the side-effects of
|
|
727 |
the command. We do this so that the library api has continual pressure
|
|
728 |
on it to be as functional as the command line in a simple manner, and
|
|
729 |
to isolate knock-on effects throughout the blackbox test suite when a
|
|
|
2063.3.1
by wang
fix typos |
730 |
command changes its name or signature. Ideally only the tests for a
|
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
731 |
given command are affected when a given command is changed.
|
|
1393.1.61
by Martin Pool
doc |
732 |
|
|
2067.2.2
by John Arbash Meinel
Review comments from Robert |
733 |
4. If you have a test which does actually require running bzr in a
|
734 |
subprocess you can use ``run_bzr_subprocess``. By default the spawned
|
|
735 |
process will not load plugins unless ``--allow-plugins`` is supplied.
|
|
736 |
||
737 |
||
|
2466.7.2
by Robert Collins
Document the user of TreeBuilder somewhat. |
738 |
Test support
|
739 |
------------
|
|
740 |
||
741 |
We have a rich collection of tools to support writing tests. Please use
|
|
742 |
them in preference to ad-hoc solutions as they provide portability and
|
|
743 |
performance benefits.
|
|
744 |
||
745 |
TreeBuilder
|
|
746 |
~~~~~~~~~~~
|
|
747 |
||
748 |
The ``TreeBuilder`` interface allows the construction of arbitrary trees
|
|
749 |
with a declarative interface. A sample session might look like::
|
|
750 |
||
751 |
tree = self.make_branch_and_tree('path')
|
|
752 |
builder = TreeBuilder()
|
|
753 |
builder.start_tree(tree)
|
|
754 |
builder.build(['foo', "bar/", "bar/file"])
|
|
755 |
tree.commit('commit the tree')
|
|
756 |
builder.finish_tree()
|
|
757 |
||
758 |
Please see bzrlib.treebuilder for more details.
|
|
759 |
||
|
2466.7.7
by Robert Collins
Document basic usage. |
760 |
BranchBuilder
|
761 |
~~~~~~~~~~~~~
|
|
762 |
||
763 |
The ``BranchBuilder`` interface allows the creation of test branches in a
|
|
764 |
quick and easy manner. A sample session::
|
|
765 |
||
766 |
builder = BranchBuilder(self.get_transport().clone('relpath'))
|
|
767 |
builder.build_commit()
|
|
768 |
builder.build_commit()
|
|
769 |
builder.build_commit()
|
|
770 |
branch = builder.get_branch()
|
|
771 |
||
772 |
Please see bzrlib.branchbuilder for more details.
|
|
|
2466.7.2
by Robert Collins
Document the user of TreeBuilder somewhat. |
773 |
|
|
1740.6.1
by Martin Pool
Remove Scratch objects used by doctests |
774 |
Doctests
|
775 |
--------
|
|
776 |
||
777 |
We make selective use of doctests__. In general they should provide
|
|
778 |
*examples* within the API documentation which can incidentally be tested. We
|
|
779 |
don't try to test every important case using doctests -- regular Python
|
|
780 |
tests are generally a better solution.
|
|
781 |
||
782 |
Most of these are in ``bzrlib/doc/api``. More additions are welcome.
|
|
783 |
||
784 |
__ http://docs.python.org/lib/module-doctest.html
|
|
785 |
||
786 |
||
|
1092.1.22
by Robert Collins
update hacking with some test foo |
787 |
Running tests
|
788 |
=============
|
|
789 |
Currently, bzr selftest is used to invoke tests.
|
|
790 |
You can provide a pattern argument to run a subset. For example,
|
|
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
791 |
to run just the blackbox tests, run::
|
|
1393.1.61
by Martin Pool
doc |
792 |
|
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
793 |
./bzr selftest -v blackbox
|
|
1393.1.61
by Martin Pool
doc |
794 |
|
|
2394.2.6
by Ian Clatworthy
completed blackbox tests |
795 |
To skip a particular test (or set of tests), use the --exclude option
|
796 |
(shorthand -x) like so::
|
|
797 |
||
798 |
./bzr selftest -v -x blackbox
|
|
799 |
||
800 |
To list tests without running them, use the --list-only option like so::
|
|
801 |
||
802 |
./bzr selftest --list-only
|
|
803 |
||
804 |
This option can be combined with other selftest options (like -x) and
|
|
805 |
filter patterns to understand their effect.
|
|
|
1551.6.41
by Aaron Bentley
Add advice on skipping tests to HACKING |
806 |
|
|
1393.1.61
by Martin Pool
doc |
807 |
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
808 |
Handling Errors and Exceptions
|
809 |
==============================
|
|
810 |
||
811 |
Commands should return non-zero when they encounter circumstances that
|
|
812 |
the user should really pay attention to - which includes trivial shell
|
|
813 |
pipelines.
|
|
814 |
||
815 |
Recommended values are:
|
|
816 |
||
817 |
0. OK.
|
|
818 |
1. Conflicts in merge-like operations, or changes are present in
|
|
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
819 |
diff-like operations.
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
820 |
2. Unrepresentable diff changes (i.e. binary files that we cannot show
|
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
821 |
a diff of).
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
822 |
3. An error or exception has occurred.
|
823 |
||
824 |
Errors are handled through Python exceptions. Exceptions should be defined
|
|
825 |
inside bzrlib.errors, so that we can see the whole tree at a glance.
|
|
826 |
||
827 |
We broadly classify errors as either being either internal or not,
|
|
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
828 |
depending on whether ``internal_error`` is set or not. If we think it's our
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
829 |
fault, we show a backtrace, an invitation to report the bug, and possibly
|
830 |
other details. This is the default for errors that aren't specifically
|
|
831 |
recognized as being caused by a user error. Otherwise we show a briefer
|
|
832 |
message, unless -Derror was given.
|
|
833 |
||
834 |
Many errors originate as "environmental errors" which are raised by Python
|
|
835 |
or builtin libraries -- for example IOError. These are treated as being
|
|
836 |
our fault, unless they're caught in a particular tight scope where we know
|
|
837 |
that they indicate a user errors. For example if the repository format
|
|
838 |
is not found, the user probably gave the wrong path or URL. But if one of
|
|
839 |
the files inside the repository is not found, then it's our fault --
|
|
840 |
either there's a bug in bzr, or something complicated has gone wrong in
|
|
841 |
the environment that means one internal file was deleted.
|
|
842 |
||
843 |
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors
|
|
844 |
to be added near the place where they are used.
|
|
845 |
||
846 |
Exceptions are formatted for the user by conversion to a string
|
|
847 |
(eventually calling their ``__str__`` method.) As a convenience the
|
|
848 |
``._fmt`` member can be used as a template which will be mapped to the
|
|
849 |
error's instance dict.
|
|
850 |
||
851 |
New exception classes should be defined when callers might want to catch
|
|
852 |
that exception specifically, or when it needs a substantially different
|
|
853 |
format string.
|
|
854 |
||
855 |
Exception strings should start with a capital letter and should not have a
|
|
856 |
final fullstop. If long, they may contain newlines to break the text.
|
|
857 |
||
858 |
||
859 |
Documenting Changes
|
|
860 |
===================
|
|
861 |
||
862 |
When you change bzrlib, please update the relevant documentation for the
|
|
863 |
change you made: Changes to commands should update their help, and
|
|
864 |
possibly end user tutorials; changes to the core library should be
|
|
865 |
reflected in API documentation.
|
|
866 |
||
867 |
NEWS File
|
|
868 |
---------
|
|
869 |
||
870 |
If you make a user-visible change, please add a note to the NEWS file.
|
|
871 |
The description should be written to make sense to someone who's just
|
|
872 |
a user of bzr, not a developer: new functions or classes shouldn't be
|
|
873 |
mentioned, but new commands, changes in behaviour or fixed nontrivial
|
|
874 |
bugs should be listed. See the existing entries for an idea of what
|
|
875 |
should be done.
|
|
876 |
||
877 |
Within each release, entries in the news file should have the most
|
|
878 |
user-visible changes first. So the order should be approximately:
|
|
879 |
||
880 |
* changes to existing behaviour - the highest priority because the
|
|
881 |
user's existing knowledge is incorrect
|
|
882 |
* new features - should be brought to their attention
|
|
883 |
* bug fixes - may be of interest if the bug was affecting them, and
|
|
884 |
should include the bug number if any
|
|
885 |
* major documentation changes
|
|
886 |
* changes to internal interfaces
|
|
887 |
||
888 |
People who made significant contributions to each change are listed in
|
|
889 |
parenthesis. This can include reporting bugs (particularly with good
|
|
890 |
details or reproduction recipes), submitting patches, etc.
|
|
891 |
||
892 |
Commands
|
|
893 |
--------
|
|
894 |
||
895 |
The docstring of a command is used by ``bzr help`` to generate help output
|
|
896 |
for the command. The list 'takes_options' attribute on a command is used by
|
|
897 |
``bzr help`` to document the options for the command - the command
|
|
898 |
docstring does not need to document them. Finally, the '_see_also'
|
|
899 |
attribute on a command can be used to reference other related help topics.
|
|
900 |
||
901 |
API Documentation
|
|
902 |
-----------------
|
|
903 |
||
904 |
Functions, methods, classes and modules should have docstrings
|
|
905 |
describing how they are used.
|
|
906 |
||
907 |
The first line of the docstring should be a self-contained sentence.
|
|
908 |
||
909 |
For the special case of Command classes, this acts as the user-visible
|
|
910 |
documentation shown by the help command.
|
|
911 |
||
912 |
The docstrings should be formatted as reStructuredText_ (like this
|
|
913 |
document), suitable for processing using the epydoc_ tool into HTML
|
|
914 |
documentation.
|
|
915 |
||
916 |
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
|
|
917 |
.. _epydoc: http://epydoc.sourceforge.net/
|
|
918 |
||
919 |
||
920 |
General Guidelines
|
|
921 |
==================
|
|
922 |
||
923 |
Copyright
|
|
924 |
---------
|
|
925 |
||
926 |
The copyright policy for bzr was recently made clear in this email (edited
|
|
927 |
for grammatical correctness)::
|
|
928 |
||
929 |
The attached patch cleans up the copyright and license statements in
|
|
930 |
the bzr source. It also adds tests to help us remember to add them
|
|
931 |
with the correct text.
|
|
932 |
||
933 |
We had the problem that lots of our files were "Copyright Canonical
|
|
934 |
Development Ltd" which is not a real company, and some other variations
|
|
935 |
on this theme. Also, some files were missing the GPL statements.
|
|
936 |
|
|
937 |
I want to be clear about the intent of this patch, since copyright can
|
|
938 |
be a little controversial.
|
|
939 |
|
|
940 |
1) The big motivation for this is not to shut out the community, but
|
|
941 |
just to clean up all of the invalid copyright statements.
|
|
942 |
|
|
943 |
2) It has been the general policy for bzr that we want a single
|
|
944 |
copyright holder for all of the core code. This is following the model
|
|
945 |
set by the FSF, which makes it easier to update the code to a new
|
|
946 |
license in case problems are encountered. (For example, if we want to
|
|
947 |
upgrade the project universally to GPL v3 it is much simpler if there is
|
|
948 |
a single copyright holder). It also makes it clearer if copyright is
|
|
949 |
ever debated, there is a single holder, which makes it easier to defend
|
|
950 |
in court, etc. (I think the FSF position is that if you assign them
|
|
951 |
copyright, they can defend it in court rather than you needing to, and
|
|
952 |
I'm sure Canonical would do the same).
|
|
953 |
As such, Canonical has requested copyright assignments from all of the
|
|
954 |
major contributers.
|
|
955 |
|
|
956 |
3) If someone wants to add code and not attribute it to Canonical, there
|
|
957 |
is a specific list of files that are excluded from this check. And the
|
|
958 |
test failure indicates where that is, and how to update it.
|
|
959 |
|
|
960 |
4) If anyone feels that I changed a copyright statement incorrectly, just
|
|
961 |
let me know, and I'll be happy to correct it. Whenever you have large
|
|
962 |
mechanical changes like this, it is possible to make some mistakes.
|
|
963 |
|
|
964 |
Just to reiterate, this is a community project, and it is meant to stay
|
|
965 |
that way. Core bzr code is copyright Canonical for legal reasons, and
|
|
966 |
the tests are just there to help us maintain that.
|
|
967 |
||
968 |
||
969 |
Miscellaneous Topics
|
|
970 |
####################
|
|
971 |
||
972 |
Debugging
|
|
973 |
=========
|
|
974 |
||
975 |
Bazaar has a few facilities to help debug problems by going into pdb_, the
|
|
976 |
Python debugger.
|
|
977 |
||
978 |
.. _pdb: http://docs.python.org/lib/debugger-commands.html
|
|
979 |
||
980 |
If the ``BZR_PDB`` environment variable is set
|
|
981 |
then bzr will go into pdb post-mortem mode when an unhandled exception
|
|
982 |
occurs.
|
|
983 |
||
|
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
984 |
If you send a SIGQUIT signal to bzr, which can be done by pressing
|
985 |
Ctrl-\\ on Unix, bzr will go into the debugger immediately. You can
|
|
986 |
continue execution by typing ``c``. This can be disabled if necessary
|
|
987 |
by setting the environment variable ``BZR_SIGQUIT_PDB=0``.
|
|
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
988 |
|
989 |
||
990 |
Jargon
|
|
991 |
======
|
|
992 |
||
993 |
revno
|
|
994 |
Integer identifier for a revision on the main line of a branch.
|
|
995 |
Revision 0 is always the null revision; others are 1-based
|
|
996 |
indexes into the branch's revision history.
|
|
997 |
||
998 |
||
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
999 |
Unicode and Encoding Support
|
1000 |
============================
|
|
1001 |
||
1002 |
This section discusses various techniques that Bazaar uses to handle
|
|
1003 |
characters that are outside the ASCII set.
|
|
1004 |
||
1005 |
``Command.outf``
|
|
1006 |
----------------
|
|
1007 |
||
1008 |
When a ``Command`` object is created, it is given a member variable
|
|
1009 |
accessible by ``self.outf``. This is a file-like object, which is bound to
|
|
1010 |
``sys.stdout``, and should be used to write information to the screen,
|
|
1011 |
rather than directly writing to ``sys.stdout`` or calling ``print``.
|
|
1012 |
This file has the ability to translate Unicode objects into the correct
|
|
|
1711.2.96
by John Arbash Meinel
cleanup from suggestions by Robert and Martin |
1013 |
representation, based on the console encoding. Also, the class attribute
|
1014 |
``encoding_type`` will effect how unprintable characters will be
|
|
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1015 |
handled. This parameter can take one of 3 values:
|
1016 |
||
1017 |
replace
|
|
|
1711.2.96
by John Arbash Meinel
cleanup from suggestions by Robert and Martin |
1018 |
Unprintable characters will be represented with a suitable replacement
|
1019 |
marker (typically '?'), and no exception will be raised. This is for
|
|
1020 |
any command which generates text for the user to review, rather than
|
|
1021 |
for automated processing.
|
|
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1022 |
For example: ``bzr log`` should not fail if one of the entries has text
|
1023 |
that cannot be displayed.
|
|
1024 |
|
|
1025 |
strict
|
|
|
2063.3.1
by wang
fix typos |
1026 |
Attempting to print an unprintable character will cause a UnicodeError.
|
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1027 |
This is for commands that are intended more as scripting support, rather
|
1028 |
than plain user review.
|
|
1029 |
For exampl: ``bzr ls`` is designed to be used with shell scripting. One
|
|
1030 |
use would be ``bzr ls --null --unknows | xargs -0 rm``. If ``bzr``
|
|
1031 |
printed a filename with a '?', the wrong file could be deleted. (At the
|
|
1032 |
very least, the correct file would not be deleted). An error is used to
|
|
1033 |
indicate that the requested action could not be performed.
|
|
1034 |
|
|
1035 |
exact
|
|
1036 |
Do not attempt to automatically convert Unicode strings. This is used
|
|
1037 |
for commands that must handle conversion themselves.
|
|
1038 |
For example: ``bzr diff`` needs to translate Unicode paths, but should
|
|
1039 |
not change the exact text of the contents of the files.
|
|
1040 |
||
1041 |
||
1042 |
``bzrlib.urlutils.unescape_for_display``
|
|
1043 |
----------------------------------------
|
|
1044 |
||
1045 |
Because Transports work in URLs (as defined earlier), printing the raw URL
|
|
1046 |
to the user is usually less than optimal. Characters outside the standard
|
|
1047 |
set are printed as escapes, rather than the real character, and local
|
|
1048 |
paths would be printed as ``file://`` urls. The function
|
|
1049 |
``unescape_for_display`` attempts to unescape a URL, such that anything
|
|
1050 |
that cannot be printed in the current encoding stays an escaped URL, but
|
|
1051 |
valid characters are generated where possible.
|
|
1052 |
||
1053 |
||
|
2405.2.2
by Andrew Bennetts
Add a brief section on portability to HACKING. |
1054 |
Portability Tips
|
1055 |
================
|
|
1056 |
||
1057 |
The ``bzrlib.osutils`` module has many useful helper functions, including
|
|
1058 |
some more portable variants of functions in the standard library.
|
|
1059 |
||
1060 |
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it
|
|
1061 |
to fail on Windows if some files are readonly or still open elsewhere.
|
|
1062 |
Use ``bzrlib.osutils.rmtree`` instead.
|
|
1063 |
||
1064 |
||
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1065 |
C Extension Modules
|
1066 |
===================
|
|
1067 |
||
1068 |
We write some extensions in C using pyrex. We design these to work in
|
|
1069 |
three scenarios:
|
|
|
2449.1.1
by Alexander Belchenko
fix RSTX wrong formatting in HACKING |
1070 |
|
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1071 |
* User with no C compiler
|
1072 |
* User with C compiler
|
|
1073 |
* Developers
|
|
1074 |
||
1075 |
The recommended way to install bzr is to have a C compiler so that the
|
|
1076 |
extensions can be built, but if no C compiler is present, the pure python
|
|
1077 |
versions we supply will work, though more slowly.
|
|
1078 |
||
1079 |
For developers we recommend that pyrex be installed, so that the C
|
|
1080 |
extensions can be changed if needed.
|
|
1081 |
||
1082 |
For the C extensions, the extension module should always match the
|
|
1083 |
original python one in all respects (modulo speed). This should be
|
|
1084 |
maintained over time.
|
|
1085 |
||
1086 |
To create an extension, add rules to setup.py for building it with pyrex,
|
|
1087 |
and with distutils. Now start with an empty .pyx file. At the top add
|
|
1088 |
"include 'yourmodule.py'". This will import the contents of foo.py into this
|
|
1089 |
file at build time - remember that only one module will be loaded at
|
|
1090 |
runtime. Now you can subclass classes, or replace functions, and only your
|
|
1091 |
changes need to be present in the .pyx file.
|
|
1092 |
||
1093 |
Note that pyrex does not support all 2.4 programming idioms, so some
|
|
1094 |
syntax changes may be required. I.e.
|
|
|
2449.1.1
by Alexander Belchenko
fix RSTX wrong formatting in HACKING |
1095 |
|
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1096 |
- 'from foo import (bar, gam)' needs to change to not use the brackets.
|
1097 |
- 'import foo.bar as bar' needs to be 'import foo.bar; bar = foo.bar'
|
|
|
2449.1.1
by Alexander Belchenko
fix RSTX wrong formatting in HACKING |
1098 |
|
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1099 |
If the changes are too dramatic, consider
|
1100 |
maintaining the python code twice - once in the .pyx, and once in the .py,
|
|
1101 |
and no longer including the .py file.
|
|
1102 |
||
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1103 |
|
1104 |
Making Installers for OS Windows
|
|
|
1861.2.19
by Alexander Belchenko
HACKING: mention where to get instructions for building windows installers |
1105 |
================================
|
|
1861.2.20
by Alexander Belchenko
English |
1106 |
To build a win32 installer, see the instructions on the wiki page:
|
|
1861.2.19
by Alexander Belchenko
HACKING: mention where to get instructions for building windows installers |
1107 |
http://bazaar-vcs.org/BzrWin32Installer
|
1108 |
||
1109 |
||
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
1110 |
..
|
1111 |
vim: ft=rst tw=74 ai
|