~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to doc/developers/HACKING.txt

Merge cleanup into texinfo

Show diffs side-by-side

added added

removed removed

Lines of Context:
12
12
document, send a merge request or new text to the mailing list.
13
13
 
14
14
The latest developer documentation can be found online at
15
 
http://doc.bazaar-vcs.org/developers/.
16
 
 
 
15
http://doc.bazaar.canonical.com/developers/.
17
16
 
18
17
Getting Started
19
18
###############
29
28
To answer these questions and more, take a moment to explore the
30
29
overall Bazaar Platform. Here are some links to browse:
31
30
 
32
 
* The Plugins page on the Wiki - http://bazaar-vcs.org/BzrPlugins
 
31
* The Plugins page on the Wiki - http://wiki.bazaar.canonical.com/BzrPlugins
33
32
 
34
33
* The Bazaar product family on Launchpad - https://launchpad.net/bazaar
35
34
 
36
35
* Bug Tracker for the core product - https://bugs.launchpad.net/bzr/
37
36
 
38
 
* Blueprint Tracker for the core product - https://blueprints.launchpad.net/bzr/
39
 
 
40
37
If nothing else, perhaps you'll find inspiration in how other developers
41
38
have solved their challenges.
42
39
 
55
52
 
56
53
There is a very active community around Bazaar. Mostly we meet on IRC
57
54
(#bzr on irc.freenode.net) and on the mailing list. To join the Bazaar
58
 
community, see http://bazaar-vcs.org/BzrSupport.
 
55
community, see http://wiki.bazaar.canonical.com/BzrSupport.
59
56
 
60
57
If you are planning to make a change, it's a very good idea to mention it
61
58
on the IRC channel and/or on the mailing list. There are many advantages
128
125
"Propose for merging into another branch".  Select "~bzr/bzr/trunk" to hand
129
126
your changes off to the Bazaar developers for review and merging.
130
127
 
 
128
Alternatively, after pushing you can use the ``lp-propose`` command to 
 
129
create the merge proposal.
 
130
 
131
131
Using a meaningful name for your branch will help you and the reviewer(s)
132
132
better track the submission. Use a very succint description of your submission
133
133
and prefix it with bug number if needed (lp:~mbp/bzr/484558-merge-directory
135
135
(lp:~jameinel/bzr/export-file-511987).
136
136
 
137
137
 
 
138
Review cover letters
 
139
--------------------
 
140
 
 
141
Please put a "cover letter" on your merge request explaining:
 
142
 
 
143
* the reason **why** you're making this change
 
144
 
 
145
* **how** this change achieves this purpose
 
146
 
 
147
* anything else you may have fixed in passing
 
148
 
 
149
* anything significant that you thought of doing, such as a more
 
150
  extensive fix or a different approach, but didn't or couldn't do now
 
151
 
 
152
A good cover letter makes reviewers' lives easier because they can decide
 
153
from the letter whether they agree with the purpose and approach, and then
 
154
assess whether the patch actually does what the cover letter says.
 
155
Explaining any "drive-by fixes" or roads not taken may also avoid queries
 
156
from the reviewer.  All in all this should give faster and better reviews.
 
157
Sometimes writing the cover letter helps the submitter realize something
 
158
else they need to do.  The size of the cover letter should be proportional
 
159
to the size and complexity of the patch.
 
160
 
 
161
 
138
162
Why make a local copy of bzr.dev?
139
163
---------------------------------
140
164
 
177
201
 
178
202
* Launchpad - https://launchpad.net/
179
203
 
180
 
* Bazaar - http://bazaar-vcs.org/
181
 
 
182
 
* Bundle Buggy - http://bundlebuggy.aaronbentley.com/
 
204
* Bazaar - http://bazaar.canonical.com/
183
205
 
184
206
* Patch Queue Manager - https://launchpad.net/pqm/
185
207
 
186
 
For further information, see http://bazaar-vcs.org/BzrDevelopment.
 
208
For further information, see <http://wiki.bazaar.canonical.com/BzrDevelopment>.
187
209
 
188
210
 
189
211
 
192
214
================================================
193
215
 
194
216
Bazaar supports many ways of organising your work. See
195
 
http://bazaar-vcs.org/SharedRepositoryLayouts for a summary of the
 
217
http://wiki.bazaar.canonical.com/SharedRepositoryLayouts for a summary of the
196
218
popular alternatives.
197
219
 
198
220
Of course, the best choice for you will depend on numerous factors:
269
291
<http://starship.python.net/crew/mwh/bzrlibapi/>.
270
292
 
271
293
See also the `Bazaar Architectural Overview
272
 
<http://doc.bazaar-vcs.org/developers/overview.html>`_.
273
 
 
274
 
 
275
 
The Code Review Process
276
 
#######################
277
 
 
278
 
All code changes coming in to Bazaar are reviewed by someone else.
279
 
Normally changes by core contributors are reviewed by one other core
280
 
developer, and changes from other people are reviewed by two core
281
 
developers.  Use intelligent discretion if the patch is trivial.
282
 
 
283
 
Good reviews do take time. They also regularly require a solid
284
 
understanding of the overall code base. In practice, this means a small
285
 
number of people often have a large review burden - with knowledge comes
286
 
responsibility. No one likes their merge requests sitting in a queue going
287
 
nowhere, so reviewing sooner rather than later is strongly encouraged.
288
 
 
289
 
 
290
 
 
291
 
 
292
 
 
293
 
Review cover letters
294
 
====================
295
 
 
296
 
Please put a "cover letter" on your merge request explaining:
297
 
 
298
 
* the reason **why** you're making this change
299
 
 
300
 
* **how** this change achieves this purpose
301
 
 
302
 
* anything else you may have fixed in passing
303
 
 
304
 
* anything significant that you thought of doing, such as a more
305
 
  extensive fix or a different approach, but didn't or couldn't do now
306
 
 
307
 
A good cover letter makes reviewers' lives easier because they can decide
308
 
from the letter whether they agree with the purpose and approach, and then
309
 
assess whether the patch actually does what the cover letter says.
310
 
Explaining any "drive-by fixes" or roads not taken may also avoid queries
311
 
from the reviewer.  All in all this should give faster and better reviews.
312
 
Sometimes writing the cover letter helps the submitter realize something
313
 
else they need to do.  The size of the cover letter should be proportional
314
 
to the size and complexity of the patch.
315
 
 
316
 
 
317
 
Reviewing proposed changes
318
 
==========================
319
 
 
320
 
Anyone is welcome to review code, and reply to the thread with their
321
 
opinion or comments.
322
 
 
323
 
The simplest way to review a proposed change is to just read the patch on
324
 
the list or in Bundle Buggy.  For more complex changes it may be useful
325
 
to make a new working tree or branch from trunk, and merge the proposed
326
 
change into it, so you can experiment with the code or look at a wider
327
 
context.
328
 
 
329
 
There are three main requirements for code to get in:
330
 
 
331
 
* Doesn't reduce test coverage: if it adds new methods or commands,
332
 
  there should be tests for them.  There is a good test framework
333
 
  and plenty of examples to crib from, but if you are having trouble
334
 
  working out how to test something feel free to post a draft patch
335
 
  and ask for help.
336
 
 
337
 
* Doesn't reduce design clarity, such as by entangling objects
338
 
  we're trying to separate.  This is mostly something the more
339
 
  experienced reviewers need to help check.
340
 
 
341
 
* Improves bugs, features, speed, or code simplicity.
342
 
 
343
 
Code that goes in should not degrade any of these aspects.  Patches are
344
 
welcome that only cleanup the code without changing the external
345
 
behaviour.  The core developers take care to keep the code quality high
346
 
and understandable while recognising that perfect is sometimes the enemy
347
 
of good.
348
 
 
349
 
It is easy for reviews to make people notice other things which should be
350
 
fixed but those things should not hold up the original fix being accepted.
351
 
New things can easily be recorded in the Bug Tracker instead.
352
 
 
353
 
It's normally much easier to review several smaller patches than one large
354
 
one.  You might want to use ``bzr-loom`` to maintain threads of related
355
 
work, or submit a preparatory patch that will make your "real" change
356
 
easier.
357
 
 
358
 
 
359
 
Checklist for reviewers
360
 
=======================
361
 
 
362
 
* Do you understand what the code's doing and why?
363
 
 
364
 
* Will it perform reasonably for large inputs, both in memory size and
365
 
  run time?  Are there some scenarios where performance should be
366
 
  measured?
367
 
 
368
 
* Is it tested, and are the tests at the right level?  Are there both
369
 
  blackbox (command-line level) and API-oriented tests?
370
 
 
371
 
* If this change will be visible to end users or API users, is it
372
 
  appropriately documented in NEWS?
373
 
 
374
 
* Does it meet the coding standards below?
375
 
 
376
 
* If it changes the user-visible behaviour, does it update the help
377
 
  strings and user documentation?
378
 
 
379
 
* If it adds a new major concept or standard practice, does it update the
380
 
  developer documentation?
381
 
 
382
 
* (your ideas here...)
383
 
 
384
 
 
385
 
Reviews on Launchpad
386
 
====================
387
 
 
388
 
From May 2009 on, we prefer people to propose code reviews through
389
 
Launchpad.
390
 
 
391
 
 * <https://launchpad.net/+tour/code-review>
392
 
 
393
 
 * <https://help.launchpad.net/Code/Review>
394
 
 
395
 
Anyone can propose or comment on a merge proposal just by creating a
396
 
Launchpad account.
397
 
 
398
 
There are two ways to create a new merge proposal: through the web
399
 
interface or by email.
400
 
 
401
 
 
402
 
Proposing a merge through the web
403
 
---------------------------------
404
 
 
405
 
To create the proposal through the web, first push your branch to Launchpad.
406
 
For example, a branch dealing with documentation belonging to the Launchpad
407
 
User mbp could be pushed as ::
408
 
 
409
 
  bzr push lp:~mbp/bzr/doc
410
 
 
411
 
Then go to the branch's web page, which in this case would be
412
 
<https://code.launchpad.net/~mbp/bzr/doc>.  You can simplify this step by just
413
 
running ::
414
 
 
415
 
  bzr lp-open
416
 
 
417
 
You can then click "Propose for merging into another branch", and enter your
418
 
cover letter (see above) into the web form.  Typically you'll want to merge
419
 
into ``~bzr/bzr/trunk`` which will be the default; you might also want to
420
 
nominate merging into a release branch for a bug fix.  There is the option to
421
 
specify a specific reviewer or type of review, and you shouldn't normally
422
 
change those.
423
 
 
424
 
Submitting the form takes you to the new page about the merge proposal
425
 
containing the diff of the changes, comments by interested people, and
426
 
controls to comment or vote on the change.
427
 
 
428
 
Proposing a merge by mail
429
 
-------------------------
430
 
 
431
 
To propose a merge by mail, send a bundle to ``merge@code.launchpad.net``.
432
 
 
433
 
You can generate a merge request like this::
434
 
 
435
 
  bzr send -o bug-1234.diff
436
 
 
437
 
``bzr send`` can also send mail directly if you prefer; see the help.
438
 
 
439
 
Reviewing changes
440
 
-----------------
441
 
 
442
 
From <https://code.launchpad.net/bzr/+activereviews> you can see all
443
 
currently active reviews, and choose one to comment on.  This page also
444
 
shows proposals that are now approved and should be merged by someone with
445
 
PQM access.
446
 
 
447
 
 
448
 
Reviews through Bundle Buggy
449
 
============================
450
 
 
451
 
The Bundle Buggy tool used up to May 2009 is still available as a review
452
 
mechanism.
453
 
 
454
 
Sending patches for review
455
 
--------------------------
456
 
 
457
 
If you'd like to propose a change, please post to the
458
 
bazaar@lists.canonical.com list with a bundle, patch, or link to a
459
 
branch. Put ``[PATCH]`` or ``[MERGE]`` in the subject so Bundle Buggy
460
 
can pick it out, and explain the change in the email message text.
461
 
Remember to update the NEWS file as part of your change if it makes any
462
 
changes visible to users or plugin developers. Please include a diff
463
 
against mainline if you're giving a link to a branch.
464
 
 
465
 
You can generate a merge request like this::
466
 
 
467
 
  bzr send -o bug-1234.patch
468
 
 
469
 
A ``.patch`` extension is recommended instead of .bundle as many mail clients
470
 
will send the latter as a binary file.
471
 
 
472
 
``bzr send`` can also send mail directly if you prefer; see the help.
473
 
 
474
 
Please do **NOT** put [PATCH] or [MERGE] in the subject line if you don't
475
 
want it to be merged. If you want comments from developers rather than
476
 
to be merged, you can put ``[RFC]`` in the subject line.
477
 
 
478
 
If this change addresses a bug, please put the bug number in the subject
479
 
line too, in the form ``[#1]`` so that Bundle Buggy can recognize it.
480
 
 
481
 
If the change is intended for a particular release mark that in the
482
 
subject too, e.g. ``[1.6]``.
483
 
Anyone can "vote" on the mailing list by expressing an opinion. Core
484
 
developers can also vote using Bundle Buggy. Here are the voting codes and
485
 
their explanations.
486
 
 
487
 
:approve:  Reviewer wants this submission merged.
488
 
:tweak:    Reviewer wants this submission merged with small changes. (No
489
 
  re-review required.)
490
 
:abstain:  Reviewer does not intend to vote on this patch.
491
 
:resubmit: Please make changes and resubmit for review.
492
 
:reject:   Reviewer doesn't want this kind of change merged.
493
 
:comment:  Not really a vote. Reviewer just wants to comment, for now.
494
 
 
495
 
If a change gets two approvals from core reviewers, and no rejections,
496
 
then it's OK to come in.  Any of the core developers can bring it into the
497
 
bzr.dev trunk and backport it to maintenance branches if required.  The
498
 
Release Manager will merge the change into the branch for a pending
499
 
release, if any. As a guideline, core developers usually merge their own
500
 
changes and volunteer to merge other contributions if they were the second
501
 
reviewer to agree to a change.
502
 
 
503
 
To track the progress of proposed changes, use Bundle Buggy. See
504
 
http://bundlebuggy.aaronbentley.com/help for a link to all the
505
 
outstanding merge requests together with an explanation of the columns.
506
 
Bundle Buggy will also mail you a link to track just your change.
507
 
 
508
 
Coding Style Guidelines
509
 
#######################
510
 
 
511
 
hasattr and getattr
512
 
===================
513
 
 
514
 
``hasattr`` should not be used because it swallows exceptions including
515
 
``KeyboardInterrupt``.  Instead, say something like ::
516
 
 
517
 
  if getattr(thing, 'name', None) is None
518
 
 
519
 
 
520
 
Code layout
521
 
===========
522
 
 
523
 
Please write PEP-8__ compliant code.
524
 
 
525
 
__ http://www.python.org/peps/pep-0008.html
526
 
 
527
 
One often-missed requirement is that the first line of docstrings
528
 
should be a self-contained one-sentence summary.
529
 
 
530
 
We use 4 space indents for blocks, and never use tab characters.  (In vim,
531
 
``set expandtab``.)
532
 
 
533
 
Trailing white space should be avoided, but is allowed.
534
 
You should however not make lots of unrelated white space changes.
535
 
 
536
 
Unix style newlines (LF) are used.
537
 
 
538
 
Each file must have a newline at the end of it.
539
 
 
540
 
Lines should be no more than 79 characters if at all possible.
541
 
Lines that continue a long statement may be indented in either of
542
 
two ways:
543
 
 
544
 
within the parenthesis or other character that opens the block, e.g.::
545
 
 
546
 
    my_long_method(arg1,
547
 
                   arg2,
548
 
                   arg3)
549
 
 
550
 
or indented by four spaces::
551
 
 
552
 
    my_long_method(arg1,
553
 
        arg2,
554
 
        arg3)
555
 
 
556
 
The first is considered clearer by some people; however it can be a bit
557
 
harder to maintain (e.g. when the method name changes), and it does not
558
 
work well if the relevant parenthesis is already far to the right.  Avoid
559
 
this::
560
 
 
561
 
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
562
 
                                                     two,
563
 
                                                     three)
564
 
 
565
 
but rather ::
566
 
 
567
 
     self.legbone.kneebone.shinbone.toebone.shake_it(one,
568
 
         two,
569
 
         three)
570
 
 
571
 
or ::
572
 
 
573
 
     self.legbone.kneebone.shinbone.toebone.shake_it(
574
 
         one, two, three)
575
 
 
576
 
For long lists, we like to add a trailing comma and put the closing
577
 
character on the following line.  This makes it easier to add new items in
578
 
future::
579
 
 
580
 
    from bzrlib.goo import (
581
 
        jam,
582
 
        jelly,
583
 
        marmalade,
584
 
        )
585
 
 
586
 
There should be spaces between function parameters, but not between the
587
 
keyword name and the value::
588
 
 
589
 
    call(1, 3, cheese=quark)
590
 
 
591
 
In emacs::
592
 
 
593
 
    ;(defface my-invalid-face
594
 
    ;  '((t (:background "Red" :underline t)))
595
 
    ;  "Face used to highlight invalid constructs or other uglyties"
596
 
    ;  )
597
 
 
598
 
    (defun my-python-mode-hook ()
599
 
     ;; setup preferred indentation style.
600
 
     (setq fill-column 79)
601
 
     (setq indent-tabs-mode nil) ; no tabs, never, I will not repeat
602
 
    ;  (font-lock-add-keywords 'python-mode
603
 
    ;                         '(("^\\s *\t" . 'my-invalid-face) ; Leading tabs
604
 
    ;                            ("[ \t]+$" . 'my-invalid-face)  ; Trailing spaces
605
 
    ;                            ("^[ \t]+$" . 'my-invalid-face)); Spaces only
606
 
    ;                          )
607
 
     )
608
 
 
609
 
    (add-hook 'python-mode-hook 'my-python-mode-hook)
610
 
 
611
 
The lines beginning with ';' are comments. They can be activated
612
 
if one want to have a strong notice of some tab/space usage
613
 
violations.
614
 
 
615
 
 
616
 
Module Imports
617
 
==============
618
 
 
619
 
* Imports should be done at the top-level of the file, unless there is
620
 
  a strong reason to have them lazily loaded when a particular
621
 
  function runs.  Import statements have a cost, so try to make sure
622
 
  they don't run inside hot functions.
623
 
 
624
 
* Module names should always be given fully-qualified,
625
 
  i.e. ``bzrlib.hashcache`` not just ``hashcache``.
626
 
 
627
 
 
628
 
Naming
629
 
======
630
 
 
631
 
Functions, methods or members that are relatively private are given
632
 
a leading underscore prefix.  Names without a leading underscore are
633
 
public not just across modules but to programmers using bzrlib as an
634
 
API.
635
 
 
636
 
We prefer class names to be concatenated capital words (``TestCase``)
637
 
and variables, methods and functions to be lowercase words joined by
638
 
underscores (``revision_id``, ``get_revision``).
639
 
 
640
 
For the purposes of naming some names are treated as single compound
641
 
words: "filename", "revno".
642
 
 
643
 
Consider naming classes as nouns and functions/methods as verbs.
644
 
 
645
 
Try to avoid using abbreviations in names, because there can be
646
 
inconsistency if other people use the full name.
647
 
 
648
 
 
649
 
Standard Names
650
 
==============
651
 
 
652
 
``revision_id`` not ``rev_id`` or ``revid``
653
 
 
654
 
Functions that transform one thing to another should be named ``x_to_y``
655
 
(not ``x2y`` as occurs in some old code.)
656
 
 
657
 
 
658
 
Destructors
659
 
===========
660
 
 
661
 
Python destructors (``__del__``) work differently to those of other
662
 
languages.  In particular, bear in mind that destructors may be called
663
 
immediately when the object apparently becomes unreferenced, or at some
664
 
later time, or possibly never at all.  Therefore we have restrictions on
665
 
what can be done inside them.
666
 
 
667
 
 0. If you think you need to use a ``__del__`` method ask another
668
 
    developer for alternatives.  If you do need to use one, explain
669
 
    why in a comment.
670
 
 
671
 
 1. Never rely on a ``__del__`` method running.  If there is code that
672
 
    must run, do it from a ``finally`` block instead.
673
 
 
674
 
 2. Never ``import`` from inside a ``__del__`` method, or you may crash the
675
 
    interpreter!!
676
 
 
677
 
 3. In some places we raise a warning from the destructor if the object
678
 
    has not been cleaned up or closed.  This is considered OK: the warning
679
 
    may not catch every case but it's still useful sometimes.
680
 
 
681
 
 
682
 
Cleanup methods
683
 
===============
684
 
 
685
 
Often when something has failed later code, including cleanups invoked
686
 
from ``finally`` blocks, will fail too.  These secondary failures are
687
 
generally uninteresting compared to the original exception.  So use the
688
 
``only_raises`` decorator (from ``bzrlib.decorators``) for methods that
689
 
are typically called in ``finally`` blocks, such as ``unlock`` methods.
690
 
For example, ``@only_raises(LockNotHeld, LockBroken)``.  All errors that
691
 
are unlikely to be a knock-on failure from a previous failure should be
692
 
allowed.
693
 
 
694
 
 
695
 
Factories
696
 
=========
697
 
 
698
 
In some places we have variables which point to callables that construct
699
 
new instances.  That is to say, they can be used a lot like class objects,
700
 
but they shouldn't be *named* like classes::
701
 
 
702
 
> I think that things named FooBar should create instances of FooBar when
703
 
> called. Its plain confusing for them to do otherwise. When we have
704
 
> something that is going to be used as a class - that is, checked for via
705
 
> isinstance or other such idioms, them I would call it foo_class, so that
706
 
> it is clear that a callable is not sufficient. If it is only used as a
707
 
> factory, then yes, foo_factory is what I would use.
708
 
 
709
 
 
710
 
Registries
711
 
==========
712
 
 
713
 
Several places in Bazaar use (or will use) a registry, which is a
714
 
mapping from names to objects or classes.  The registry allows for
715
 
loading in registered code only when it's needed, and keeping
716
 
associated information such as a help string or description.
717
 
 
718
 
 
719
 
InterObject and multiple dispatch
720
 
=================================
721
 
 
722
 
The ``InterObject`` provides for two-way `multiple dispatch`__: matching
723
 
up for example a source and destination repository to find the right way
724
 
to transfer data between them.
725
 
 
726
 
.. __: http://en.wikipedia.org/wiki/Multiple_dispatch
727
 
 
728
 
There is a subclass ``InterObject`` classes for each type of object that is
729
 
dispatched this way, e.g. ``InterRepository``.  Calling ``.get()`` on this
730
 
class will return an ``InterObject`` instance providing the best match for
731
 
those parameters, and this instance then has methods for operations
732
 
between the objects.
733
 
 
734
 
::
735
 
 
736
 
  inter = InterRepository.get(source_repo, target_repo)
737
 
  inter.fetch(revision_id)
738
 
 
739
 
``InterRepository`` also acts as a registry-like object for its
740
 
subclasses, and they can be added through ``.register_optimizer``.  The
741
 
right one to run is selected by asking each class, in reverse order of
742
 
registration, whether it ``.is_compatible`` with the relevant objects.
743
 
 
744
 
Lazy Imports
745
 
============
746
 
 
747
 
To make startup time faster, we use the ``bzrlib.lazy_import`` module to
748
 
delay importing modules until they are actually used. ``lazy_import`` uses
749
 
the same syntax as regular python imports. So to import a few modules in a
750
 
lazy fashion do::
751
 
 
752
 
  from bzrlib.lazy_import import lazy_import
753
 
  lazy_import(globals(), """
754
 
  import os
755
 
  import subprocess
756
 
  import sys
757
 
  import time
758
 
 
759
 
  from bzrlib import (
760
 
     errors,
761
 
     transport,
762
 
     revision as _mod_revision,
763
 
     )
764
 
  import bzrlib.transport
765
 
  import bzrlib.xml5
766
 
  """)
767
 
 
768
 
At this point, all of these exist as a ``ImportReplacer`` object, ready to
769
 
be imported once a member is accessed. Also, when importing a module into
770
 
the local namespace, which is likely to clash with variable names, it is
771
 
recommended to prefix it as ``_mod_<module>``. This makes it clearer that
772
 
the variable is a module, and these object should be hidden anyway, since
773
 
they shouldn't be imported into other namespaces.
774
 
 
775
 
While it is possible for ``lazy_import()`` to import members of a module
776
 
when using the ``from module import member`` syntax, it is recommended to
777
 
only use that syntax to load sub modules ``from module import submodule``.
778
 
This is because variables and classes can frequently be used without
779
 
needing a sub-member for example::
780
 
 
781
 
  lazy_import(globals(), """
782
 
  from module import MyClass
783
 
  """)
784
 
 
785
 
  def test(x):
786
 
      return isinstance(x, MyClass)
787
 
 
788
 
This will incorrectly fail, because ``MyClass`` is a ``ImportReplacer``
789
 
object, rather than the real class.
790
 
 
791
 
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
792
 
Because the replacer only knows about the original name, it is unable to
793
 
replace other variables. The ``ImportReplacer`` class will raise an
794
 
``IllegalUseOfScopeReplacer`` exception if it can figure out that this
795
 
happened. But it requires accessing a member more than once from the new
796
 
variable, so some bugs are not detected right away.
797
 
 
798
 
 
799
 
The Null revision
800
 
=================
801
 
 
802
 
The null revision is the ancestor of all revisions.  Its revno is 0, its
803
 
revision-id is ``null:``, and its tree is the empty tree.  When referring
804
 
to the null revision, please use ``bzrlib.revision.NULL_REVISION``.  Old
805
 
code sometimes uses ``None`` for the null revision, but this practice is
806
 
being phased out.
807
 
 
808
 
 
809
 
Object string representations
810
 
=============================
811
 
 
812
 
Python prints objects using their ``__repr__`` method when they are
813
 
written to logs, exception tracebacks, or the debugger.  We want
814
 
objects to have useful representations to help in determining what went
815
 
wrong.
816
 
 
817
 
If you add a new class you should generally add a ``__repr__`` method
818
 
unless there is an adequate method in a parent class.  There should be a
819
 
test for the repr.
820
 
 
821
 
Representations should typically look like Python constructor syntax, but
822
 
they don't need to include every value in the object and they don't need
823
 
to be able to actually execute.  They're to be read by humans, not
824
 
machines.  Don't hardcode the classname in the format, so that we get the
825
 
correct value if the method is inherited by a subclass.  If you're
826
 
printing attributes of the object, including strings, you should normally
827
 
use ``%r`` syntax (to call their repr in turn).
828
 
 
829
 
Try to avoid the representation becoming more than one or two lines long.
830
 
(But balance this against including useful information, and simplicity of
831
 
implementation.)
832
 
 
833
 
Because repr methods are often called when something has already gone
834
 
wrong, they should be written somewhat more defensively than most code.
835
 
The object may be half-initialized or in some other way in an illegal
836
 
state.  The repr method shouldn't raise an exception, or it may hide the
837
 
(probably more useful) underlying exception.
838
 
 
839
 
Example::
840
 
 
841
 
    def __repr__(self):
842
 
        return '%s(%r)' % (self.__class__.__name__,
843
 
                           self._transport)
844
 
 
845
 
 
846
 
Exception handling
847
 
==================
848
 
 
849
 
A bare ``except`` statement will catch all exceptions, including ones that
850
 
really should terminate the program such as ``MemoryError`` and
851
 
``KeyboardInterrupt``.  They should rarely be used unless the exception is
852
 
later re-raised.  Even then, think about whether catching just
853
 
``Exception`` (which excludes system errors in Python2.5 and later) would
854
 
be better.
855
 
 
856
 
 
857
 
Test coverage
858
 
=============
859
 
 
860
 
All code should be exercised by the test suite.  See the `Bazaar Testing
861
 
Guide <http://doc.bazaar-vcs.org/developers/testing.html>`_ for detailed
862
 
information about writing tests.
 
294
<http://doc.bazaar.canonical.com/developers/overview.html>`_.
863
295
 
864
296
 
865
297
Core Topics
1126
558
final fullstop.  If long, they may contain newlines to break the text.
1127
559
 
1128
560
 
1129
 
Assertions
1130
 
==========
1131
 
 
1132
 
Do not use the Python ``assert`` statement, either in tests or elsewhere.
1133
 
A source test checks that it is not used.  It is ok to explicitly raise
1134
 
AssertionError.
1135
 
 
1136
 
Rationale:
1137
 
 
1138
 
 * It makes the behaviour vary depending on whether bzr is run with -O
1139
 
   or not, therefore giving a chance for bugs that occur in one case or
1140
 
   the other, several of which have already occurred: assertions with
1141
 
   side effects, code which can't continue unless the assertion passes,
1142
 
   cases where we should give the user a proper message rather than an
1143
 
   assertion failure.
1144
 
 * It's not that much shorter than an explicit if/raise.
1145
 
 * It tends to lead to fuzzy thinking about whether the check is
1146
 
   actually needed or not, and whether it's an internal error or not
1147
 
 * It tends to cause look-before-you-leap patterns.
1148
 
 * It's unsafe if the check is needed to protect the integrity of the
1149
 
   user's data.
1150
 
 * It tends to give poor messages since the developer can get by with
1151
 
   no explanatory text at all.
1152
 
 * We can't rely on people always running with -O in normal use, so we
1153
 
   can't use it for tests that are actually expensive.
1154
 
 * Expensive checks that help developers are better turned on from the
1155
 
   test suite or a -D flag.
1156
 
 * If used instead of ``self.assert*()`` in tests it makes them falsely pass with -O.
1157
 
 
1158
561
 
1159
562
Documenting Changes
1160
563
===================
1378
781
valid characters are generated where possible.
1379
782
 
1380
783
 
1381
 
Portability Tips
1382
 
================
1383
 
 
1384
 
The ``bzrlib.osutils`` module has many useful helper functions, including
1385
 
some more portable variants of functions in the standard library.
1386
 
 
1387
 
In particular, don't use ``shutil.rmtree`` unless it's acceptable for it
1388
 
to fail on Windows if some files are readonly or still open elsewhere.
1389
 
Use ``bzrlib.osutils.rmtree`` instead.
1390
 
 
1391
 
 
1392
784
C Extension Modules
1393
785
===================
1394
786
 
1431
823
Making Installers for OS Windows
1432
824
================================
1433
825
To build a win32 installer, see the instructions on the wiki page:
1434
 
http://bazaar-vcs.org/BzrWin32Installer
1435
 
 
 
826
http://wiki.bazaar.canonical.com/BzrWin32Installer
1436
827
 
1437
828
Core Developer Tasks
1438
829
####################
1451
842
* reviewing changes
1452
843
* reviewing blueprints
1453
844
* planning releases
1454
 
* managing releases (see `Releasing Bazaar <http://doc.bazaar-vcs.org/developers/releasing.html>`_)
 
845
* managing releases (see `Releasing Bazaar <http://doc.bazaar.canonical.com/developers/releasing.html>`_)
1455
846
 
1456
847
.. note::
1457
848
  Removing barriers to community participation is a key reason for adopting
1478
869
energy by emailing the **bazaar-commits** list implicitly. To do this,
1479
870
install and configure the Email plugin. One way to do this is add these
1480
871
configuration settings to your central configuration file (e.g.
1481
 
``~/.bazaar/bazaar.conf`` on Linux)::
 
872
``~/.bazaar/bazaar.conf``)::
1482
873
 
1483
874
  [DEFAULT]
1484
875
  email = Joe Smith <joe.smith@internode.on.net>
1494
885
how to set it up and configure it.
1495
886
 
1496
887
 
1497
 
Submitting Changes
1498
 
==================
1499
 
 
1500
 
An Overview of PQM
1501
 
------------------
1502
 
 
1503
 
Of the many workflows supported by Bazaar, the one adopted for Bazaar
1504
 
development itself is known as "Decentralized with automatic gatekeeper".
1505
 
To repeat the explanation of this given on
1506
 
http://bazaar-vcs.org/Workflows:
1507
 
 
1508
 
.. pull-quote::
1509
 
  In this workflow, each developer has their own branch or
1510
 
  branches, plus read-only access to the mainline. A software gatekeeper
1511
 
  (e.g. PQM) has commit rights to the main branch. When a developer wants
1512
 
  their work merged, they request the gatekeeper to merge it. The gatekeeper
1513
 
  does a merge, a compile, and runs the test suite. If the code passes, it
1514
 
  is merged into the mainline.
1515
 
 
1516
 
In a nutshell, here's the overall submission process:
1517
 
 
1518
 
#. get your work ready (including review except for trivial changes)
1519
 
#. push to a public location
1520
 
#. ask PQM to merge from that location
1521
 
 
1522
 
.. note::
1523
 
  At present, PQM always takes the changes to merge from a branch
1524
 
  at a URL that can be read by it. For Bazaar, that means a public,
1525
 
  typically http, URL.
1526
 
 
1527
 
As a result, the following things are needed to use PQM for submissions:
1528
 
 
1529
 
#. A publicly available web server
1530
 
#. Your OpenPGP key registered with PQM (contact RobertCollins for this)
1531
 
#. The PQM plugin installed and configured (not strictly required but
1532
 
   highly recommended).
1533
 
 
1534
 
 
1535
 
Selecting a Public Branch Location
1536
 
----------------------------------
1537
 
 
1538
 
If you don't have your own web server running, branches can always be
1539
 
pushed to Launchpad. Here's the process for doing that:
1540
 
 
1541
 
Depending on your location throughout the world and the size of your
1542
 
repository though, it is often quicker to use an alternative public
1543
 
location to Launchpad, particularly if you can set up your own repo and
1544
 
push into that. By using an existing repo, push only needs to send the
1545
 
changes, instead of the complete repository every time. Note that it is
1546
 
easy to register branches in other locations with Launchpad so no benefits
1547
 
are lost by going this way.
1548
 
 
1549
 
.. note::
1550
 
  For Canonical staff, http://people.ubuntu.com/~<user>/ is one
1551
 
  suggestion for public http branches. Contact your manager for information
1552
 
  on accessing this system if required.
1553
 
 
1554
 
It should also be noted that best practice in this area is subject to
1555
 
change as things evolve. For example, once the Bazaar smart server on
1556
 
Launchpad supports server-side branching, the performance situation will
1557
 
be very different to what it is now (Jun 2007).
1558
 
 
1559
 
 
1560
 
Configuring the PQM Plug-In
1561
 
---------------------------
1562
 
 
1563
 
While not strictly required, the PQM plugin automates a few things and
1564
 
reduces the chance of error. Before looking at the plugin, it helps to
1565
 
understand  a little more how PQM operates. Basically, PQM requires an
1566
 
email indicating what you want it to do. The email typically looks like
1567
 
this::
1568
 
 
1569
 
  star-merge source-branch target-branch
1570
 
 
1571
 
For example::
1572
 
 
1573
 
  star-merge http://bzr.arbash-meinel.com/branches/bzr/jam-integration http://bazaar-vcs.org/bzr/bzr.dev
1574
 
 
1575
 
Note that the command needs to be on one line. The subject of the email
1576
 
will be used for the commit message. The email also needs to be ``gpg``
1577
 
signed with a key that PQM accepts.
1578
 
 
1579
 
The advantages of using the PQM plugin are:
1580
 
 
1581
 
#. You can use the config policies to make it easy to set up public
1582
 
   branches, so you don't have to ever type the full paths you want to merge
1583
 
   from or into.
1584
 
 
1585
 
#. It checks to make sure the public branch last revision matches the
1586
 
   local last revision so you are submitting what you think you are.
1587
 
 
1588
 
#. It uses the same public_branch and smtp sending settings as bzr-email,
1589
 
   so if you have one set up, you have the other mostly set up.
1590
 
 
1591
 
#. Thunderbird refuses to not wrap lines, and request lines are usually
1592
 
   pretty long (you have 2 long URLs in there).
1593
 
 
1594
 
Here are sample configuration settings for the PQM plugin. Here are the
1595
 
lines in bazaar.conf::
1596
 
 
1597
 
  [DEFAULT]
1598
 
  email = Joe Smith <joe.smith@internode.on.net>
1599
 
  smtp_server=mail.internode.on.net:25
1600
 
 
1601
 
And here are the lines in ``locations.conf`` (or ``branch.conf`` for
1602
 
dirstate-tags branches)::
1603
 
 
1604
 
  [/home/joe/bzr/my-integration]
1605
 
  push_location = sftp://joe-smith@bazaar.launchpad.net/%7Ejoe-smith/bzr/my-integration/
1606
 
  push_location:policy = norecurse
1607
 
  public_branch = http://bazaar.launchpad.net/~joe-smith/bzr/my-integration/
1608
 
  public_branch:policy = appendpath
1609
 
  pqm_email = Bazaar PQM <pqm@bazaar-vcs.org>
1610
 
  pqm_branch = http://bazaar-vcs.org/bzr/bzr.dev
1611
 
 
1612
 
Note that the push settings will be added by the first ``push`` on
1613
 
a branch. Indeed the preferred way to generate the lines above is to use
1614
 
``push`` with an argument, then copy-and-paste the other lines into
1615
 
the relevant file.
1616
 
 
1617
 
 
1618
 
Submitting a Change
1619
 
-------------------
1620
 
 
1621
 
Here is one possible recipe once the above environment is set up:
1622
 
 
1623
 
#. pull bzr.dev => my-integration
1624
 
#. merge patch => my-integration
1625
 
#. fix up any final merge conflicts (NEWS being the big killer here).
1626
 
#. commit
1627
 
#. push
1628
 
#. pqm-submit
1629
 
 
1630
 
.. note::
1631
 
  The ``push`` step is not required if ``my-integration`` is a checkout of
1632
 
  a public branch.
1633
 
 
1634
 
  Because of defaults, you can type a single message into commit and
1635
 
  pqm-commit will reuse that.
1636
 
 
1637
 
 
1638
 
Tracking Change Acceptance
1639
 
--------------------------
1640
 
 
1641
 
The web interface to PQM is https://pqm.bazaar-vcs.org/. After submitting
1642
 
a change, you can visit this URL to confirm it was received and placed in
1643
 
PQM's queue.
1644
 
 
1645
 
When PQM completes processing a change, an email is sent to you with the
1646
 
results.
1647
 
 
1648
 
 
1649
 
Reviewing Blueprints
1650
 
====================
1651
 
 
1652
 
Blueprint Tracking Using Launchpad
1653
 
----------------------------------
1654
 
 
1655
 
New features typically require a fair amount of discussion, design and
1656
 
debate. For Bazaar, that information is often captured in a so-called
1657
 
"blueprint" on our Wiki. Overall tracking of blueprints and their status
1658
 
is done using Launchpad's relevant tracker,
1659
 
https://blueprints.launchpad.net/bzr/. Once a blueprint for ready for
1660
 
review, please announce it on the mailing list.
1661
 
 
1662
 
Alternatively, send an email beginning with [RFC] with the proposal to the
1663
 
list. In some cases, you may wish to attach proposed code  or a proposed
1664
 
developer document if that best communicates the idea. Debate can then
1665
 
proceed using the normal merge review processes.
1666
 
 
1667
 
 
1668
 
Recording Blueprint Review Feedback
1669
 
-----------------------------------
1670
 
 
1671
 
Unlike its Bug Tracker, Launchpad's Blueprint Tracker doesn't currently
1672
 
(Jun 2007) support a chronological list of comment responses. Review
1673
 
feedback can either be recorded on the Wiki hosting the blueprints or by
1674
 
using Launchpad's whiteboard feature.
1675
 
 
1676
888
 
1677
889
Planning Releases
1678
890
=================
1679
891
 
1680
892
 
1681
 
Using Releases and Milestones in Launchpad
1682
 
------------------------------------------
1683
 
 
1684
 
TODO ... (Exact policies still under discussion)
1685
 
 
1686
 
 
1687
893
Bug Triage
1688
894
----------
1689
895