Rev 4358: Allow passing keys to check to VersionedFile.check(). in http://people.ubuntu.com/~robertc/baz2.0/check

Robert Collins robertc at robertcollins.net
Mon Jun 15 01:24:19 BST 2009


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

------------------------------------------------------------
revno: 4358
revision-id: robertc at robertcollins.net-20090615002404-veq70usx4l5h3b1k
parent: robertc at robertcollins.net-20090601033315-1qj9cuq5e69vokao
committer: Robert Collins <robertc at robertcollins.net>
branch nick: check
timestamp: Mon 2009-06-15 10:24:04 +1000
message:
  Allow passing keys to check to VersionedFile.check().
=== modified file 'bzrlib/knit.py'
--- a/bzrlib/knit.py	2009-04-27 23:14:00 +0000
+++ b/bzrlib/knit.py	2009-06-15 00:24:04 +0000
@@ -1005,8 +1005,15 @@
         """See VersionedFiles.annotate."""
         return self._factory.annotate(self, key)
 
-    def check(self, progress_bar=None):
+    def check(self, progress_bar=None, keys=None):
         """See VersionedFiles.check()."""
+        if keys is None:
+            return self._logical_check()
+        else:
+            # At the moment, check does not extra work over get_record_stream
+            return self.get_record_stream(keys, 'unordered', True)
+
+    def _logical_check(self):
         # This doesn't actually test extraction of everything, but that will
         # impact 'bzr check' substantially, and needs to be integrated with
         # care. However, it does check for the obvious problem of a delta with

=== modified file 'bzrlib/tests/test_versionedfile.py'
--- a/bzrlib/tests/test_versionedfile.py	2009-05-01 18:09:24 +0000
+++ b/bzrlib/tests/test_versionedfile.py	2009-06-15 00:24:04 +0000
@@ -30,6 +30,7 @@
     knit as _mod_knit,
     osutils,
     progress,
+    ui,
     )
 from bzrlib.errors import (
                            RevisionNotPresent,
@@ -1510,6 +1511,28 @@
         self.assertRaises(RevisionNotPresent,
             files.annotate, prefix + ('missing-key',))
 
+    def test_check_no_parameters(self):
+        files = self.get_versionedfiles()
+
+    def test_check_progressbar_parameter(self):
+        """A progress bar can be supplied because check can be a generator."""
+        pb = ui.ui_factory.nested_progress_bar()
+        self.addCleanup(pb.finished)
+        files = self.get_versionedfiles()
+        files.check(progress_bar=pb)
+
+    def test_check_with_keys_becomes_generator(self):
+        files = self.get_versionedfiles()
+        self.get_diamond_files(files)
+        keys = files.keys()
+        entries = files.check(keys=keys)
+        seen = set()
+        # Texts output should be fulltexts.
+        self.capture_stream(files, entries, seen.add,
+            files.get_parent_map(keys), require_fulltext=True)
+        # All texts should be output.
+        self.assertEqual(set(keys), seen)
+
     def test_construct(self):
         """Each parameterised test can be constructed on a transport."""
         files = self.get_versionedfiles()
@@ -1669,7 +1692,8 @@
              'knit-delta-closure', 'knit-delta-closure-ref',
              'groupcompress-block', 'groupcompress-block-ref'])
 
-    def capture_stream(self, f, entries, on_seen, parents):
+    def capture_stream(self, f, entries, on_seen, parents,
+        require_fulltext=False):
         """Capture a stream for testing."""
         for factory in entries:
             on_seen(factory.key)
@@ -1680,6 +1704,8 @@
             self.assertEqual(parents[factory.key], factory.parents)
             self.assertIsInstance(factory.get_bytes_as(factory.storage_kind),
                 str)
+            if require_fulltext:
+                factory.get_bytes_as('fulltext')
 
     def test_get_record_stream_interface(self):
         """each item in a stream has to provide a regular interface."""
@@ -2547,8 +2573,8 @@
         self.assertRaises(NotImplementedError,
                 self.texts.add_mpdiffs, [])
 
-    def test_check(self):
-        self.assertTrue(self.texts.check())
+    def test_check_noerrors(self):
+        self.texts.check()
 
     def test_insert_record_stream(self):
         self.assertRaises(NotImplementedError, self.texts.insert_record_stream,

=== modified file 'bzrlib/versionedfile.py'
--- a/bzrlib/versionedfile.py	2009-04-29 17:02:36 +0000
+++ b/bzrlib/versionedfile.py	2009-06-15 00:24:04 +0000
@@ -876,7 +876,16 @@
         raise NotImplementedError(self.annotate)
 
     def check(self, progress_bar=None):
-        """Check this object for integrity."""
+        """Check this object for integrity.
+        
+        :param progress_bar: A progress bar to output as the check progresses.
+        :param keys: Specific keys within the VersionedFiles to check. When
+            this parameter is not None, check() becomes a generator as per
+            get_record_stream. The difference to get_record_stream is that
+            more or deeper checks will be performed.
+        :return: None, or if keys was supplied a generator as per
+            get_record_stream.
+        """
         raise NotImplementedError(self.check)
 
     @staticmethod
@@ -1092,10 +1101,15 @@
             result.append((prefix + (origin,), line))
         return result
 
-    def check(self, progress_bar=None):
+    def check(self, progress_bar=None, keys=None):
         """See VersionedFiles.check()."""
+        # XXX: This is over-enthusiastic but as we only thunk for Weaves today
+        # this is tolerable. Ideally we'd pass keys down to check() and 
+        # have the older VersiondFile interface updated too.
         for prefix, vf in self._iter_all_components():
             vf.check()
+        if keys is not None:
+            return self.get_record_stream(keys, 'unordered', True)
 
     def get_parent_map(self, keys):
         """Get a map of the parents of keys.




More information about the bazaar-commits mailing list