Add no-progress capability support to UploadPackHandler.
authorDave Borowitz <dborowitz@google.com>
Fri, 19 Feb 2010 23:20:10 +0000 (15:20 -0800)
committerDave Borowitz <dborowitz@google.com>
Thu, 4 Mar 2010 17:50:05 +0000 (09:50 -0800)
The progress function is now a method rather than a lambda, since it
needs to check the handler's state in order to decide whether to
write. Since progress is called many times, also changed
_client_capabilities to be a set. Added simple tests for the progress
method.

Change-Id: Id6b48272af0da10ae6c99512ec1706c0d0309455

dulwich/server.py
dulwich/tests/test_server.py

index c31e952cf24e22f631299ef93089f78c6c6272d1..54565b8ddca30bca77ff487a9c4e1d6172b00134 100644 (file)
@@ -166,7 +166,7 @@ class Handler(object):
             if cap not in my_caps:
                 raise GitProtocolError('Client asked for capability %s that '
                                        'was not advertised.' % cap)
-        self._client_capabilities = caps
+        self._client_capabilities = set(caps)
 
     def has_capability(self, cap):
         if self._client_capabilities is None:
@@ -187,26 +187,29 @@ class UploadPackHandler(Handler):
 
     def capabilities(self):
         return ("multi_ack_detailed", "multi_ack", "side-band-64k", "thin-pack",
-                "ofs-delta")
+                "ofs-delta", "no-progress")
 
-    def handle(self):
+    def progress(self, message):
+        if self.has_capability("no-progress"):
+            return
+        self.proto.write_sideband(2, message)
 
-        progress = lambda x: self.proto.write_sideband(2, x)
+    def handle(self):
         write = lambda x: self.proto.write_sideband(1, x)
 
         graph_walker = ProtocolGraphWalker(self)
         objects_iter = self.backend.fetch_objects(
-          graph_walker.determine_wants, graph_walker, progress)
+          graph_walker.determine_wants, graph_walker, self.progress)
 
         # Do they want any objects?
         if len(objects_iter) == 0:
             return
 
-        progress("dul-daemon says what\n")
-        progress("counting objects: %d, done.\n" % len(objects_iter))
+        self.progress("dul-daemon says what\n")
+        self.progress("counting objects: %d, done.\n" % len(objects_iter))
         write_pack_data(ProtocolFile(None, write), objects_iter, 
                         len(objects_iter))
-        progress("how was that, then?\n")
+        self.progress("how was that, then?\n")
         # we are done
         self.proto.write("0000")
 
index 90947f4bb9e3a3ba1ce341009f19fa646e8649a2..c91d396cda23d94298dbb1662099585090bca700 100644 (file)
@@ -108,6 +108,28 @@ class HandlerTestCase(TestCase):
         self.assertFalse(self._handler.has_capability('capxxx'))
 
 
+class UploadPackHandlerTestCase(TestCase):
+    def setUp(self):
+        self._handler = UploadPackHandler(None, None, None)
+        self._handler.proto = TestProto()
+
+    def test_progress(self):
+        self._handler.set_client_capabilities([])
+        self._handler.progress('first message')
+        self._handler.progress('second message')
+        self.assertEqual('first message',
+                         self._handler.proto.get_received_line(2))
+        self.assertEqual('second message',
+                         self._handler.proto.get_received_line(2))
+        self.assertEqual(None, self._handler.proto.get_received_line(2))
+
+    def test_no_progress(self):
+        self._handler.set_client_capabilities(['no-progress'])
+        self._handler.progress('first message')
+        self._handler.progress('second message')
+        self.assertEqual(None, self._handler.proto.get_received_line(2))
+
+
 class TestCommit(object):
     def __init__(self, sha, parents, commit_time):
         self.id = sha