Rev 6316: (jelmer) Add HPSS call for ``Repository.get_signature_text``. (Jelmer in file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

Patch Queue Manager pqm at pqm.ubuntu.com
Mon Nov 28 15:14:49 UTC 2011


At file:///srv/pqm.bazaar-vcs.org/archives/thelove/bzr/%2Btrunk/

------------------------------------------------------------
revno: 6316 [merge]
revision-id: pqm at pqm.ubuntu.com-20111128151448-7n0jzgkwjlvxvao6
parent: pqm at pqm.ubuntu.com-20111128141956-yl7aefec4py39k12
parent: jelmer at samba.org-20111128141856-lwh2exm44dv21f2x
committer: Patch Queue Manager <pqm at pqm.ubuntu.com>
branch nick: +trunk
timestamp: Mon 2011-11-28 15:14:48 +0000
message:
  (jelmer) Add HPSS call for ``Repository.get_signature_text``. (Jelmer
   Vernooij)
modified:
  bzrlib/remote.py               remote.py-20060720103555-yeeg2x51vn0rbtdp-1
  bzrlib/smart/repository.py     repository.py-20061128022038-vr5wy5bubyb8xttk-1
  bzrlib/smart/request.py        request.py-20061108095550-gunadhxmzkdjfeek-1
  bzrlib/tests/blackbox/test_sign_my_commits.py test_sign_my_commits.py-20060215152957-270238a1ffacc841
  bzrlib/tests/per_repository/test_repository.py test_repository.py-20060131092128-ad07f494f5c9d26c
  bzrlib/tests/test_remote.py    test_remote.py-20060720103555-yeeg2x51vn0rbtdp-2
  bzrlib/tests/test_smart.py     test_smart.py-20061122024551-ol0l0o0oofsu9b3t-2
  doc/en/release-notes/bzr-2.5.txt bzr2.5.txt-20110708125756-587p0hpw7oke4h05-1
=== modified file 'bzrlib/remote.py'
--- a/bzrlib/remote.py	2011-11-28 13:05:15 +0000
+++ b/bzrlib/remote.py	2011-11-28 14:18:56 +0000
@@ -2054,8 +2054,24 @@
 
     @needs_read_lock
     def get_signature_text(self, revision_id):
-        self._ensure_real()
-        return self._real_repository.get_signature_text(revision_id)
+        path = self.bzrdir._path_for_remote_call(self._client)
+        try:
+            response_tuple, response_handler = self._call_expecting_body(
+                'Repository.get_revision_signature_text', path, revision_id)
+        except errors.UnknownSmartMethod:
+            self._ensure_real()
+            return self._real_repository.get_signature_text(revision_id)
+        except errors.NoSuchRevision, err:
+            for fallback in self._fallback_repositories:
+                try:
+                    return fallback.get_signature_text(revision_id)
+                except errors.NoSuchRevision:
+                    pass
+            raise err
+        else:
+            if response_tuple[0] != 'ok':
+                raise errors.UnexpectedSmartServerResponse(response_tuple)
+            return response_handler.read_body_bytes()
 
     @needs_read_lock
     def _get_inventory_xml(self, revision_id):
@@ -2338,7 +2354,12 @@
                 revision_id)
         if response[0] not in ('yes', 'no'):
             raise SmartProtocolError('unexpected response code %s' % (response,))
-        return (response[0] == 'yes')
+        if response[0] == 'yes':
+            return True
+        for fallback in self._fallback_repositories:
+            if fallback.has_signature_for_revision_id(revision_id):
+                return True
+        return False
 
     @needs_read_lock
     def verify_revision_signature(self, revision_id, gpg_strategy):
@@ -2545,9 +2566,9 @@
 
     def _real_stream(self, repo, search):
         """Get a stream for search from repo.
-        
-        This never called RemoteStreamSource.get_stream, and is a heler
-        for RemoteStreamSource._get_stream to allow getting a stream 
+
+        This never called RemoteStreamSource.get_stream, and is a helper
+        for RemoteStreamSource._get_stream to allow getting a stream
         reliably whether fallback back because of old servers or trying
         to stream from a non-RemoteRepository (which the stacked support
         code will do).
@@ -3729,7 +3750,6 @@
         return self._bzrdir._real_bzrdir
 
 
-
 def _extract_tar(tar, to_dir):
     """Extract all the contents of a tarfile object.
 

=== modified file 'bzrlib/smart/repository.py'
--- a/bzrlib/smart/repository.py	2011-11-28 11:34:18 +0000
+++ b/bzrlib/smart/repository.py	2011-11-28 14:18:56 +0000
@@ -436,6 +436,28 @@
         return SuccessfulSmartServerResponse(('ok', ), body)
 
 
+class SmartServerRepositoryGetRevisionSignatureText(
+        SmartServerRepositoryRequest):
+    """Return the signature text of a revision.
+
+    New in 2.5.
+    """
+
+    def do_repository_request(self, repository, revision_id):
+        """Return the result of repository.get_signature_text().
+
+        :param repository: The repository to query in.
+        :return: A smart server response of with the signature text as
+            body.
+        """
+        try:
+            text = repository.get_signature_text(revision_id)
+        except errors.NoSuchRevision, err:
+            return FailedSmartServerResponse(
+                ('nosuchrevision', err.revision))
+        return SuccessfulSmartServerResponse(('ok', ), text)
+
+
 class SmartServerRepositoryIsShared(SmartServerRepositoryRequest):
 
     def do_repository_request(self, repository):

=== modified file 'bzrlib/smart/request.py'
--- a/bzrlib/smart/request.py	2011-11-28 11:34:18 +0000
+++ b/bzrlib/smart/request.py	2011-11-28 14:18:56 +0000
@@ -642,6 +642,9 @@
 request_handlers.register_lazy(
     'Repository.get_revision_graph', 'bzrlib.smart.repository', 'SmartServerRepositoryGetRevisionGraph')
 request_handlers.register_lazy(
+    'Repository.get_revision_signature_text', 'bzrlib.smart.repository',
+    'SmartServerRepositoryGetRevisionSignatureText')
+request_handlers.register_lazy(
     'Repository.has_revision', 'bzrlib.smart.repository', 'SmartServerRequestHasRevision')
 request_handlers.register_lazy(
     'Repository.has_signature_for_revision_id', 'bzrlib.smart.repository',

=== modified file 'bzrlib/tests/blackbox/test_sign_my_commits.py'
--- a/bzrlib/tests/blackbox/test_sign_my_commits.py	2011-11-28 13:05:15 +0000
+++ b/bzrlib/tests/blackbox/test_sign_my_commits.py	2011-11-28 14:18:56 +0000
@@ -186,6 +186,6 @@
         # The number of readv requests seems to vary depending on the generated
         # repository and how well it compresses, so allow for a bit of
         # variation:
-        if len(self.hpss_calls) not in (20, 21):
-            self.fail("Incorrect length: wanted 20 or 21, got %d for %r" % (
+        if len(self.hpss_calls) not in (18, 19):
+            self.fail("Incorrect length: wanted 18 or 19, got %d for %r" % (
                 len(self.hpss_calls), self.hpss_calls))

=== modified file 'bzrlib/tests/per_repository/test_repository.py'
--- a/bzrlib/tests/per_repository/test_repository.py	2011-11-17 16:10:15 +0000
+++ b/bzrlib/tests/per_repository/test_repository.py	2011-11-28 11:44:21 +0000
@@ -552,13 +552,15 @@
         b = builder.get_branch()
         b.lock_write()
         self.addCleanup(b.unlock)
-        b.repository.start_write_group()
-        self.addCleanup(b.repository.abort_write_group)
         if b.repository._format.supports_revision_signatures:
+            b.repository.start_write_group()
             b.repository.add_signature_text('A', 'This might be a signature')
+            b.repository.commit_write_group()
             self.assertEqual('This might be a signature',
                              b.repository.get_signature_text('A'))
         else:
+            b.repository.start_write_group()
+            self.addCleanup(b.repository.abort_write_group)
             self.assertRaises(errors.UnsupportedOperation,
                 b.repository.add_signature_text, 'A',
                 'This might be a signature')

=== modified file 'bzrlib/tests/test_remote.py'
--- a/bzrlib/tests/test_remote.py	2011-11-28 13:05:15 +0000
+++ b/bzrlib/tests/test_remote.py	2011-11-28 14:18:56 +0000
@@ -2372,6 +2372,32 @@
             client._calls)
 
 
+class TestRepositoryGetRevisionSignatureText(TestRemoteRepository):
+
+    def test_text(self):
+        # ('ok',), body with signature text
+        transport_path = 'quack'
+        repo, client = self.setup_fake_client_and_repository(transport_path)
+        client.add_success_response_with_body(
+            'THETEXT', 'ok')
+        self.assertEquals("THETEXT", repo.get_signature_text("revid"))
+        self.assertEqual(
+            [('call_expecting_body', 'Repository.get_revision_signature_text',
+             ('quack/', 'revid'))],
+            client._calls)
+
+    def test_no_signature(self):
+        transport_path = 'quick'
+        repo, client = self.setup_fake_client_and_repository(transport_path)
+        client.add_error_response('nosuchrevision', 'unknown')
+        self.assertRaises(errors.NoSuchRevision, repo.get_signature_text,
+                "unknown")
+        self.assertEqual(
+            [('call_expecting_body', 'Repository.get_revision_signature_text',
+              ('quick/', 'unknown'))],
+            client._calls)
+
+
 class TestRepositoryGetGraph(TestRemoteRepository):
 
     def test_get_graph(self):

=== modified file 'bzrlib/tests/test_smart.py'
--- a/bzrlib/tests/test_smart.py	2011-11-28 11:34:18 +0000
+++ b/bzrlib/tests/test_smart.py	2011-11-28 14:18:56 +0000
@@ -46,6 +46,7 @@
     server,
     vfs,
     )
+from bzrlib.testament import Testament
 from bzrlib.tests import test_server
 from bzrlib.transport import (
     chroot,
@@ -1984,6 +1985,30 @@
             request.execute('', ))
 
 
+class TestSmartServerRepositoryGetRevisionSignatureText(
+        tests.TestCaseWithMemoryTransport):
+
+    def test_get_signature(self):
+        backing = self.get_transport()
+        request = smart_repo.SmartServerRepositoryGetRevisionSignatureText(
+            backing)
+        bb = self.make_branch_builder('.')
+        bb.build_commit(rev_id='A')
+        repo = bb.get_branch().repository
+        strategy = gpg.LoopbackGPGStrategy(None)
+        self.addCleanup(repo.lock_write().unlock)
+        repo.start_write_group()
+        repo.sign_revision('A', strategy)
+        repo.commit_write_group()
+        expected_body = (
+            '-----BEGIN PSEUDO-SIGNED CONTENT-----\n' +
+            Testament.from_revision(repo, 'A').as_short_text() +
+            '-----END PSEUDO-SIGNED CONTENT-----\n')
+        self.assertEqual(
+            smart_req.SmartServerResponse(('ok', ), expected_body),
+            request.execute('', 'A'))
+
+
 class TestSmartServerRepositoryMakeWorkingTrees(
         tests.TestCaseWithMemoryTransport):
 
@@ -2431,6 +2456,8 @@
             smart_repo.SmartServerRepositoryGetRevIdForRevno)
         self.assertHandlerEqual('Repository.get_revision_graph',
             smart_repo.SmartServerRepositoryGetRevisionGraph)
+        self.assertHandlerEqual('Repository.get_revision_signature_text',
+            smart_repo.SmartServerRepositoryGetRevisionSignatureText)
         self.assertHandlerEqual('Repository.get_stream',
             smart_repo.SmartServerRepositoryGetStream)
         self.assertHandlerEqual('Repository.get_stream_1.19',

=== modified file 'doc/en/release-notes/bzr-2.5.txt'
--- a/doc/en/release-notes/bzr-2.5.txt	2011-11-28 13:05:15 +0000
+++ b/doc/en/release-notes/bzr-2.5.txt	2011-11-28 14:18:56 +0000
@@ -128,8 +128,9 @@
   ``VersionedFileRepository.get_serializer_format``,
   ``Repository.all_revision_ids``, ``Repository.start_write_group``,
   ``Repository.commit_write_group``, ``Repository.abort_write_group``
-  ``Repository.iter_revisions``, ``Repository.check_write_group`` and
-  ``Repository.add_signature_revision_text``.
+  ``Repository.check_write_group``, ``Repository.iter_revisions``,
+  ``Repository.add_signature_revision_text`` and
+  ``Repository.get_revision_signature_text``.
   (Jelmer Vernooij)
 
 * Add HPSS call for ``Repository.pack``. (Jelmer Vernooij, #894461)




More information about the bazaar-commits mailing list