[MERGE] Developer doc: container format

Andrew Bennetts andrew at canonical.com
Thu Jun 7 16:59:58 BST 2007


Andrew Bennetts wrote:
> Hi all,
> 
> This document adds a description of a basic container format to doc/developers.
> This was worked out with Robert on Friday.
> 
> Feedback welcome. 

Thanks everyone for the feedback so far, it's been greatly appreciated.

Here's a new version, with a bunch of changes:

  * length prefix immediately follows the kind marker,
  * more compact: kind markers are now just one byte, no more "length: " or
    "name: " in the headers,
  * slightly more fleshing out of motivation, and other tweaks to the document
    to make it clearer, especially about anonymous records,
  * now using the blessed markup for the different levels of headings :)

Feedback is still welcome, but I'm pretty happy with this as a simple but useful
starting point, and I've started work on code to implement it and eventually use
it in the smart server protocol.

-Andrew.

-------------- next part --------------
# Bazaar revision bundle v0.9
#
# message:
#   Updates in response to feedback on mailing list and in person.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Thu 2007-06-07 16:41:53.664000034 +1000

=== added file doc/developers/container-format.txt // file-id:containerformat.t
... xt-20070601074309-7n7w1jiyayud6xdn-1
--- /dev/null
+++ doc/developers/container-format.txt
@@ -0,0 +1,242 @@
+================
+Container format
+================
+
+Status
+======
+
+:Date: 2007-06-07
+
+This document describes the proposed container format for streaming and
+storing collections of data in Bazaar.  Initially this will be used for
+streaming revision data for incremental push/pull in the smart server for
+0.18, but the intentional is that this will be the basis for much more
+than just that use case.
+
+In particular, this document currently focuses almost exclusively on the
+streaming case, and not the on-disk storage case.  It also does not
+discuss the APIs used to manipulate containers and their records.
+
+
+.. contents::
+
+
+Motivation
+==========
+
+To create a low-level file format which is suitable for solving the smart
+server latency problem and whose layout and requirements are extendable in
+future versions of Bazaar, and with no requirements that the smart server
+does not have today.
+
+
+Terminology
+===========
+
+A **container** is a streamable file that contains a series of
+**records**.  Records may have **names**, and consist of bytes.
+
+
+Use Cases
+=========
+
+Here's a brief description of use cases this format is intended to
+support.
+
+Streaming data between a smart server and client
+------------------------------------------------
+
+It would be nice if we could combine multiple containers into a single
+stream by something no more expensive than concatenation (e.g. by omitting
+end/start marker pairs).  
+
+Incremental push or pull
+~~~~~~~~~~~~~~~~~~~~~~~~
+
+Consider the use case of incremental push/pull, which is currently (0.16)
+very slow on high-latency links due to the large number of round trips.
+What we'd like is something like the following.
+
+A client will make a request meaning "give me the knit contents for these
+revision IDs" (how the client determines which revision IDs it needs is
+unimportant here).  In response, the server streams a single container of:
+
+  * one record per file-id:revision-id knit gzip contents and graph data,
+  * one record per inventory:revision-id knit gzip contents and graph
+    data,
+  * one record per revision knit gzip contents,
+  * one record per revision signature,
+  * end marker record.
+
+in that order.
+
+Persistent storage on disk
+--------------------------
+
+We want a storage format that allows lock-free writes, which suggests a
+format that uses *rename into place*, and *do not modify after writing*.
+
+Usable before deep model changes to Bazaar
+------------------------------------------
+
+We want a format we can use and refine sooner rather than later.  So it
+should be usable before the anticipated model changes for Bazaar "1.0"
+land, while not conflicting with those changes either.
+
+Specifically, we'd like to have this format in Bazaar 0.18.
+
+Examples of possible record content
+-----------------------------------
+
+  * full texts of file versions
+  * deltas of full texts
+  * revisions
+  * inventories
+  * inventory as tree items e.g. the inventory data for 20 files
+  * revision signatures
+  * per-file graph data
+  * annotation cache
+
+
+Characteristics
+===============
+
+Some key aspects of the described format are discussed in this section.
+
+No length-prefixing of entire container
+---------------------------------------
+
+The overall container is not length prefixed.  Instead there is an end
+marker so that readers can determine when they have read the entire
+container.  This also does not conflict with the goal of allowing
+single-pass writing.
+
+Structured as a self-contained series of records
+------------------------------------------------
+
+The container contains a series of *records*.  Each record is
+self-delimiting.  Record markers are lightweight.  The overhead in terms
+of bytes and processing for records in this container vs. the raw contents
+of those records is minimal.
+
+Addressing records
+------------------
+
+There is a requirement that each object can be given an arbitrary name.
+Some revision control systems address all content by the SHA-1 digest of
+that content, but this scheme is unsatisfactory for Bazaar's revision
+objects.  We can still allow addressing by SHA-1 digest for those content
+types where it makes sense.
+
+Some proposed object names:
+
+  * to name a revision: "``revision:``\ *revision-id*".  e.g., 
+    `revision:pqm at pqm.ubuntu.com-20070531210833-8ptk86ocu822hjd5`.
+  * to name an inventory delta: "``inventory.delta:``\ *revision-id*".  e.g.,
+    `inventory.delta:pqm at pqm.ubuntu.com-20070531210833-8ptk86ocu822hjd5`.
+
+It seems likely that we may want to have multiple names for an object.
+This format allows that (by allowing multiple ``name`` headers in a Bytes
+record).
+
+Although records are in principle addressable by name, this specification
+alone doesn't provide for efficient access to a particular record given
+its name.  It is intended that seperate indexes will be maintained to
+provide this.
+
+It is acceptable to have records with no explicit name, if the expected
+use of them does not require them.  For example:
+
+  * a record's content could be self-describing in the context of a
+    particular container, or
+  * a record could be accessed via an index based on SHA-1, or 
+  * when streaming, the first record could be treated specially.
+
+Reasonably cheap for small records
+----------------------------------
+
+The overhead for storing fairly short records (tens of bytes, rather than
+thousands or millions) is minimal.  The minimum overhead is 3 bytes plus
+the length of the decimal representation of the *length* value (for a
+record with no name).
+
+
+Specification
+=============
+
+This describes just a basic layer for storing simple series of "records".
+This layer has no intrinsic understanding of the contents of those
+records.
+
+The format is:
+
+  * a **container lead-in**, "``bzr pack format 1\n``",
+  * followed by one or more **records**.
+
+A record is:
+
+  * a 1 byte **kind marker**.
+  * 0 or more bytes of record content, depending on the record type.
+
+Record types
+------------
+
+End Marker
+~~~~~~~~~~
+
+An **End Marker** record:
+
+  * has a kind marker of "``E``",
+  * no content bytes.
+
+End Marker records signal the end of a container.
+
+Bytes
+~~~~~
+
+A **Bytes** record:
+
+  * has a kind marker of "``B``",
+  * followed by a mandatory **content length** [1]_: 
+    "*number*\ ``\n``", where *number* is in decimal, e.g::
+
+      1234
+
+  * followed by zero or more optional **names**: 
+    "*name*\ ``\n``", e.g.::
+
+      revision:pqm at pqm.ubuntu.com-20070531210833-8ptk86ocu822hjd5
+
+  * followed by an **end of headers** byte: "``\n``",
+  * followed by some **bytes**, exactly as many as specified by the length
+    prefix header.
+
+So a Bytes record is a series of lines encoding the length and names (if
+any) followed by a body.
+
+For example, this is a possible Bytes record (including the kind marker)::
+
+  B26
+  example-name1
+  example-name2
+
+  abcdefghijklmnopqrstuvwxyz
+
+
+Names
+-----
+
+Names should be UTF-8 encoded strings, with no whitespace.  Names should
+be unique within a single container, but no guarantee of uniqueness
+outside of the container is made by this layer.  Names need to be at least
+one character long.
+
+
+.. [1] This requires that the writer of a record knows the full length of
+  the record up front, which typically means it will need to buffer an
+  entire record in memory.  For the first version of this format this is
+  considered to be acceptable.
+
+..
+   vim: ft=rst tw=74 ai
+

=== modified file Makefile
--- Makefile
+++ Makefile
@@ -86,13 +86,13 @@
 pretty_files: $(patsubst doc/%.txt, $(PRETTYDIR)/%.htm, $(txt_files))
 
 doc/developers/%.htm: doc/developers/%.txt
-	python tools/rst2html.py --link-stylesheet --stylesheet=../default.css $< $@
+	python tools/rst2html.py --link-stylesheet --stylesheet=../default.css --footnote-references=superscript $< $@
 
 doc/developers/HACKING.htm: doc/developers/HACKING
-	python tools/rst2html.py --link-stylesheet --stylesheet=../default.css $< $@
+	python tools/rst2html.py --link-stylesheet --stylesheet=../default.css --footnote-references=superscript $< $@
 
 %.htm: %.txt
-	python tools/rst2html.py --link-stylesheet --stylesheet=default.css $< $@
+	python tools/rst2html.py --link-stylesheet --stylesheet=default.css --footnote-references=superscript $< $@
 
 $(PRETTYDIR)/%.htm: pretty_docs doc/%.txt
 	python tools/rst2prettyhtml.py doc/bazaar-vcs.org.kid doc/$*.txt \

=== modified file doc/developers/index.txt // last-changed:andrew.bennetts at cano
... nical.com-20070601074703-5z2fps5c8c7c6bjp
--- doc/developers/index.txt
+++ doc/developers/index.txt
@@ -13,3 +13,8 @@
 * `Performance roadmap <performance-roadmap.htm>`_
 
   The roadmap for fixing performance in bzr over the next few releases.
+
+* `Container format <container-format.htm>`_
+
+  Notes on a container format for streaming and storing Bazaar data.
+

=== modified directory  // last-changed:andrew.bennetts at canonical.com-200706070
... 64153-z6sap26og3pbxxrl
# revision id: andrew.bennetts at canonical.com-20070607064153-z6sap26og3pbxxrl
# sha1: 61f351e1476379b23eff6bcc3d4615c94c86d28e
# inventory sha1: 716dfc7973dc99a6d3aeded69508d31d99be52aa
# parent ids:
#   andrew.bennetts at canonical.com-20070607040810-7aeblrfw0sl41mun
# base id: pqm at pqm.ubuntu.com-20070531210833-8ptk86ocu822hjd5
# properties:
#   branch-nick: container-format-doc

# message:
#   Use standard heading markers.
#   
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Thu 2007-06-07 14:08:10.411000013 +1000

=== modified file doc/developers/container-format.txt // encoding:base64
LS0tIGRvYy9kZXZlbG9wZXJzL2NvbnRhaW5lci1mb3JtYXQudHh0CisrKyBkb2MvZGV2ZWxvcGVy
cy9jb250YWluZXItZm9ybWF0LnR4dApAQCAtMSw1ICsxLDYgQEAKKz09PT09PT09PT09PT09PT0K
IENvbnRhaW5lciBmb3JtYXQKLS0tLS0tLS0tLS0tLS0tLS0KKz09PT09PT09PT09PT09PT0KIAog
U3RhdHVzCiA9PT09PT0KQEAgLTM1LDEwICszNiwxMCBAQAogICAqIDAgb3IgbW9yZSBieXRlcyBv
ZiByZWNvcmQgY29udGVudCwgZGVwZW5kaW5nIG9uIHRoZSByZWNvcmQgdHlwZS4KIAogUmVjb3Jk
IHR5cGVzCi1eXl5eXl5eXl5eXl4KKy0tLS0tLS0tLS0tLQogCiBFbmQgTWFya2VyCi0rKysrKysr
KysrCit+fn5+fn5+fn5+CiAKIEFuICoqRW5kIE1hcmtlcioqIHJlY29yZDoKIApAQCAtNDgsNyAr
NDksNyBAQAogRW5kIE1hcmtlciByZWNvcmRzIHNpZ25hbCB0aGUgZW5kIG9mIGEgY29udGFpbmVy
LgogCiBGdWxsIFRleHQKLSsrKysrKysrKworfn5+fn5+fn5+CiAKIEEgKipGdWxsIFRleHQqKiBy
ZWNvcmQ6CiAKQEAgLTc4LDcgKzc5LDcgQEAKIAogCiBOYW1lcwotXl5eXl4KKy0tLS0tCiAKIE5h
bWVzIHNob3VsZCBiZSBVVEYtOCBlbmNvZGVkIHN0cmluZ3MsIHdpdGggbm8gd2hpdGVzcGFjZS4g
IE5hbWVzIHNob3VsZAogYmUgdW5pcXVlIHdpdGhpbiBhIHNpbmdsZSBjb250YWluZXIsIGJ1dCBu
byBndWFyYW50ZWUgb2YgdW5pcXVlbmVzcwpAQCAtOTEsNyArOTIsNyBAQAogU29tZSBrZXkgYXNw
ZWN0cyBvZiB0aGlzIGZvcm1hdCBhcmUgZGlzY3Vzc2VkIGluIHRoaXMgc2VjdGlvbi4KIAogTm8g
bGVuZ3RoLXByZWZpeGluZyBvZiBlbnRpcmUgY29udGFpbmVyCi1eXl5eXl5eXl5eXl5eXl5eXl5e
Xl5eXl5eXl5eXl5eXl5eXl5eXl4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLQogCiBUaGUgb3ZlcmFsbCBjb250YWluZXIgaXMgbm90IGxlbmd0aCBwcmVmaXhlZC4gIElu
c3RlYWQgdGhlcmUgaXMgYW4gZW5kCiBtYXJrZXIgc28gdGhhdCByZWFkZXJzIGNhbiBkZXRlcm1p
bmUgd2hlbiB0aGV5IGhhdmUgcmVhZCB0aGUgZW50aXJlCkBAIC05OSw3ICsxMDAsNyBAQAogc2lu
Z2xlLXBhc3Mgd3JpdGluZy4KIAogU3RydWN0dXJlZCBhcyBhIHNlbGYtY29udGFpbmVkIHNlcmll
cyBvZiByZWNvcmRzCi1eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e
Xl5eXl4KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQog
CiBUaGUgY29udGFpbmVyIGNvbnRhaW5zIGEgc2VyaWVzIG9mICpyZWNvcmRzKi4gIEVhY2ggcmVj
b3JkIGlzCiBzZWxmLWRlbGltaXRpbmcuICBSZWNvcmQgbWFya2VycyBhcmUgbGlnaHR3ZWlnaHQu
ICBUaGUgb3ZlcmhlYWQgaW4gdGVybXMKQEAgLTEwNyw3ICsxMDgsNyBAQAogb2YgdGhvc2UgcmVj
b3JkcyBpcyBtaW5pbWFsLgogCiBBZGRyZXNzaW5nIHJlY29yZHMKLV5eXl5eXl5eXl5eXl5eXl5e
XgorLS0tLS0tLS0tLS0tLS0tLS0tCiAKIFRoZXJlIGlzIGEgcmVxdWlyZW1lbnQgdGhhdCBlYWNo
IG9iamVjdCBjYW4gYmUgZ2l2ZW4gYW4gYXJiaXRyYXJ5IG5hbWUuCiBTb21lIHJldmlzaW9uIGNv
bnRyb2wgc3lzdGVtcyBhZGRyZXNzIGFsbCBjb250ZW50IGJ5IHRoZSBTSEEtMSBkaWdlc3Qgb2YK
QEAgLTEzOSwxNCArMTQwLDE0IEBACiBzdXBwb3J0LgogCiBTdHJlYW1pbmcgZGF0YSBiZXR3ZWVu
IGEgc21hcnQgc2VydmVyIGFuZCBjbGllbnQKLV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e
Xl5eXl5eXl5eXl5eXl5eXl5eXgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tCiAKIEl0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgY29tYmluZSBtdWx0
aXBsZSBjb250YWluZXJzIGludG8gYSBzaW5nbGUKIHN0cmVhbSBieSBzb21ldGhpbmcgbm8gbW9y
ZSBleHBlbnNpdmUgdGhhbiBjb25jYXRlbmF0aW9uIChlLmcuIGJ5IG9taXR0aW5nCiBlbmQvc3Rh
cnQgbWFya2VyIHBhaXJzKS4gIAogCiBJbmNyZW1lbnRhbCBwdXNoIG9yIHB1bGwKLSsrKysrKysr
KysrKysrKysrKysrKysrKworfn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+CiAKIENvbnNpZGVyIHRo
ZSB1c2UgY2FzZSBvZiBpbmNyZW1lbnRhbCBwdXNoL3B1bGwsIHdoaWNoIGlzIGN1cnJlbnRseSAo
MC4xNikKIHZlcnkgc2xvdyBvbiBoaWdoLWxhdGVuY3kgbGlua3MgZHVlIHRvIHRoZSBsYXJnZSBu
dW1iZXIgb2Ygcm91bmQgdHJpcHMuCkBAIC0xNjYsMTMgKzE2NywxMyBAQAogaW4gdGhhdCBvcmRl
ci4KIAogUGVyc2lzdGVudCBzdG9yYWdlIG9uIGRpc2sKLV5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e
Xl5eCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBXZSB3YW50IGEgc3RvcmFnZSBmb3Jt
YXQgdGhhdCBhbGxvd3MgbG9jay1mcmVlIHdyaXRlcywgd2hpY2ggc3VnZ2VzdHMgYQogZm9ybWF0
IHRoYXQgdXNlcyAqcmVuYW1lIGludG8gcGxhY2UqLCBhbmQgKmRvIG5vdCBtb2RpZnkgYWZ0ZXIg
d3JpdGluZyouCiAKIFVzYWJsZSBiZWZvcmUgZGVlcCBtb2RlbCBjaGFuZ2VzIHRvIEJhemFhcgot
Xl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCistLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogV2Ugd2FudCBhIGZvcm1hdCB3ZSBjYW4g
dXNlIGFuZCByZWZpbmUgc29vbmVyIHJhdGhlciB0aGFuIGxhdGVyLiAgU28gaXQKIHNob3VsZCBi
ZSB1c2FibGUgYmVmb3JlIHRoZSBhbnRpY2lwYXRlZCBtb2RlbCBjaGFuZ2VzIGZvciBCYXphYXIg
IjEuMCIKCg==

=== modified directory  // last-changed:andrew.bennetts at canonical.com-200706070
... 40810-7aeblrfw0sl41mun
# revision id: andrew.bennetts at canonical.com-20070607040810-7aeblrfw0sl41mun
# sha1: 8f9d8525e9a950522d37e546c36bbdaaa6a6c9ba
# inventory sha1: 259f514bb116cfbbf79c2bf61bf5f59edfaf572e
# parent ids:
#   andrew.bennetts at canonical.com-20070601074703-5z2fps5c8c7c6bjp
# properties:
#   branch-nick: container-format-doc

# message:
#   First draft of container format developer doc, based on discussion with Robert.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Fri 2007-06-01 17:47:03.904000044 +1000

=== added file doc/developers/container-format.txt // file-id:containerformat.t
... xt-20070601074309-7n7w1jiyayud6xdn-1 // encoding:base64
LS0tIC9kZXYvbnVsbAorKysgZG9jL2RldmVsb3BlcnMvY29udGFpbmVyLWZvcm1hdC50eHQKQEAg
LTAsMCArMSwxOTkgQEAKK0NvbnRhaW5lciBmb3JtYXQKKy0tLS0tLS0tLS0tLS0tLS0KKworU3Rh
dHVzCis9PT09PT0KKworOkRhdGU6IDIwMDctMDYtMDEKKworVGhpcyBkb2N1bWVudCBkZXNjcmli
ZXMgdGhlIHByb3Bvc2VkIGNvbnRhaW5lciBmb3JtYXQgZm9yIHN0cmVhbWluZyBhbmQKK3N0b3Jp
bmcgY29sbGVjdGlvbnMgb2YgZGF0YSBpbiBCYXphYXIuICBJbml0aWFsbHkgdGhpcyB3aWxsIGJl
IHVzZWQgZm9yCitzdHJlYW1pbmcgcmV2aXNpb24gZGF0YSBmb3IgaW5jcmVtZW50YWwgcHVzaC9w
dWxsIGluIHRoZSBzbWFydCBzZXJ2ZXIgZm9yCiswLjE4LCBidXQgdGhlIGludGVudGlvbmFsIGlz
IHRoYXQgdGhpcyB3aWxsIGJlIHRoZSBiYXNpcyBmb3IgbXVjaCBtb3JlCit0aGFuIGp1c3QgdGhh
dCB1c2UgY2FzZS4KKworSW4gcGFydGljdWxhciwgdGhpcyBkb2N1bWVudCBjdXJyZW50bHkgZm9j
dXNlcyBhbG1vc3QgZXhjbHVzaXZlbHkgb24gdGhlCitzdHJlYW1pbmcgY2FzZSwgYW5kIG5vdCB0
aGUgb24tZGlzayBzdG9yYWdlIGNhc2UuCisKKy4uIGNvbnRlbnRzOjoKKworU3BlY2lmaWNhdGlv
bgorPT09PT09PT09PT09PQorCitUaGlzIGRlc2NyaWJlcyBqdXN0IGEgYmFzaWMgbGF5ZXIgZm9y
IHN0b3Jpbmcgc2ltcGxlIHNlcmllcyBvZiAicmVjb3JkcyIuCitUaGlzIGxheWVyIGhhcyBubyBp
bnRyaW5zaWMgdW5kZXJzdGFuZGluZyBvZiB0aGUgY29udGVudHMgb2YgdGhvc2UKK3JlY29yZHMu
CisKK1RoZSBmb3JtYXQgaXM6CisKKyAgKiBhICoqY29udGFpbmVyIGxlYWQtaW4qKiwgImBgYnpy
IHBhY2sgZm9ybWF0IDFcbmBgIiwKKyAgKiBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSAqKnJlY29y
ZHMqKi4KKworQSByZWNvcmQgaXM6CisKKyAgKiBhIDMgYnl0ZSAqKmtpbmQgbWFya2VyKiouCisg
ICogMCBvciBtb3JlIGJ5dGVzIG9mIHJlY29yZCBjb250ZW50LCBkZXBlbmRpbmcgb24gdGhlIHJl
Y29yZCB0eXBlLgorCitSZWNvcmQgdHlwZXMKK15eXl5eXl5eXl5eXgorCitFbmQgTWFya2VyCisr
KysrKysrKysrCisKK0FuICoqRW5kIE1hcmtlcioqIHJlY29yZDoKKworICAqIGhhcyBhIGtpbmQg
bWFya2VyIG9mICJgYEVNXG5gYCIsCisgICogbm8gY29udGVudCBieXRlcy4KKworRW5kIE1hcmtl
ciByZWNvcmRzIHNpZ25hbCB0aGUgZW5kIG9mIGEgY29udGFpbmVyLgorCitGdWxsIFRleHQKKysr
KysrKysrKworCitBICoqRnVsbCBUZXh0KiogcmVjb3JkOgorCisgICogaGFzIGEga2luZCBtYXJr
ZXIgb2YgImBgRlRcbmBgIiwKKyAgKiBmb2xsb3dlZCBieSBvbmUgb3IgbW9yZSBvcHRpb25hbCAq
Km5hbWUgaGVhZGVycyoqOiAKKyAgICAiYGBuYW1lOmBgICpuYW1lKlwgYGBcbmBgIiwgZS5nLjo6
CisKKyAgICAgIG5hbWU6IHJldmlzaW9uOnBxbUBwcW0udWJ1bnR1LmNvbS0yMDA3MDUzMTIxMDgz
My04cHRrODZvY3U4MjJoamQ1CisKKyAgKiBmb2xsb3dlZCBieSBhIG1hbmRhdG9yeSAqKmNvbnRl
bnQgbGVuZ3RoIGhlYWRlcioqOiAKKyAgICAiYGBsZW5ndGg6YGAgKm51bWJlcipcIGBgXG5gYCIs
IHdoZXJlICpudW1iZXIqIGlzIGluIGRlY2ltYWwsIGUuZzo6CisKKyAgICAgIGxlbmd0aDogMTIz
NAorCisgICogZm9sbG93ZWQgYnkgYW4gKiplbmQgb2YgaGVhZGVycyoqIGJ5dGU6ICJgYFxuYGAi
LAorICAqIGZvbGxvd2VkIGJ5IHNvbWUgKipieXRlcyoqLCBleGFjdGx5IGFzIG1hbnkgYXMgc3Bl
Y2lmaWVkIGJ5IHRoZSBsZW5ndGgKKyAgICBwcmVmaXggaGVhZGVyLgorCitTbyBhIEZ1bGwgVGV4
dCByZWNvcmQgbG9va3MgYSBiaXQgbGlrZSBhbiBSRkMgODIyLWZvcm1hdHRlZCBtZXNzYWdlLgor
ZS5nLjo6CisKKyAgRlQKKyAgbmFtZTogZXhhbXBsZS1yZWNvcmQKKyAgbGVuZ3RoOiA1CisKKyAg
YWJjZGUKKworCitOYW1lcworXl5eXl4KKworTmFtZXMgc2hvdWxkIGJlIFVURi04IGVuY29kZWQg
c3RyaW5ncywgd2l0aCBubyB3aGl0ZXNwYWNlLiAgTmFtZXMgc2hvdWxkCitiZSB1bmlxdWUgd2l0
aGluIGEgc2luZ2xlIGNvbnRhaW5lciwgYnV0IG5vIGd1YXJhbnRlZSBvZiB1bmlxdWVuZXNzCitv
dXRzaWRlIG9mIHRoZSBjb250YWluZXIgaXMgbWFkZSBieSB0aGlzIGxheWVyLgorCisKK0NoYXJh
Y3RlcmlzdGljcworPT09PT09PT09PT09PT09CisKK1NvbWUga2V5IGFzcGVjdHMgb2YgdGhpcyBm
b3JtYXQgYXJlIGRpc2N1c3NlZCBpbiB0aGlzIHNlY3Rpb24uCisKK05vIGxlbmd0aC1wcmVmaXhp
bmcgb2YgZW50aXJlIGNvbnRhaW5lcgorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5e
Xl5eXl5eCisKK1RoZSBvdmVyYWxsIGNvbnRhaW5lciBpcyBub3QgbGVuZ3RoIHByZWZpeGVkLiAg
SW5zdGVhZCB0aGVyZSBpcyBhbiBlbmQKK21hcmtlciBzbyB0aGF0IHJlYWRlcnMgY2FuIGRldGVy
bWluZSB3aGVuIHRoZXkgaGF2ZSByZWFkIHRoZSBlbnRpcmUKK2NvbnRhaW5lci4gIFRoaXMgYWxz
byBkb2VzIG5vdCBjb25mbGljdCB3aXRoIHRoZSBnb2FsIG9mIGFsbG93aW5nCitzaW5nbGUtcGFz
cyB3cml0aW5nLgorCitTdHJ1Y3R1cmVkIGFzIGEgc2VsZi1jb250YWluZWQgc2VyaWVzIG9mIHJl
Y29yZHMKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXgor
CitUaGUgY29udGFpbmVyIGNvbnRhaW5zIGEgc2VyaWVzIG9mICpyZWNvcmRzKi4gIEVhY2ggcmVj
b3JkIGlzCitzZWxmLWRlbGltaXRpbmcuICBSZWNvcmQgbWFya2VycyBhcmUgbGlnaHR3ZWlnaHQu
ICBUaGUgb3ZlcmhlYWQgaW4gdGVybXMKK29mIGJ5dGVzIGFuZCBwcm9jZXNzaW5nIGZvciByZWNv
cmRzIGluIHRoaXMgY29udGFpbmVyIHZzLiB0aGUgcmF3IGNvbnRlbnRzCitvZiB0aG9zZSByZWNv
cmRzIGlzIG1pbmltYWwuCisKK0FkZHJlc3NpbmcgcmVjb3JkcworXl5eXl5eXl5eXl5eXl5eXl5e
CisKK1RoZXJlIGlzIGEgcmVxdWlyZW1lbnQgdGhhdCBlYWNoIG9iamVjdCBjYW4gYmUgZ2l2ZW4g
YW4gYXJiaXRyYXJ5IG5hbWUuCitTb21lIHJldmlzaW9uIGNvbnRyb2wgc3lzdGVtcyBhZGRyZXNz
IGFsbCBjb250ZW50IGJ5IHRoZSBTSEEtMSBkaWdlc3Qgb2YKK3RoYXQgY29udGVudCwgYnV0IHRo
aXMgc2NoZW1lIGlzIHVuc2F0aXNmYWN0b3J5IGZvciBCYXphYXIncyByZXZpc2lvbgorb2JqZWN0
cy4gIFdlIGNhbiBzdGlsbCBhbGxvdyBhZGRyZXNzaW5nIGJ5IFNIQS0xIGRpZ2VzdCBmb3IgdGhv
c2UgY29udGVudAordHlwZXMgd2hlcmUgaXQgbWFrZXMgc2Vuc2UuCisKK1NvbWUgcHJvcG9zZWQg
b2JqZWN0IG5hbWVzOgorCisgICogdG8gbmFtZSBhIHJldmlzaW9uOiAiYGByZXZpc2lvbjpgYFwg
KnJldmlzaW9uLWlkKiIuICBlLmcuLCAKKyAgICBgcmV2aXNpb246cHFtQHBxbS51YnVudHUuY29t
LTIwMDcwNTMxMjEwODMzLThwdGs4Nm9jdTgyMmhqZDVgLgorICAqIHRvIG5hbWUgYW4gaW52ZW50
b3J5IGRlbHRhOiAiYGBpbnZlbnRvcnkuZGVsdGE6YGBcICpyZXZpc2lvbi1pZCoiLiAgZS5nLiwK
KyAgICBgaW52ZW50b3J5LmRlbHRhOnBxbUBwcW0udWJ1bnR1LmNvbS0yMDA3MDUzMTIxMDgzMy04
cHRrODZvY3U4MjJoamQ1YC4KKworSXQgc2VlbXMgbGlrZWx5IHRoYXQgd2UgbWF5IHdhbnQgdG8g
aGF2ZSBtdWx0aXBsZSBuYW1lcyBmb3IgYW4gb2JqZWN0LgorVGhpcyBmb3JtYXQgYWxsb3dzIHRo
YXQgKGJ5IGFsbG93aW5nIG11bHRpcGxlIGBgbmFtZWBgIGhlYWRlcnMgaW4gYSBGdWxsCitUZXh0
IHJlY29yZCkuCisKK0FsdGhvdWdoIHJlY29yZHMgYXJlIGluIHByaW5jaXBsZSBhZGRyZXNzYWJs
ZSBieSBuYW1lLCB0aGlzIHNwZWNpZmljYXRpb24KK2Fsb25lIGRvZXNuJ3QgcHJvdmlkZSBmb3Ig
ZWZmaWNpZW50IGFjY2VzcyB0byBhIHBhcnRpY3VsYXIgcmVjb3JkIGdpdmVuCitpdHMgbmFtZS4g
IEl0IGlzIGludGVuZGVkIHRoYXQgc2VwZXJhdGUgaW5kZXhlcyB3aWxsIGJlIG1haW50YWluZWQg
dG8KK3Byb3ZpZGUgdGhpcy4KKworCitVc2UgQ2FzZXMKKz09PT09PT09PQorCitIZXJlJ3MgYSBi
cmllZiBkZXNjcmlwdGlvbiBvZiB1c2UgY2FzZXMgdGhpcyBmb3JtYXQgaXMgaW50ZW5kZWQgdG8K
K3N1cHBvcnQuCisKK1N0cmVhbWluZyBkYXRhIGJldHdlZW4gYSBzbWFydCBzZXJ2ZXIgYW5kIGNs
aWVudAorXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisK
K0l0IHdvdWxkIGJlIG5pY2UgaWYgd2UgY291bGQgY29tYmluZSBtdWx0aXBsZSBjb250YWluZXJz
IGludG8gYSBzaW5nbGUKK3N0cmVhbSBieSBzb21ldGhpbmcgbm8gbW9yZSBleHBlbnNpdmUgdGhh
biBjb25jYXRlbmF0aW9uIChlLmcuIGJ5IG9taXR0aW5nCitlbmQvc3RhcnQgbWFya2VyIHBhaXJz
KS4gIAorCitJbmNyZW1lbnRhbCBwdXNoIG9yIHB1bGwKKysrKysrKysrKysrKysrKysrKysrKysr
KworCitDb25zaWRlciB0aGUgdXNlIGNhc2Ugb2YgaW5jcmVtZW50YWwgcHVzaC9wdWxsLCB3aGlj
aCBpcyBjdXJyZW50bHkgKDAuMTYpCit2ZXJ5IHNsb3cgb24gaGlnaC1sYXRlbmN5IGxpbmtzIGR1
ZSB0byB0aGUgbGFyZ2UgbnVtYmVyIG9mIHJvdW5kIHRyaXBzLgorV2hhdCB3ZSdkIGxpa2UgaXMg
c29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZy4KKworQSBjbGllbnQgd2lsbCBtYWtlIGEgcmVx
dWVzdCBtZWFuaW5nICJnaXZlIG1lIHRoZSBrbml0IGNvbnRlbnRzIGZvciB0aGVzZQorcmV2aXNp
b24gSURzIiAoaG93IHRoZSBjbGllbnQgZGV0ZXJtaW5lcyB3aGljaCByZXZpc2lvbiBJRHMgaXQg
bmVlZHMgaXMKK3VuaW1wb3J0YW50IGhlcmUpLiAgSW4gcmVzcG9uc2UsIHRoZSBzZXJ2ZXIgc3Ry
ZWFtcyBhIHNpbmdsZSBjb250YWluZXIgb2Y6CisKKyAgKiBvbmUgcmVjb3JkIHBlciBmaWxlLWlk
OnJldmlzaW9uLWlkIGtuaXQgZ3ppcCBjb250ZW50cyBhbmQgZ3JhcGggZGF0YSwKKyAgKiBvbmUg
cmVjb3JkIHBlciBpbnZlbnRvcnk6cmV2aXNpb24taWQga25pdCBnemlwIGNvbnRlbnRzIGFuZCBn
cmFwaAorICAgIGRhdGEsCisgICogb25lIHJlY29yZCBwZXIgcmV2aXNpb24ga25pdCBnemlwIGNv
bnRlbnRzLAorICAqIG9uZSByZWNvcmQgcGVyIHJldmlzaW9uIHNpZ25hdHVyZSwKKyAgKiBlbmQg
bWFya2VyIHJlY29yZC4KKworaW4gdGhhdCBvcmRlci4KKworUGVyc2lzdGVudCBzdG9yYWdlIG9u
IGRpc2sKK15eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eCisKK1dlIHdhbnQgYSBzdG9yYWdlIGZv
cm1hdCB0aGF0IGFsbG93cyBsb2NrLWZyZWUgd3JpdGVzLCB3aGljaCBzdWdnZXN0cyBhCitmb3Jt
YXQgdGhhdCB1c2VzICpyZW5hbWUgaW50byBwbGFjZSosIGFuZCAqZG8gbm90IG1vZGlmeSBhZnRl
ciB3cml0aW5nKi4KKworVXNhYmxlIGJlZm9yZSBkZWVwIG1vZGVsIGNoYW5nZXMgdG8gQmF6YWFy
CiteXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl5eXl4KKworV2Ugd2FudCBh
IGZvcm1hdCB3ZSBjYW4gdXNlIGFuZCByZWZpbmUgc29vbmVyIHJhdGhlciB0aGFuIGxhdGVyLiAg
U28gaXQKK3Nob3VsZCBiZSB1c2FibGUgYmVmb3JlIHRoZSBhbnRpY2lwYXRlZCBtb2RlbCBjaGFu
Z2VzIGZvciBCYXphYXIgIjEuMCIKK2xhbmQsIHdoaWxlIG5vdCBjb25mbGljdGluZyB3aXRoIHRo
b3NlIGNoYW5nZXMgZWl0aGVyLgorCitTcGVjaWZpY2FsbHksIHdlJ2QgbGlrZSB0byBoYXZlIHRo
aXMgZm9ybWF0IGluIEJhemFhciAwLjE4LgorCisKK0V4YW1wbGVzIG9mIHBvc3NpYmxlIHJlY29y
ZCBjb250ZW50Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisgICogZnVs
bCB0ZXh0cworICAqIGRlbHRhcyBvZiBmdWxsIHRleHRzCisgICogcmV2aXNpb25zCisgICogaW52
ZW50b3JpZXMKKyAgKiBpbnZlbnRvcnkgYXMgdHJlZSBpdGVtcyBlLmcuIHRoZSBpbnZlbnRvcnkg
ZGF0YSBmb3IgMjAgZmlsZXMKKyAgKiByZXZpc2lvbiBzaWduYXR1cmVzCisgICogcGVyLWZpbGUg
Z3JhcGggZGF0YQorICAqIGFubm90YXRpb24gY2FjaGUKKworCisuLgorICAgdmltOiBmdD1yc3Qg
dHc9NzQgYWkKKwoK

=== modified file doc/developers/index.txt // encoding:base64
LS0tIGRvYy9kZXZlbG9wZXJzL2luZGV4LnR4dAorKysgZG9jL2RldmVsb3BlcnMvaW5kZXgudHh0
CkBAIC0xMywzICsxMyw4IEBACiAqIGBQZXJmb3JtYW5jZSByb2FkbWFwIDxwZXJmb3JtYW5jZS1y
b2FkbWFwLmh0bT5gXwogCiAgIFRoZSByb2FkbWFwIGZvciBmaXhpbmcgcGVyZm9ybWFuY2UgaW4g
YnpyIG92ZXIgdGhlIG5leHQgZmV3IHJlbGVhc2VzLgorCisqIGBDb250YWluZXIgZm9ybWF0IDxj
b250YWluZXItZm9ybWF0Lmh0bT5gXworCisgIE5vdGVzIG9uIGEgY29udGFpbmVyIGZvcm1hdCBm
b3Igc3RyZWFtaW5nIGFuZCBzdG9yaW5nIEJhemFhciBkYXRhLgorCgo=

=== modified directory  // last-changed:andrew.bennetts at canonical.com-200706010
... 74703-5z2fps5c8c7c6bjp
# revision id: andrew.bennetts at canonical.com-20070601074703-5z2fps5c8c7c6bjp
# sha1: f4203286a7f42eb1b453a976c2124e5fca086b3d
# inventory sha1: 7a017b8f0a6d14d1f215abaa2f5d5a2067c027eb
# parent ids:
#   pqm at pqm.ubuntu.com-20070531210833-8ptk86ocu822hjd5
# properties:
#   branch-nick: container-format-doc



More information about the bazaar mailing list