=== modified file 'NEWS'
--- NEWS 2009-07-16 08:00:03 +0000
+++ NEWS 2009-07-27 18:03:19 +0000
@@ -33,6 +33,9 @@
* ``bzr mv`` no longer takes out branch locks, which allows it to work
when the branch is readonly. (Robert Collins, #216541)
+* ``bzr send`` now generates valid bundles with ``--2a`` formats.
+ (John Arbash Meinel, #393349)
+
* Fixed spurious "Source branch does not support stacking" warning when
pushing. (Andrew Bennetts, #388908)
It'd be useful to mention in the news file the constraints on interoperation
with other formats and clients.
=== modified file 'bzrlib/bundle/serializer/v4.py'
--- bzrlib/bundle/serializer/v4.py 2009-06-10 03:56:49 +0000
+++ bzrlib/bundle/serializer/v4.py 2009-07-27 17:51:10 +0000
@@ -315,12 +315,69 @@
def write_revisions(self):
"""Write bundle records for all revisions and signatures"""
inv_vf = self.repository.inventories
- revision_order = [key[-1] for key in multiparent.topo_iter_keys(inv_vf,
- self.revision_keys)]
+ topological_order = [key[-1] for key in multiparent.topo_iter_keys(
+ inv_vf, self.revision_keys)]
+ revision_order = topological_order
if self.target is not None and self.target in self.revision_ids:
+ # Make sure the target is always the last entry
+ revision_order = list(topological_order) revision_order.remove(self.target) revision_order.append(self.target)
- self._add_mp_records_keys('inventory', inv_vf, [(revid,) for revid in revision_order])
+ if self.repository._serializer.support_altered_by_hack:
+ self._add_mp_records_keys('inventory', inv_vf,
+ [(revid,) for revid in topological_order])
+ else:
+ self._add_inventory_mpdiffs_from_serializer(topological_order)
+ self._add_revision_texts(revision_order)
I think you should have, here, at least some description of why you're
going to use support_altered_by_hack here, because it's (at least to me)
not very clear that it's the same thing as being able to get the
inventory mp records from the versionedfile.
Maybe a comment or docstring about the purpose of this?
+ inventory_key_order = [(r,) for r in revision_order]
+ parent_map = self.repository.inventories.get_parent_map(
+ inventory_key_order)
+ missing_keys = set(inventory_key_order).difference(parent_map)
+ if missing_keys:
+ raise errors.RevisionNotPresent(list(missing_keys)[0],
+ self.repository.inventories)
+ inv_to_str = self.repository._serializer.write_inventory_to_string
+ # Make sure that we grab the parent texts first
+ just_parents = set()
+ map(just_parents.update, parent_map.itervalues())
+ just_parents.difference_update(parent_map)
+ # Ignore ghost parents
+ present_parents = self.repository.inventories.get_parent_map(
+ just_parents)
+ ghost_keys = just_parents.difference(present_parents)
+ needed_inventories = list(present_parents) + inventory_key_order
+ needed_inventories = [k[-1] for k in needed_inventories]
+ all_lines = {}
+ for inv in self.repository.iter_inventories(needed_inventories):
+ revision_id = inv.revision_id
+ key = (revision_id,)
+ as_bytes = inv_to_str(inv)
+ # The sha1 is validated as the xml/textual form, not as the
+ # form-in-the-repository
+ sha1 = osutils.sha_string(as_bytes)
+ as_lines = osutils.split_lines(as_bytes)
+ del as_bytes
+ all_lines[key] = as_lines
+ if key in just_parents:
+ # We don't transmit those entries
+ continue
+ # Create an mpdiff for this text, and add it to the output
+ parent_keys = parent_map[key]
+ # See the comment in VF.make_mpdiffs about how this effects
+ # ordering when there are ghosts present. I think we have a latent
+ # bug
+ parent_lines = [all_lines[p_key] for p_key in parent_keys
+ if p_key not in ghost_keys]
+ diff = multiparent.MultiParent.from_lines(
+ as_lines, parent_lines)
+ text = ''.join(diff.to_patch())
+ parent_ids = [k[-1] for k in parent_keys]
+ self.bundle.add_multiparent_record(text, sha1, parent_ids,
+ 'inventory', revision_id, None)
+
+ def _add_revision_texts(self, revision_order):
parent_map = self.repository.get_parent_map(revision_order) revision_to_str = self.repository._serializer.write_revision_to_string
revisions = self.repository.get_revisions(revision_order)
=== modified file 'bzrlib/chk_serializer.py'
--- bzrlib/chk_serializer.py 2009-07-01 10:46:27 +0000
+++ bzrlib/chk_serializer.py 2009-07-22 20:22:21 +0000
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 Canonical Ltd
+# Copyright (C) 2008, 2009 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -21,8 +21,8 @@
cache_utf8,
inventory,
revision as _mod_revision,
- xml5,
xml6,
+ xml7,
)
-class CHKSerializerSubtree(BEncodeRevisionSerializer1, xml6.Serializer_v6):
+class CHKSerializerSubtree(BEncodeRevisionSerializer1, xml7.Serializer_v7):
"""A CHKInventory based serializer that supports tree references"""
-class CHKSerializer(xml5.Serializer_v5):
+class CHKSerializer(xml6.Serializer_v6):
"""A CHKInventory based serializer with 'plain' behaviour."""
format_num = '9'
It would be nice (not necessarily for this patch) if we didn't have
concrete final classes inheriting from each other, but rather just made
them inherit from some kind of trait class.
=== modified file 'bzrlib/repository.py'
--- bzrlib/repository.py 2009-07-02 23:10:53 +0000
+++ bzrlib/repository.py 2009-07-22 19:00:01 +0000
@@ -2190,6 +2190,7 @@
"""
if ((None in revision_ids)
or (_mod_revision.NULL_REVISION in revision_ids)):
+ import pdb; pdb.set_trace()
raise ValueError('cannot get null revision inventory')
return self._iter_inventories(revision_ids)
=== modified file 'NEWS'
--- NEWS 2009-07-16 08:00:03 +0000
+++ NEWS 2009-07-27 18:03:19 +0000
@@ -33,6 +33,9 @@
* ``bzr mv`` no longer takes out branch locks, which allows it to work
when the branch is readonly. (Robert Collins, #216541)
+* ``bzr send`` now generates valid bundles with ``--2a`` formats.
+ (John Arbash Meinel, #393349)
+
* Fixed spurious "Source branch does not support stacking" warning when
pushing. (Andrew Bennetts, #388908)
It'd be useful to mention in the news file the constraints on interoperation
with other formats and clients.
=== modified file 'bzrlib/ bundle/ serializer/ v4.py' bundle/ serializer/ v4.py 2009-06-10 03:56:49 +0000 bundle/ serializer/ v4.py 2009-07-27 17:51:10 +0000 (self): .inventories topo_iter_ keys(inv_ vf, keys)] topo_iter_ keys( keys)] l_order)
revision_ order.remove( self.target)
revision_ order.append( self.target) mp_records_ keys('inventory ', inv_vf, [(revid,) for revid in revision_order]) ._serializer. support_ altered_ by_hack: mp_records_ keys('inventory ', inv_vf, inventory_ mpdiffs_ from_serializer (topological_ order) revision_ texts(revision_ order)
--- bzrlib/
+++ bzrlib/
@@ -315,12 +315,69 @@
def write_revisions
"""Write bundle records for all revisions and signatures"""
inv_vf = self.repository
- revision_order = [key[-1] for key in multiparent.
- self.revision_
+ topological_order = [key[-1] for key in multiparent.
+ inv_vf, self.revision_
+ revision_order = topological_order
if self.target is not None and self.target in self.revision_ids:
+ # Make sure the target is always the last entry
+ revision_order = list(topologica
- self._add_
+ if self.repository
+ self._add_
+ [(revid,) for revid in topological_order])
+ else:
+ self._add_
+ self._add_
I think you should have, here, at least some description of why you're altered_ by_hack here, because it's (at least to me)
going to use support_
not very clear that it's the same thing as being able to get the
inventory mp records from the versionedfile.
Is there a reason the orders should be different?
+ mpdiffs_ from_serializer (self, revision_order):
+ def _add_inventory_
Maybe a comment or docstring about the purpose of this?
+ inventory_key_order = [(r,) for r in revision_order] .inventories. get_parent_ map( key_order) key_order) .difference( parent_ map) RevisionNotPres ent(list( missing_ keys)[0] , .inventories) ._serializer. write_inventory _to_string parents. update, parent_ map.itervalues( )) difference_ update( parent_ map) .inventories. get_parent_ map( difference( present_ parents) parents) + inventory_key_order .iter_inventori es(needed_ inventories) : the-repository sha_string( as_bytes) split_lines( as_bytes) MultiParent. from_lines( diff.to_ patch() ) add_multiparent _record( text, sha1, parent_ids, texts(self, revision_order): .get_parent_ map(revision_ order)
revision_ to_str = self.repository ._serializer. write_revision_ to_string .get_revisions( revision_ order)
+ parent_map = self.repository
+ inventory_
+ missing_keys = set(inventory_
+ if missing_keys:
+ raise errors.
+ self.repository
+ inv_to_str = self.repository
+ # Make sure that we grab the parent texts first
+ just_parents = set()
+ map(just_
+ just_parents.
+ # Ignore ghost parents
+ present_parents = self.repository
+ just_parents)
+ ghost_keys = just_parents.
+ needed_inventories = list(present_
+ needed_inventories = [k[-1] for k in needed_inventories]
+ all_lines = {}
+ for inv in self.repository
+ revision_id = inv.revision_id
+ key = (revision_id,)
+ as_bytes = inv_to_str(inv)
+ # The sha1 is validated as the xml/textual form, not as the
+ # form-in-
+ sha1 = osutils.
+ as_lines = osutils.
+ del as_bytes
+ all_lines[key] = as_lines
+ if key in just_parents:
+ # We don't transmit those entries
+ continue
+ # Create an mpdiff for this text, and add it to the output
+ parent_keys = parent_map[key]
+ # See the comment in VF.make_mpdiffs about how this effects
+ # ordering when there are ghosts present. I think we have a latent
+ # bug
+ parent_lines = [all_lines[p_key] for p_key in parent_keys
+ if p_key not in ghost_keys]
+ diff = multiparent.
+ as_lines, parent_lines)
+ text = ''.join(
+ parent_ids = [k[-1] for k in parent_keys]
+ self.bundle.
+ 'inventory', revision_id, None)
+
+ def _add_revision_
parent_map = self.repository
revisions = self.repository
=== modified file 'bzrlib/ chk_serializer. py' chk_serializer. py 2009-07-01 10:46:27 +0000 chk_serializer. py 2009-07-22 20:22:21 +0000
--- bzrlib/
+++ bzrlib/
@@ -1,4 +1,4 @@
-# Copyright (C) 2008 Canonical Ltd
+# Copyright (C) 2008, 2009 Canonical Ltd
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
@@ -21,8 +21,8 @@
cache_utf8,
inventory,
revision as _mod_revision,
- xml5,
xml6,
+ xml7,
)
@@ -131,7 +131,7 @@ revision_ from_string( f.read( ))
return self.read_
-class CHKSerializerSu btree(BEncodeRe visionSerialize r1, xml6.Serializer _v6): btree(BEncodeRe visionSerialize r1, xml7.Serializer _v7):
+class CHKSerializerSu
"""A CHKInventory based serializer that supports tree references"""
supported_ kinds = set(['file', 'directory', 'symlink', 'tree-reference']) TreeReference( file_id, name, parent_id, revision,
reference_ revision) _v6._unpack_ entry(self, elt) _v7._unpack_ entry(self, elt)
@@ -152,14 +152,14 @@
return inventory.
else:
- return xml6.Serializer
+ return xml7.Serializer
def __init__(self, node_size, search_key_name):
self. maximum_ size = node_size
self. search_ key_name = search_key_name
-class CHKSerializer( xml5.Serializer _v5): xml6.Serializer _v6):
+class CHKSerializer(
"""A CHKInventory based serializer with 'plain' behaviour."""
format_num = '9'
It would be nice (not necessarily for this patch) if we didn't have
concrete final classes inheriting from each other, but rather just made
them inherit from some kind of trait class.
=== modified file 'bzrlib/ repository. py' repository. py 2009-07-02 23:10:53 +0000 repository. py 2009-07-22 19:00:01 +0000 NULL_REVISION in revision_ids)): inventories( revision_ ids)
--- bzrlib/
+++ bzrlib/
@@ -2190,6 +2190,7 @@
"""
if ((None in revision_ids)
or (_mod_revision.
+ import pdb; pdb.set_trace()
raise ValueError('cannot get null revision inventory')
return self._iter_
Uh...
Otherwise looks ok.