# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: john@arbash-meinel.com-20090507165738-d1paryt860nnyku6
# target_branch: http://bazaar-vcs.org/bzr/bzr.dev
# testament_sha1: f0f72de7eeea544ae5ade7ee9f43d072012e16b0
# timestamp: 2009-05-07 11:57:48 -0500
# source_branch: lp:///~jameinel/bzr/rio_serializer
# base_revision_id: pqm@pqm.ubuntu.com-20090506173137-di6mfn1f3od2khp3
# 
# Begin patch
=== modified file 'bzrlib/bzrdir.py'
--- bzrlib/bzrdir.py	2009-05-06 15:10:44 +0000
+++ bzrlib/bzrdir.py	2009-05-06 20:46:38 +0000
@@ -3780,6 +3780,18 @@
     experimental=True,
     )
 
+format_registry.register_metadir('development7-rich-root',
+    'bzrlib.repofmt.groupcompress_repo.RepositoryFormatCHK2',
+    help='pack-1.9 with 255-way hashed CHK inv, rio revision, group compress, '
+        'rich roots. Please read '
+        'http://doc.bazaar-vcs.org/latest/developers/development-repo.html '
+        'before use.',
+    branch_format='bzrlib.branch.BzrBranchFormat7',
+    tree_format='bzrlib.workingtree.WorkingTreeFormat6',
+    hidden=True,
+    experimental=True,
+    )
+
 # The following format should be an alias for the rich root equivalent 
 # of the default format
 format_registry.register_metadir('default-rich-root',

=== modified file 'bzrlib/chk_serializer.py'
--- bzrlib/chk_serializer.py	2009-04-09 20:23:07 +0000
+++ bzrlib/chk_serializer.py	2009-05-06 20:46:38 +0000
@@ -16,14 +16,89 @@
 
 """Serializer object for CHK based inventory storage."""
 
+from cStringIO import (
+    StringIO,
+    )
+
 from bzrlib import (
+    cache_utf8,
     inventory,
+    osutils,
+    revision as _mod_revision,
+    rio,
     xml5,
     xml6,
     )
 
-
-class CHKSerializerSubtree(xml6.Serializer_v6):
+class RIORevisionSerializer1(object):
+    """Simple revision serializer based around RIO. 
+    
+    It tries to group entries together that are less likely
+    to change often, to make it easier to do compression.
+    """
+
+    def write_revision(self, rev, f):
+        decode_utf8 = cache_utf8.decode
+        w = rio.RioWriter(f)
+        s = rio.Stanza()
+        revision_id = decode_utf8(rev.revision_id)
+        s.add("revision-id", revision_id)
+        s.add("timestamp", "%.3f" % rev.timestamp)
+        for p in rev.parent_ids:
+            s.add("parent-id", decode_utf8(p))
+        s.add("inventory-sha1", rev.inventory_sha1)
+        s.add("committer", rev.committer)
+        if rev.timezone is not None:
+            s.add("timezone", str(rev.timezone))
+        if rev.properties:
+            revprops_stanza = rio.Stanza()
+            for k, v in rev.properties.iteritems():
+                if isinstance(v, str):
+                    v = decode_utf8(v)
+                revprops_stanza.add(decode_utf8(k), v)
+            s.add("properties", revprops_stanza.to_unicode())
+        s.add("message", rev.message)
+        w.write_stanza(s)
+
+    def write_revision_to_string(self, rev):
+        f = StringIO()
+        self.write_revision(rev, f)
+        return f.getvalue()
+
+    def read_revision(self, f):
+        s = rio.read_stanza(f)
+        rev = _mod_revision.Revision(None)
+        rev.parent_ids = []
+        for (field, value) in s.iter_pairs():
+            if field == "revision-id":
+                rev.revision_id = cache_utf8.encode(value)
+            elif field == "parent-id":
+                rev.parent_ids.append(cache_utf8.encode(value))
+            elif field == "committer":
+                rev.committer = value
+            elif field == "inventory-sha1":
+                rev.inventory_sha1 = value
+            elif field == "timezone":
+                rev.timezone = int(value)
+            elif field == "timestamp":
+                rev.timestamp = float(value)
+            elif field == "message":
+                rev.message = value
+            elif field == "properties":
+                rev.properties = rio.read_stanza_unicode(
+                    osutils.split_lines(value)).as_dict()
+            else:
+                raise AssertionError("Unknown field %s" % field)
+            l = f.readline()
+        return rev
+
+    def read_revision_from_string(self, xml_string):
+        f = StringIO(xml_string)
+        rev = self.read_revision(f)
+        return rev
+
+
+class CHKSerializerSubtree(RIORevisionSerializer1, xml6.Serializer_v6):
     """A CHKInventory based serializer that supports tree references"""
 
     supported_kinds = set(['file', 'directory', 'symlink', 'tree-reference'])
@@ -64,3 +139,12 @@
 
 
 chk_serializer_255_bigpage = CHKSerializer(65536, 'hash-255-way')
+
+
+class CHKRIOSerializer(RIORevisionSerializer1, CHKSerializer):
+    """A CHKInventory and RIO based serializer with 'plain' behaviour."""
+
+    format_num = '10'
+
+
+chk_rio_serializer = CHKRIOSerializer(65536, 'hash-255-way')

=== modified file 'bzrlib/repofmt/groupcompress_repo.py'
--- bzrlib/repofmt/groupcompress_repo.py	2009-04-20 08:37:32 +0000
+++ bzrlib/repofmt/groupcompress_repo.py	2009-05-06 20:46:38 +0000
@@ -1002,3 +1002,23 @@
                 'Does not support nested trees', target_format)
 
 
+
+class RepositoryFormatCHK2(RepositoryFormatCHK1):
+    """A CHK repository that uses the RIO revision serializer."""
+
+    _serializer = chk_serializer.chk_rio_serializer
+
+    def _get_matching_bzrdir(self):
+        return bzrdir.format_registry.make_bzrdir('development7-rich-root')
+
+    def _ignore_setting_bzrdir(self, format):
+        pass
+
+    _matchingbzrdir = property(_get_matching_bzrdir, _ignore_setting_bzrdir)
+
+    def get_format_string(self):
+        """See RepositoryFormat.get_format_string()."""
+        return ('Bazaar development format - chk repository with rio revision '
+                'serialization (needs bzr.dev from 1.15)\n')
+
+

=== modified file 'bzrlib/repository.py'
--- bzrlib/repository.py	2009-05-05 03:13:58 +0000
+++ bzrlib/repository.py	2009-05-06 20:46:38 +0000
@@ -3031,6 +3031,13 @@
     'RepositoryFormatCHK1',
     )
 
+format_registry.register_lazy(
+    'Bazaar development format - chk repository with rio revision '
+        'serialization (needs bzr.dev from 1.15)\n',
+    'bzrlib.repofmt.groupcompress_repo',
+    'RepositoryFormatCHK2',
+    )
+
 
 class InterRepository(InterObject):
     """This class represents operations taking place between two repositories.

=== modified file 'bzrlib/rio.py'
--- bzrlib/rio.py	2009-03-23 14:59:43 +0000
+++ bzrlib/rio.py	2009-05-07 16:57:38 +0000
@@ -284,30 +284,30 @@
     #       rather than a more specific error.
 
     for line in unicode_iter:
-        if line is None or line == '':
+        if line is None or line == u'':
             break       # end of file
-        if line == '\n':
+        if line == u'\n':
             break       # end of stanza
         real_l = line
-        if line[0] == '\t': # continues previous value
+        if line[0] == u'\t': # continues previous value
             if tag is None:
                 raise ValueError('invalid continuation line %r' % real_l)
-            accum_value += '\n' + line[1:-1]
+            accum_value.append(u'\n' + line[1:-1])
         else: # new tag:value line
             if tag is not None:
-                stanza.add(tag, accum_value)
+                stanza.add(tag, u''.join(accum_value))
             try:
-                colon_index = line.index(': ')
+                colon_index = line.index(u': ')
             except ValueError:
                 raise ValueError('tag/value separator not found in line %r'
                                  % real_l)
             tag = str(line[:colon_index])
             if not valid_tag(tag):
                 raise ValueError("invalid rio tag %r" % (tag,))
-            accum_value = line[colon_index+2:-1]
+            accum_value = [line[colon_index+2:-1]]
 
     if tag is not None: # add last tag-value
-        stanza.add(tag, accum_value)
+        stanza.add(tag, u''.join(accum_value))
         return stanza
     else:     # didn't see any content
         return None

=== modified file 'bzrlib/tests/per_repository/test_revision.py'
--- bzrlib/tests/per_repository/test_revision.py	2009-03-23 14:59:43 +0000
+++ bzrlib/tests/per_repository/test_revision.py	2009-04-15 01:37:51 +0000
@@ -72,7 +72,7 @@
         tree1.commit(message="quux", allow_pointless=True, committer="jaq",
                      revprops={'empty':'',
                                'value':'one',
-                               'unicode':'\xb5',
+                               'unicode':u'\xb5',
                                'multiline':'foo\nbar\n\n'
                               })
         self.assertTrue(len(tree1.branch.revision_history()) > 0)

=== modified file 'bzrlib/workingtree.py'
--- bzrlib/workingtree.py	2009-05-06 06:36:03 +0000
+++ bzrlib/workingtree.py	2009-05-06 19:56:11 +0000
@@ -1642,7 +1642,7 @@
 
             fl = []
             for subf in os.listdir(dirabs):
-                if subf == '.bzr':
+                if self.bzrdir.is_control_filename(subf):
                     continue
                 if subf not in dir_entry.children:
                     try:
@@ -2374,7 +2374,8 @@
                     bzrdir_loc = bisect_left(cur_disk_dir_content,
                         ('.bzr', '.bzr'))
                     if (bzrdir_loc < len(cur_disk_dir_content)
-                        and cur_disk_dir_content[bzrdir_loc][0] == '.bzr'):
+                        and self.bzrdir.is_control_filename(
+                            cur_disk_dir_content[bzrdir_loc][0])):
                         # we dont yield the contents of, or, .bzr itself.
                         del cur_disk_dir_content[bzrdir_loc]
             if inv_finished:

# Begin bundle
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