[#288751][merge] check invariants in NewPack
Martin Pool
mbp at canonical.com
Wed Nov 12 09:38:39 GMT 2008
As the comment says, we don't intend to have packs with deltas that
depend on data not present anywhere in their repository. (It could in
principle be supported but per a previous conversation we don't want to
create this.)
There was a check that we don't create this data from a Packer, but that
only covers transmission between same-format pack repositories. It's
better to do it on the NewPack object which covers all insertions into
the repository.
I also changed it to give an "internal error" message rather than
RevisionNotPresent, because this is clearly a bzr bug.
This doesn't fix #288751, but it will (should) cause a more obvious
error if we're about to hit it, and should make it easier to diagnose.
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: mbp at sourcefrog.net-20081112092834-ve92du17xgnvaztg
# target_branch: http://sourcefrog.net/bzr/trunk
# testament_sha1: e21d94179c4951e942a2ce23691b3dca6cff8a2a
# timestamp: 2008-11-12 19:30:03 +1000
# source_branch: http://sourcefrog.net/bzr/288751-pack-deltas
# base_revision_id: mbp at sourcefrog.net-20081112091307-yvchhvmcgr58aca7
#
# Begin patch
=== modified file 'bzrlib/repofmt/pack_repo.py'
--- bzrlib/repofmt/pack_repo.py 2008-11-12 09:13:07 +0000
+++ bzrlib/repofmt/pack_repo.py 2008-11-12 09:28:34 +0000
@@ -324,6 +324,26 @@
else:
raise AssertionError(self._state)
+ def _check_references(self):
+ """Make sure our external references are present.
+
+ Packs are allowed to have deltas whose base is not in the pack, but it
+ must be present somewhere in this collection. It is not allowed to
+ have deltas based on a fallback repository.
+ (See <https://bugs.launchpad.net/bzr/+bug/288751>)
+ """
+ external_refs = self._external_compression_parents_of_texts()
+ if external_refs:
+ index = self._pack_collection.text_index.combined_index
+ found_items = list(index.iter_entries(external_refs))
+ if len(found_items) != len(external_refs):
+ found_keys = set(k for idx, k, refs, value in found_items)
+ missing_items = external_refs - found_keys
+ raise errors.BzrCheckError(
+ "Newly created pack file %r has delta references
to items not "
+ "in its repository:\n%r"
+ % (self, missing_items))
+
def data_inserted(self):
"""True if data has been added to this pack."""
return bool(self.get_revision_count() or
@@ -346,6 +366,7 @@
if self._buffer[1]:
self._write_data('', flush=True)
self.name = self._hash.hexdigest()
+ self._check_references()
# write indices
# XXX: It'd be better to write them all to temporary names, then
# rename them all into place, so that the window when only some are
@@ -690,19 +711,6 @@
self.new_pack.text_index, readv_group_iter, total_items))
self._log_copied_texts()
- def _check_references(self):
- """Make sure our external references are present."""
- external_refs = self.new_pack._external_compression_parents_of_texts()
- if external_refs:
- index = self._pack_collection.text_index.combined_index
- found_items = list(index.iter_entries(external_refs))
- if len(found_items) != len(external_refs):
- found_keys = set(k for idx, k, refs, value in found_items)
- missing_items = external_refs - found_keys
- missing_file_id, missing_revision_id = missing_items.pop()
- raise errors.RevisionNotPresent(missing_revision_id,
- missing_file_id)
-
def _create_pack_from_packs(self):
self.pb.update("Opening pack", 0, 5)
self.new_pack = self.open_pack()
@@ -739,7 +747,7 @@
time.ctime(),
self._pack_collection._upload_transport.base, new_pack.random_name,
new_pack.signature_index.key_count(),
time.time() - new_pack.start_time)
- self._check_references()
+ new_pack._check_references()
if not self._use_pack(new_pack):
new_pack.abort()
return None
# Begin bundle
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
More information about the bazaar
mailing list