~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/HACKING.txt

  • Committer: Andrew Bennetts
  • Date: 2010-07-29 11:17:57 UTC
  • mfrom: (5050.3.17 2.2)
  • mto: This revision was merged to the branch mainline in revision 5365.
  • Revision ID: andrew.bennetts@canonical.com-20100729111757-018h3pcefo7z0dnq
Merge lp:bzr/2.2 into lp:bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
73
73
Bazaar Development in a Nutshell
74
74
================================
75
75
 
76
 
.. was from http://wiki.bazaar.canonical.com/BzrGivingBack
 
76
.. was from bazaar-vcs.org/BzrGivingBack
77
77
 
78
78
One of the fun things about working on a version control system like Bazaar is
79
79
that the users have a high level of proficiency in contributing back into
89
89
 
90
90
 $ bzr init-repo ~/bzr
91
91
 $ cd ~/bzr
92
 
 $ bzr branch lp:bzr bzr.dev
 
92
 $ bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev
93
93
 
94
94
Now make your own branch::
95
95
 
117
117
`your_lp_username`.  You can push your branch to Launchpad directly from
118
118
Bazaar::
119
119
 
120
 
  $ bzr push lp:~<your_lp_username>/bzr/meaningful_name_here
 
120
  $ bzr push lp:~your_lp_username/bzr/meaningful_name_here
121
121
 
122
122
After you have pushed your branch, you will need to propose it for merging to
123
123
the Bazaar trunk.  Go to
124
 
<https://launchpad.net/~<your_lp_username>/bzr/meaningful_name_here> and choose
125
 
"Propose for merging into another branch".  Select "lp:bzr" to hand
 
124
<https://launchpad.net/your_lp_username/bzr/meaningful_name_here> and choose
 
125
"Propose for merging into another branch".  Select "~bzr/bzr/trunk" to hand
126
126
your changes off to the Bazaar developers for review and merging.
127
127
 
128
128
Alternatively, after pushing you can use the ``lp-propose`` command to 
224
224
* create a local copy of the main development branch (bzr.dev) by using
225
225
  this command::
226
226
 
227
 
    bzr branch lp:bzr bzr.dev
 
227
    bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev
228
228
 
229
229
* keep your copy of bzr.dev pristine (by not developing in it) and keep
230
230
  it up to date (by using bzr pull)
242
242
Navigating the Code Base
243
243
========================
244
244
 
245
 
.. Was at <http://wiki.bazaar.canonical.com/NewDeveloperIntroduction>
 
245
.. Was at <http://bazaar-vcs.org/NewDeveloperIntroduction>
246
246
 
247
247
Some of the key files in this directory are:
248
248
 
254
254
    This file covers a brief introduction to Bazaar and lists some of its
255
255
    key features.
256
256
 
 
257
NEWS
 
258
    Summary of changes in each Bazaar release that can affect users or
 
259
    plugin developers.
 
260
 
257
261
setup.py
258
262
    Installs Bazaar system-wide or to your home directory.  To perform
259
263
    development work on Bazaar it is not required to run this file - you
281
285
    Documentation specifically targeted at Bazaar and plugin developers.
282
286
    (Including this document.)
283
287
 
284
 
doc/en/release-notes/
285
 
 
286
 
    Detailed changes in each Bazaar release (there is one file by series:
287
 
    bzr-2.3.txt, bzr-2.4.txt, etc) that can affect users or plugin
288
 
    developers.
289
 
 
290
 
doc/en/whats-new/
291
 
 
292
 
    High-level summaries of changes in each Bazaar release (there is one
293
 
    file by series: whats-new-in-2.3.txt, whats-new-in-2.4.txt, etc).
294
288
 
295
289
 
296
290
Automatically-generated API reference information is available at
365
359
can't fix.
366
360
 
367
361
 
 
362
Getting Input
 
363
=============
 
364
 
 
365
Processing Command Lines
 
366
------------------------
 
367
 
 
368
bzrlib has a standard framework for parsing command lines and calling
 
369
processing routines associated with various commands. See builtins.py
 
370
for numerous examples.
 
371
 
 
372
 
 
373
Standard Parameter Types
 
374
------------------------
 
375
 
 
376
There are some common requirements in the library: some parameters need to be
 
377
unicode safe, some need byte strings, and so on. At the moment we have
 
378
only codified one specific pattern: Parameters that need to be unicode
 
379
should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
 
380
input into unicode in a consistent fashion, allowing trivial strings to be
 
381
used for programmer convenience, but not performing unpredictably in the
 
382
presence of different locales.
 
383
 
 
384
 
 
385
Writing Output
 
386
==============
 
387
 
 
388
(The strategy described here is what we want to get to, but it's not
 
389
consistently followed in the code at the moment.)
 
390
 
 
391
bzrlib is intended to be a generically reusable library.  It shouldn't
 
392
write messages to stdout or stderr, because some programs that use it
 
393
might want to display that information through a GUI or some other
 
394
mechanism.
 
395
 
 
396
We can distinguish two types of output from the library:
 
397
 
 
398
 1. Structured data representing the progress or result of an
 
399
    operation.  For example, for a commit command this will be a list
 
400
    of the modified files and the finally committed revision number
 
401
    and id.
 
402
 
 
403
    These should be exposed either through the return code or by calls
 
404
    to a callback parameter.
 
405
 
 
406
    A special case of this is progress indicators for long-lived
 
407
    operations, where the caller should pass a ProgressBar object.
 
408
 
 
409
 2. Unstructured log/debug messages, mostly for the benefit of the
 
410
    developers or users trying to debug problems.  This should always
 
411
    be sent through ``bzrlib.trace`` and Python ``logging``, so that
 
412
    it can be redirected by the client.
 
413
 
 
414
The distinction between the two is a bit subjective, but in general if
 
415
there is any chance that a library would want to see something as
 
416
structured data, we should make it so.
 
417
 
 
418
The policy about how output is presented in the text-mode client
 
419
should be only in the command-line tool.
 
420
 
 
421
 
 
422
Progress and Activity Indications
 
423
---------------------------------
 
424
 
 
425
bzrlib has a way for code to display to the user that stuff is happening
 
426
during a long operation.  There are two particular types: *activity* which
 
427
means that IO is happening on a Transport, and *progress* which means that
 
428
higher-level application work is occurring.  Both are drawn together by
 
429
the `ui_factory`.
 
430
 
 
431
Transport objects are responsible for calling `report_transport_activity`
 
432
when they do IO.
 
433
 
 
434
Progress uses a model/view pattern: application code acts on a
 
435
`ProgressTask` object, which notifies the UI when it needs to be
 
436
displayed.  Progress tasks form a stack.  To create a new progress task on
 
437
top of the stack, call `bzrlib.ui.ui_factory.nested_progress_bar()`, then
 
438
call `update()` on the returned ProgressTask.  It can be updated with just
 
439
a text description, with a numeric count, or with a numeric count and
 
440
expected total count.  If an expected total count is provided the view
 
441
can show the progress moving along towards the expected total.
 
442
 
 
443
The user should call `finish` on the `ProgressTask` when the logical
 
444
operation has finished, so it can be removed from the stack.
 
445
 
 
446
Progress tasks have a complex relationship with generators: it's a very
 
447
good place to use them, but because python2.4 does not allow ``finally``
 
448
blocks in generators it's hard to clean them up properly.  In this case
 
449
it's probably better to have the code calling the generator allocate a
 
450
progress task for its use and then call `finalize` when it's done, which
 
451
will close it if it was not already closed.  The generator should also
 
452
finish the progress task when it exits, because it may otherwise be a long
 
453
time until the finally block runs.
 
454
 
 
455
 
 
456
Message guidelines
 
457
------------------
 
458
 
 
459
When filenames or similar variables are presented inline within a message,
 
460
they should be enclosed in double quotes (ascii 0x22, not chiral unicode
 
461
quotes)::
 
462
 
 
463
  bzr: ERROR: No such file "asdf"
 
464
 
 
465
When we print just a list of filenames there should not be any quoting:
 
466
see `bug 544297`_.
 
467
 
 
468
.. _bug 544297: https://bugs.launchpad.net/bugs/544297
 
469
 
 
470
https://wiki.ubuntu.com/UnitsPolicy provides a good explanation about
 
471
which unit should be used when. Roughly speaking, IEC standard applies
 
472
for base-2 units and SI standard applies for base-10 units:
 
473
 
 
474
* for network bandwidth and disk sizes, use base-10 (Mbits/s, kB/s, GB)
 
475
 
 
476
* for RAM sizes, use base-2 (GiB, TiB)
 
477
 
 
478
 
 
479
 
 
480
Displaying help
 
481
===============
 
482
 
 
483
Bazaar has online help for various topics through ``bzr help COMMAND`` or
 
484
equivalently ``bzr command -h``.  We also have help on command options,
 
485
and on other help topics.  (See ``help_topics.py``.)
 
486
 
 
487
As for python docstrings, the first paragraph should be a single-sentence
 
488
synopsis of the command. These are user-visible and should be prefixed with
 
489
``__doc__ =`` so help works under ``python -OO`` with docstrings stripped.
 
490
 
 
491
The help for options should be one or more proper sentences, starting with
 
492
a capital letter and finishing with a full stop (period).
 
493
 
 
494
All help messages and documentation should have two spaces between
 
495
sentences.
 
496
 
 
497
 
 
498
Handling Errors and Exceptions
 
499
==============================
 
500
 
 
501
Commands should return non-zero when they encounter circumstances that
 
502
the user should really pay attention to - which includes trivial shell
 
503
pipelines.
 
504
 
 
505
Recommended values are:
 
506
 
 
507
    0. OK.
 
508
    1. Conflicts in merge-like operations, or changes are present in
 
509
       diff-like operations.
 
510
    2. Unrepresentable diff changes (i.e. binary files that we cannot show
 
511
       a diff of).
 
512
    3. An error or exception has occurred.
 
513
    4. An internal error occurred (one that shows a traceback.)
 
514
 
 
515
Errors are handled through Python exceptions. Exceptions should be defined
 
516
inside bzrlib.errors, so that we can see the whole tree at a glance.
 
517
 
 
518
We broadly classify errors as either being either internal or not,
 
519
depending on whether ``internal_error`` is set or not.  If we think it's our
 
520
fault, we show a backtrace, an invitation to report the bug, and possibly
 
521
other details.  This is the default for errors that aren't specifically
 
522
recognized as being caused by a user error.  Otherwise we show a briefer
 
523
message, unless -Derror was given.
 
524
 
 
525
Many errors originate as "environmental errors" which are raised by Python
 
526
or builtin libraries -- for example IOError.  These are treated as being
 
527
our fault, unless they're caught in a particular tight scope where we know
 
528
that they indicate a user errors.  For example if the repository format
 
529
is not found, the user probably gave the wrong path or URL.  But if one of
 
530
the files inside the repository is not found, then it's our fault --
 
531
either there's a bug in bzr, or something complicated has gone wrong in
 
532
the environment that means one internal file was deleted.
 
533
 
 
534
Many errors are defined in ``bzrlib/errors.py`` but it's OK for new errors
 
535
to be added near the place where they are used.
 
536
 
 
537
Exceptions are formatted for the user by conversion to a string
 
538
(eventually calling their ``__str__`` method.)  As a convenience the
 
539
``._fmt`` member can be used as a template which will be mapped to the
 
540
error's instance dict.
 
541
 
 
542
New exception classes should be defined when callers might want to catch
 
543
that exception specifically, or when it needs a substantially different
 
544
format string.
 
545
 
 
546
#. If it is something that a caller can recover from, a custom exception
 
547
   is reasonable.
 
548
 
 
549
#. If it is a data consistency issue, using a builtin like
 
550
   ``ValueError``/``TypeError`` is reasonable.
 
551
 
 
552
#. If it is a programmer error (using an api incorrectly)
 
553
   ``AssertionError`` is reasonable.
 
554
 
 
555
#. Otherwise, use ``BzrError`` or ``InternalBzrError``.
 
556
 
 
557
Exception strings should start with a capital letter and should not have a
 
558
final fullstop.  If long, they may contain newlines to break the text.
 
559
 
 
560
 
 
561
 
 
562
Documenting Changes
 
563
===================
 
564
 
 
565
When you change bzrlib, please update the relevant documentation for the
 
566
change you made: Changes to commands should update their help, and
 
567
possibly end user tutorials; changes to the core library should be
 
568
reflected in API documentation.
 
569
 
 
570
NEWS File
 
571
---------
 
572
 
 
573
If you make a user-visible change, please add a note to the NEWS file.
 
574
The description should be written to make sense to someone who's just
 
575
a user of bzr, not a developer: new functions or classes shouldn't be
 
576
mentioned, but new commands, changes in behaviour or fixed nontrivial
 
577
bugs should be listed.  See the existing entries for an idea of what
 
578
should be done.
 
579
 
 
580
Within each release, entries in the news file should have the most
 
581
user-visible changes first.  So the order should be approximately:
 
582
 
 
583
 * changes to existing behaviour - the highest priority because the
 
584
   user's existing knowledge is incorrect
 
585
 * new features - should be brought to their attention
 
586
 * bug fixes - may be of interest if the bug was affecting them, and
 
587
   should include the bug number if any
 
588
 * major documentation changes, including fixed documentation bugs
 
589
 * changes to internal interfaces
 
590
 
 
591
People who made significant contributions to each change are listed in
 
592
parenthesis.  This can include reporting bugs (particularly with good
 
593
details or reproduction recipes), submitting patches, etc.
 
594
 
 
595
To help with merging, NEWS entries should be sorted lexicographically
 
596
within each section.
 
597
 
 
598
Commands
 
599
--------
 
600
 
 
601
The docstring of a command is used by ``bzr help`` to generate help output
 
602
for the command. The list 'takes_options' attribute on a command is used by
 
603
``bzr help`` to document the options for the command - the command
 
604
docstring does not need to document them. Finally, the '_see_also'
 
605
attribute on a command can be used to reference other related help topics.
 
606
 
 
607
API Documentation
 
608
-----------------
 
609
 
 
610
Functions, methods, classes and modules should have docstrings
 
611
describing how they are used.
 
612
 
 
613
The first line of the docstring should be a self-contained sentence.
 
614
 
 
615
For the special case of Command classes, this acts as the user-visible
 
616
documentation shown by the help command.
 
617
 
 
618
The docstrings should be formatted as reStructuredText_ (like this
 
619
document), suitable for processing using the epydoc_ tool into HTML
 
620
documentation.
 
621
 
 
622
.. _reStructuredText: http://docutils.sourceforge.net/rst.html
 
623
.. _epydoc: http://epydoc.sourceforge.net/
 
624
 
 
625
 
368
626
General Guidelines
369
627
==================
370
628
 
436
694
be disabled if necessary by setting the environment variable
437
695
``BZR_SIGQUIT_PDB=0``.
438
696
 
439
 
All tests inheriting from bzrlib.tests.TestCase can use ``self.debug()``
440
 
instead of the longer ``import pdb; pdb.set_trace()``. The former also works
441
 
when ``stdin/stdout`` are redirected (by using the original ``stdin/stdout``
442
 
file handles at the start of the ``bzr`` script) while the later doesn't.
443
 
``bzrlib.debug.set_trace()`` also uses the original ``stdin/stdout`` file
444
 
handles.
445
697
 
446
698
Debug Flags
447
699
===========
523
775
Because Transports work in URLs (as defined earlier), printing the raw URL
524
776
to the user is usually less than optimal. Characters outside the standard
525
777
set are printed as escapes, rather than the real character, and local
526
 
paths would be printed as ``file://`` URLs. The function
 
778
paths would be printed as ``file://`` urls. The function
527
779
``unescape_for_display`` attempts to unescape a URL, such that anything
528
780
that cannot be printed in the current encoding stays an escaped URL, but
529
781
valid characters are generated where possible.
588
840
stuff covered above, "core" developers have responsibility for:
589
841
 
590
842
* reviewing changes
 
843
* reviewing blueprints
591
844
* planning releases
592
845
* managing releases (see `Releasing Bazaar <http://doc.bazaar.canonical.com/developers/releasing.html>`_)
593
846