974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
1 |
============================
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
2 |
Guidelines for modifying bzr |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
3 |
============================
|
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`` |
|
1711.2.96
by John Arbash Meinel
cleanup from suggestions by Robert and Martin |
8 |
in the source tree, or at http://doc.bazaar-vcs.org/current/hacking.html) |
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
9 |
|
10 |
Overall
|
|
11 |
=======
|
|
12 |
||
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
13 |
* New functionality should have test cases. Preferably write the |
14 |
test before writing the code. |
|
15 |
||
16 |
In general, you can test at either the command-line level or the |
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
17 |
internal API level. See Writing Tests below for more detail. |
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
18 |
|
1185.33.48
by Martin Pool
Hacking notes on TDD |
19 |
* Try to practice Test-Driven Development. before fixing a bug, write a |
20 |
test case so that it does not regress. Similarly for adding a new |
|
21 |
feature: write a test case for a small version of the new feature before |
|
22 |
starting on the code itself. Check the test fails on the old code, then |
|
23 |
add the feature or fix and check it passes. |
|
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
24 |
|
25 |
* Exceptions should be defined inside bzrlib.errors, so that we can |
|
26 |
see the whole tree at a glance. |
|
27 |
||
28 |
* Imports should be done at the top-level of the file, unless there is |
|
29 |
a strong reason to have them lazily loaded when a particular |
|
30 |
function runs. Import statements have a cost, so try to make sure |
|
31 |
they don't run inside hot functions. |
|
32 |
||
33 |
* Module names should always be given fully-qualified,
|
|
34 |
i.e. ``bzrlib.hashcache`` not just ``hashcache``.
|
|
35 |
||
1185.33.48
by Martin Pool
Hacking notes on TDD |
36 |
* Commands should return non-zero when they encounter circumstances that
|
1476
by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins) |
37 |
the user should really pay attention to - which includes trivial shell
|
38 |
pipelines.
|
|
39 |
||
1185.34.1
by Jelmer Vernooij
Fix a couple of typo's |
40 |
Recommended values are
|
1711.2.94
by John Arbash Meinel
Update HACKING to be rst compliant |
41 |
0. OK,
|
42 |
1. Conflicts in merge-like operations, or changes are present in
|
|
1476
by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins) |
43 |
diff-like operations.
|
1711.2.94
by John Arbash Meinel
Update HACKING to be rst compliant |
44 |
2. Unrepresentable diff changes (i.e. binary files that we cannot show
|
1476
by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins) |
45 |
a diff of).
|
1711.2.94
by John Arbash Meinel
Update HACKING to be rst compliant |
46 |
3. An error or exception has occurred.
|
1476
by Robert Collins
Merge now has a retcode of 1 when conflicts occur. (Robert Collins) |
47 |
|
1393.1.54
by Martin Pool
- more hacking notes on evolving interfaces |
48 |
Evolving interfaces
|
49 |
-------------------
|
|
50 |
||
1534.2.4
by Robert Collins
Update NEWS and HACKING for the symbol_versioning module. |
51 |
We have a commitment to 6 months API stability - any supported symbol in a
|
52 |
release of bzr MUST NOT be altered in any way that would result in
|
|
53 |
breaking existing code that uses it. That means that method names,
|
|
54 |
parameter ordering, parameter names, variable and attribute names etc must
|
|
55 |
not be changed without leaving a 'deprecated forwarder' behind. This even |
|
56 |
applies to modules and classes.
|
|
57 |
||
58 |
If you wish to change the behaviour of a supported API in an incompatible
|
|
2063.3.1
by wang
fix typos |
59 |
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. |
60 |
parameter to branch.commit - that's fine. On the other hand, if I add a |
61 |
keyword parameter to branch.commit which is a *required* transaction |
|
62 |
object, I should rename the API - i.e. to 'branch.commit_transaction'. |
|
63 |
||
64 |
When renaming such supported API's, be sure to leave a deprecated_method (or |
|
65 |
_function or ...) behind which forwards to the new API. See the
|
|
66 |
bzrlib.symbol_versioning module for decorators that take care of the
|
|
67 |
details for you - such as updating the docstring, and issuing a warning
|
|
68 |
when the old api is used.
|
|
69 |
||
2063.3.1
by wang
fix typos |
70 |
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. |
71 |
not required. Minimally though, please try to rename things so that
|
72 |
callers will at least get an AttributeError rather than weird results.
|
|
73 |
||
1393.1.54
by Martin Pool
- more hacking notes on evolving interfaces |
74 |
|
1534.3.1
by Robert Collins
* bzrlib.osutils.safe_unicode now exists to provide parameter coercion |
75 |
Standard parameter types
|
76 |
------------------------
|
|
77 |
||
78 |
There are some common requirements in the library: some parameters need to be
|
|
79 |
unicode safe, some need byte strings, and so on. At the moment we have
|
|
80 |
only codified one specific pattern: Parameters that need to be unicode
|
|
2052.3.9
by John Arbash Meinel
Add an entry about copyright to HACKING |
81 |
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
|
1534.3.1
by Robert Collins
* bzrlib.osutils.safe_unicode now exists to provide parameter coercion |
82 |
input into unicode in a consistent fashion, allowing trivial strings to be
|
83 |
used for programmer convenience, but not performing unpredictably in the
|
|
84 |
presence of different locales.
|
|
85 |
||
2052.3.9
by John Arbash Meinel
Add an entry about copyright to HACKING |
86 |
|
87 |
Copyright
|
|
88 |
---------
|
|
89 |
||
90 |
The copyright policy for bzr was recently made clear in this email (edited
|
|
91 |
for grammatical correctness)::
|
|
92 |
||
93 |
The attached patch cleans up the copyright and license statements in
|
|
94 |
the bzr source. It also adds tests to help us remember to add them
|
|
95 |
with the correct text.
|
|
96 |
||
97 |
We had the problem that lots of our files were "Copyright Canonical
|
|
98 |
Development Ltd" which is not a real company, and some other variations
|
|
99 |
on this theme. Also, some files were missing the GPL statements.
|
|
100 |
|
|
101 |
I want to be clear about the intent of this patch, since copyright can
|
|
102 |
be a little controversial.
|
|
103 |
|
|
104 |
1) The big motivation for this is not to shut out the community, but
|
|
105 |
just to clean up all of the invalid copyright statements.
|
|
106 |
|
|
107 |
2) It has been the general policy for bzr that we want a single
|
|
108 |
copyright holder for all of the core code. This is following the model
|
|
109 |
set by the FSF, which makes it easier to update the code to a new
|
|
110 |
license in case problems are encountered. (For example, if we want to
|
|
111 |
upgrade the project universally to GPL v3 it is much simpler if there is
|
|
112 |
a single copyright holder). It also makes it clearer if copyright is
|
|
113 |
ever debated, there is a single holder, which makes it easier to defend
|
|
114 |
in court, etc. (I think the FSF position is that if you assign them
|
|
115 |
copyright, they can defend it in court rather than you needing to, and
|
|
116 |
I'm sure Canonical would do the same). |
|
117 |
As such, Canonical has requested copyright assignments from all of the |
|
118 |
major contributers. |
|
119 |
||
120 |
3) If someone wants to add code and not attribute it to Canonical, there |
|
121 |
is a specific list of files that are excluded from this check. And the |
|
122 |
test failure indicates where that is, and how to update it. |
|
123 |
||
124 |
4) If anyone feels that I changed a copyright statement incorrectly, just |
|
125 |
let me know, and I'll be happy to correct it. Whenever you have large |
|
126 |
mechanical changes like this, it is possible to make some mistakes.
|
|
127 |
|
|
128 |
Just to reiterate, this is a community project, and it is meant to stay
|
|
129 |
that way. Core bzr code is copyright Canonical for legal reasons, and
|
|
130 |
the tests are just there to help us maintain that.
|
|
131 |
||
132 |
||
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
133 |
Documentation
|
134 |
=============
|
|
135 |
||
136 |
If you change the behaviour of a command, please update its docstring
|
|
137 |
in bzrlib/commands.py. This is displayed by the 'bzr help' command. |
|
138 |
||
1185.33.2
by Martin Pool
How to maintain the NEWS file |
139 |
NEWS file
|
140 |
---------
|
|
141 |
||
974.1.26
by aaron.bentley at utoronto
merged mbp@sourcefrog.net-20050817233101-0939da1cf91f2472 |
142 |
If you make a user-visible change, please add a note to the NEWS file.
|
143 |
The description should be written to make sense to someone who's just |
|
144 |
a user of bzr, not a developer: new functions or classes shouldn't be |
|
145 |
mentioned, but new commands, changes in behaviour or fixed nontrivial
|
|
146 |
bugs should be listed. See the existing entries for an idea of what
|
|
147 |
should be done.
|
|
1098
by Martin Pool
- notes on how output is written |
148 |
|
1185.33.2
by Martin Pool
How to maintain the NEWS file |
149 |
Within each release, entries in the news file should have the most
|
150 |
user-visible changes first. So the order should be approximately:
|
|
151 |
||
152 |
* changes to existing behaviour - the highest priority because the
|
|
153 |
user's existing knowledge is incorrect |
|
154 |
* new features - should be brought to their attention |
|
155 |
* bug fixes - may be of interest if the bug was affecting them, and |
|
156 |
should include the bug number if any |
|
157 |
* major documentation changes |
|
158 |
* changes to internal interfaces |
|
159 |
||
160 |
People who made significant contributions to each change are listed in |
|
161 |
parenthesis. This can include reporting bugs (particularly with good |
|
162 |
details or reproduction recipes), submitting patches, etc. |
|
1098
by Martin Pool
- notes on how output is written |
163 |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
164 |
API documentation |
165 |
-----------------
|
|
166 |
||
167 |
Functions, methods, classes and modules should have docstrings |
|
168 |
describing how they are used. |
|
169 |
||
170 |
The first line of the docstring should be a self-contained sentence. |
|
171 |
||
172 |
For the special case of Command classes, this acts as the user-visible |
|
173 |
documentation shown by the help command. |
|
174 |
||
175 |
The docstrings should be formatted as reStructuredText_ (like this |
|
176 |
document), suitable for processing using the epydoc_ tool into HTML |
|
177 |
documentation. |
|
178 |
||
179 |
.. _reStructuredText: http://docutils.sourceforge.net/rst.html |
|
180 |
.. _epydoc: http://epydoc.sourceforge.net/ |
|
181 |
||
182 |
||
183 |
||
184 |
Coding style |
|
185 |
============
|
|
186 |
||
187 |
Please write PEP-8__ compliant code. |
|
188 |
||
189 |
One often-missed requirement is that the first line of docstrings |
|
190 |
should be a self-contained one-sentence summary. |
|
191 |
||
192 |
__ http://www.python.org/peps/pep-0008.html |
|
193 |
||
194 |
||
195 |
||
196 |
Naming
|
|
197 |
------
|
|
198 |
||
199 |
Functions, methods or members that are in some sense "private" are given |
|
200 |
a leading underscore prefix. This is just a hint that code outside the |
|
201 |
implementation should probably not use that interface. |
|
202 |
||
203 |
We prefer class names to be concatenated capital words (``TestCase``) |
|
204 |
and variables, methods and functions to be lowercase words joined by |
|
205 |
underscores (``revision_id``, ``get_revision``). |
|
206 |
||
207 |
For the purposes of naming some names are treated as single compound |
|
208 |
words: "filename", "revno". |
|
209 |
||
210 |
Consider naming classes as nouns and functions/methods as verbs. |
|
211 |
||
212 |
||
213 |
Standard names |
|
214 |
--------------
|
|
215 |
||
216 |
``revision_id`` not ``rev_id`` or ``revid`` |
|
217 |
||
218 |
Functions that transform one thing to another should be named ``x_to_y`` |
|
219 |
(not ``x2y`` as occurs in some old code.) |
|
220 |
||
1098
by Martin Pool
- notes on how output is written |
221 |
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
222 |
Destructors
|
223 |
-----------
|
|
224 |
||
1185.16.150
by Martin Pool
Improved description of python exception policies |
225 |
Python destructors (``__del__``) work differently to those of other |
226 |
languages. In particular, bear in mind that destructors may be called |
|
227 |
immediately when the object apparently becomes unreferenced, or at some |
|
228 |
later time, or possibly never at all. Therefore we have restrictions on |
|
229 |
what can be done inside them. |
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
230 |
|
231 |
0. Never use a __del__ method without asking Martin/Robert first. |
|
232 |
||
233 |
1. Never rely on a ``__del__`` method running. If there is code that |
|
234 |
must run, do it from a ``finally`` block instead. |
|
235 |
||
236 |
2. Never ``import`` from inside a ``__del__`` method, or you may crash the |
|
237 |
interpreter!! |
|
238 |
||
239 |
3. In some places we raise a warning from the destructor if the object |
|
240 |
has not been cleaned up or closed. This is considered OK: the warning |
|
241 |
may not catch every case but it's still useful sometimes. |
|
242 |
||
243 |
||
1740.2.5
by Aaron Bentley
Merge from bzr.dev |
244 |
Factories
|
245 |
---------
|
|
246 |
||
247 |
In some places we have variables which point to callables that construct
|
|
248 |
new instances. That is to say, they can be used a lot like class objects,
|
|
249 |
but they shouldn't be *named* like classes: |
|
250 |
||
251 |
> I think that things named FooBar should create instances of FooBar when |
|
252 |
> called. Its plain confusing for them to do otherwise. When we have |
|
253 |
> something that is going to be used as a class - that is, checked for via |
|
254 |
> isinstance or other such idioms, them I would call it foo_class, so that |
|
255 |
> it is clear that a callable is not sufficient. If it is only used as a |
|
256 |
> factory, then yes, foo_factory is what I would use. |
|
257 |
||
258 |
||
1911.4.15
by John Arbash Meinel
Updated HACKING and docstrings per Martin's suggestions |
259 |
Registries
|
260 |
----------
|
|
261 |
||
262 |
Several places in Bazaar use (or will use) a registry, which is a |
|
263 |
mapping from names to objects or classes. The registry allows for |
|
264 |
loading in registered code only when it's needed, and keeping |
|
265 |
associated information such as a help string or description.
|
|
266 |
||
267 |
||
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
268 |
Lazy Imports
|
269 |
------------
|
|
270 |
||
271 |
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
|
|
272 |
delay importing modules until they are actually used. ``lazy_import`` uses
|
|
273 |
the same syntax as regular python imports. So to import a few modules in a
|
|
274 |
lazy fashion do::
|
|
275 |
||
276 |
from bzrlib.lazy_import import lazy_import
|
|
277 |
lazy_import(globals(), """
|
|
278 |
import os
|
|
279 |
import subprocess
|
|
280 |
import sys
|
|
281 |
import time
|
|
282 |
||
283 |
from bzrlib import (
|
|
284 |
errors,
|
|
285 |
transport,
|
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
286 |
revision as _mod_revision,
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
287 |
)
|
288 |
import bzrlib.transport
|
|
289 |
import bzrlib.xml5
|
|
290 |
""")
|
|
291 |
||
292 |
At this point, all of these exist as a ``ImportReplacer`` object, ready to
|
|
1996.3.37
by John Arbash Meinel
Update HACKING and TODO |
293 |
be imported once a member is accessed. Also, when importing a module into
|
294 |
the local namespace, which is likely to clash with variable names, it is
|
|
295 |
recommended to prefix it as ``_mod_<module>``. This makes it clean that
|
|
296 |
the variable is a module, and these object should be hidden anyway, since
|
|
297 |
they shouldn't be imported into other namespaces. |
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
298 |
|
299 |
||
300 |
Modules versus Members |
|
301 |
~~~~~~~~~~~~~~~~~~~~~~
|
|
302 |
||
303 |
While it is possible for ``lazy_import()`` to import members of a module |
|
2063.3.1
by wang
fix typos |
304 |
when using the ``from module import member`` syntax, it is recommended to |
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
305 |
only use that syntax to load sub modules ``from module import submodule``. |
306 |
This is because variables and classes can frequently be used without |
|
307 |
needing a sub-member for example:: |
|
308 |
||
309 |
lazy_import(globals(), """ |
|
310 |
from module import MyClass
|
|
311 |
""") |
|
312 |
||
313 |
def test(x): |
|
314 |
return isinstance(x, MyClass) |
|
315 |
||
316 |
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer`` |
|
317 |
object, rather than the real class. |
|
318 |
||
319 |
||
320 |
Passing to other variables |
|
321 |
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
322 |
||
1996.1.26
by John Arbash Meinel
Update HACKING and docstrings |
323 |
It also is incorrect to assign ``ImportReplacer`` objects to other variables. |
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
324 |
Because the replacer only knows about the original name, it is unable to |
325 |
replace other variables. The ``ImportReplacer`` class will raise an |
|
1996.1.26
by John Arbash Meinel
Update HACKING and docstrings |
326 |
``IllegalUseOfScopeReplacer`` exception if it can figure out that this |
327 |
happened. But it requires accessing a member more than once from the new |
|
328 |
variable, so some bugs are not detected right away. |
|
1996.1.20
by John Arbash Meinel
HACKING and NEWS |
329 |
|
330 |
||
1098
by Martin Pool
- notes on how output is written |
331 |
Writing output |
332 |
==============
|
|
333 |
||
334 |
(The strategy described here is what we want to get to, but it's not |
|
335 |
consistently followed in the code at the moment.)
|
|
336 |
||
337 |
bzrlib is intended to be a generically reusable library. It shouldn't |
|
338 |
write messages to stdout or stderr, because some programs that use it |
|
339 |
might want to display that information through a GUI or some other |
|
340 |
mechanism. |
|
341 |
||
342 |
We can distinguish two types of output from the library: |
|
343 |
||
344 |
1. Structured data representing the progress or result of an |
|
345 |
operation. For example, for a commit command this will be a list |
|
346 |
of the modified files and the finally committed revision number |
|
347 |
and id. |
|
348 |
||
349 |
These should be exposed either through the return code or by calls |
|
350 |
to a callback parameter. |
|
351 |
||
352 |
A special case of this is progress indicators for long-lived |
|
353 |
operations, where the caller should pass a ProgressBar object. |
|
354 |
||
355 |
2. Unstructured log/debug messages, mostly for the benefit of the |
|
356 |
developers or users trying to debug problems. This should always |
|
357 |
be sent through ``bzrlib.trace`` and Python ``logging``, so that |
|
358 |
it can be redirected by the client. |
|
359 |
||
360 |
The distinction between the two is a bit subjective, but in general if |
|
361 |
there is any chance that a library would want to see something as |
|
362 |
structured data, we should make it so. |
|
363 |
||
364 |
The policy about how output is presented in the text-mode client |
|
365 |
should be only in the command-line tool. |
|
1092.1.22
by Robert Collins
update hacking with some test foo |
366 |
|
1418
by Robert Collins
merge martins latest |
367 |
|
1092.1.22
by Robert Collins
update hacking with some test foo |
368 |
Writing tests |
369 |
=============
|
|
2067.2.2
by John Arbash Meinel
Review comments from Robert |
370 |
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
371 |
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 |
372 |
FOO is the logical thing under test. That file should be placed in the |
373 |
tests subdirectory under the package being tested. |
|
374 |
||
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
375 |
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py. |
376 |
See bzrlib/selftest/test_sampler.py for a template test script. |
|
377 |
||
378 |
Tests can be written for the UI or for individual areas of the library. |
|
379 |
Choose whichever is appropriate: if adding a new command, or a new command |
|
380 |
option, then you should be writing a UI test. If you are both adding UI |
|
381 |
functionality and library functionality, you will want to write tests for |
|
382 |
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 |
383 |
and they are found in ``bzrlib/tests/blackbox/*.py``. |
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
384 |
|
385 |
When writing blackbox tests please honour the following conventions:
|
|
386 |
||
387 |
1. Place the tests for the command 'name' in
|
|
388 |
bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
|
|
389 |
to locate the test script for a faulty command.
|
|
390 |
||
391 |
2. Use the 'self.run_bzr("name")' utility function to invoke the command
|
|
392 |
rather than running bzr in a subprocess or invoking the
|
|
393 |
cmd_object.run() method directly. This is a lot faster than
|
|
394 |
subprocesses and generates the same logging output as running it in a
|
|
395 |
subprocess (which invoking the method directly does not).
|
|
396 |
|
|
397 |
3. Only test the one command in a single test script. Use the bzrlib
|
|
398 |
library when setting up tests and when evaluating the side-effects of
|
|
399 |
the command. We do this so that the library api has continual pressure
|
|
400 |
on it to be as functional as the command line in a simple manner, and
|
|
401 |
to isolate knock-on effects throughout the blackbox test suite when a
|
|
2063.3.1
by wang
fix typos |
402 |
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. |
403 |
given command are affected when a given command is changed.
|
1393.1.61
by Martin Pool
doc |
404 |
|
2067.2.2
by John Arbash Meinel
Review comments from Robert |
405 |
4. If you have a test which does actually require running bzr in a
|
406 |
subprocess you can use ``run_bzr_subprocess``. By default the spawned
|
|
407 |
process will not load plugins unless ``--allow-plugins`` is supplied.
|
|
408 |
||
409 |
||
1740.6.1
by Martin Pool
Remove Scratch objects used by doctests |
410 |
Doctests
|
411 |
--------
|
|
412 |
||
413 |
We make selective use of doctests__. In general they should provide
|
|
414 |
*examples* within the API documentation which can incidentally be tested. We
|
|
415 |
don't try to test every important case using doctests -- regular Python
|
|
416 |
tests are generally a better solution.
|
|
417 |
||
418 |
Most of these are in ``bzrlib/doc/api``. More additions are welcome.
|
|
419 |
||
420 |
__ http://docs.python.org/lib/module-doctest.html
|
|
421 |
||
422 |
||
1092.1.22
by Robert Collins
update hacking with some test foo |
423 |
Running tests
|
424 |
=============
|
|
425 |
Currently, bzr selftest is used to invoke tests.
|
|
426 |
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. |
427 |
to run just the blackbox tests, run::
|
1393.1.61
by Martin Pool
doc |
428 |
|
1638.1.1
by Robert Collins
Update HACKING to reflect current test writing policy. |
429 |
./bzr selftest -v blackbox
|
1393.1.61
by Martin Pool
doc |
430 |
|
1551.6.41
by Aaron Bentley
Add advice on skipping tests to HACKING |
431 |
To skip a particular test (or set of tests), you need to use a negative
|
432 |
match, like so::
|
|
1711.2.94
by John Arbash Meinel
Update HACKING to be rst compliant |
433 |
|
1551.6.41
by Aaron Bentley
Add advice on skipping tests to HACKING |
434 |
./bzr selftest '^(?!.*blackbox)'
|
435 |
||
1393.1.61
by Martin Pool
doc |
436 |
|
437 |
Errors and exceptions
|
|
438 |
=====================
|
|
439 |
||
2067.3.1
by Martin Pool
Clean up BzrNewError, other exception classes and users. |
440 |
Errors are handled through Python exceptions.
|
441 |
||
2067.3.5
by Martin Pool
Review comments |
442 |
We broadly classify errors as either being either internal or not,
|
443 |
depending on whether ``user_error`` is set or not. If we think it's our
|
|
444 |
fault, we show a backtrace, an invitation to report the bug, and possibly
|
|
445 |
other details. This is the default for errors that aren't specifically
|
|
446 |
recognized as being caused by a user error. Otherwise we show a briefer
|
|
447 |
message, unless -Derror was given.
|
|
2067.3.1
by Martin Pool
Clean up BzrNewError, other exception classes and users. |
448 |
|
449 |
Many errors originate as "environmental errors" which are raised by Python
|
|
450 |
or builtin libraries -- for example IOError. These are treated as being
|
|
451 |
our fault, unless they're caught in a particular tight scope where we know
|
|
452 |
that they indicate a user errors. For example if the repository format
|
|
453 |
is not found, the user probably gave the wrong path or URL. But if one of
|
|
454 |
the files inside the repository is not found, then it's our fault --
|
|
455 |
either there's a bug in bzr, or something complicated has gone wrong in
|
|
456 |
the environment that means one internal file was deleted.
|
|
457 |
||
458 |
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors
|
|
459 |
to be added near the place where they are used.
|
|
460 |
||
461 |
Exceptions are formatted for the user by conversion to a string
|
|
462 |
(eventually calling their ``__str__`` method.) As a convenience the
|
|
463 |
``._fmt`` member can be used as a template which will be mapped to the
|
|
464 |
error's instance dict.
|
|
465 |
||
466 |
New exception classes should be defined when callers might want to catch
|
|
467 |
that exception specifically, or when it needs a substantially different
|
|
468 |
format string.
|
|
469 |
||
470 |
Exception strings should start with a capital letter and should not have a
|
|
2067.3.5
by Martin Pool
Review comments |
471 |
final fullstop. If long, they may contain newlines to break the text.
|
2067.3.1
by Martin Pool
Clean up BzrNewError, other exception classes and users. |
472 |
|
1092.1.22
by Robert Collins
update hacking with some test foo |
473 |
|
1393.1.53
by Martin Pool
- notes from coding-convention discussion |
474 |
|
475 |
Jargon
|
|
476 |
======
|
|
477 |
||
478 |
revno
|
|
479 |
Integer identifier for a revision on the main line of a branch.
|
|
480 |
Revision 0 is always the null revision; others are 1-based
|
|
481 |
indexes into the branch's revision history.
|
|
1185.16.85
by mbp at sourcefrog
- rules for using destructors |
482 |
|
1185.33.98
by Martin Pool
Add notes on merge/review process. |
483 |
|
1684.1.3
by Martin Pool
(HACKING) some notes on handling unicode & urls for transports |
484 |
Transport
|
485 |
=========
|
|
486 |
||
487 |
The ``Transport`` layer handles access to local or remote directories.
|
|
488 |
Each Transport object acts like a logical connection to a particular
|
|
489 |
directory, and it allows various operations on files within it. You can
|
|
490 |
*clone* a transport to get a new Transport connected to a subdirectory or
|
|
491 |
parent directory.
|
|
492 |
||
493 |
Transports are not used for access to the working tree. At present
|
|
494 |
working trees are always local and they are accessed through the regular
|
|
495 |
Python file io mechanisms.
|
|
496 |
||
497 |
filenames vs URLs
|
|
498 |
-----------------
|
|
499 |
||
500 |
Transports work in URLs. Take note that URLs are by definition only
|
|
501 |
ASCII - the decision of how to encode a Unicode string into a URL must be
|
|
502 |
taken at a higher level, typically in the Store. (Note that Stores also
|
|
503 |
escape filenames which cannot be safely stored on all filesystems, but
|
|
504 |
this is a different level.)
|
|
505 |
||
506 |
The main reason for this is that it's not possible to safely roundtrip a
|
|
507 |
URL into Unicode and then back into the same URL. The URL standard
|
|
508 |
gives a way to represent non-ASCII bytes in ASCII (as %-escapes), but
|
|
509 |
doesn't say how those bytes represent non-ASCII characters. (They're not
|
|
510 |
guaranteed to be UTF-8 -- that is common but doesn't happen everywhere.)
|
|
511 |
||
512 |
For example if the user enters the url ``http://example/%e0`` there's no
|
|
513 |
way to tell whether that character represents "latin small letter a with
|
|
514 |
grave" in iso-8859-1, or "latin small letter r with acute" in iso-8859-2
|
|
515 |
or malformed UTF-8. So we can't convert their URL to Unicode reliably.
|
|
516 |
||
517 |
Equally problematic if we're given a url-like string containing non-ascii
|
|
518 |
characters (such as the accented a) we can't be sure how to convert that
|
|
519 |
to the correct URL, because we don't know what encoding the server expects
|
|
520 |
for those characters. (Although this is not totally reliable we might still
|
|
521 |
accept these and assume they should be put into UTF-8.)
|
|
522 |
||
1711.2.94
by John Arbash Meinel
Update HACKING to be rst compliant |
523 |
A similar edge case is that the url ``http://foo/sweet%2Fsour`` contains
|
1684.1.3
by Martin Pool
(HACKING) some notes on handling unicode & urls for transports |
524 |
one directory component whose name is "sweet/sour". The escaped slash is
|
525 |
not a directory separator. If we try to convert URLs to regular Unicode
|
|
526 |
paths this information will be lost.
|
|
527 |
||
528 |
This implies that Transports must natively deal with URLs; for simplicity
|
|
529 |
they *only* deal with URLs and conversion of other strings to URLs is done
|
|
530 |
elsewhere. Information they return, such as from ``list_dir``, is also in
|
|
531 |
the form of URL components.
|
|
532 |
||
533 |
||
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
534 |
Unicode and Encoding Support
|
535 |
============================
|
|
536 |
||
537 |
This section discusses various techniques that Bazaar uses to handle
|
|
538 |
characters that are outside the ASCII set.
|
|
539 |
||
540 |
``Command.outf``
|
|
541 |
----------------
|
|
542 |
||
543 |
When a ``Command`` object is created, it is given a member variable
|
|
544 |
accessible by ``self.outf``. This is a file-like object, which is bound to
|
|
545 |
``sys.stdout``, and should be used to write information to the screen,
|
|
546 |
rather than directly writing to ``sys.stdout`` or calling ``print``.
|
|
547 |
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 |
548 |
representation, based on the console encoding. Also, the class attribute
|
549 |
``encoding_type`` will effect how unprintable characters will be
|
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
550 |
handled. This parameter can take one of 3 values:
|
551 |
||
552 |
replace
|
|
1711.2.96
by John Arbash Meinel
cleanup from suggestions by Robert and Martin |
553 |
Unprintable characters will be represented with a suitable replacement
|
554 |
marker (typically '?'), and no exception will be raised. This is for
|
|
555 |
any command which generates text for the user to review, rather than
|
|
556 |
for automated processing.
|
|
1711.2.95
by John Arbash Meinel
Add HACKING note for the self.outf parameter. |
557 |
For example: ``bzr log`` should not fail if one of the entries has text
|
558 |
that cannot be displayed.
|
|
559 |
|
|
560 |
strict
|
|
2063.3.1
by wang
fix typos |
561 |
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. |
562 |
This is for commands that are intended more as scripting support, rather
|
563 |
than plain user review.
|
|
564 |
For exampl: ``bzr ls`` is designed to be used with shell scripting. One
|
|
565 |
use would be ``bzr ls --null --unknows | xargs -0 rm``. If ``bzr``
|
|
566 |
printed a filename with a '?', the wrong file could be deleted. (At the
|
|
567 |
very least, the correct file would not be deleted). An error is used to
|
|
568 |
indicate that the requested action could not be performed.
|
|
569 |
|
|
570 |
exact
|
|
571 |
Do not attempt to automatically convert Unicode strings. This is used
|
|
572 |
for commands that must handle conversion themselves.
|
|
573 |
For example: ``bzr diff`` needs to translate Unicode paths, but should
|
|
574 |
not change the exact text of the contents of the files.
|
|
575 |
||
576 |
||
577 |
``bzrlib.urlutils.unescape_for_display``
|
|
578 |
----------------------------------------
|
|
579 |
||
580 |
Because Transports work in URLs (as defined earlier), printing the raw URL
|
|
581 |
to the user is usually less than optimal. Characters outside the standard
|
|
582 |
set are printed as escapes, rather than the real character, and local
|
|
583 |
paths would be printed as ``file://`` urls. The function
|
|
584 |
``unescape_for_display`` attempts to unescape a URL, such that anything
|
|
585 |
that cannot be printed in the current encoding stays an escaped URL, but
|
|
586 |
valid characters are generated where possible.
|
|
587 |
||
588 |
||
1185.33.98
by Martin Pool
Add notes on merge/review process. |
589 |
Merge/review process
|
590 |
====================
|
|
591 |
||
592 |
If you'd like to propose a change, please post to the
|
|
593 |
bazaar-ng@lists.canonical.com list with a patch, bzr changeset, or link to a
|
|
594 |
branch. Please put '[patch]' in the subject so we can pick them out, and
|
|
595 |
include some text explaining the change. Remember to put an update to the NEWS
|
|
596 |
file in your diff, if it makes any changes visible to users or plugin
|
|
597 |
developers. Please include a diff against mainline if you're giving a link to
|
|
598 |
a branch.
|
|
599 |
||
600 |
Please indicate if you think the code is ready to merge, or if it's just a
|
|
601 |
draft or for discussion. If you want comments from many developers rather than
|
|
602 |
to be merged, you can put '[rfc]' in the subject lines.
|
|
603 |
||
604 |
Anyone is welcome to review code. There are broadly three gates for
|
|
605 |
code to get in:
|
|
606 |
||
607 |
* Doesn't reduce test coverage: if it adds new methods or commands,
|
|
608 |
there should be tests for them. There is a good test framework
|
|
609 |
and plenty of examples to crib from, but if you are having trouble
|
|
610 |
working out how to test something feel free to post a draft patch
|
|
611 |
and ask for help.
|
|
612 |
||
613 |
* Doesn't reduce design clarity, such as by entangling objects
|
|
614 |
we're trying to separate. This is mostly something the more
|
|
615 |
experienced reviewers need to help check.
|
|
616 |
||
617 |
* Improves bugs, features, speed, or code simplicity.
|
|
618 |
||
619 |
Code that goes in should pass all three.
|
|
620 |
||
621 |
If you read a patch please reply and say so. We can use a numeric scale
|
|
622 |
of -1, -0, +0, +1, meaning respectively "really don't want it in current
|
|
623 |
form", "somewhat uncomfortable", "ok with me", and "please put it in".
|
|
624 |
Anyone can "vote". (It's not really voting, just a terse expression.)
|
|
625 |
||
626 |
If something gets say two +1 votes from core reviewers, and no
|
|
627 |
vetos, then it's OK to come in. Any of the core developers can bring it
|
|
628 |
into their integration branch, which I'll merge regularly. (If you do
|
|
629 |
so, please reply and say so.)
|
|
630 |
||
631 |
||
1861.2.19
by Alexander Belchenko
HACKING: mention where to get instructions for building windows installers |
632 |
Making installers for OS Windows
|
633 |
================================
|
|
1861.2.20
by Alexander Belchenko
English |
634 |
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 |
635 |
http://bazaar-vcs.org/BzrWin32Installer
|
636 |
||
637 |
||
1740.6.1
by Martin Pool
Remove Scratch objects used by doctests |
638 |
:: vim: ft=rst tw=74 ai
|