Rev 2805: Generate the revision_index_map for packing during the core operation, from the pack objects. in http://people.ubuntu.com/~robertc/baz2.0/repository

Robert Collins robertc at robertcollins.net
Wed Oct 10 09:06:19 BST 2007


At http://people.ubuntu.com/~robertc/baz2.0/repository

------------------------------------------------------------
revno: 2805
revision-id: robertc at robertcollins.net-20071010080610-8yhs1je76gsccaw8
parent: robertc at robertcollins.net-20071010073131-8iiuanh7s960lyim
committer: Robert Collins <robertc at robertcollins.net>
branch nick: repository
timestamp: Wed 2007-10-10 18:06:10 +1000
message:
  Generate the revision_index_map for packing during the core operation, from the pack objects.
modified:
  bzrlib/repofmt/pack_repo.py    pack_repo.py-20070813041115-gjv5ma7ktfqwsjgn-1
  bzrlib/repository.py           rev_storage.py-20051111201905-119e9401e46257e3
  bzrlib/tests/test_repository.py test_repository.py-20060131075918-65c555b881612f4d
=== modified file 'bzrlib/repofmt/pack_repo.py'
--- a/bzrlib/repofmt/pack_repo.py	2007-10-10 07:31:31 +0000
+++ b/bzrlib/repofmt/pack_repo.py	2007-10-10 08:06:10 +0000
@@ -114,6 +114,10 @@
         return "<bzrlib.repofmt.pack_repo.Pack object at 0x%x, %s, %s" % (
             id(self), self.transport, self.name)
 
+    def file_name(self):
+        """Get the file name for the pack on disk."""
+        return self.name + '.pack'
+
     def get_revision_count(self):
         return self.revision_index.key_count()
 
@@ -263,7 +267,7 @@
         self._execute_pack_operations(pack_operations)
         return True
 
-    def create_pack_from_packs(self, packs, revision_index_map,
+    def create_pack_from_packs(self, packs,
         inventory_index_map, text_index_map, signature_index_map, suffix,
         revision_ids=None):
         """Create a new pack by reading data from other packs.
@@ -275,7 +279,6 @@
         source packs are not altered.
 
         :param packs: An iterable of Packs to combine.
-        :param revision_index_map: A revision index map.
         :param inventory_index_map: A inventory index map.
         :param text_index_map: A text index map.
         :param signature_index_map: A signature index map.
@@ -296,8 +299,8 @@
             return None
         random_name = self.repo.control_files._lock.nonce + suffix
         if 'fetch' in debug.debug_flags:
-            plain_pack_list = ['%s%s' % (transport.base, name) for
-                transport, name in revision_index_map.itervalues()]
+            plain_pack_list = ['%s%s' % (a_pack.transport.base, a_pack.name)
+                for a_pack in packs]
             if revision_ids is not None:
                 rev_count = len(revision_ids)
             else:
@@ -333,6 +336,10 @@
             revision_keys = [(revision_id,) for revision_id in revision_ids]
         else:
             revision_keys = None
+
+        # select revision keys
+        revision_index_map = self._packs_list_to_pack_map_and_index_list(
+            packs, 'revision_index')[0]
         revision_nodes = self._index_contents(revision_index_map, revision_keys)
         # copy revision keys and adjust values
         list(self._copy_nodes_graph(revision_nodes, revision_index_map, writer,
@@ -585,15 +592,13 @@
             in use.
         :return: None
         """
-        # select revision keys
-        revision_index_map = self._revision_index_map(pack_details, packs)
         # select inventory keys
         inv_index_map = self._inv_index_map(pack_details)
         # select text keys
         text_index_map = self._text_index_map(pack_details)
         # select signature keys
         signature_index_map = self._signature_index_map(pack_details)
-        self.create_pack_from_packs(packs, revision_index_map, inv_index_map,
+        self.create_pack_from_packs(packs, inv_index_map,
             text_index_map, signature_index_map, '.autopack')
 
     def _copy_nodes(self, nodes, index_map, writer, write_index):
@@ -842,14 +847,28 @@
             pack_map[new_index] = (transport, name)
         return pack_map, indices
 
+    def _packs_list_to_pack_map_and_index_list(self, packs, index_attribute):
+        """Convert a list of packs to an index pack map and index list.
+
+        :param packs: The packs list to process.
+        :param index_attribute: The attribute that the desired index is found
+            on.
+        :return: A tuple (map, list) where map contains the dict from
+            index:pack_tuple, and lsit contains the indices in the same order
+            as the packs list.
+        """
+        indices = []
+        pack_map = {}
+        for pack in packs:
+            index = getattr(pack, index_attribute)
+            indices.append(index)
+            pack_map[index] = (pack.transport, pack.file_name())
+        return pack_map, indices
+
     def _inv_index_map(self, pack_details):
         """Get a map of inv index -> packs for pack_details."""
         return self._make_index_to_pack_map(pack_details, '.iix')[0]
 
-    def _revision_index_map(self, pack_details, packs):
-        """Get a map of revision index -> packs for pack_details."""
-        return self._make_index_to_pack_map(pack_details, '.rix')[0]
-
     def _signature_index_map(self, pack_details):
         """Get a map of signature index -> packs for pack_details."""
         return self._make_index_to_pack_map(pack_details, '.six')[0]

=== modified file 'bzrlib/repository.py'
--- a/bzrlib/repository.py	2007-10-10 07:31:31 +0000
+++ b/bzrlib/repository.py	2007-10-10 08:06:10 +0000
@@ -2344,13 +2344,11 @@
                 raise errors.InstallFailed([revision_id])
         packs = self.source._packs.all_pack_details()
         _packs = self.source._packs.all_packs()
-        revision_index_map = self.source._packs._revision_index_map(packs, _packs)
         inventory_index_map = self.source._packs._inv_index_map(packs)
         text_index_map = self.source._packs._text_index_map(packs)
         signature_index_map = self.source._packs._signature_index_map(packs)
         pack = self.target._packs.create_pack_from_packs(
             _packs,
-            revision_index_map,
             inventory_index_map,
             text_index_map,
             signature_index_map,

=== modified file 'bzrlib/tests/test_repository.py'
--- a/bzrlib/tests/test_repository.py	2007-10-10 06:46:36 +0000
+++ b/bzrlib/tests/test_repository.py	2007-10-10 08:06:10 +0000
@@ -1001,3 +1001,7 @@
         self.assertCurrentlyNotEqual(left, right)
         right.transport = 'a'
         self.assertCurrentlyEqual(left, right)
+
+    def test_file_name(self):
+        pack = pack_repo.Pack('', 'a_name', '', '', '', '')
+        self.assertEqual('a_name.pack', pack.file_name())



More information about the bazaar-commits mailing list