summaryrefslogtreecommitdiff
path: root/doc/developers/development-repo.txt
diff options
context:
space:
mode:
Diffstat (limited to 'doc/developers/development-repo.txt')
-rw-r--r--doc/developers/development-repo.txt277
1 files changed, 277 insertions, 0 deletions
diff --git a/doc/developers/development-repo.txt b/doc/developers/development-repo.txt
new file mode 100644
index 0000000..761fad5
--- /dev/null
+++ b/doc/developers/development-repo.txt
@@ -0,0 +1,277 @@
+==============================
+Development repository formats
+==============================
+
+.. contents::
+
+Using development repository formats
+====================================
+
+Motivation
+----------
+
+We believe that we can continue to gain substantial performance benefits
+by altering the repository storage in bzr. The more feedback we can get
+on the changes during the development process the better.
+
+To make it possible to get more feedback we are going to expose the
+current development formats to the users of our development trunk
+'bzr.dev'. The technical details of the individual formats are at the
+end of this document.
+
+Format names
+------------
+
+The current development format will be called 'development'. Each time
+the development format changes, the prior development format will be
+renamed to e.g. 'development0', 'development1' etc.
+
+When a release of bzr is done, all the older numbered development
+formats will be removed from 'bzr.dev', so we will not be carrying the
+code for them around indefinately.
+
+Support for upgrade and migration
+---------------------------------
+
+The preservation and renaming policy makes it quite safe for users to
+test out development formats (though we cannot guarantee bugs of course
+- it is development code):
+
+ - users of a given development format can always get back onto regular
+ formats by switching to the next bzr released version which is
+ guaranteed to be able to upgrade from that development format.
+ - users that routinely use bzr.dev should upgrade to the most recent
+ development version available before pulling in bzr.dev changes
+ around release time, as that is when old format cleanups will occur.
+
+We cannot guarantee backwards compatability though, because some of the
+planned work may be 'upgrade only'. Please see ``bzr help formats`` for
+the text of the 'development' format which will indicate its
+compatability with other formats if you need to interoperate with
+users or services that do not have bzr.dev.
+
+Before converting to a development format
+-----------------------------------------
+
+Run a ``bzr check`` with the version of bzr that you will be using.
+``bzr check`` gets updated as we find new things that are inconsistent
+with existing repositories. While only a small number of repositories
+are likely to have any given error, it is best to check just in case.
+
+If ``bzr check`` reports a problem, run this command::
+
+ bzr reconcile
+
+Note that reconcile can take many hours, particularly if you are
+reconciling one of the 'knit' or 'dirstate' format repositories. If you
+have such a repository, consider upgrading it to 'pack-0.92' first,
+which will perform reconcile significantly faster.
+
+Creating a new development format branch
+----------------------------------------
+
+If you're starting a project from scratch, it's easy to make it a
+``development`` one. Here's how::
+
+ cd my-stuff
+ bzr init --development
+ bzr add
+ bzr commit -m "initial import"
+
+In other words, use the normal sequence of commands but add the
+``--development`` option to the ``init`` command.
+
+
+Creating a new development format repository
+--------------------------------------------
+
+If you're starting a project from scratch and wish to use a shared repository
+for branches, you can make it a ``development`` repository like this::
+
+ cd my-repo
+ bzr init-repo --development .
+ cd my-stuff
+ bzr init
+ bzr add
+ bzr commit -m "initial import"
+
+In other words, use the normal sequence of commands but add the
+``--development`` option to the ``init-repo`` command.
+
+Upgrading an existing branch or repository to development
+---------------------------------------------------------
+
+If you have an existing branch and wish to migrate it to
+a ``development`` format, use the ``upgrade`` command like this::
+
+ bzr upgrade --development path-to-my-branch
+
+If you are using a shared repository, run::
+
+ bzr upgrade --development ROOT_OF_REPOSITORY
+
+to upgrade the history database. Note that this will not
+alter the branch format of each branch, so
+you will need to also upgrade each branch individually
+if you are upgrading from an old (e.g. < 0.17) bzr.
+More modern bzr's will already have the branch format at
+our latest branch format which adds support for tags.
+
+Starting a new development format branch from one in an older format
+--------------------------------------------------------------------
+
+This can be done in one of several ways:
+
+1. Create a new branch and pull into it
+2. Create a standalone branch and upgrade its format
+3. Create a knitpack shared repository and branch into it
+
+Here are the commands for using the ``pull`` approach::
+
+ bzr init --development my-new-branch
+ cd my-new-branch
+ bzr pull my-source-branch
+
+Here are the commands for using the ``upgrade`` approach::
+
+ bzr branch my-source-branch my-new-branch
+ cd my-new-branch
+ bzr upgrade --development .
+
+Here are the commands for the shared repository approach::
+
+ cd my-repo
+ bzr init-repo --development .
+ bzr branch my-source-branch my-new-branch
+ cd my-new-branch
+
+As a reminder, any of the above approaches can fail if the source branch
+has inconsistent data within it and hasn't been reconciled yet. Please
+be sure to check that before reporting problems.
+
+Develoment formats for bzr-svn users
+------------------------------------
+
+If you are using ``bzr-svn`` or are testing the prototype subtree support,
+you can still use and assist in testing the development formats. The
+commands to use are identical to the ones given above except that the
+name of the format to use is ``development-subtree``.
+
+**WARNING**: Note that bzr only supports one-way conversion **to** the
+subtree format ``development-subtree``. Once you are using
+``development-subtree`` you cannot pull or merge back into a regular
+format such as ``pack-0.92``, ``development`` etc.
+
+The ``development-subtree`` format is required for the bzr-svn
+plug-in but should otherwise not be used until the subtree feature is
+complete within bzr.
+
+Reporting problems
+------------------
+
+If you need any help or encounter any problems, please contact the developers
+via the usual ways, i.e. chat to us on IRC or send a message to our mailing
+list. See http://wiki.bazaar.canonical.com/BzrSupport for contact details.
+
+
+Technical notes
+===============
+
+When to create a new development format
+---------------------------------------
+
+Whenever a code change will result in incorrect behaviour with existing
+``development`` repositories. Changes in push/pull/init/commit/merge
+have all been known to do this in the past.
+
+How to create a new development format
+--------------------------------------
+
+1. Register two new formats with the next available sequence number.
+ e.g. ``development1`` and ``development1-subtree``. (You can see the
+ current development format for an example.
+ These should:
+
+ * Use your new development repository/branch/tree classes
+ * Have really bare bones help - something like 'changes X to be Y
+ see ...developers/development-repo.html'
+ * Be hidden and experimental.
+2. Change the repository class (or branch or tree) in the
+ ``development`` and ``development-subtree`` formats to point to the
+ new class you are creating.
+3. Add a new development format (and tests!). Repository formats are in
+ ``bzrlib.repofmt``. You probably want to reproduce the current
+ development format from ``bzrlib.repofmt.pack_repo`` with just new
+ disk format strings, ``_get_matching_bzrdir`` and help.
+4. Register your development format with the various registries. At the
+ moment you need to update:
+
+ 1. ``bzrlib/bzrdir.py`` to register the WT/Branch/Repository
+ collection.
+
+ 2. ``bzrlib/workingtree.py``, ``bzrlib/branch.py``,
+ ``bzrlib/repository.py``, each one maintains a direct list of
+ their respective formats.
+
+ 3. For repositories, you also need to update the InterKnit1and2
+ class. This is responsible for converting between rich-root and
+ non-rich-root repositories.
+
+ 4. For repositories based on KnitPackRepository, you need to update
+ ``bzrlib/tests/test_pack_repository.py`` to add the class to the
+ tested permutations.
+
+5. Alter any other things that do class based tests. The easiest way
+ to find these is a grep for Development in bzrlib - and please
+ refactor as you find these to reduce the relevance this step has,
+ as it should not need to exist.
+6. Now subclass/create from scratch/whatever the live object code you
+ need to change to introduce your new format. Keep in mind that
+ eventually it will become the default format, so please don't keep
+ subclassing the last releases code, rather consider making the last
+ releases code a subclass of your new code (if there is a lot in
+ common) so that we can eventually remove that format once it becomes
+ ancient (or relegate it to a plugin).
+7. Once you have made the changes that required a new disk format, you
+ should submit the resulting branch to be merged. Other changes - to
+ take advantage of whatever new feature you have added - should be
+ sent in separately, because the disk level changes are a contention
+ point between multiple developers.
+
+Format Details
+==============
+
+development
+-----------
+
+Not currently available, as our development formats are all rich root or
+subtrees now.
+
+development-rich-root
+---------------------
+
+Currently an alias for Development6Subtree
+
+development-subtree
+-------------------
+
+Currently an alias for Development6Subtree
+
+Development6RichRoot[Subtree]
+-----------------------------
+
+These formats use the new groupcompress delta compress and a CHK(Content
+Hash Key) based inventory store which is much faster at incremental
+operations than the prior XML based store.
+*Note* Converting from a non-rich-root to a rich-root format is a
+one-way upgrade, and you cannot merge back afterwards: using this format
+for everyday use is likely to cause all developers of a project to
+upgrade to a rich-root format themselves. This is fine, as bzr is moving
+to make rich-root formats the default and to get all users to upgrade,
+but we have not finalised the migration process, and until we do do not
+recomment that casual users upgrade. Users of bzr-svn are already using
+rich-root formats and can test with this with impunity.
+
+
+..
+ vim: tw=72 ft=rst expandtab