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 |
|
3314.1.1
by Martin Pool
Add Developer's Guide text about PPA builds |
5 |
This document describes the Bazaar internals and the development process. |
6 |
It's meant for people interested in developing Bazaar, and some parts will |
|
7 |
also be useful to people developing Bazaar plugins. |
|
8 |
||
9 |
If you have any questions or something seems to be incorrect, unclear or |
|
10 |
missing, please talk to us in ``irc://irc.freenode.net/#bzr``, or write to |
|
11 |
the Bazaar mailing list. To propose a correction or addition to this |
|
12 |
document, send a merge request or new text to the mailing list. |
|
13 |
||
4634.39.12
by Ian Clatworthy
pdf generation of the Developer Guide |
14 |
The latest developer documentation can be found online at |
15 |
http://doc.bazaar-vcs.org/developers/. |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
16 |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
17 |
|
18 |
Getting Started |
|
19 |
############### |
|
20 |
||
21 |
Exploring the Bazaar Platform |
|
22 |
============================= |
|
23 |
||
24 |
Before making changes, it's a good idea to explore the work already |
|
25 |
done by others. Perhaps the new feature or improvement you're looking |
|
26 |
for is available in another plug-in already? If you find a bug, |
|
27 |
perhaps someone else has already fixed it? |
|
28 |
||
29 |
To answer these questions and more, take a moment to explore the |
|
30 |
overall Bazaar Platform. Here are some links to browse: |
|
31 |
||
32 |
* The Plugins page on the Wiki - http://bazaar-vcs.org/BzrPlugins |
|
33 |
||
2466.6.3
by Ian Clatworthy
Incorporate feedback from Aaron B. & Alex B. |
34 |
* The Bazaar product family on Launchpad - https://launchpad.net/bazaar |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
35 |
|
36 |
* Bug Tracker for the core product - https://bugs.launchpad.net/bzr/ |
|
37 |
||
38 |
* Blueprint Tracker for the core product - https://blueprints.launchpad.net/bzr/ |
|
39 |
||
40 |
If nothing else, perhaps you'll find inspiration in how other developers |
|
41 |
have solved their challenges. |
|
42 |
||
4424.1.1
by Martin Pool
Trim some outdated performance drive documentation, and the performance.png graph |
43 |
Finding Something To Do |
44 |
======================= |
|
45 |
||
46 |
Ad-hoc performance work can also be done. One useful tool is the 'evil' debug |
|
47 |
flag. For instance running ``bzr -Devil commit -m "test"`` will log a backtrace |
|
48 |
to the bzr log file for every method call which triggers a slow or non-scalable |
|
49 |
part of the bzr library. So checking that a given command with ``-Devil`` has |
|
50 |
no backtraces logged to the log file is a good way to find problem function |
|
51 |
calls that might be nested deep in the code base. |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
52 |
|
53 |
Planning and Discussing Changes |
|
54 |
=============================== |
|
55 |
||
56 |
There is a very active community around Bazaar. Mostly we meet on IRC |
|
57 |
(#bzr on irc.freenode.net) and on the mailing list. To join the Bazaar |
|
58 |
community, see http://bazaar-vcs.org/BzrSupport. |
|
59 |
||
60 |
If you are planning to make a change, it's a very good idea to mention it |
|
61 |
on the IRC channel and/or on the mailing list. There are many advantages |
|
62 |
to involving the community before you spend much time on a change. |
|
63 |
These include: |
|
64 |
||
65 |
* you get to build on the wisdom on others, saving time |
|
66 |
||
67 |
* if others can direct you to similar code, it minimises the work to be done |
|
68 |
||
69 |
* it assists everyone in coordinating direction, priorities and effort. |
|
70 |
||
71 |
In summary, maximising the input from others typically minimises the |
|
72 |
total effort required to get your changes merged. The community is |
|
73 |
friendly, helpful and always keen to welcome newcomers. |
|
74 |
||
75 |
||
76 |
Bazaar Development in a Nutshell |
|
77 |
================================ |
|
78 |
||
4595.5.1
by Neil Martinsen-Burrell
added giving back introduction from the wiki |
79 |
.. was from bazaar-vcs.org/BzrGivingBack |
80 |
||
81 |
One of the fun things about working on a version control system like Bazaar is |
|
82 |
that the users have a high level of proficiency in contributing back into |
|
83 |
the tool. Consider the following very brief introduction to contributing back |
|
84 |
to Bazaar. More detailed instructions are in the following sections. |
|
85 |
||
86 |
Making the change |
|
87 |
----------------- |
|
88 |
||
89 |
First, get a local copy of the development mainline (See `Why make a local |
|
90 |
copy of bzr.dev?`_.) |
|
91 |
:: |
|
92 |
||
93 |
$ bzr init-repo ~/bzr |
|
94 |
$ cd ~/bzr |
|
95 |
$ bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev |
|
96 |
||
97 |
Now make your own branch:: |
|
98 |
||
4595.5.3
by John Arbash Meinel
Suggest a task-specific branch, rather than a generic 'giveback' branch. |
99 |
$ bzr branch bzr.dev 123456-my-bugfix |
4595.5.1
by Neil Martinsen-Burrell
added giving back introduction from the wiki |
100 |
|
4595.5.3
by John Arbash Meinel
Suggest a task-specific branch, rather than a generic 'giveback' branch. |
101 |
This will give you a branch called "123456-my-bugfix" that you can work on |
102 |
and commit in. Here, you can study the code, make a fix or a new feature. |
|
103 |
Feel free to commit early and often (after all, it's your branch!). |
|
4595.5.1
by Neil Martinsen-Burrell
added giving back introduction from the wiki |
104 |
|
105 |
Documentation improvements are an easy place to get started giving back to the |
|
106 |
Bazaar project. The documentation is in the `doc/` subdirectory of the Bazaar |
|
107 |
source tree. |
|
108 |
||
109 |
When you are done, make sure that you commit your last set of changes as well! |
|
110 |
Once you are happy with your changes, ask for them to be merged, as described |
|
111 |
below. |
|
112 |
||
113 |
Making a Merge Proposal |
|
114 |
----------------------- |
|
115 |
||
116 |
The Bazaar developers use Launchpad to further enable a truly distributed |
|
117 |
style of development. Anyone can propose a branch for merging into the Bazaar |
|
118 |
trunk. To start this process, you need to push your branch to Launchpad. To |
|
119 |
do this, you will need a Launchpad account and user name, e.g. |
|
120 |
`your_lp_username`. You can push your branch to Launchpad directly from |
|
121 |
Bazaar:: |
|
122 |
||
123 |
$ bzr push lp:~your_lp_username/bzr/giveback |
|
124 |
||
125 |
After you have pushed your branch, you will need to propose it for merging to |
|
126 |
the Bazaar trunk. Go to <https://launchpad.net/your_lp_username/bzr/giveback> |
|
127 |
and choose "Propose for merging into another branch". Select "~bzr/bzr/trunk" |
|
128 |
to hand your changes off to the Bazaar developers for review and merging. |
|
129 |
||
130 |
Why make a local copy of bzr.dev? |
|
131 |
--------------------------------- |
|
132 |
||
133 |
Making a local mirror of bzr.dev is not strictly necessary, but it means |
|
134 |
||
135 |
- You can use that copy of bzr.dev as your main bzr executable, and keep it |
|
136 |
up-to-date using ``bzr pull``. |
|
137 |
- Certain operations are faster, and can be done when offline. For example: |
|
138 |
||
139 |
- ``bzr bundle`` |
|
140 |
- ``bzr diff -r ancestor:...`` |
|
141 |
- ``bzr merge`` |
|
142 |
||
143 |
- When it's time to create your next branch, it's more convenient. When you |
|
144 |
have further contributions to make, you should do them in their own branch:: |
|
145 |
||
146 |
$ cd ~/bzr |
|
147 |
$ bzr branch bzr.dev additional_fixes |
|
148 |
$ cd additional_fixes # hack, hack, hack |
|
149 |
||
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
150 |
|
151 |
||
152 |
Understanding the Development Process |
|
153 |
===================================== |
|
154 |
||
3683.1.1
by Martin Pool
Improved review process docs and separate out architectural overview |
155 |
The development team follows many practices including: |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
156 |
|
157 |
* a public roadmap and planning process in which anyone can participate |
|
158 |
||
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
159 |
* time based milestones everyone can work towards and plan around |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
160 |
|
161 |
* extensive code review and feedback to contributors |
|
162 |
||
163 |
* complete and rigorous test coverage on any code contributed |
|
164 |
||
165 |
* automated validation that all tests still pass before code is merged |
|
166 |
into the main code branch. |
|
167 |
||
168 |
The key tools we use to enable these practices are: |
|
169 |
||
170 |
* Launchpad - https://launchpad.net/ |
|
171 |
||
172 |
* Bazaar - http://bazaar-vcs.org/ |
|
173 |
||
174 |
* Bundle Buggy - http://bundlebuggy.aaronbentley.com/ |
|
175 |
||
176 |
* Patch Queue Manager - https://launchpad.net/pqm/ |
|
177 |
||
178 |
For further information, see http://bazaar-vcs.org/BzrDevelopment. |
|
179 |
||
180 |
||
181 |
||
182 |
||
183 |
Preparing a Sandbox for Making Changes to Bazaar |
|
184 |
================================================ |
|
185 |
||
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
186 |
Bazaar supports many ways of organising your work. See |
187 |
http://bazaar-vcs.org/SharedRepositoryLayouts for a summary of the |
|
188 |
popular alternatives. |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
189 |
|
190 |
Of course, the best choice for you will depend on numerous factors: |
|
191 |
the number of changes you may be making, the complexity of the changes, etc. |
|
192 |
As a starting suggestion though: |
|
193 |
||
194 |
* create a local copy of the main development branch (bzr.dev) by using |
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
195 |
this command:: |
196 |
||
197 |
bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
198 |
|
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
199 |
* keep your copy of bzr.dev pristine (by not developing in it) and keep |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
200 |
it up to date (by using bzr pull) |
201 |
||
202 |
* create a new branch off your local bzr.dev copy for each issue |
|
203 |
(bug or feature) you are working on. |
|
204 |
||
205 |
This approach makes it easy to go back and make any required changes |
|
206 |
after a code review. Resubmitting the change is then simple with no |
|
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
207 |
risk of accidentally including edits related to other issues you may |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
208 |
be working on. After the changes for an issue are accepted and merged, |
209 |
the associated branch can be deleted or archived as you wish. |
|
210 |
||
211 |
||
212 |
Navigating the Code Base |
|
213 |
======================== |
|
214 |
||
3464.3.4
by Martin Pool
Merge part of the NewDeveloperIntroduction into HACKING |
215 |
.. Was at <http://bazaar-vcs.org/NewDeveloperIntroduction> |
216 |
||
217 |
Some of the key files in this directory are: |
|
218 |
||
219 |
bzr |
|
220 |
The command you run to start Bazaar itself. This script is pretty |
|
221 |
short and just does some checks then jumps into bzrlib. |
|
222 |
||
223 |
README |
|
224 |
This file covers a brief introduction to Bazaar and lists some of its |
|
225 |
key features. |
|
226 |
||
227 |
NEWS |
|
228 |
Summary of changes in each Bazaar release that can affect users or |
|
229 |
plugin developers. |
|
230 |
||
231 |
setup.py |
|
232 |
Installs Bazaar system-wide or to your home directory. To perform |
|
233 |
development work on Bazaar it is not required to run this file - you |
|
234 |
can simply run the bzr command from the top level directory of your |
|
235 |
development copy. Note: That if you run setup.py this will create a |
|
236 |
'build' directory in your development branch. There's nothing wrong |
|
237 |
with this but don't be confused by it. The build process puts a copy |
|
238 |
of the main code base into this build directory, along with some other |
|
239 |
files. You don't need to go in here for anything discussed in this |
|
240 |
guide. |
|
241 |
||
242 |
bzrlib |
|
243 |
Possibly the most exciting folder of all, bzrlib holds the main code |
|
244 |
base. This is where you will go to edit python files and contribute to |
|
245 |
Bazaar. |
|
246 |
||
247 |
doc |
|
248 |
Holds documentation on a whole range of things on Bazaar from the |
|
249 |
origination of ideas within the project to information on Bazaar |
|
250 |
features and use cases. Within this directory there is a subdirectory |
|
251 |
for each translation into a human language. All the documentation |
|
252 |
is in the ReStructuredText markup language. |
|
253 |
||
254 |
doc/developers |
|
4595.5.1
by Neil Martinsen-Burrell
added giving back introduction from the wiki |
255 |
Documentation specifically targeted at Bazaar and plugin developers. |
3464.3.4
by Martin Pool
Merge part of the NewDeveloperIntroduction into HACKING |
256 |
(Including this document.) |
257 |
||
258 |
||
259 |
||
260 |
Automatically-generated API reference information is available at |
|
3464.3.12
by Martin Pool
Update links to bzrlib api docs |
261 |
<http://starship.python.net/crew/mwh/bzrlibapi/>. |
3683.1.1
by Martin Pool
Improved review process docs and separate out architectural overview |
262 |
|
4634.39.36
by Ian Clatworthy
Get plain-style documentation generation working again |
263 |
See also the `Bazaar Architectural Overview |
264 |
<http://doc.bazaar-vcs.org/developers/overview.html>`_. |
|
3683.1.1
by Martin Pool
Improved review process docs and separate out architectural overview |
265 |
|
266 |
||
267 |
The Code Review Process |
|
268 |
####################### |
|
269 |
||
270 |
All code changes coming in to Bazaar are reviewed by someone else. |
|
271 |
Normally changes by core contributors are reviewed by one other core |
|
272 |
developer, and changes from other people are reviewed by two core |
|
273 |
developers. Use intelligent discretion if the patch is trivial. |
|
274 |
||
275 |
Good reviews do take time. They also regularly require a solid |
|
276 |
understanding of the overall code base. In practice, this means a small |
|
277 |
number of people often have a large review burden - with knowledge comes |
|
4595.5.1
by Neil Martinsen-Burrell
added giving back introduction from the wiki |
278 |
responsibility. No one likes their merge requests sitting in a queue going |
3683.1.1
by Martin Pool
Improved review process docs and separate out architectural overview |
279 |
nowhere, so reviewing sooner rather than later is strongly encouraged. |
280 |
||
281 |
||
282 |
||
283 |
||
284 |
||
285 |
Review cover letters |
|
286 |
==================== |
|
287 |
||
288 |
Please put a "cover letter" on your merge request explaining: |
|
289 |
||
290 |
* the reason **why** you're making this change |
|
291 |
||
3883.1.5
by Gordon P. Hemsley
Fixed I-before-E typo in passing. |
292 |
* **how** this change achieves this purpose |
3683.1.1
by Martin Pool
Improved review process docs and separate out architectural overview |
293 |
|
294 |
* anything else you may have fixed in passing |
|
295 |
||
296 |
* anything significant that you thought of doing, such as a more |
|
297 |
extensive fix or a different approach, but didn't or couldn't do now |
|
298 |
||
299 |
A good cover letter makes reviewers' lives easier because they can decide |
|
300 |
from the letter whether they agree with the purpose and approach, and then |
|
301 |
assess whether the patch actually does what the cover letter says. |
|
302 |
Explaining any "drive-by fixes" or roads not taken may also avoid queries |
|
303 |
from the reviewer. All in all this should give faster and better reviews. |
|
304 |
Sometimes writing the cover letter helps the submitter realize something |
|
305 |
else they need to do. The size of the cover letter should be proportional |
|
306 |
to the size and complexity of the patch. |
|
307 |
||
308 |
||
309 |
Reviewing proposed changes |
|
310 |
========================== |
|
311 |
||
312 |
Anyone is welcome to review code, and reply to the thread with their |
|
313 |
opinion or comments. |
|
314 |
||
315 |
The simplest way to review a proposed change is to just read the patch on |
|
316 |
the list or in Bundle Buggy. For more complex changes it may be useful |
|
317 |
to make a new working tree or branch from trunk, and merge the proposed |
|
318 |
change into it, so you can experiment with the code or look at a wider |
|
319 |
context. |
|
320 |
||
321 |
There are three main requirements for code to get in: |
|
322 |
||
323 |
* Doesn't reduce test coverage: if it adds new methods or commands, |
|
324 |
there should be tests for them. There is a good test framework |
|
325 |
and plenty of examples to crib from, but if you are having trouble |
|
326 |
working out how to test something feel free to post a draft patch |
|
327 |
and ask for help. |
|
328 |
||
329 |
* Doesn't reduce design clarity, such as by entangling objects |
|
330 |
we're trying to separate. This is mostly something the more |
|
331 |
experienced reviewers need to help check. |
|
332 |
||
333 |
* Improves bugs, features, speed, or code simplicity. |
|
334 |
||
335 |
Code that goes in should not degrade any of these aspects. Patches are |
|
336 |
welcome that only cleanup the code without changing the external |
|
337 |
behaviour. The core developers take care to keep the code quality high |
|
338 |
and understandable while recognising that perfect is sometimes the enemy |
|
339 |
of good. |
|
340 |
||
341 |
It is easy for reviews to make people notice other things which should be |
|
342 |
fixed but those things should not hold up the original fix being accepted. |
|
343 |
New things can easily be recorded in the Bug Tracker instead. |
|
344 |
||
345 |
It's normally much easier to review several smaller patches than one large |
|
346 |
one. You might want to use ``bzr-loom`` to maintain threads of related |
|
347 |
work, or submit a preparatory patch that will make your "real" change |
|
348 |
easier. |
|
349 |
||
350 |
||
351 |
Checklist for reviewers |
|
352 |
======================= |
|
353 |
||
354 |
* Do you understand what the code's doing and why? |
|
355 |
||
356 |
* Will it perform reasonably for large inputs, both in memory size and |
|
357 |
run time? Are there some scenarios where performance should be |
|
358 |
measured? |
|
359 |
||
360 |
* Is it tested, and are the tests at the right level? Are there both |
|
361 |
blackbox (command-line level) and API-oriented tests? |
|
362 |
||
363 |
* If this change will be visible to end users or API users, is it |
|
364 |
appropriately documented in NEWS? |
|
365 |
||
366 |
* Does it meet the coding standards below? |
|
367 |
||
368 |
* If it changes the user-visible behaviour, does it update the help |
|
369 |
strings and user documentation? |
|
370 |
||
371 |
* If it adds a new major concept or standard practice, does it update the |
|
372 |
developer documentation? |
|
373 |
||
374 |
* (your ideas here...) |
|
375 |
||
376 |
||
4325.5.4
by Martin Pool
Update developer guide to use Launchpad reviews |
377 |
Reviews on Launchpad |
378 |
==================== |
|
379 |
||
380 |
From May 2009 on, we prefer people to propose code reviews through |
|
381 |
Launchpad. |
|
382 |
||
383 |
* <https://launchpad.net/+tour/code-review> |
|
384 |
||
385 |
* <https://help.launchpad.net/Code/Review> |
|
386 |
||
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
387 |
Anyone can propose or comment on a merge proposal just by creating a |
4325.5.4
by Martin Pool
Update developer guide to use Launchpad reviews |
388 |
Launchpad account. |
389 |
||
390 |
There are two ways to create a new merge proposal: through the web |
|
391 |
interface or by email. |
|
392 |
||
393 |
||
394 |
Proposing a merge through the web |
|
395 |
--------------------------------- |
|
396 |
||
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
397 |
To create the proposal through the web, first push your branch to Launchpad. |
398 |
For example, a branch dealing with documentation belonging to the Launchpad |
|
399 |
User mbp could be pushed as :: |
|
4325.5.4
by Martin Pool
Update developer guide to use Launchpad reviews |
400 |
|
401 |
bzr push lp:~mbp/bzr/doc |
|
402 |
||
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
403 |
Then go to the branch's web page, which in this case would be |
404 |
<https://code.launchpad.net/~mbp/bzr/doc>. You can simplify this step by just |
|
4325.5.4
by Martin Pool
Update developer guide to use Launchpad reviews |
405 |
running :: |
406 |
||
407 |
bzr lp-open |
|
408 |
||
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
409 |
You can then click "Propose for merging into another branch", and enter your |
410 |
cover letter (see above) into the web form. Typically you'll want to merge |
|
411 |
into ``~bzr/bzr/trunk`` which will be the default; you might also want to |
|
412 |
nominate merging into a release branch for a bug fix. There is the option to |
|
413 |
specify a specific reviewer or type of review, and you shouldn't normally |
|
414 |
change those. |
|
4325.5.4
by Martin Pool
Update developer guide to use Launchpad reviews |
415 |
|
416 |
Submitting the form takes you to the new page about the merge proposal |
|
417 |
containing the diff of the changes, comments by interested people, and |
|
418 |
controls to comment or vote on the change. |
|
419 |
||
420 |
Proposing a merge by mail |
|
421 |
------------------------- |
|
422 |
||
423 |
To propose a merge by mail, send a bundle to ``merge@code.launchpad.net``. |
|
424 |
||
425 |
You can generate a merge request like this:: |
|
426 |
||
427 |
bzr send -o bug-1234.diff |
|
428 |
||
429 |
``bzr send`` can also send mail directly if you prefer; see the help. |
|
430 |
||
431 |
Reviewing changes |
|
432 |
----------------- |
|
433 |
||
434 |
From <https://code.launchpad.net/bzr/+activereviews> you can see all |
|
435 |
currently active reviews, and choose one to comment on. This page also |
|
436 |
shows proposals that are now approved and should be merged by someone with |
|
437 |
PQM access. |
|
438 |
||
439 |
||
440 |
Reviews through Bundle Buggy |
|
441 |
============================ |
|
442 |
||
443 |
The Bundle Buggy tool used up to May 2009 is still available as a review |
|
444 |
mechanism. |
|
445 |
||
446 |
Sending patches for review |
|
447 |
-------------------------- |
|
448 |
||
449 |
If you'd like to propose a change, please post to the |
|
450 |
bazaar@lists.canonical.com list with a bundle, patch, or link to a |
|
451 |
branch. Put ``[PATCH]`` or ``[MERGE]`` in the subject so Bundle Buggy |
|
452 |
can pick it out, and explain the change in the email message text. |
|
453 |
Remember to update the NEWS file as part of your change if it makes any |
|
454 |
changes visible to users or plugin developers. Please include a diff |
|
455 |
against mainline if you're giving a link to a branch. |
|
456 |
||
457 |
You can generate a merge request like this:: |
|
458 |
||
459 |
bzr send -o bug-1234.patch |
|
460 |
||
461 |
A ``.patch`` extension is recommended instead of .bundle as many mail clients |
|
462 |
will send the latter as a binary file. |
|
463 |
||
464 |
``bzr send`` can also send mail directly if you prefer; see the help. |
|
465 |
||
466 |
Please do **NOT** put [PATCH] or [MERGE] in the subject line if you don't |
|
467 |
want it to be merged. If you want comments from developers rather than |
|
468 |
to be merged, you can put ``[RFC]`` in the subject line. |
|
469 |
||
470 |
If this change addresses a bug, please put the bug number in the subject |
|
471 |
line too, in the form ``[#1]`` so that Bundle Buggy can recognize it. |
|
472 |
||
473 |
If the change is intended for a particular release mark that in the |
|
474 |
subject too, e.g. ``[1.6]``. |
|
3683.1.1
by Martin Pool
Improved review process docs and separate out architectural overview |
475 |
Anyone can "vote" on the mailing list by expressing an opinion. Core |
476 |
developers can also vote using Bundle Buggy. Here are the voting codes and |
|
477 |
their explanations. |
|
478 |
||
479 |
:approve: Reviewer wants this submission merged. |
|
480 |
:tweak: Reviewer wants this submission merged with small changes. (No |
|
481 |
re-review required.) |
|
482 |
:abstain: Reviewer does not intend to vote on this patch. |
|
483 |
:resubmit: Please make changes and resubmit for review. |
|
484 |
:reject: Reviewer doesn't want this kind of change merged. |
|
485 |
:comment: Not really a vote. Reviewer just wants to comment, for now. |
|
486 |
||
487 |
If a change gets two approvals from core reviewers, and no rejections, |
|
488 |
then it's OK to come in. Any of the core developers can bring it into the |
|
489 |
bzr.dev trunk and backport it to maintenance branches if required. The |
|
490 |
Release Manager will merge the change into the branch for a pending |
|
491 |
release, if any. As a guideline, core developers usually merge their own |
|
492 |
changes and volunteer to merge other contributions if they were the second |
|
493 |
reviewer to agree to a change. |
|
494 |
||
495 |
To track the progress of proposed changes, use Bundle Buggy. See |
|
496 |
http://bundlebuggy.aaronbentley.com/help for a link to all the |
|
497 |
outstanding merge requests together with an explanation of the columns. |
|
498 |
Bundle Buggy will also mail you a link to track just your change. |
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
499 |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
500 |
Coding Style Guidelines |
3408.1.5
by Martin Pool
Coding standard: repr methods |
501 |
####################### |
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
502 |
|
3376.2.2
by Martin Pool
Add documentation of assert statement ban |
503 |
hasattr and getattr |
3408.1.8
by Martin Pool
merge trunk |
504 |
=================== |
2974.1.1
by Martin Pool
HACKING: say not to use hasattr() |
505 |
|
506 |
``hasattr`` should not be used because it swallows exceptions including |
|
507 |
``KeyboardInterrupt``. Instead, say something like :: |
|
508 |
||
509 |
if getattr(thing, 'name', None) is None |
|
510 |
||
511 |
||
2795.1.1
by Martin Pool
Document code layout stuff |
512 |
Code layout |
3408.1.5
by Martin Pool
Coding standard: repr methods |
513 |
=========== |
2795.1.1
by Martin Pool
Document code layout stuff |
514 |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
515 |
Please write PEP-8__ compliant code. |
516 |
||
2795.1.1
by Martin Pool
Document code layout stuff |
517 |
__ http://www.python.org/peps/pep-0008.html |
518 |
||
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
519 |
One often-missed requirement is that the first line of docstrings |
520 |
should be a self-contained one-sentence summary. |
|
521 |
||
2795.1.1
by Martin Pool
Document code layout stuff |
522 |
We use 4 space indents for blocks, and never use tab characters. (In vim, |
523 |
``set expandtab``.) |
|
524 |
||
4210.5.2
by Marius Kruger
update white space policy in HACKING |
525 |
Trailing white space should be avoided, but is allowed. |
526 |
You should however not make lots of unrelated white space changes. |
|
3943.7.1
by Marius Kruger
* Change test_no_tabs to test_coding_style and let it check for trailing newlines too. |
527 |
|
3943.7.2
by Marius Kruger
* also check for unix style newlines and note in HACKING that this is what we use. |
528 |
Unix style newlines (LF) are used. |
529 |
||
3943.7.5
by Marius Kruger
* test_source also notes how many longlines exist |
530 |
Each file must have a newline at the end of it. |
531 |
||
2795.1.1
by Martin Pool
Document code layout stuff |
532 |
Lines should be no more than 79 characters if at all possible. |
533 |
Lines that continue a long statement may be indented in either of |
|
534 |
two ways: |
|
535 |
||
536 |
within the parenthesis or other character that opens the block, e.g.:: |
|
537 |
||
538 |
my_long_method(arg1, |
|
539 |
arg2, |
|
540 |
arg3) |
|
541 |
||
542 |
or indented by four spaces:: |
|
543 |
||
544 |
my_long_method(arg1, |
|
545 |
arg2, |
|
546 |
arg3) |
|
547 |
||
548 |
The first is considered clearer by some people; however it can be a bit |
|
549 |
harder to maintain (e.g. when the method name changes), and it does not |
|
550 |
work well if the relevant parenthesis is already far to the right. Avoid |
|
551 |
this:: |
|
552 |
||
553 |
self.legbone.kneebone.shinbone.toebone.shake_it(one, |
|
554 |
two, |
|
555 |
three) |
|
556 |
||
557 |
but rather :: |
|
558 |
||
559 |
self.legbone.kneebone.shinbone.toebone.shake_it(one, |
|
560 |
two, |
|
561 |
three) |
|
562 |
||
563 |
or :: |
|
564 |
||
565 |
self.legbone.kneebone.shinbone.toebone.shake_it( |
|
566 |
one, two, three) |
|
567 |
||
568 |
For long lists, we like to add a trailing comma and put the closing |
|
569 |
character on the following line. This makes it easier to add new items in |
|
570 |
future:: |
|
571 |
||
572 |
from bzrlib.goo import ( |
|
573 |
jam, |
|
574 |
jelly, |
|
575 |
marmalade, |
|
576 |
) |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
577 |
|
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
578 |
There should be spaces between function parameters, but not between the |
2795.1.3
by Martin Pool
clarify spacing for function parameters |
579 |
keyword name and the value:: |
580 |
||
581 |
call(1, 3, cheese=quark) |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
582 |
|
2795.1.2
by Martin Pool
emacs indent additions from vila |
583 |
In emacs:: |
584 |
||
585 |
;(defface my-invalid-face |
|
586 |
; '((t (:background "Red" :underline t))) |
|
587 |
; "Face used to highlight invalid constructs or other uglyties" |
|
588 |
; ) |
|
589 |
||
590 |
(defun my-python-mode-hook () |
|
591 |
;; setup preferred indentation style. |
|
592 |
(setq fill-column 79) |
|
593 |
(setq indent-tabs-mode nil) ; no tabs, never, I will not repeat |
|
594 |
; (font-lock-add-keywords 'python-mode |
|
595 |
; '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs |
|
596 |
; ("[ \t]+$" . 'my-invalid-face) ; Trailing spaces |
|
597 |
; ("^[ \t]+$" . 'my-invalid-face)); Spaces only |
|
598 |
; ) |
|
599 |
) |
|
600 |
||
601 |
(add-hook 'python-mode-hook 'my-python-mode-hook) |
|
602 |
||
603 |
The lines beginning with ';' are comments. They can be activated |
|
604 |
if one want to have a strong notice of some tab/space usage |
|
605 |
violations. |
|
606 |
||
607 |
||
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
608 |
Module Imports |
3408.1.5
by Martin Pool
Coding standard: repr methods |
609 |
============== |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
610 |
|
611 |
* Imports should be done at the top-level of the file, unless there is |
|
612 |
a strong reason to have them lazily loaded when a particular |
|
613 |
function runs. Import statements have a cost, so try to make sure |
|
614 |
they don't run inside hot functions. |
|
615 |
||
616 |
* Module names should always be given fully-qualified, |
|
617 |
i.e. ``bzrlib.hashcache`` not just ``hashcache``. |
|
618 |
||
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
619 |
|
620 |
Naming |
|
3408.1.5
by Martin Pool
Coding standard: repr methods |
621 |
====== |
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
622 |
|
2625.3.1
by Ian Clatworthy
Clarify the use of underscore in the naming convention |
623 |
Functions, methods or members that are "private" to bzrlib are given |
624 |
a leading underscore prefix. Names without a leading underscore are |
|
625 |
public not just across modules but to programmers using bzrlib as an |
|
626 |
API. As a consequence, a leading underscore is appropriate for names |
|
627 |
exposed across modules but that are not to be exposed to bzrlib API |
|
628 |
programmers. |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
629 |
|
630 |
We prefer class names to be concatenated capital words (``TestCase``) |
|
631 |
and variables, methods and functions to be lowercase words joined by |
|
632 |
underscores (``revision_id``, ``get_revision``). |
|
633 |
||
634 |
For the purposes of naming some names are treated as single compound |
|
635 |
words: "filename", "revno". |
|
636 |
||
637 |
Consider naming classes as nouns and functions/methods as verbs. |
|
638 |
||
2221.4.7
by Aaron Bentley
Add suggestion to HACKING |
639 |
Try to avoid using abbreviations in names, because there can be |
640 |
inconsistency if other people use the full name. |
|
641 |
||
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
642 |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
643 |
Standard Names |
3408.1.5
by Martin Pool
Coding standard: repr methods |
644 |
============== |
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
645 |
|
646 |
``revision_id`` not ``rev_id`` or ``revid`` |
|
647 |
||
648 |
Functions that transform one thing to another should be named ``x_to_y`` |
|
649 |
(not ``x2y`` as occurs in some old code.) |
|
650 |
||
1098
by Martin Pool
- notes on how output is written |
651 |
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
652 |
Destructors |
3408.1.5
by Martin Pool
Coding standard: repr methods |
653 |
=========== |
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
654 |
|
1185.16.150
by Martin Pool
Improved description of python exception policies |
655 |
Python destructors (``__del__``) work differently to those of other |
656 |
languages. In particular, bear in mind that destructors may be called |
|
657 |
immediately when the object apparently becomes unreferenced, or at some |
|
658 |
later time, or possibly never at all. Therefore we have restrictions on |
|
659 |
what can be done inside them. |
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
660 |
|
3408.1.5
by Martin Pool
Coding standard: repr methods |
661 |
0. If you think you need to use a ``__del__`` method ask another |
662 |
developer for alternatives. If you do need to use one, explain |
|
663 |
why in a comment. |
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
664 |
|
665 |
1. Never rely on a ``__del__`` method running. If there is code that |
|
666 |
must run, do it from a ``finally`` block instead. |
|
667 |
||
668 |
2. Never ``import`` from inside a ``__del__`` method, or you may crash the |
|
669 |
interpreter!! |
|
670 |
||
671 |
3. In some places we raise a warning from the destructor if the object |
|
672 |
has not been cleaned up or closed. This is considered OK: the warning |
|
673 |
may not catch every case but it's still useful sometimes. |
|
674 |
||
675 |
||
1740.2.5
by Aaron Bentley
Merge from bzr.dev |
676 |
Factories |
3408.1.5
by Martin Pool
Coding standard: repr methods |
677 |
========= |
1740.2.5
by Aaron Bentley
Merge from bzr.dev |
678 |
|
679 |
In some places we have variables which point to callables that construct |
|
680 |
new instances. That is to say, they can be used a lot like class objects, |
|
681 |
but they shouldn't be *named* like classes: |
|
682 |
||
683 |
> I think that things named FooBar should create instances of FooBar when |
|
684 |
> called. Its plain confusing for them to do otherwise. When we have |
|
685 |
> something that is going to be used as a class - that is, checked for via |
|
686 |
> isinstance or other such idioms, them I would call it foo_class, so that |
|
687 |
> it is clear that a callable is not sufficient. If it is only used as a |
|
688 |
> factory, then yes, foo_factory is what I would use. |
|
689 |
||
690 |
||
1911.4.15
by John Arbash Meinel
Updated HACKING and docstrings per Martin's suggestions |
691 |
Registries |
3408.1.5
by Martin Pool
Coding standard: repr methods |
692 |
========== |
1911.4.15
by John Arbash Meinel
Updated HACKING and docstrings per Martin's suggestions |
693 |
|
694 |
Several places in Bazaar use (or will use) a registry, which is a |
|
695 |
mapping from names to objects or classes. The registry allows for |
|
696 |
loading in registered code only when it's needed, and keeping |
|
697 |
associated information such as a help string or description. |
|
698 |
||
699 |
||
3582.1.1
by Martin Pool
Document InterObject |
700 |
InterObject and multiple dispatch |
701 |
================================= |
|
702 |
||
703 |
The ``InterObject`` provides for two-way `multiple dispatch`__: matching |
|
704 |
up for example a source and destination repository to find the right way |
|
705 |
to transfer data between them. |
|
706 |
||
3582.1.6
by Martin Pool
developer guide ReST syntax fix |
707 |
.. __: http://en.wikipedia.org/wiki/Multiple_dispatch |
708 |
||
3582.1.1
by Martin Pool
Document InterObject |
709 |
There is a subclass ``InterObject`` classes for each type of object that is |
710 |
dispatched this way, e.g. ``InterRepository``. Calling ``.get()`` on this |
|
711 |
class will return an ``InterObject`` instance providing the best match for |
|
712 |
those parameters, and this instance then has methods for operations |
|
713 |
between the objects. |
|
714 |
||
715 |
inter = InterRepository.get(source_repo, target_repo) |
|
716 |
inter.fetch(revision_id) |
|
717 |
||
718 |
``InterRepository`` also acts as a registry-like object for its |
|
719 |
subclasses, and they can be added through ``.register_optimizer``. The |
|
720 |
right one to run is selected by asking each class, in reverse order of |
|
721 |
registration, whether it ``.is_compatible`` with the relevant objects. |
|
722 |
||
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
723 |
Lazy Imports |
3408.1.5
by Martin Pool
Coding standard: repr methods |
724 |
============ |
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
725 |
|
726 |
To make startup time faster, we use the ``bzrlib.lazy_import`` module to |
|
727 |
delay importing modules until they are actually used. ``lazy_import`` uses |
|
728 |
the same syntax as regular python imports. So to import a few modules in a |
|
729 |
lazy fashion do:: |
|
730 |
||
731 |
from bzrlib.lazy_import import lazy_import |
|
732 |
lazy_import(globals(), """ |
|
733 |
import os |
|
734 |
import subprocess |
|
735 |
import sys |
|
736 |
import time |
|
737 |
||
738 |
from bzrlib import ( |
|
739 |
errors, |
|
740 |
transport, |
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
741 |
revision as _mod_revision, |
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
742 |
) |
743 |
import bzrlib.transport |
|
744 |
import bzrlib.xml5 |
|
745 |
""") |
|
746 |
||
747 |
At this point, all of these exist as a ``ImportReplacer`` object, ready to |
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
748 |
be imported once a member is accessed. Also, when importing a module into |
749 |
the local namespace, which is likely to clash with variable names, it is |
|
2370.1.1
by Ian Clatworthy
Minor corrections to HACKING |
750 |
recommended to prefix it as ``_mod_<module>``. This makes it clearer that |
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
751 |
the variable is a module, and these object should be hidden anyway, since |
752 |
they shouldn't be imported into other namespaces. |
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
753 |
|
754 |
While it is possible for ``lazy_import()`` to import members of a module |
|
2063.3.1
by wang
fix typos |
755 |
when using the ``from module import member`` syntax, it is recommended to |
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
756 |
only use that syntax to load sub modules ``from module import submodule``. |
757 |
This is because variables and classes can frequently be used without |
|
758 |
needing a sub-member for example:: |
|
759 |
||
760 |
lazy_import(globals(), """ |
|
761 |
from module import MyClass |
|
762 |
""") |
|
763 |
||
764 |
def test(x): |
|
765 |
return isinstance(x, MyClass) |
|
766 |
||
767 |
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer`` |
|
768 |
object, rather than the real class. |
|
769 |
||
1996.1.26
by John Arbash Meinel
Update HACKING and docstrings |
770 |
It also is incorrect to assign ``ImportReplacer`` objects to other variables. |
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
771 |
Because the replacer only knows about the original name, it is unable to |
772 |
replace other variables. The ``ImportReplacer`` class will raise an |
|
1996.1.26
by John Arbash Meinel
Update HACKING and docstrings |
773 |
``IllegalUseOfScopeReplacer`` exception if it can figure out that this |
774 |
happened. But it requires accessing a member more than once from the new |
|
775 |
variable, so some bugs are not detected right away. |
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
776 |
|
777 |
||
2598.5.9
by Aaron Bentley
Update NEWS and HACKING |
778 |
The Null revision |
3408.1.5
by Martin Pool
Coding standard: repr methods |
779 |
================= |
2598.5.9
by Aaron Bentley
Update NEWS and HACKING |
780 |
|
781 |
The null revision is the ancestor of all revisions. Its revno is 0, its |
|
782 |
revision-id is ``null:``, and its tree is the empty tree. When referring |
|
783 |
to the null revision, please use ``bzrlib.revision.NULL_REVISION``. Old |
|
784 |
code sometimes uses ``None`` for the null revision, but this practice is |
|
785 |
being phased out. |
|
786 |
||
787 |
||
3408.1.5
by Martin Pool
Coding standard: repr methods |
788 |
Object string representations |
789 |
============================= |
|
790 |
||
791 |
Python prints objects using their ``__repr__`` method when they are |
|
792 |
written to logs, exception tracebacks, or the debugger. We want |
|
793 |
objects to have useful representations to help in determining what went |
|
794 |
wrong. |
|
795 |
||
796 |
If you add a new class you should generally add a ``__repr__`` method |
|
797 |
unless there is an adequate method in a parent class. There should be a |
|
798 |
test for the repr. |
|
799 |
||
800 |
Representations should typically look like Python constructor syntax, but |
|
801 |
they don't need to include every value in the object and they don't need |
|
802 |
to be able to actually execute. They're to be read by humans, not |
|
803 |
machines. Don't hardcode the classname in the format, so that we get the |
|
804 |
correct value if the method is inherited by a subclass. If you're |
|
805 |
printing attributes of the object, including strings, you should normally |
|
806 |
use ``%r`` syntax (to call their repr in turn). |
|
807 |
||
3408.1.10
by Martin Pool
Review feedback |
808 |
Try to avoid the representation becoming more than one or two lines long. |
809 |
(But balance this against including useful information, and simplicity of |
|
810 |
implementation.) |
|
811 |
||
3408.1.5
by Martin Pool
Coding standard: repr methods |
812 |
Because repr methods are often called when something has already gone |
3464.3.10
by Martin Pool
Remove example of catching all exceptions from __repr__ in HACKING |
813 |
wrong, they should be written somewhat more defensively than most code. |
814 |
The object may be half-initialized or in some other way in an illegal |
|
815 |
state. The repr method shouldn't raise an exception, or it may hide the |
|
816 |
(probably more useful) underlying exception. |
|
3408.1.5
by Martin Pool
Coding standard: repr methods |
817 |
|
818 |
Example:: |
|
819 |
||
820 |
def __repr__(self): |
|
3464.3.10
by Martin Pool
Remove example of catching all exceptions from __repr__ in HACKING |
821 |
return '%s(%r)' % (self.__class__.__name__, |
822 |
self._transport) |
|
3408.1.5
by Martin Pool
Coding standard: repr methods |
823 |
|
824 |
||
3464.3.11
by Martin Pool
Add developer advice against bare except: |
825 |
Exception handling |
826 |
================== |
|
827 |
||
828 |
A bare ``except`` statement will catch all exceptions, including ones that |
|
829 |
really should terminate the program such as ``MemoryError`` and |
|
830 |
``KeyboardInterrupt``. They should rarely be used unless the exception is |
|
831 |
later re-raised. Even then, think about whether catching just |
|
832 |
``Exception`` (which excludes system errors in Python2.5 and later) would |
|
833 |
be better. |
|
834 |
||
835 |
||
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
836 |
Test coverage |
837 |
============= |
|
838 |
||
4634.39.36
by Ian Clatworthy
Get plain-style documentation generation working again |
839 |
All code should be exercised by the test suite. See the `Bazaar Testing |
840 |
Guide <http://doc.bazaar-vcs.org/developers/testing.html>`_ for detailed |
|
841 |
information about writing tests. |
|
3619.3.1
by Andrew Bennetts
Move the notes on writing tests out of HACKING into a new file, and improve |
842 |
|
3464.3.11
by Martin Pool
Add developer advice against bare except: |
843 |
|
3408.1.7
by Martin Pool
Move coding standards to be a top-level section in the developer guide |
844 |
Core Topics |
845 |
########### |
|
846 |
||
847 |
Evolving Interfaces |
|
848 |
=================== |
|
849 |
||
850 |
We have a commitment to 6 months API stability - any supported symbol in a |
|
851 |
release of bzr MUST NOT be altered in any way that would result in |
|
852 |
breaking existing code that uses it. That means that method names, |
|
853 |
parameter ordering, parameter names, variable and attribute names etc must |
|
854 |
not be changed without leaving a 'deprecated forwarder' behind. This even |
|
855 |
applies to modules and classes. |
|
856 |
||
857 |
If you wish to change the behaviour of a supported API in an incompatible |
|
858 |
way, you need to change its name as well. For instance, if I add an optional keyword |
|
859 |
parameter to branch.commit - that's fine. On the other hand, if I add a |
|
860 |
keyword parameter to branch.commit which is a *required* transaction |
|
861 |
object, I should rename the API - i.e. to 'branch.commit_transaction'. |
|
862 |
||
863 |
When renaming such supported API's, be sure to leave a deprecated_method (or |
|
864 |
_function or ...) behind which forwards to the new API. See the |
|
865 |
bzrlib.symbol_versioning module for decorators that take care of the |
|
866 |
details for you - such as updating the docstring, and issuing a warning |
|
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
867 |
when the old API is used. |
3408.1.7
by Martin Pool
Move coding standards to be a top-level section in the developer guide |
868 |
|
869 |
For unsupported API's, it does not hurt to follow this discipline, but it's |
|
870 |
not required. Minimally though, please try to rename things so that |
|
871 |
callers will at least get an AttributeError rather than weird results. |
|
872 |
||
873 |
||
874 |
Deprecation decorators |
|
875 |
---------------------- |
|
876 |
||
877 |
``bzrlib.symbol_versioning`` provides decorators that can be attached to |
|
878 |
methods, functions, and other interfaces to indicate that they should no |
|
3408.1.9
by Martin Pool
Use new-style deprecated_in |
879 |
longer be used. For example:: |
880 |
||
881 |
@deprecated_method(deprecated_in((0, 1, 4))) |
|
882 |
def foo(self): |
|
883 |
return self._new_foo() |
|
3408.1.7
by Martin Pool
Move coding standards to be a top-level section in the developer guide |
884 |
|
885 |
To deprecate a static method you must call ``deprecated_function`` |
|
886 |
(**not** method), after the staticmethod call:: |
|
887 |
||
888 |
@staticmethod |
|
3408.1.9
by Martin Pool
Use new-style deprecated_in |
889 |
@deprecated_function(deprecated_in((0, 1, 4))) |
3408.1.7
by Martin Pool
Move coding standards to be a top-level section in the developer guide |
890 |
def create_repository(base, shared=False, format=None): |
891 |
||
892 |
When you deprecate an API, you should not just delete its tests, because |
|
893 |
then we might introduce bugs in them. If the API is still present at all, |
|
894 |
it should still work. The basic approach is to use |
|
895 |
``TestCase.applyDeprecated`` which in one step checks that the API gives |
|
896 |
the expected deprecation message, and also returns the real result from |
|
897 |
the method, so that tests can keep running. |
|
898 |
||
3427.5.9
by John Arbash Meinel
merge bzr.dev, move update to new location in HACKING |
899 |
Deprecation warnings will be suppressed for final releases, but not for |
900 |
development versions or release candidates, or when running ``bzr |
|
901 |
selftest``. This gives developers information about whether their code is |
|
902 |
using deprecated functions, but avoids confusing users about things they |
|
903 |
can't fix. |
|
904 |
||
3408.1.7
by Martin Pool
Move coding standards to be a top-level section in the developer guide |
905 |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
906 |
Getting Input |
907 |
============= |
|
908 |
||
909 |
Processing Command Lines |
|
910 |
------------------------ |
|
911 |
||
912 |
bzrlib has a standard framework for parsing command lines and calling |
|
913 |
processing routines associated with various commands. See builtins.py |
|
2466.6.2
by Ian Clatworthy
Incorporate feedback from LarstiQ |
914 |
for numerous examples. |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
915 |
|
916 |
||
917 |
Standard Parameter Types |
|
918 |
------------------------ |
|
919 |
||
920 |
There are some common requirements in the library: some parameters need to be |
|
921 |
unicode safe, some need byte strings, and so on. At the moment we have |
|
922 |
only codified one specific pattern: Parameters that need to be unicode |
|
923 |
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the |
|
924 |
input into unicode in a consistent fashion, allowing trivial strings to be |
|
925 |
used for programmer convenience, but not performing unpredictably in the |
|
926 |
presence of different locales. |
|
927 |
||
928 |
||
929 |
Writing Output |
|
1098
by Martin Pool
- notes on how output is written |
930 |
============== |
931 |
||
932 |
(The strategy described here is what we want to get to, but it's not |
|
933 |
consistently followed in the code at the moment.) |
|
934 |
||
935 |
bzrlib is intended to be a generically reusable library. It shouldn't |
|
936 |
write messages to stdout or stderr, because some programs that use it |
|
937 |
might want to display that information through a GUI or some other |
|
938 |
mechanism. |
|
939 |
||
940 |
We can distinguish two types of output from the library: |
|
941 |
||
942 |
1. Structured data representing the progress or result of an |
|
943 |
operation. For example, for a commit command this will be a list |
|
944 |
of the modified files and the finally committed revision number |
|
945 |
and id. |
|
946 |
||
947 |
These should be exposed either through the return code or by calls |
|
948 |
to a callback parameter. |
|
949 |
||
950 |
A special case of this is progress indicators for long-lived |
|
951 |
operations, where the caller should pass a ProgressBar object. |
|
952 |
||
953 |
2. Unstructured log/debug messages, mostly for the benefit of the |
|
954 |
developers or users trying to debug problems. This should always |
|
955 |
be sent through ``bzrlib.trace`` and Python ``logging``, so that |
|
956 |
it can be redirected by the client. |
|
957 |
||
958 |
The distinction between the two is a bit subjective, but in general if |
|
959 |
there is any chance that a library would want to see something as |
|
960 |
structured data, we should make it so. |
|
961 |
||
962 |
The policy about how output is presented in the text-mode client |
|
963 |
should be only in the command-line tool. |
|
1092.1.22
by Robert Collins
update hacking with some test foo |
964 |
|
1418
by Robert Collins
merge martins latest |
965 |
|
4110.2.20
by Martin Pool
Developer docs of progress bars |
966 |
Progress and Activity Indications |
967 |
--------------------------------- |
|
968 |
||
969 |
bzrlib has a way for code to display to the user that stuff is happening |
|
970 |
during a long operation. There are two particular types: *activity* which |
|
971 |
means that IO is happening on a Transport, and *progress* which means that |
|
972 |
higher-level application work is occurring. Both are drawn together by |
|
973 |
the `ui_factory`. |
|
974 |
||
975 |
Transport objects are responsible for calling `report_transport_activity` |
|
976 |
when they do IO. |
|
977 |
||
978 |
Progress uses a model/view pattern: application code acts on a |
|
979 |
`ProgressTask` object, which notifies the UI when it needs to be |
|
980 |
displayed. Progress tasks form a stack. To create a new progress task on |
|
981 |
top of the stack, call `bzrlib.ui.ui_factory.nested_progress_bar()`, then |
|
982 |
call `update()` on the returned ProgressTask. It can be updated with just |
|
983 |
a text description, with a numeric count, or with a numeric count and |
|
984 |
expected total count. If an expected total count is provided the view |
|
985 |
can show the progress moving along towards the expected total. |
|
986 |
||
987 |
The user should call `finish` on the `ProgressTask` when the logical |
|
988 |
operation has finished, so it can be removed from the stack. |
|
989 |
||
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
990 |
Progress tasks have a complex relationship with generators: it's a very |
4110.2.20
by Martin Pool
Developer docs of progress bars |
991 |
good place to use them, but because python2.4 does not allow ``finally`` |
992 |
blocks in generators it's hard to clean them up properly. In this case |
|
993 |
it's probably better to have the code calling the generator allocate a |
|
994 |
progress task for its use and then call `finalize` when it's done, which |
|
995 |
will close it if it was not already closed. The generator should also |
|
996 |
finish the progress task when it exits, because it may otherwise be a long |
|
997 |
time until the finally block runs. |
|
998 |
||
2598.1.1
by Martin Pool
Add test for and documentation of option style, fix up existing options to comply |
999 |
|
1000 |
Displaying help |
|
1001 |
=============== |
|
1002 |
||
1003 |
Bazaar has online help for various topics through ``bzr help COMMAND`` or |
|
1004 |
equivalently ``bzr command -h``. We also have help on command options, |
|
1005 |
and on other help topics. (See ``help_topics.py``.) |
|
1006 |
||
1007 |
As for python docstrings, the first paragraph should be a single-sentence |
|
1008 |
synopsis of the command. |
|
1009 |
||
1010 |
The help for options should be one or more proper sentences, starting with |
|
1011 |
a capital letter and finishing with a full stop (period). |
|
1012 |
||
1013 |
All help messages and documentation should have two spaces between |
|
1014 |
sentences. |
|
1015 |
||
1016 |
||
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1017 |
Handling Errors and Exceptions |
1018 |
============================== |
|
1019 |
||
1020 |
Commands should return non-zero when they encounter circumstances that |
|
1021 |
the user should really pay attention to - which includes trivial shell |
|
1022 |
pipelines. |
|
1023 |
||
1024 |
Recommended values are: |
|
1025 |
||
1026 |
0. OK. |
|
1027 |
1. Conflicts in merge-like operations, or changes are present in |
|
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
1028 |
diff-like operations. |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1029 |
2. Unrepresentable diff changes (i.e. binary files that we cannot show |
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
1030 |
a diff of). |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1031 |
3. An error or exception has occurred. |
2713.2.2
by Martin Pool
Add mention of exitcode 4 for internal errors |
1032 |
4. An internal error occurred (one that shows a traceback.) |
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1033 |
|
1034 |
Errors are handled through Python exceptions. Exceptions should be defined |
|
1035 |
inside bzrlib.errors, so that we can see the whole tree at a glance. |
|
1036 |
||
1037 |
We broadly classify errors as either being either internal or not, |
|
3882.4.2
by Martin Pool
Tweak documentation of exception classes |
1038 |
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 |
1039 |
fault, we show a backtrace, an invitation to report the bug, and possibly |
1040 |
other details. This is the default for errors that aren't specifically |
|
1041 |
recognized as being caused by a user error. Otherwise we show a briefer |
|
1042 |
message, unless -Derror was given. |
|
1043 |
||
1044 |
Many errors originate as "environmental errors" which are raised by Python |
|
1045 |
or builtin libraries -- for example IOError. These are treated as being |
|
1046 |
our fault, unless they're caught in a particular tight scope where we know |
|
1047 |
that they indicate a user errors. For example if the repository format |
|
1048 |
is not found, the user probably gave the wrong path or URL. But if one of |
|
1049 |
the files inside the repository is not found, then it's our fault -- |
|
1050 |
either there's a bug in bzr, or something complicated has gone wrong in |
|
1051 |
the environment that means one internal file was deleted. |
|
1052 |
||
1053 |
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors |
|
1054 |
to be added near the place where they are used. |
|
1055 |
||
1056 |
Exceptions are formatted for the user by conversion to a string |
|
1057 |
(eventually calling their ``__str__`` method.) As a convenience the |
|
1058 |
``._fmt`` member can be used as a template which will be mapped to the |
|
1059 |
error's instance dict. |
|
1060 |
||
1061 |
New exception classes should be defined when callers might want to catch |
|
1062 |
that exception specifically, or when it needs a substantially different |
|
1063 |
format string. |
|
1064 |
||
3882.4.1
by Martin Pool
Developer documentation about when to add new exception classes |
1065 |
#. If it is something that a caller can recover from, a custom exception |
1066 |
is reasonable. |
|
1067 |
||
1068 |
#. If it is a data consistency issue, using a builtin like |
|
1069 |
``ValueError``/``TypeError`` is reasonable. |
|
1070 |
||
1071 |
#. If it is a programmer error (using an api incorrectly) |
|
1072 |
``AssertionError`` is reasonable. |
|
1073 |
||
3882.4.2
by Martin Pool
Tweak documentation of exception classes |
1074 |
#. Otherwise, use ``BzrError`` or ``InternalBzrError``. |
3882.4.1
by Martin Pool
Developer documentation about when to add new exception classes |
1075 |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1076 |
Exception strings should start with a capital letter and should not have a |
1077 |
final fullstop. If long, they may contain newlines to break the text. |
|
1078 |
||
1079 |
||
3376.2.3
by Martin Pool
Updated info about assertions |
1080 |
Assertions |
3408.1.8
by Martin Pool
merge trunk |
1081 |
========== |
3376.2.3
by Martin Pool
Updated info about assertions |
1082 |
|
1083 |
Do not use the Python ``assert`` statement, either in tests or elsewhere. |
|
1084 |
A source test checks that it is not used. It is ok to explicitly raise |
|
1085 |
AssertionError. |
|
1086 |
||
1087 |
Rationale: |
|
1088 |
||
1089 |
* It makes the behaviour vary depending on whether bzr is run with -O |
|
1090 |
or not, therefore giving a chance for bugs that occur in one case or |
|
1091 |
the other, several of which have already occurred: assertions with |
|
1092 |
side effects, code which can't continue unless the assertion passes, |
|
1093 |
cases where we should give the user a proper message rather than an |
|
1094 |
assertion failure. |
|
1095 |
* It's not that much shorter than an explicit if/raise. |
|
1096 |
* It tends to lead to fuzzy thinking about whether the check is |
|
1097 |
actually needed or not, and whether it's an internal error or not |
|
1098 |
* It tends to cause look-before-you-leap patterns. |
|
1099 |
* It's unsafe if the check is needed to protect the integrity of the |
|
1100 |
user's data. |
|
1101 |
* It tends to give poor messages since the developer can get by with |
|
1102 |
no explanatory text at all. |
|
1103 |
* We can't rely on people always running with -O in normal use, so we |
|
1104 |
can't use it for tests that are actually expensive. |
|
1105 |
* Expensive checks that help developers are better turned on from the |
|
1106 |
test suite or a -D flag. |
|
1107 |
* If used instead of ``self.assert*()`` in tests it makes them falsely pass with -O. |
|
1108 |
||
1109 |
||
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1110 |
Documenting Changes |
1111 |
=================== |
|
1112 |
||
1113 |
When you change bzrlib, please update the relevant documentation for the |
|
1114 |
change you made: Changes to commands should update their help, and |
|
1115 |
possibly end user tutorials; changes to the core library should be |
|
1116 |
reflected in API documentation. |
|
1117 |
||
1118 |
NEWS File |
|
1119 |
--------- |
|
1120 |
||
1121 |
If you make a user-visible change, please add a note to the NEWS file. |
|
1122 |
The description should be written to make sense to someone who's just |
|
1123 |
a user of bzr, not a developer: new functions or classes shouldn't be |
|
1124 |
mentioned, but new commands, changes in behaviour or fixed nontrivial |
|
1125 |
bugs should be listed. See the existing entries for an idea of what |
|
1126 |
should be done. |
|
1127 |
||
1128 |
Within each release, entries in the news file should have the most |
|
1129 |
user-visible changes first. So the order should be approximately: |
|
1130 |
||
1131 |
* changes to existing behaviour - the highest priority because the |
|
1132 |
user's existing knowledge is incorrect |
|
1133 |
* new features - should be brought to their attention |
|
1134 |
* bug fixes - may be of interest if the bug was affecting them, and |
|
1135 |
should include the bug number if any |
|
1136 |
* major documentation changes |
|
1137 |
* changes to internal interfaces |
|
1138 |
||
1139 |
People who made significant contributions to each change are listed in |
|
1140 |
parenthesis. This can include reporting bugs (particularly with good |
|
1141 |
details or reproduction recipes), submitting patches, etc. |
|
1142 |
||
1143 |
Commands |
|
1144 |
-------- |
|
1145 |
||
1146 |
The docstring of a command is used by ``bzr help`` to generate help output |
|
1147 |
for the command. The list 'takes_options' attribute on a command is used by |
|
1148 |
``bzr help`` to document the options for the command - the command |
|
1149 |
docstring does not need to document them. Finally, the '_see_also' |
|
1150 |
attribute on a command can be used to reference other related help topics. |
|
1151 |
||
1152 |
API Documentation |
|
1153 |
----------------- |
|
1154 |
||
1155 |
Functions, methods, classes and modules should have docstrings |
|
1156 |
describing how they are used. |
|
1157 |
||
1158 |
The first line of the docstring should be a self-contained sentence. |
|
1159 |
||
1160 |
For the special case of Command classes, this acts as the user-visible |
|
1161 |
documentation shown by the help command. |
|
1162 |
||
1163 |
The docstrings should be formatted as reStructuredText_ (like this |
|
1164 |
document), suitable for processing using the epydoc_ tool into HTML |
|
1165 |
documentation. |
|
1166 |
||
1167 |
.. _reStructuredText: http://docutils.sourceforge.net/rst.html |
|
1168 |
.. _epydoc: http://epydoc.sourceforge.net/ |
|
1169 |
||
1170 |
||
1171 |
General Guidelines |
|
1172 |
================== |
|
1173 |
||
1174 |
Copyright |
|
1175 |
--------- |
|
1176 |
||
1177 |
The copyright policy for bzr was recently made clear in this email (edited |
|
1178 |
for grammatical correctness):: |
|
1179 |
||
1180 |
The attached patch cleans up the copyright and license statements in |
|
1181 |
the bzr source. It also adds tests to help us remember to add them |
|
1182 |
with the correct text. |
|
1183 |
||
1184 |
We had the problem that lots of our files were "Copyright Canonical |
|
1185 |
Development Ltd" which is not a real company, and some other variations |
|
1186 |
on this theme. Also, some files were missing the GPL statements. |
|
1187 |
||
1188 |
I want to be clear about the intent of this patch, since copyright can |
|
1189 |
be a little controversial. |
|
1190 |
||
1191 |
1) The big motivation for this is not to shut out the community, but |
|
1192 |
just to clean up all of the invalid copyright statements. |
|
1193 |
||
1194 |
2) It has been the general policy for bzr that we want a single |
|
1195 |
copyright holder for all of the core code. This is following the model |
|
1196 |
set by the FSF, which makes it easier to update the code to a new |
|
1197 |
license in case problems are encountered. (For example, if we want to |
|
1198 |
upgrade the project universally to GPL v3 it is much simpler if there is |
|
1199 |
a single copyright holder). It also makes it clearer if copyright is |
|
1200 |
ever debated, there is a single holder, which makes it easier to defend |
|
1201 |
in court, etc. (I think the FSF position is that if you assign them |
|
1202 |
copyright, they can defend it in court rather than you needing to, and |
|
1203 |
I'm sure Canonical would do the same). |
|
1204 |
As such, Canonical has requested copyright assignments from all of the |
|
1205 |
major contributers. |
|
1206 |
||
1207 |
3) If someone wants to add code and not attribute it to Canonical, there |
|
1208 |
is a specific list of files that are excluded from this check. And the |
|
1209 |
test failure indicates where that is, and how to update it. |
|
1210 |
||
1211 |
4) If anyone feels that I changed a copyright statement incorrectly, just |
|
1212 |
let me know, and I'll be happy to correct it. Whenever you have large |
|
1213 |
mechanical changes like this, it is possible to make some mistakes. |
|
1214 |
||
1215 |
Just to reiterate, this is a community project, and it is meant to stay |
|
1216 |
that way. Core bzr code is copyright Canonical for legal reasons, and |
|
1217 |
the tests are just there to help us maintain that. |
|
1218 |
||
1219 |
||
1220 |
Miscellaneous Topics |
|
1221 |
#################### |
|
1222 |
||
1223 |
Debugging |
|
1224 |
========= |
|
1225 |
||
1226 |
Bazaar has a few facilities to help debug problems by going into pdb_, the |
|
1227 |
Python debugger. |
|
1228 |
||
1229 |
.. _pdb: http://docs.python.org/lib/debugger-commands.html |
|
1230 |
||
1231 |
If the ``BZR_PDB`` environment variable is set |
|
1232 |
then bzr will go into pdb post-mortem mode when an unhandled exception |
|
1233 |
occurs. |
|
1234 |
||
4578.1.3
by John Arbash Meinel
NEWS and HACKING entries. |
1235 |
If you send a SIGQUIT or SIGBREAK signal to bzr then it will drop into the |
1236 |
debugger immediately. SIGQUIT can be generated by pressing Ctrl-\\ on |
|
1237 |
Unix. SIGBREAK is generated with Ctrl-Pause on Windows (some laptops have |
|
1238 |
this as Fn-Pause). You can continue execution by typing ``c``. This can |
|
1239 |
be disabled if necessary by setting the environment variable |
|
1240 |
``BZR_SIGQUIT_PDB=0``. |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1241 |
|
1242 |
||
3959.1.2
by Martin Pool
Brief developer docs about debug flags |
1243 |
Debug Flags |
1244 |
=========== |
|
1245 |
||
1246 |
Bazaar accepts some global options starting with ``-D`` such as |
|
1247 |
``-Dhpss``. These set a value in `bzrlib.debug.debug_flags`, and |
|
1248 |
typically cause more information to be written to the trace file. Most |
|
1249 |
`mutter` calls should be guarded by a check of those flags so that we |
|
1250 |
don't write out too much information if it's not needed. |
|
1251 |
||
1252 |
Debug flags may have effects other than just emitting trace messages. |
|
1253 |
||
1254 |
Run ``bzr help global-options`` to see them all. |
|
1255 |
||
4070.8.2
by Martin Pool
Initial support for debug_flags config option |
1256 |
These flags may also be set as a comma-separated list in the |
1257 |
``debug_flags`` option in e.g. ``~/.bazaar/bazaar.conf``. (Note that it |
|
1258 |
must be in this global file, not in the branch or location configuration, |
|
1259 |
because it's currently only loaded at startup time.) For instance you may |
|
1260 |
want to always record hpss traces and to see full error tracebacks:: |
|
1261 |
||
1262 |
debug_flags = hpss, error |
|
1263 |
||
3959.1.2
by Martin Pool
Brief developer docs about debug flags |
1264 |
|
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1265 |
Jargon |
1266 |
====== |
|
1267 |
||
1268 |
revno |
|
1269 |
Integer identifier for a revision on the main line of a branch. |
|
1270 |
Revision 0 is always the null revision; others are 1-based |
|
1271 |
indexes into the branch's revision history. |
|
1272 |
||
1273 |
||
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1274 |
Unicode and Encoding Support |
1275 |
============================ |
|
1276 |
||
1277 |
This section discusses various techniques that Bazaar uses to handle |
|
1278 |
characters that are outside the ASCII set. |
|
1279 |
||
1280 |
``Command.outf`` |
|
1281 |
---------------- |
|
1282 |
||
1283 |
When a ``Command`` object is created, it is given a member variable |
|
1284 |
accessible by ``self.outf``. This is a file-like object, which is bound to |
|
1285 |
``sys.stdout``, and should be used to write information to the screen, |
|
1286 |
rather than directly writing to ``sys.stdout`` or calling ``print``. |
|
1287 |
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 |
1288 |
representation, based on the console encoding. Also, the class attribute |
1289 |
``encoding_type`` will effect how unprintable characters will be |
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1290 |
handled. This parameter can take one of 3 values: |
1291 |
||
1292 |
replace |
|
1711.2.96
by John Arbash Meinel
cleanup from suggestions by Robert and Martin |
1293 |
Unprintable characters will be represented with a suitable replacement |
1294 |
marker (typically '?'), and no exception will be raised. This is for |
|
1295 |
any command which generates text for the user to review, rather than |
|
1296 |
for automated processing. |
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1297 |
For example: ``bzr log`` should not fail if one of the entries has text |
1298 |
that cannot be displayed. |
|
1299 |
||
1300 |
strict |
|
2063.3.1
by wang
fix typos |
1301 |
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. |
1302 |
This is for commands that are intended more as scripting support, rather |
1303 |
than plain user review. |
|
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
1304 |
For example: ``bzr ls`` is designed to be used with shell scripting. One |
1305 |
use would be ``bzr ls --null --unknowns | xargs -0 rm``. If ``bzr`` |
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
1306 |
printed a filename with a '?', the wrong file could be deleted. (At the |
1307 |
very least, the correct file would not be deleted). An error is used to |
|
1308 |
indicate that the requested action could not be performed. |
|
1309 |
||
1310 |
exact |
|
1311 |
Do not attempt to automatically convert Unicode strings. This is used |
|
1312 |
for commands that must handle conversion themselves. |
|
1313 |
For example: ``bzr diff`` needs to translate Unicode paths, but should |
|
1314 |
not change the exact text of the contents of the files. |
|
1315 |
||
1316 |
||
1317 |
``bzrlib.urlutils.unescape_for_display`` |
|
1318 |
---------------------------------------- |
|
1319 |
||
1320 |
Because Transports work in URLs (as defined earlier), printing the raw URL |
|
1321 |
to the user is usually less than optimal. Characters outside the standard |
|
1322 |
set are printed as escapes, rather than the real character, and local |
|
1323 |
paths would be printed as ``file://`` urls. The function |
|
1324 |
``unescape_for_display`` attempts to unescape a URL, such that anything |
|
1325 |
that cannot be printed in the current encoding stays an escaped URL, but |
|
1326 |
valid characters are generated where possible. |
|
1327 |
||
1328 |
||
2405.2.2
by Andrew Bennetts
Add a brief section on portability to HACKING. |
1329 |
Portability Tips |
1330 |
================ |
|
1331 |
||
1332 |
The ``bzrlib.osutils`` module has many useful helper functions, including |
|
1333 |
some more portable variants of functions in the standard library. |
|
1334 |
||
1335 |
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it |
|
1336 |
to fail on Windows if some files are readonly or still open elsewhere. |
|
1337 |
Use ``bzrlib.osutils.rmtree`` instead. |
|
1338 |
||
1339 |
||
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1340 |
C Extension Modules |
1341 |
=================== |
|
1342 |
||
1343 |
We write some extensions in C using pyrex. We design these to work in |
|
1344 |
three scenarios: |
|
2449.1.1
by Alexander Belchenko
fix RSTX wrong formatting in HACKING |
1345 |
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1346 |
* User with no C compiler |
1347 |
* User with C compiler |
|
1348 |
* Developers |
|
1349 |
||
1350 |
The recommended way to install bzr is to have a C compiler so that the |
|
1351 |
extensions can be built, but if no C compiler is present, the pure python |
|
1352 |
versions we supply will work, though more slowly. |
|
1353 |
||
1354 |
For developers we recommend that pyrex be installed, so that the C |
|
1355 |
extensions can be changed if needed. |
|
1356 |
||
1357 |
For the C extensions, the extension module should always match the |
|
1358 |
original python one in all respects (modulo speed). This should be |
|
1359 |
maintained over time. |
|
1360 |
||
1361 |
To create an extension, add rules to setup.py for building it with pyrex, |
|
1362 |
and with distutils. Now start with an empty .pyx file. At the top add |
|
1363 |
"include 'yourmodule.py'". This will import the contents of foo.py into this |
|
1364 |
file at build time - remember that only one module will be loaded at |
|
1365 |
runtime. Now you can subclass classes, or replace functions, and only your |
|
1366 |
changes need to be present in the .pyx file. |
|
1367 |
||
1368 |
Note that pyrex does not support all 2.4 programming idioms, so some |
|
1369 |
syntax changes may be required. I.e. |
|
2449.1.1
by Alexander Belchenko
fix RSTX wrong formatting in HACKING |
1370 |
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1371 |
- 'from foo import (bar, gam)' needs to change to not use the brackets. |
1372 |
- '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 |
1373 |
|
1739.1.2
by Robert Collins
More pyrex finesse, documentation. |
1374 |
If the changes are too dramatic, consider |
1375 |
maintaining the python code twice - once in the .pyx, and once in the .py, |
|
1376 |
and no longer including the .py file. |
|
1377 |
||
2466.6.1
by Ian Clatworthy
Expand HACKING into Bazaar Developer Guide |
1378 |
|
1379 |
Making Installers for OS Windows |
|
1861.2.19
by Alexander Belchenko
HACKING: mention where to get instructions for building windows installers |
1380 |
================================ |
1861.2.20
by Alexander Belchenko
English |
1381 |
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 |
1382 |
http://bazaar-vcs.org/BzrWin32Installer |
1383 |
||
1384 |
||
2797.1.1
by Ian Clatworthy
Merge Core Developer Hanbook into HACKING |
1385 |
Core Developer Tasks |
1386 |
#################### |
|
1387 |
||
1388 |
Overview |
|
1389 |
======== |
|
1390 |
||
1391 |
What is a Core Developer? |
|
1392 |
------------------------- |
|
1393 |
||
1394 |
While everyone in the Bazaar community is welcome and encouraged to |
|
1395 |
propose and submit changes, a smaller team is reponsible for pulling those |
|
1396 |
changes together into a cohesive whole. In addition to the general developer |
|
1397 |
stuff covered above, "core" developers have responsibility for: |
|
1398 |
||
1399 |
* reviewing changes |
|
1400 |
* reviewing blueprints |
|
1401 |
* planning releases |
|
4634.39.36
by Ian Clatworthy
Get plain-style documentation generation working again |
1402 |
* managing releases (see `Releasing Bazaar <http://doc.bazaar-vcs.org/developers/releasing.html>`_) |
2797.1.1
by Ian Clatworthy
Merge Core Developer Hanbook into HACKING |
1403 |
|
1404 |
.. note:: |
|
1405 |
Removing barriers to community participation is a key reason for adopting |
|
1406 |
distributed VCS technology. While DVCS removes many technical barriers, |
|
1407 |
a small number of social barriers are often necessary instead. |
|
1408 |
By documenting how the above things are done, we hope to |
|
1409 |
encourage more people to participate in these activities, keeping the |
|
1410 |
differences between core and non-core contributors to a minimum. |
|
1411 |
||
1412 |
||
1413 |
Communicating and Coordinating |
|
1414 |
------------------------------ |
|
1415 |
||
1416 |
While it has many advantages, one of the challenges of distributed |
|
1417 |
development is keeping everyone else aware of what you're working on. |
|
1418 |
There are numerous ways to do this: |
|
1419 |
||
1420 |
#. Assign bugs to yourself in Launchpad |
|
1421 |
#. Mention it on the mailing list |
|
1422 |
#. Mention it on IRC |
|
1423 |
||
1424 |
As well as the email notifcations that occur when merge requests are sent |
|
1425 |
and reviewed, you can keep others informed of where you're spending your |
|
1426 |
energy by emailing the **bazaar-commits** list implicitly. To do this, |
|
1427 |
install and configure the Email plugin. One way to do this is add these |
|
1428 |
configuration settings to your central configuration file (e.g. |
|
1429 |
``~/.bazaar/bazaar.conf`` on Linux):: |
|
1430 |
||
1431 |
[DEFAULT] |
|
1432 |
email = Joe Smith <joe.smith@internode.on.net> |
|
1433 |
smtp_server = mail.internode.on.net:25 |
|
1434 |
||
1435 |
Then add these lines for the relevant branches in ``locations.conf``:: |
|
1436 |
||
1437 |
post_commit_to = bazaar-commits@lists.canonical.com |
|
1438 |
post_commit_mailer = smtplib |
|
1439 |
||
1440 |
While attending a sprint, RobertCollins' Dbus plugin is useful for the |
|
1441 |
same reason. See the documentation within the plugin for information on |
|
1442 |
how to set it up and configure it. |
|
1443 |
||
1444 |
||
1445 |
Submitting Changes |
|
1446 |
================== |
|
1447 |
||
1448 |
An Overview of PQM |
|
1449 |
------------------ |
|
1450 |
||
1451 |
Of the many workflows supported by Bazaar, the one adopted for Bazaar |
|
1452 |
development itself is known as "Decentralized with automatic gatekeeper". |
|
1453 |
To repeat the explanation of this given on |
|
1454 |
http://bazaar-vcs.org/Workflows: |
|
1455 |
||
1456 |
.. pull-quote:: |
|
1457 |
In this workflow, each developer has their own branch or |
|
1458 |
branches, plus read-only access to the mainline. A software gatekeeper |
|
1459 |
(e.g. PQM) has commit rights to the main branch. When a developer wants |
|
1460 |
their work merged, they request the gatekeeper to merge it. The gatekeeper |
|
1461 |
does a merge, a compile, and runs the test suite. If the code passes, it |
|
1462 |
is merged into the mainline. |
|
1463 |
||
1464 |
In a nutshell, here's the overall submission process: |
|
1465 |
||
1466 |
#. get your work ready (including review except for trivial changes) |
|
1467 |
#. push to a public location |
|
1468 |
#. ask PQM to merge from that location |
|
1469 |
||
1470 |
.. note:: |
|
1471 |
At present, PQM always takes the changes to merge from a branch |
|
1472 |
at a URL that can be read by it. For Bazaar, that means a public, |
|
1473 |
typically http, URL. |
|
1474 |
||
1475 |
As a result, the following things are needed to use PQM for submissions: |
|
1476 |
||
1477 |
#. A publicly available web server |
|
1478 |
#. Your OpenPGP key registered with PQM (contact RobertCollins for this) |
|
1479 |
#. The PQM plugin installed and configured (not strictly required but |
|
1480 |
highly recommended). |
|
1481 |
||
1482 |
||
1483 |
Selecting a Public Branch Location |
|
1484 |
---------------------------------- |
|
1485 |
||
1486 |
If you don't have your own web server running, branches can always be |
|
1487 |
pushed to Launchpad. Here's the process for doing that: |
|
1488 |
||
1489 |
Depending on your location throughout the world and the size of your |
|
1490 |
repository though, it is often quicker to use an alternative public |
|
1491 |
location to Launchpad, particularly if you can set up your own repo and |
|
1492 |
push into that. By using an existing repo, push only needs to send the |
|
1493 |
changes, instead of the complete repository every time. Note that it is |
|
1494 |
easy to register branches in other locations with Launchpad so no benefits |
|
1495 |
are lost by going this way. |
|
1496 |
||
1497 |
.. note:: |
|
1498 |
For Canonical staff, http://people.ubuntu.com/~<user>/ is one |
|
1499 |
suggestion for public http branches. Contact your manager for information |
|
1500 |
on accessing this system if required. |
|
1501 |
||
1502 |
It should also be noted that best practice in this area is subject to |
|
1503 |
change as things evolve. For example, once the Bazaar smart server on |
|
1504 |
Launchpad supports server-side branching, the performance situation will |
|
1505 |
be very different to what it is now (Jun 2007). |
|
1506 |
||
1507 |
||
1508 |
Configuring the PQM Plug-In |
|
1509 |
--------------------------- |
|
1510 |
||
1511 |
While not strictly required, the PQM plugin automates a few things and |
|
1512 |
reduces the chance of error. Before looking at the plugin, it helps to |
|
1513 |
understand a little more how PQM operates. Basically, PQM requires an |
|
1514 |
email indicating what you want it to do. The email typically looks like |
|
1515 |
this:: |
|
1516 |
||
1517 |
star-merge source-branch target-branch |
|
1518 |
||
1519 |
For example:: |
|
1520 |
||
1521 |
star-merge http://bzr.arbash-meinel.com/branches/bzr/jam-integration http://bazaar-vcs.org/bzr/bzr.dev |
|
1522 |
||
1523 |
Note that the command needs to be on one line. The subject of the email |
|
1524 |
will be used for the commit message. The email also needs to be ``gpg`` |
|
1525 |
signed with a key that PQM accepts. |
|
1526 |
||
1527 |
The advantages of using the PQM plugin are: |
|
1528 |
||
1529 |
#. You can use the config policies to make it easy to set up public |
|
1530 |
branches, so you don't have to ever type the full paths you want to merge |
|
1531 |
from or into. |
|
1532 |
||
1533 |
#. It checks to make sure the public branch last revision matches the |
|
1534 |
local last revision so you are submitting what you think you are. |
|
1535 |
||
1536 |
#. It uses the same public_branch and smtp sending settings as bzr-email, |
|
1537 |
so if you have one set up, you have the other mostly set up. |
|
1538 |
||
1539 |
#. Thunderbird refuses to not wrap lines, and request lines are usually |
|
1540 |
pretty long (you have 2 long URLs in there). |
|
1541 |
||
1542 |
Here are sample configuration settings for the PQM plugin. Here are the |
|
1543 |
lines in bazaar.conf:: |
|
1544 |
||
1545 |
[DEFAULT] |
|
1546 |
email = Joe Smith <joe.smith@internode.on.net> |
|
1547 |
smtp_server=mail.internode.on.net:25 |
|
1548 |
||
1549 |
And here are the lines in ``locations.conf`` (or ``branch.conf`` for |
|
1550 |
dirstate-tags branches):: |
|
1551 |
||
1552 |
[/home/joe/bzr/my-integration] |
|
1553 |
push_location = sftp://joe-smith@bazaar.launchpad.net/%7Ejoe-smith/bzr/my-integration/ |
|
1554 |
push_location:policy = norecurse |
|
1555 |
public_branch = http://bazaar.launchpad.net/~joe-smith/bzr/my-integration/ |
|
1556 |
public_branch:policy = appendpath |
|
1557 |
pqm_email = Bazaar PQM <pqm@bazaar-vcs.org> |
|
1558 |
pqm_branch = http://bazaar-vcs.org/bzr/bzr.dev |
|
1559 |
||
1560 |
Note that the push settings will be added by the first ``push`` on |
|
1561 |
a branch. Indeed the preferred way to generate the lines above is to use |
|
1562 |
``push`` with an argument, then copy-and-paste the other lines into |
|
1563 |
the relevant file. |
|
1564 |
||
1565 |
||
1566 |
Submitting a Change |
|
1567 |
------------------- |
|
1568 |
||
1569 |
Here is one possible recipe once the above environment is set up: |
|
1570 |
||
1571 |
#. pull bzr.dev => my-integration |
|
1572 |
#. merge patch => my-integration |
|
1573 |
#. fix up any final merge conflicts (NEWS being the big killer here). |
|
1574 |
#. commit |
|
1575 |
#. push |
|
1576 |
#. pqm-submit |
|
1577 |
||
1578 |
.. note:: |
|
1579 |
The ``push`` step is not required if ``my-integration`` is a checkout of |
|
1580 |
a public branch. |
|
1581 |
||
1582 |
Because of defaults, you can type a single message into commit and |
|
1583 |
pqm-commit will reuse that. |
|
1584 |
||
1585 |
||
1586 |
Tracking Change Acceptance |
|
1587 |
-------------------------- |
|
1588 |
||
1589 |
The web interface to PQM is https://pqm.bazaar-vcs.org/. After submitting |
|
1590 |
a change, you can visit this URL to confirm it was received and placed in |
|
1591 |
PQM's queue. |
|
1592 |
||
1593 |
When PQM completes processing a change, an email is sent to you with the |
|
1594 |
results. |
|
1595 |
||
1596 |
||
1597 |
Reviewing Blueprints |
|
1598 |
==================== |
|
1599 |
||
1600 |
Blueprint Tracking Using Launchpad |
|
1601 |
---------------------------------- |
|
1602 |
||
1603 |
New features typically require a fair amount of discussion, design and |
|
1604 |
debate. For Bazaar, that information is often captured in a so-called |
|
1605 |
"blueprint" on our Wiki. Overall tracking of blueprints and their status |
|
1606 |
is done using Launchpad's relevant tracker, |
|
1607 |
https://blueprints.launchpad.net/bzr/. Once a blueprint for ready for |
|
1608 |
review, please announce it on the mailing list. |
|
1609 |
||
4595.5.2
by Neil Martinsen-Burrell
Include bazaar-vcs.org/BzrGivingBack in HACKING.txt; fix typos in HACKING.txt |
1610 |
Alternatively, send an email beginning with [RFC] with the proposal to the |
2797.1.1
by Ian Clatworthy
Merge Core Developer Hanbook into HACKING |
1611 |
list. In some cases, you may wish to attach proposed code or a proposed |
1612 |
developer document if that best communicates the idea. Debate can then |
|
1613 |
proceed using the normal merge review processes. |
|
1614 |
||
1615 |
||
1616 |
Recording Blueprint Review Feedback |
|
1617 |
----------------------------------- |
|
1618 |
||
1619 |
Unlike its Bug Tracker, Launchpad's Blueprint Tracker doesn't currently |
|
1620 |
(Jun 2007) support a chronological list of comment responses. Review |
|
1621 |
feedback can either be recorded on the Wiki hosting the blueprints or by |
|
1622 |
using Launchpad's whiteboard feature. |
|
1623 |
||
1624 |
||
1625 |
Planning Releases |
|
1626 |
================= |
|
1627 |
||
1628 |
||
1629 |
Using Releases and Milestones in Launchpad |
|
1630 |
------------------------------------------ |
|
1631 |
||
1632 |
TODO ... (Exact policies still under discussion) |
|
1633 |
||
1634 |
||
1635 |
Bug Triage |
|
1636 |
---------- |
|
1637 |
||
1638 |
Keeping on top of bugs reported is an important part of ongoing release |
|
1639 |
planning. Everyone in the community is welcome and encouraged to raise |
|
1640 |
bugs, confirm bugs raised by others, and nominate a priority. Practically |
|
1641 |
though, a good percentage of bug triage is often done by the core |
|
1642 |
developers, partially because of their depth of product knowledge. |
|
1643 |
||
1644 |
With respect to bug triage, core developers are encouraged to play an |
|
1645 |
active role with particular attention to the following tasks: |
|
1646 |
||
1647 |
* keeping the number of unconfirmed bugs low |
|
1648 |
* ensuring the priorities are generally right (everything as critical - or |
|
1649 |
medium - is meaningless) |
|
1650 |
* looking out for regressions and turning those around sooner rather than later. |
|
1651 |
||
1652 |
.. note:: |
|
1653 |
As well as prioritizing bugs and nominating them against a |
|
1654 |
target milestone, Launchpad lets core developers offer to mentor others in |
|
3383.2.6
by Martin Pool
doc tone moderation |
1655 |
fixing them. |
3314.1.1
by Martin Pool
Add Developer's Guide text about PPA builds |
1656 |
|
1657 |
||
2475.2.4
by Martin Pool
HACKING rest fixes from jam |
1658 |
.. |
1659 |
vim: ft=rst tw=74 ai |