~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to HACKING

  • Committer: Alexander Belchenko
  • Date: 2006-07-30 16:43:12 UTC
  • mto: (1711.2.111 jam-integration)
  • mto: This revision was merged to the branch mainline in revision 1906.
  • Revision ID: bialix@ukr.net-20060730164312-b025fd3ff0cee59e
rename  gpl.txt => COPYING.txt

Show diffs side-by-side

added added

removed removed

Lines of Context:
56
56
applies to modules and classes.
57
57
 
58
58
If you wish to change the behaviour of a supported API in an incompatible
59
 
way, you need to change its name as well. For instance, if I add an optional keyword
 
59
way, you need to change its name as well. For instance, if I add a optional keyword
60
60
parameter to branch.commit - that's fine. On the other hand, if I add a
61
61
keyword parameter to branch.commit which is a *required* transaction
62
62
object, I should rename the API - i.e. to 'branch.commit_transaction'. 
67
67
details for you - such as updating the docstring, and issuing a warning
68
68
when the old api is used.
69
69
 
70
 
For unsupported API's, it does not hurt to follow this discipline, but it's
 
70
For unsupported API's, it does not hurt to follow this discipline, but its
71
71
not required. Minimally though, please try to rename things so that
72
72
callers will at least get an AttributeError rather than weird results.
73
73
 
78
78
There are some common requirements in the library: some parameters need to be
79
79
unicode safe, some need byte strings, and so on. At the moment we have
80
80
only codified one specific pattern: Parameters that need to be unicode
81
 
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
 
81
should be check via 'bzrlib.osutils.safe_unicode'. This will coerce the
82
82
input into unicode in a consistent fashion, allowing trivial strings to be
83
83
used for programmer convenience, but not performing unpredictably in the
84
84
presence of different locales.
85
85
 
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
 
 
133
86
Documentation
134
87
=============
135
88
 
136
 
When you change bzrlib, please update the relevant documentation for the
137
 
change you made: Changes to commands should update their help, and
138
 
possibly end user tutorials; changes to the core library should be
139
 
reflected in API documentation.
140
 
 
141
 
Commands
142
 
--------
143
 
 
144
 
The docstring of a command is used by ``bzr help`` to generate help output
145
 
for the command. The list 'takes_options' attribute on a command is used by
146
 
``bzr help`` to document the options for the command - the command
147
 
docstring does not need to document them. Finally, the '_see_also'
148
 
attribute on a command can be used to reference other related help topics.
 
89
If you change the behaviour of a command, please update its docstring
 
90
in bzrlib/commands.py.  This is displayed by the 'bzr help' command.
149
91
 
150
92
NEWS file
151
93
---------
220
162
 
221
163
Consider naming classes as nouns and functions/methods as verbs.
222
164
 
223
 
Try to avoid using abbreviations in names, because there can be
224
 
inconsistency if other people use the full name.
225
 
 
226
165
 
227
166
Standard names
228
167
--------------
270
209
> factory, then yes, foo_factory is what I would use.
271
210
 
272
211
 
273
 
Registries
274
 
----------
275
 
 
276
 
Several places in Bazaar use (or will use) a registry, which is a 
277
 
mapping from names to objects or classes.  The registry allows for 
278
 
loading in registered code only when it's needed, and keeping
279
 
associated information such as a help string or description.
280
 
 
281
 
 
282
 
Lazy Imports
283
 
------------
284
 
 
285
 
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
286
 
delay importing modules until they are actually used. ``lazy_import`` uses
287
 
the same syntax as regular python imports. So to import a few modules in a
288
 
lazy fashion do::
289
 
 
290
 
  from bzrlib.lazy_import import lazy_import
291
 
  lazy_import(globals(), """
292
 
  import os
293
 
  import subprocess
294
 
  import sys
295
 
  import time
296
 
 
297
 
  from bzrlib import (
298
 
     errors,
299
 
     transport,
300
 
     revision as _mod_revision,
301
 
     )
302
 
  import bzrlib.transport
303
 
  import bzrlib.xml5
304
 
  """)
305
 
 
306
 
At this point, all of these exist as a ``ImportReplacer`` object, ready to
307
 
be imported once a member is accessed. Also, when importing a module into
308
 
the local namespace, which is likely to clash with variable names, it is
309
 
recommended to prefix it as ``_mod_<module>``. This makes it clearer that
310
 
the variable is a module, and these object should be hidden anyway, since
311
 
they shouldn't be imported into other namespaces.
312
 
 
313
 
 
314
 
Modules versus Members
315
 
~~~~~~~~~~~~~~~~~~~~~~
316
 
 
317
 
While it is possible for ``lazy_import()`` to import members of a module
318
 
when using the ``from module import member`` syntax, it is recommended to
319
 
only use that syntax to load sub modules ``from module import submodule``.
320
 
This is because variables and classes can frequently be used without
321
 
needing a sub-member for example::
322
 
 
323
 
  lazy_import(globals(), """
324
 
  from module import MyClass
325
 
  """)
326
 
 
327
 
  def test(x):
328
 
      return isinstance(x, MyClass)
329
 
 
330
 
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
331
 
object, rather than the real class.
332
 
 
333
 
 
334
 
Passing to other variables
335
 
~~~~~~~~~~~~~~~~~~~~~~~~~~
336
 
 
337
 
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
338
 
Because the replacer only knows about the original name, it is unable to
339
 
replace other variables. The ``ImportReplacer`` class will raise an
340
 
``IllegalUseOfScopeReplacer`` exception if it can figure out that this
341
 
happened. But it requires accessing a member more than once from the new
342
 
variable, so some bugs are not detected right away.
343
 
 
344
 
 
345
212
Writing output
346
213
==============
347
214
 
381
248
 
382
249
Writing tests
383
250
=============
384
 
 
385
251
In general tests should be placed in a file named test_FOO.py where 
386
252
FOO is the logical thing under test. That file should be placed in the
387
253
tests subdirectory under the package being tested.
388
254
 
389
255
For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
390
 
See bzrlib/tests/test_sampler.py for a template test script.
 
256
See bzrlib/selftest/test_sampler.py for a template test script.
391
257
 
392
258
Tests can be written for the UI or for individual areas of the library.
393
259
Choose whichever is appropriate: if adding a new command, or a new command 
413
279
    the command. We do this so that the library api has continual pressure
414
280
    on it to be as functional as the command line in a simple manner, and
415
281
    to isolate knock-on effects throughout the blackbox test suite when a
416
 
    command changes its name or signature. Ideally only the tests for a
 
282
    command changes it name or signature. Ideally only the tests for a
417
283
    given command are affected when a given command is changed.
418
284
 
419
 
 4. If you have a test which does actually require running bzr in a
420
 
    subprocess you can use ``run_bzr_subprocess``. By default the spawned
421
 
    process will not load plugins unless ``--allow-plugins`` is supplied.
422
 
 
423
 
 
424
285
Doctests
425
286
--------
426
287
 
442
303
 
443
304
  ./bzr selftest -v blackbox
444
305
 
445
 
To skip a particular test (or set of tests), use the --exclude option
446
 
(shorthand -x) like so::
447
 
 
448
 
  ./bzr selftest -v -x blackbox  
449
 
 
450
 
To list tests without running them, use the --list-only option like so::
451
 
 
452
 
  ./bzr selftest --list-only
453
 
 
454
 
This option can be combined with other selftest options (like -x) and
455
 
filter patterns to understand their effect.
 
306
To skip a particular test (or set of tests), you need to use a negative
 
307
match, like so::
 
308
 
 
309
  ./bzr selftest '^(?!.*blackbox)'  
456
310
 
457
311
 
458
312
Errors and exceptions
459
313
=====================
460
314
 
461
 
Errors are handled through Python exceptions.
462
 
 
463
 
We broadly classify errors as either being either internal or not,
464
 
depending on whether ``user_error`` is set or not.  If we think it's our
465
 
fault, we show a backtrace, an invitation to report the bug, and possibly
466
 
other details.  This is the default for errors that aren't specifically
467
 
recognized as being caused by a user error.  Otherwise we show a briefer
468
 
message, unless -Derror was given.
469
 
 
470
 
Many errors originate as "environmental errors" which are raised by Python
471
 
or builtin libraries -- for example IOError.  These are treated as being
472
 
our fault, unless they're caught in a particular tight scope where we know
473
 
that they indicate a user errors.  For example if the repository format
474
 
is not found, the user probably gave the wrong path or URL.  But if one of
475
 
the files inside the repository is not found, then it's our fault --
476
 
either there's a bug in bzr, or something complicated has gone wrong in
477
 
the environment that means one internal file was deleted.
478
 
 
479
 
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors
480
 
to be added near the place where they are used.
481
 
 
482
 
Exceptions are formatted for the user by conversion to a string
483
 
(eventually calling their ``__str__`` method.)  As a convenience the
484
 
``._fmt`` member can be used as a template which will be mapped to the
485
 
error's instance dict.
486
 
 
487
 
New exception classes should be defined when callers might want to catch
488
 
that exception specifically, or when it needs a substantially different
489
 
format string.
490
 
 
491
 
Exception strings should start with a capital letter and should not have a
492
 
final fullstop.  If long, they may contain newlines to break the text.
493
 
 
494
 
 
495
 
 
496
 
Debugging
497
 
=========
498
 
 
499
 
Bazaar has a few facilities to help debug problems by going into pdb_, the
500
 
Python debugger.
501
 
 
502
 
.. _pdb: http://docs.python.org/lib/debugger-commands.html
503
 
 
504
 
If the ``BZR_PDB`` environment variable is set 
505
 
then bzr will go into pdb post-mortem mode when an unhandled exception
506
 
occurs.
507
 
 
508
 
If you send a SIGQUIT signal to bzr, which can be done by pressing C-\ on Unix,
509
 
bzr will go into the debugger immediately.  You can continue execution by
510
 
typing ``c``.  This can be disabled if necessary by setting the
511
 
environment variable ``BZR_SIGQUIT_PDB=0``.
512
 
 
 
315
Errors are handled through Python exceptions.  They can represent user
 
316
errors, environmental errors or program bugs.  Sometimes we can't be sure
 
317
at the time it's raised which case applies.  See bzrlib/errors.py for 
 
318
details on the error-handling practices.
513
319
 
514
320
 
515
321
Jargon
598
404
    that cannot be displayed.
599
405
  
600
406
  strict
601
 
    Attempting to print an unprintable character will cause a UnicodeError.
 
407
    Attempting to print and unprintable character will cause a UnicodeError.
602
408
    This is for commands that are intended more as scripting support, rather
603
409
    than plain user review.
604
410
    For exampl: ``bzr ls`` is designed to be used with shell scripting. One
626
432
valid characters are generated where possible.
627
433
 
628
434
 
629
 
Portability Tips
630
 
================
631
 
 
632
 
The ``bzrlib.osutils`` module has many useful helper functions, including
633
 
some more portable variants of functions in the standard library.
634
 
 
635
 
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it
636
 
to fail on Windows if some files are readonly or still open elsewhere.
637
 
Use ``bzrlib.osutils.rmtree`` instead.
638
 
 
639
 
 
640
435
Merge/review process
641
436
====================
642
437
 
643
438
If you'd like to propose a change, please post to the
644
 
bazaar@lists.canonical.com list with a patch, bzr changeset, or link to a
 
439
bazaar-ng@lists.canonical.com list with a patch, bzr changeset, or link to a
645
440
branch.  Please put '[patch]' in the subject so we can pick them out, and
646
441
include some text explaining the change.  Remember to put an update to the NEWS
647
442
file in your diff, if it makes any changes visible to users or plugin
680
475
so, please reply and say so.)
681
476
 
682
477
 
683
 
C Extension Modules
684
 
===================
685
 
 
686
 
We write some extensions in C using pyrex. We design these to work in
687
 
three scenarios:
688
 
 
689
 
 * User with no C compiler
690
 
 * User with C compiler
691
 
 * Developers
692
 
 
693
 
The recommended way to install bzr is to have a C compiler so that the
694
 
extensions can be built, but if no C compiler is present, the pure python
695
 
versions we supply will work, though more slowly.
696
 
 
697
 
For developers we recommend that pyrex be installed, so that the C
698
 
extensions can be changed if needed.
699
 
 
700
 
For the C extensions, the extension module should always match the
701
 
original python one in all respects (modulo speed). This should be
702
 
maintained over time.
703
 
 
704
 
To create an extension, add rules to setup.py for building it with pyrex,
705
 
and with distutils. Now start with an empty .pyx file. At the top add
706
 
"include 'yourmodule.py'". This will import the contents of foo.py into this 
707
 
file at build time - remember that only one module will be loaded at
708
 
runtime. Now you can subclass classes, or replace functions, and only your
709
 
changes need to be present in the .pyx file.
710
 
 
711
 
Note that pyrex does not support all 2.4 programming idioms, so some
712
 
syntax changes may be required. I.e. 
713
 
 
714
 
 - 'from foo import (bar, gam)' needs to change to not use the brackets. 
715
 
 - 'import foo.bar as bar' needs to be 'import foo.bar; bar = foo.bar' 
716
 
 
717
 
If the changes are too dramatic, consider
718
 
maintaining the python code twice - once in the .pyx, and once in the .py,
719
 
and no longer including the .py file.
720
 
 
721
 
Making installers for OS Windows
722
 
================================
723
 
To build a win32 installer, see the instructions on the wiki page:
724
 
http://bazaar-vcs.org/BzrWin32Installer
725
 
 
726
 
 
727
478
:: vim: ft=rst tw=74 ai