Rev 2477: [merge] Hacking updates from Ian C in http://bzr.arbash-meinel.com/branches/bzr/HACKING
John Arbash Meinel
john at arbash-meinel.com
Wed May 2 16:36:29 BST 2007
At http://bzr.arbash-meinel.com/branches/bzr/HACKING
------------------------------------------------------------
revno: 2477
revision-id: john at arbash-meinel.com-20070502153626-58g4th8dzq1upses
parent: pqm at pqm.ubuntu.com-20070502125159-zpnij2o99tlddedp
parent: ian.clatworthy at internode.on.net-20070502044327-uvny1xwti20eh1p3
committer: John Arbash Meinel <john at arbash-meinel.com>
branch nick: HACKING
timestamp: Wed 2007-05-02 10:36:26 -0500
message:
[merge] Hacking updates from Ian C
modified:
HACKING HACKING-20050805200004-2a5dc975d870f78c
------------------------------------------------------------
revno: 2466.6.3
merged: ian.clatworthy at internode.on.net-20070502044327-uvny1xwti20eh1p3
parent: ian.clatworthy at internode.on.net-20070430081033-2uer1v88nhaz4532
committer: Ian Clatworthy <ian.clatworthy at internode.on.net>
branch nick: bzr.HACKING
timestamp: Wed 2007-05-02 14:43:27 +1000
message:
Incorporate feedback from Aaron B. & Alex B.
------------------------------------------------------------
revno: 2466.6.2
merged: ian.clatworthy at internode.on.net-20070430081033-2uer1v88nhaz4532
parent: ian.clatworthy at internode.on.net-20070427150319-tldij8hy0tcsij2q
committer: Ian Clatworthy <ian.clatworthy at internode.on.net>
branch nick: bzr.HACKING
timestamp: Mon 2007-04-30 18:10:33 +1000
message:
Incorporate feedback from LarstiQ
------------------------------------------------------------
revno: 2466.6.1
merged: ian.clatworthy at internode.on.net-20070427150319-tldij8hy0tcsij2q
parent: pqm at pqm.ubuntu.com-20070426211103-h84prqh7a4ad3ez2
committer: Ian Clatworthy <ian.clatworthy at internode.on.net>
branch nick: bzr.HACKING
timestamp: Sat 2007-04-28 01:03:19 +1000
message:
Expand HACKING into Bazaar Developer Guide
-------------- next part --------------
=== modified file 'HACKING'
--- a/HACKING 2007-04-24 14:19:24 +0000
+++ b/HACKING 2007-05-02 04:43:27 +0000
@@ -1,14 +1,225 @@
-============================
-Guidelines for modifying bzr
-============================
+======================
+Bazaar Developer Guide
+======================
.. contents::
(The current version of this document is available in the file ``HACKING``
-in the source tree, or at http://doc.bazaar-vcs.org/current/hacking.html)
-
-Overall
-=======
+in the source tree, or at http://doc.bazaar-vcs.org/bzr.dev/hacking.html)
+
+
+Getting Started
+###############
+
+Exploring the Bazaar Platform
+=============================
+
+Before making changes, it's a good idea to explore the work already
+done by others. Perhaps the new feature or improvement you're looking
+for is available in another plug-in already? If you find a bug,
+perhaps someone else has already fixed it?
+
+To answer these questions and more, take a moment to explore the
+overall Bazaar Platform. Here are some links to browse:
+
+* The Plugins page on the Wiki - http://bazaar-vcs.org/BzrPlugins
+
+* The Bazaar product family on Launchpad - https://launchpad.net/bazaar
+
+* Bug Tracker for the core product - https://bugs.launchpad.net/bzr/
+
+* Blueprint Tracker for the core product - https://blueprints.launchpad.net/bzr/
+
+If nothing else, perhaps you'll find inspiration in how other developers
+have solved their challenges.
+
+
+Planning and Discussing Changes
+===============================
+
+There is a very active community around Bazaar. Mostly we meet on IRC
+(#bzr on irc.freenode.net) and on the mailing list. To join the Bazaar
+community, see http://bazaar-vcs.org/BzrSupport.
+
+If you are planning to make a change, it's a very good idea to mention it
+on the IRC channel and/or on the mailing list. There are many advantages
+to involving the community before you spend much time on a change.
+These include:
+
+* you get to build on the wisdom on others, saving time
+
+* if others can direct you to similar code, it minimises the work to be done
+
+* it assists everyone in coordinating direction, priorities and effort.
+
+In summary, maximising the input from others typically minimises the
+total effort required to get your changes merged. The community is
+friendly, helpful and always keen to welcome newcomers.
+
+
+Bazaar Development in a Nutshell
+================================
+
+Looking for a 10 minute introduction to submitting a change?
+See http://bazaar-vcs.org/BzrGivingBack.
+
+TODO: Merge that Wiki page into this document.
+
+
+Understanding the Development Process
+=====================================
+
+The development team follows many best-practices including:
+
+* a public roadmap and planning process in which anyone can participate
+
+* time based milestones everyone can work towards and plan around
+
+* extensive code review and feedback to contributors
+
+* complete and rigorous test coverage on any code contributed
+
+* automated validation that all tests still pass before code is merged
+ into the main code branch.
+
+The key tools we use to enable these practices are:
+
+* Launchpad - https://launchpad.net/
+
+* Bazaar - http://bazaar-vcs.org/
+
+* Bundle Buggy - http://bundlebuggy.aaronbentley.com/
+
+* Patch Queue Manager - https://launchpad.net/pqm/
+
+For further information, see http://bazaar-vcs.org/BzrDevelopment.
+
+
+A Closer Look at the Merge & Review Process
+===========================================
+
+If you'd like to propose a change, please post to the
+bazaar at lists.canonical.com list with a bundle, patch, or link to a
+branch. Put '[PATCH]' or '[MERGE]' in the subject so Bundle Buggy
+can pick it out, and explain the change in the email message text.
+Remember to update the NEWS file as part of your change if it makes any
+changes visible to users or plugin developers. Please include a diff
+against mainline if you're giving a link to a branch.
+
+You can generate a bundle like this:
+
+ bzr bundle > mybundle.patch
+
+A .patch extension is recommended instead of .bundle as many mail clients
+will send the latter as a binary file. If a bundle would be too long or your
+mailer mangles whitespace (e.g. implicitly converts Unix newlines to DOS
+newlines), use the merge-directive command instead like this:
+
+ bzr merge-directive http://bazaar-vcs.org http://example.org/my_branch > my_directive.patch
+
+See the help for details on the arguments to merge-directive.
+
+Please do **NOT** put [PATCH] or [MERGE] in the subject line if you don't
+want it to be merged. If you want comments from developers rather than
+to be merged, you can put '[RFC]' in the subject line.
+
+Anyone is welcome to review code. There are broadly three gates for
+code to get in:
+
+ * Doesn't reduce test coverage: if it adds new methods or commands,
+ there should be tests for them. There is a good test framework
+ and plenty of examples to crib from, but if you are having trouble
+ working out how to test something feel free to post a draft patch
+ and ask for help.
+
+ * Doesn't reduce design clarity, such as by entangling objects
+ we're trying to separate. This is mostly something the more
+ experienced reviewers need to help check.
+
+ * Improves bugs, features, speed, or code simplicity.
+
+Code that goes in should pass all three. The core developers take care
+to keep the code quality high and understandable while recognising that
+perfect is sometimes the enemy of good. (It is easy for reviews to make
+people notice other things which should be fixed but those things should
+not hold up the original fix being accepted. New things can easily be
+recorded in the Bug Tracker instead.)
+
+Anyone can "vote" on the mailing list. Core developers can also vote using
+Bundle Buggy. Here are the voting codes and their explanations.
+
+ -1 really don't want it in current form
+ -0 somewhat uncomfortable
+ +0 comfortable but resubmission after changes requested
+ +1 conditional good to go after some minor changes
+ +1 good to go
+
++1 conditional is used as a way to avoid another submit/review cycle for
+patches that need small changes.
+
+If a change gets two +1 votes from core reviewers, and no
+vetos, then it's OK to come in. Any of the core developers can bring it
+into the bzr.dev trunk and backport it to maintenance branches if required.
+The Release Manager will merge the change into the branch for a pending
+release, if any. As a guideline, core developers usually merge their own
+changes and volunteer to merge other contributions if they were the second
+reviewer to agree to a change.
+
+To track the progress of proposed changes, use Bundle Buggy. See
+http://bundlebuggy.aaronbentley.com/help for a link to all the
+outstanding merge requests together with an explanation of the columns.
+Bundle Buggy will also mail you a link to track just your change.
+
+
+Preparing a Sandbox for Making Changes to Bazaar
+================================================
+
+Bazaar supports many ways of organising your work. See
+http://bazaar-vcs.org/SharedRepositoryLayouts for a summary of the
+popular alternatives.
+
+Of course, the best choice for you will depend on numerous factors:
+the number of changes you may be making, the complexity of the changes, etc.
+As a starting suggestion though:
+
+* create a local copy of the main development branch (bzr.dev) by using
+ this command: bzr branch http://bazaar-vcs.org/bzr/bzr.dev/ bzr.dev
+
+* keep your copy of bzr.dev prestine (by not developing in it) and keep
+ it up to date (by using bzr pull)
+
+* create a new branch off your local bzr.dev copy for each issue
+ (bug or feature) you are working on.
+
+This approach makes it easy to go back and make any required changes
+after a code review. Resubmitting the change is then simple with no
+risk of accidentially including edits related to other issues you may
+be working on. After the changes for an issue are accepted and merged,
+the associated branch can be deleted or archived as you wish.
+
+
+Navigating the Code Base
+========================
+
+TODO: List and describe in one line the purpose of each directory
+inside an installation of bzr.
+
+TODO: Refer to a central location holding an up to date copy of the API
+documentation generated by epydoc, e.g. something like
+http://starship.python.net/crew/mwh/bzrlibapi/bzrlib.html.
+
+
+Testing Bazaar
+##############
+
+The Importance of Testing
+=========================
+
+Reliability is a critical success factor for any Version Control System.
+We want Bazaar to be highly reliable across multiple platforms while
+evolving over time to meet the needs of its community.
+
+In a nutshell, this is want we expect and encourage:
* New functionality should have test cases. Preferably write the
test before writing the code.
@@ -16,37 +227,175 @@
In general, you can test at either the command-line level or the
internal API level. See Writing Tests below for more detail.
-* Try to practice Test-Driven Development. before fixing a bug, write a
+* Try to practice Test-Driven Development: before fixing a bug, write a
test case so that it does not regress. Similarly for adding a new
feature: write a test case for a small version of the new feature before
starting on the code itself. Check the test fails on the old code, then
add the feature or fix and check it passes.
-* Exceptions should be defined inside bzrlib.errors, so that we can
- see the whole tree at a glance.
-
-* Imports should be done at the top-level of the file, unless there is
- a strong reason to have them lazily loaded when a particular
- function runs. Import statements have a cost, so try to make sure
- they don't run inside hot functions.
-
-* Module names should always be given fully-qualified,
- i.e. ``bzrlib.hashcache`` not just ``hashcache``.
-
-* Commands should return non-zero when they encounter circumstances that
- the user should really pay attention to - which includes trivial shell
- pipelines.
-
- Recommended values are
- 0. OK,
- 1. Conflicts in merge-like operations, or changes are present in
- diff-like operations.
- 2. Unrepresentable diff changes (i.e. binary files that we cannot show
- a diff of).
- 3. An error or exception has occurred.
-
-Evolving interfaces
--------------------
+By doing these things, the Bazaar team gets increased confidence that
+changes do what they claim to do, whether provided by the core team or
+by community members. Equally importantly, we can be surer that changes
+down the track do not break new features or bug fixes that you are
+contributing today.
+
+As of May 2007, Bazaar ships with a test suite containing over 6000 tests
+and growing. We are proud of it and want to remain so. As community
+members, we all benefit from it. Would you trust version control on
+your project to a product *without* a test suite like Bazaar has?
+
+
+Running the Test Suite
+======================
+
+Currently, bzr selftest is used to invoke tests.
+You can provide a pattern argument to run a subset. For example,
+to run just the blackbox tests, run::
+
+ ./bzr selftest -v blackbox
+
+To skip a particular test (or set of tests), use the --exclude option
+(shorthand -x) like so::
+
+ ./bzr selftest -v -x blackbox
+
+To list tests without running them, use the --list-only option like so::
+
+ ./bzr selftest --list-only
+
+This option can be combined with other selftest options (like -x) and
+filter patterns to understand their effect.
+
+
+Writing Tests
+=============
+
+In general tests should be placed in a file named test_FOO.py where
+FOO is the logical thing under test. That file should be placed in the
+tests subdirectory under the package being tested.
+
+For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
+See bzrlib/tests/test_sampler.py for a template test script.
+
+Tests can be written for the UI or for individual areas of the library.
+Choose whichever is appropriate: if adding a new command, or a new command
+option, then you should be writing a UI test. If you are both adding UI
+functionality and library functionality, you will want to write tests for
+both the UI and the core behaviours. We call UI tests 'blackbox' tests
+and they are found in ``bzrlib/tests/blackbox/*.py``.
+
+When writing blackbox tests please honour the following conventions:
+
+ 1. Place the tests for the command 'name' in
+ bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
+ to locate the test script for a faulty command.
+
+ 2. Use the 'self.run_bzr("name")' utility function to invoke the command
+ rather than running bzr in a subprocess or invoking the
+ cmd_object.run() method directly. This is a lot faster than
+ subprocesses and generates the same logging output as running it in a
+ subprocess (which invoking the method directly does not).
+
+ 3. Only test the one command in a single test script. Use the bzrlib
+ library when setting up tests and when evaluating the side-effects of
+ the command. We do this so that the library api has continual pressure
+ on it to be as functional as the command line in a simple manner, and
+ to isolate knock-on effects throughout the blackbox test suite when a
+ command changes its name or signature. Ideally only the tests for a
+ given command are affected when a given command is changed.
+
+ 4. If you have a test which does actually require running bzr in a
+ subprocess you can use ``run_bzr_subprocess``. By default the spawned
+ process will not load plugins unless ``--allow-plugins`` is supplied.
+
+
+Doctests
+--------
+
+We make selective use of doctests__. In general they should provide
+*examples* within the API documentation which can incidentally be tested. We
+don't try to test every important case using doctests -- regular Python
+tests are generally a better solution.
+
+Most of these are in ``bzrlib/doc/api``. More additions are welcome.
+
+ __ http://docs.python.org/lib/module-doctest.html
+
+
+Essential Domain Classes
+########################
+
+Introducing the Object Model
+============================
+
+The core domain objects within the bazaar model are:
+
+* Transport
+
+* Branch
+
+* Repository
+
+* WorkingTree
+
+Transports are explained below. See http://bazaar-vcs.org/Classes/
+for an introduction to the other key classes.
+
+Using Transports
+================
+
+The ``Transport`` layer handles access to local or remote directories.
+Each Transport object acts like a logical connection to a particular
+directory, and it allows various operations on files within it. You can
+*clone* a transport to get a new Transport connected to a subdirectory or
+parent directory.
+
+Transports are not used for access to the working tree. At present
+working trees are always local and they are accessed through the regular
+Python file io mechanisms.
+
+Filenames vs URLs
+-----------------
+
+Transports work in URLs. Take note that URLs are by definition only
+ASCII - the decision of how to encode a Unicode string into a URL must be
+taken at a higher level, typically in the Store. (Note that Stores also
+escape filenames which cannot be safely stored on all filesystems, but
+this is a different level.)
+
+The main reason for this is that it's not possible to safely roundtrip a
+URL into Unicode and then back into the same URL. The URL standard
+gives a way to represent non-ASCII bytes in ASCII (as %-escapes), but
+doesn't say how those bytes represent non-ASCII characters. (They're not
+guaranteed to be UTF-8 -- that is common but doesn't happen everywhere.)
+
+For example if the user enters the url ``http://example/%e0`` there's no
+way to tell whether that character represents "latin small letter a with
+grave" in iso-8859-1, or "latin small letter r with acute" in iso-8859-2
+or malformed UTF-8. So we can't convert their URL to Unicode reliably.
+
+Equally problematic if we're given a url-like string containing non-ascii
+characters (such as the accented a) we can't be sure how to convert that
+to the correct URL, because we don't know what encoding the server expects
+for those characters. (Although this is not totally reliable we might still
+accept these and assume they should be put into UTF-8.)
+
+A similar edge case is that the url ``http://foo/sweet%2Fsour`` contains
+one directory component whose name is "sweet/sour". The escaped slash is
+not a directory separator. If we try to convert URLs to regular Unicode
+paths this information will be lost.
+
+This implies that Transports must natively deal with URLs; for simplicity
+they *only* deal with URLs and conversion of other strings to URLs is done
+elsewhere. Information they return, such as from ``list_dir``, is also in
+the form of URL components.
+
+
+Core Topics
+###########
+
+Evolving Interfaces
+===================
We have a commitment to 6 months API stability - any supported symbol in a
release of bzr MUST NOT be altered in any way that would result in
@@ -72,128 +421,8 @@
callers will at least get an AttributeError rather than weird results.
-Standard parameter types
-------------------------
-
-There are some common requirements in the library: some parameters need to be
-unicode safe, some need byte strings, and so on. At the moment we have
-only codified one specific pattern: Parameters that need to be unicode
-should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
-input into unicode in a consistent fashion, allowing trivial strings to be
-used for programmer convenience, but not performing unpredictably in the
-presence of different locales.
-
-
-Copyright
----------
-
-The copyright policy for bzr was recently made clear in this email (edited
-for grammatical correctness)::
-
- The attached patch cleans up the copyright and license statements in
- the bzr source. It also adds tests to help us remember to add them
- with the correct text.
-
- We had the problem that lots of our files were "Copyright Canonical
- Development Ltd" which is not a real company, and some other variations
- on this theme. Also, some files were missing the GPL statements.
-
- I want to be clear about the intent of this patch, since copyright can
- be a little controversial.
-
- 1) The big motivation for this is not to shut out the community, but
- just to clean up all of the invalid copyright statements.
-
- 2) It has been the general policy for bzr that we want a single
- copyright holder for all of the core code. This is following the model
- set by the FSF, which makes it easier to update the code to a new
- license in case problems are encountered. (For example, if we want to
- upgrade the project universally to GPL v3 it is much simpler if there is
- a single copyright holder). It also makes it clearer if copyright is
- ever debated, there is a single holder, which makes it easier to defend
- in court, etc. (I think the FSF position is that if you assign them
- copyright, they can defend it in court rather than you needing to, and
- I'm sure Canonical would do the same).
- As such, Canonical has requested copyright assignments from all of the
- major contributers.
-
- 3) If someone wants to add code and not attribute it to Canonical, there
- is a specific list of files that are excluded from this check. And the
- test failure indicates where that is, and how to update it.
-
- 4) If anyone feels that I changed a copyright statement incorrectly, just
- let me know, and I'll be happy to correct it. Whenever you have large
- mechanical changes like this, it is possible to make some mistakes.
-
- Just to reiterate, this is a community project, and it is meant to stay
- that way. Core bzr code is copyright Canonical for legal reasons, and
- the tests are just there to help us maintain that.
-
-
-Documentation
-=============
-
-When you change bzrlib, please update the relevant documentation for the
-change you made: Changes to commands should update their help, and
-possibly end user tutorials; changes to the core library should be
-reflected in API documentation.
-
-Commands
---------
-
-The docstring of a command is used by ``bzr help`` to generate help output
-for the command. The list 'takes_options' attribute on a command is used by
-``bzr help`` to document the options for the command - the command
-docstring does not need to document them. Finally, the '_see_also'
-attribute on a command can be used to reference other related help topics.
-
-NEWS file
----------
-
-If you make a user-visible change, please add a note to the NEWS file.
-The description should be written to make sense to someone who's just
-a user of bzr, not a developer: new functions or classes shouldn't be
-mentioned, but new commands, changes in behaviour or fixed nontrivial
-bugs should be listed. See the existing entries for an idea of what
-should be done.
-
-Within each release, entries in the news file should have the most
-user-visible changes first. So the order should be approximately:
-
- * changes to existing behaviour - the highest priority because the
- user's existing knowledge is incorrect
- * new features - should be brought to their attention
- * bug fixes - may be of interest if the bug was affecting them, and
- should include the bug number if any
- * major documentation changes
- * changes to internal interfaces
-
-People who made significant contributions to each change are listed in
-parenthesis. This can include reporting bugs (particularly with good
-details or reproduction recipes), submitting patches, etc.
-
-API documentation
------------------
-
-Functions, methods, classes and modules should have docstrings
-describing how they are used.
-
-The first line of the docstring should be a self-contained sentence.
-
-For the special case of Command classes, this acts as the user-visible
-documentation shown by the help command.
-
-The docstrings should be formatted as reStructuredText_ (like this
-document), suitable for processing using the epydoc_ tool into HTML
-documentation.
-
-.. _reStructuredText: http://docutils.sourceforge.net/rst.html
-.. _epydoc: http://epydoc.sourceforge.net/
-
-
-
-Coding style
-============
+Coding Style Guidelines
+=======================
Please write PEP-8__ compliant code.
@@ -203,6 +432,17 @@
__ http://www.python.org/peps/pep-0008.html
+Module Imports
+--------------
+
+* Imports should be done at the top-level of the file, unless there is
+ a strong reason to have them lazily loaded when a particular
+ function runs. Import statements have a cost, so try to make sure
+ they don't run inside hot functions.
+
+* Module names should always be given fully-qualified,
+ i.e. ``bzrlib.hashcache`` not just ``hashcache``.
+
Naming
------
@@ -224,7 +464,7 @@
inconsistency if other people use the full name.
-Standard names
+Standard Names
--------------
``revision_id`` not ``rev_id`` or ``revid``
@@ -331,7 +571,7 @@
object, rather than the real class.
-Passing to other variables
+Passing to Other Variables
~~~~~~~~~~~~~~~~~~~~~~~~~~
It also is incorrect to assign ``ImportReplacer`` objects to other variables.
@@ -342,7 +582,30 @@
variable, so some bugs are not detected right away.
-Writing output
+Getting Input
+=============
+
+Processing Command Lines
+------------------------
+
+bzrlib has a standard framework for parsing command lines and calling
+processing routines associated with various commands. See builtins.py
+for numerous examples.
+
+
+Standard Parameter Types
+------------------------
+
+There are some common requirements in the library: some parameters need to be
+unicode safe, some need byte strings, and so on. At the moment we have
+only codified one specific pattern: Parameters that need to be unicode
+should be checked via ``bzrlib.osutils.safe_unicode``. This will coerce the
+input into unicode in a consistent fashion, allowing trivial strings to be
+used for programmer convenience, but not performing unpredictably in the
+presence of different locales.
+
+
+Writing Output
==============
(The strategy described here is what we want to get to, but it's not
@@ -379,86 +642,24 @@
should be only in the command-line tool.
-Writing tests
-=============
-
-In general tests should be placed in a file named test_FOO.py where
-FOO is the logical thing under test. That file should be placed in the
-tests subdirectory under the package being tested.
-
-For example, tests for merge3 in bzrlib belong in bzrlib/tests/test_merge3.py.
-See bzrlib/tests/test_sampler.py for a template test script.
-
-Tests can be written for the UI or for individual areas of the library.
-Choose whichever is appropriate: if adding a new command, or a new command
-option, then you should be writing a UI test. If you are both adding UI
-functionality and library functionality, you will want to write tests for
-both the UI and the core behaviours. We call UI tests 'blackbox' tests
-and they are found in ``bzrlib/tests/blackbox/*.py``.
-
-When writing blackbox tests please honour the following conventions:
-
- 1. Place the tests for the command 'name' in
- bzrlib/tests/blackbox/test_name.py. This makes it easy for developers
- to locate the test script for a faulty command.
-
- 2. Use the 'self.run_bzr("name")' utility function to invoke the command
- rather than running bzr in a subprocess or invoking the
- cmd_object.run() method directly. This is a lot faster than
- subprocesses and generates the same logging output as running it in a
- subprocess (which invoking the method directly does not).
-
- 3. Only test the one command in a single test script. Use the bzrlib
- library when setting up tests and when evaluating the side-effects of
- the command. We do this so that the library api has continual pressure
- on it to be as functional as the command line in a simple manner, and
- to isolate knock-on effects throughout the blackbox test suite when a
- command changes its name or signature. Ideally only the tests for a
- given command are affected when a given command is changed.
-
- 4. If you have a test which does actually require running bzr in a
- subprocess you can use ``run_bzr_subprocess``. By default the spawned
- process will not load plugins unless ``--allow-plugins`` is supplied.
-
-
-Doctests
---------
-
-We make selective use of doctests__. In general they should provide
-*examples* within the API documentation which can incidentally be tested. We
-don't try to test every important case using doctests -- regular Python
-tests are generally a better solution.
-
-Most of these are in ``bzrlib/doc/api``. More additions are welcome.
-
- __ http://docs.python.org/lib/module-doctest.html
-
-
-Running tests
-=============
-Currently, bzr selftest is used to invoke tests.
-You can provide a pattern argument to run a subset. For example,
-to run just the blackbox tests, run::
-
- ./bzr selftest -v blackbox
-
-To skip a particular test (or set of tests), use the --exclude option
-(shorthand -x) like so::
-
- ./bzr selftest -v -x blackbox
-
-To list tests without running them, use the --list-only option like so::
-
- ./bzr selftest --list-only
-
-This option can be combined with other selftest options (like -x) and
-filter patterns to understand their effect.
-
-
-Errors and exceptions
-=====================
-
-Errors are handled through Python exceptions.
+Handling Errors and Exceptions
+==============================
+
+Commands should return non-zero when they encounter circumstances that
+the user should really pay attention to - which includes trivial shell
+pipelines.
+
+Recommended values are:
+
+ 0. OK.
+ 1. Conflicts in merge-like operations, or changes are present in
+ diff-like operations.
+ 2. Unrepresentable diff changes (i.e. binary files that we cannot show
+ a diff of).
+ 3. An error or exception has occurred.
+
+Errors are handled through Python exceptions. Exceptions should be defined
+inside bzrlib.errors, so that we can see the whole tree at a glance.
We broadly classify errors as either being either internal or not,
depending on whether ``user_error`` is set or not. If we think it's our
@@ -492,6 +693,118 @@
final fullstop. If long, they may contain newlines to break the text.
+Documenting Changes
+===================
+
+When you change bzrlib, please update the relevant documentation for the
+change you made: Changes to commands should update their help, and
+possibly end user tutorials; changes to the core library should be
+reflected in API documentation.
+
+NEWS File
+---------
+
+If you make a user-visible change, please add a note to the NEWS file.
+The description should be written to make sense to someone who's just
+a user of bzr, not a developer: new functions or classes shouldn't be
+mentioned, but new commands, changes in behaviour or fixed nontrivial
+bugs should be listed. See the existing entries for an idea of what
+should be done.
+
+Within each release, entries in the news file should have the most
+user-visible changes first. So the order should be approximately:
+
+ * changes to existing behaviour - the highest priority because the
+ user's existing knowledge is incorrect
+ * new features - should be brought to their attention
+ * bug fixes - may be of interest if the bug was affecting them, and
+ should include the bug number if any
+ * major documentation changes
+ * changes to internal interfaces
+
+People who made significant contributions to each change are listed in
+parenthesis. This can include reporting bugs (particularly with good
+details or reproduction recipes), submitting patches, etc.
+
+Commands
+--------
+
+The docstring of a command is used by ``bzr help`` to generate help output
+for the command. The list 'takes_options' attribute on a command is used by
+``bzr help`` to document the options for the command - the command
+docstring does not need to document them. Finally, the '_see_also'
+attribute on a command can be used to reference other related help topics.
+
+API Documentation
+-----------------
+
+Functions, methods, classes and modules should have docstrings
+describing how they are used.
+
+The first line of the docstring should be a self-contained sentence.
+
+For the special case of Command classes, this acts as the user-visible
+documentation shown by the help command.
+
+The docstrings should be formatted as reStructuredText_ (like this
+document), suitable for processing using the epydoc_ tool into HTML
+documentation.
+
+.. _reStructuredText: http://docutils.sourceforge.net/rst.html
+.. _epydoc: http://epydoc.sourceforge.net/
+
+
+General Guidelines
+==================
+
+Copyright
+---------
+
+The copyright policy for bzr was recently made clear in this email (edited
+for grammatical correctness)::
+
+ The attached patch cleans up the copyright and license statements in
+ the bzr source. It also adds tests to help us remember to add them
+ with the correct text.
+
+ We had the problem that lots of our files were "Copyright Canonical
+ Development Ltd" which is not a real company, and some other variations
+ on this theme. Also, some files were missing the GPL statements.
+
+ I want to be clear about the intent of this patch, since copyright can
+ be a little controversial.
+
+ 1) The big motivation for this is not to shut out the community, but
+ just to clean up all of the invalid copyright statements.
+
+ 2) It has been the general policy for bzr that we want a single
+ copyright holder for all of the core code. This is following the model
+ set by the FSF, which makes it easier to update the code to a new
+ license in case problems are encountered. (For example, if we want to
+ upgrade the project universally to GPL v3 it is much simpler if there is
+ a single copyright holder). It also makes it clearer if copyright is
+ ever debated, there is a single holder, which makes it easier to defend
+ in court, etc. (I think the FSF position is that if you assign them
+ copyright, they can defend it in court rather than you needing to, and
+ I'm sure Canonical would do the same).
+ As such, Canonical has requested copyright assignments from all of the
+ major contributers.
+
+ 3) If someone wants to add code and not attribute it to Canonical, there
+ is a specific list of files that are excluded from this check. And the
+ test failure indicates where that is, and how to update it.
+
+ 4) If anyone feels that I changed a copyright statement incorrectly, just
+ let me know, and I'll be happy to correct it. Whenever you have large
+ mechanical changes like this, it is possible to make some mistakes.
+
+ Just to reiterate, this is a community project, and it is meant to stay
+ that way. Core bzr code is copyright Canonical for legal reasons, and
+ the tests are just there to help us maintain that.
+
+
+Miscellaneous Topics
+####################
Debugging
=========
@@ -505,11 +818,10 @@
then bzr will go into pdb post-mortem mode when an unhandled exception
occurs.
-If you send a SIGQUIT signal to bzr, which can be done by pressing C-\ on Unix,
-bzr will go into the debugger immediately. You can continue execution by
-typing ``c``. This can be disabled if necessary by setting the
-environment variable ``BZR_SIGQUIT_PDB=0``.
-
+If you send a SIGQUIT signal to bzr, which can be done by pressing
+Ctrl-\\ on Unix, bzr will go into the debugger immediately. You can
+continue execution by typing ``c``. This can be disabled if necessary
+by setting the environment variable ``BZR_SIGQUIT_PDB=0``.
Jargon
@@ -521,56 +833,6 @@
indexes into the branch's revision history.
-Transport
-=========
-
-The ``Transport`` layer handles access to local or remote directories.
-Each Transport object acts like a logical connection to a particular
-directory, and it allows various operations on files within it. You can
-*clone* a transport to get a new Transport connected to a subdirectory or
-parent directory.
-
-Transports are not used for access to the working tree. At present
-working trees are always local and they are accessed through the regular
-Python file io mechanisms.
-
-filenames vs URLs
------------------
-
-Transports work in URLs. Take note that URLs are by definition only
-ASCII - the decision of how to encode a Unicode string into a URL must be
-taken at a higher level, typically in the Store. (Note that Stores also
-escape filenames which cannot be safely stored on all filesystems, but
-this is a different level.)
-
-The main reason for this is that it's not possible to safely roundtrip a
-URL into Unicode and then back into the same URL. The URL standard
-gives a way to represent non-ASCII bytes in ASCII (as %-escapes), but
-doesn't say how those bytes represent non-ASCII characters. (They're not
-guaranteed to be UTF-8 -- that is common but doesn't happen everywhere.)
-
-For example if the user enters the url ``http://example/%e0`` there's no
-way to tell whether that character represents "latin small letter a with
-grave" in iso-8859-1, or "latin small letter r with acute" in iso-8859-2
-or malformed UTF-8. So we can't convert their URL to Unicode reliably.
-
-Equally problematic if we're given a url-like string containing non-ascii
-characters (such as the accented a) we can't be sure how to convert that
-to the correct URL, because we don't know what encoding the server expects
-for those characters. (Although this is not totally reliable we might still
-accept these and assume they should be put into UTF-8.)
-
-A similar edge case is that the url ``http://foo/sweet%2Fsour`` contains
-one directory component whose name is "sweet/sour". The escaped slash is
-not a directory separator. If we try to convert URLs to regular Unicode
-paths this information will be lost.
-
-This implies that Transports must natively deal with URLs; for simplicity
-they *only* deal with URLs and conversion of other strings to URLs is done
-elsewhere. Information they return, such as from ``list_dir``, is also in
-the form of URL components.
-
-
Unicode and Encoding Support
============================
@@ -637,49 +899,6 @@
Use ``bzrlib.osutils.rmtree`` instead.
-Merge/review process
-====================
-
-If you'd like to propose a change, please post to the
-bazaar at lists.canonical.com list with a patch, bzr changeset, or link to a
-branch. Please put '[patch]' in the subject so we can pick them out, and
-include some text explaining the change. Remember to put an update to the NEWS
-file in your diff, if it makes any changes visible to users or plugin
-developers. Please include a diff against mainline if you're giving a link to
-a branch.
-
-Please indicate if you think the code is ready to merge, or if it's just a
-draft or for discussion. If you want comments from many developers rather than
-to be merged, you can put '[rfc]' in the subject lines.
-
-Anyone is welcome to review code. There are broadly three gates for
-code to get in:
-
- * Doesn't reduce test coverage: if it adds new methods or commands,
- there should be tests for them. There is a good test framework
- and plenty of examples to crib from, but if you are having trouble
- working out how to test something feel free to post a draft patch
- and ask for help.
-
- * Doesn't reduce design clarity, such as by entangling objects
- we're trying to separate. This is mostly something the more
- experienced reviewers need to help check.
-
- * Improves bugs, features, speed, or code simplicity.
-
-Code that goes in should pass all three.
-
-If you read a patch please reply and say so. We can use a numeric scale
-of -1, -0, +0, +1, meaning respectively "really don't want it in current
-form", "somewhat uncomfortable", "ok with me", and "please put it in".
-Anyone can "vote". (It's not really voting, just a terse expression.)
-
-If something gets say two +1 votes from core reviewers, and no
-vetos, then it's OK to come in. Any of the core developers can bring it
-into their integration branch, which I'll merge regularly. (If you do
-so, please reply and say so.)
-
-
C Extension Modules
===================
@@ -718,7 +937,8 @@
maintaining the python code twice - once in the .pyx, and once in the .py,
and no longer including the .py file.
-Making installers for OS Windows
+
+Making Installers for OS Windows
================================
To build a win32 installer, see the instructions on the wiki page:
http://bazaar-vcs.org/BzrWin32Installer
More information about the bazaar-commits
mailing list