Selaa lähdekoodia

Merge support for only negotiating capabilities that are also supported by the
server.

Jelmer Vernooij 13 vuotta sitten
vanhempi
commit
38954a33b5
3 muutettua tiedostoa jossa 25 lisäystä ja 11 poistoa
  1. 3 0
      NEWS
  2. 9 11
      dulwich/client.py
  3. 13 0
      dulwich/tests/test_client.py

+ 3 - 0
NEWS

@@ -5,6 +5,9 @@
   * Options on the same line as sections in config files are now supported.
   * Options on the same line as sections in config files are now supported.
     (Jelmer Vernooij, #920553)
     (Jelmer Vernooij, #920553)
 
 
+  * Only negotiate capabilities that are also supported by the server.
+    (Rod Cloutier, Risto Kankkunen)
+
  TESTS
  TESTS
 
 
   * $HOME is now explicitly specified for tests that use it to read
   * $HOME is now explicitly specified for tests that use it to read

+ 9 - 11
dulwich/client.py

@@ -153,10 +153,10 @@ class GitClient(object):
             activity.
             activity.
         """
         """
         self._report_activity = report_activity
         self._report_activity = report_activity
-        self._fetch_capabilities = list(FETCH_CAPABILITIES)
-        self._send_capabilities = list(SEND_CAPABILITIES)
+        self._fetch_capabilities = set(FETCH_CAPABILITIES)
+        self._send_capabilities = set(SEND_CAPABILITIES)
         if thin_packs:
         if thin_packs:
-            self._fetch_capabilities.append('thin-pack')
+            self._fetch_capabilities.add('thin-pack')
 
 
     def _read_refs(self, proto):
     def _read_refs(self, proto):
         server_capabilities = None
         server_capabilities = None
@@ -169,7 +169,7 @@ class GitClient(object):
             if server_capabilities is None:
             if server_capabilities is None:
                 (ref, server_capabilities) = extract_capabilities(ref)
                 (ref, server_capabilities) = extract_capabilities(ref)
             refs[ref] = sha
             refs[ref] = sha
-        return refs, server_capabilities
+        return refs, set(server_capabilities)
 
 
     def send_pack(self, path, determine_wants, generate_pack_contents,
     def send_pack(self, path, determine_wants, generate_pack_contents,
                   progress=None):
                   progress=None):
@@ -438,9 +438,7 @@ class TraditionalGitClient(GitClient):
         """
         """
         proto, unused_can_read = self._connect('receive-pack', path)
         proto, unused_can_read = self._connect('receive-pack', path)
         old_refs, server_capabilities = self._read_refs(proto)
         old_refs, server_capabilities = self._read_refs(proto)
-        negotiated_capabilities = list(self._send_capabilities)
-        if 'report-status' not in server_capabilities:
-            negotiated_capabilities.remove('report-status')
+        negotiated_capabilities = self._send_capabilities & server_capabilities
         try:
         try:
             new_refs = determine_wants(old_refs)
             new_refs = determine_wants(old_refs)
         except:
         except:
@@ -470,8 +468,8 @@ class TraditionalGitClient(GitClient):
         :param progress: Callback for progress reports (strings)
         :param progress: Callback for progress reports (strings)
         """
         """
         proto, can_read = self._connect('upload-pack', path)
         proto, can_read = self._connect('upload-pack', path)
-        (refs, server_capabilities) = self._read_refs(proto)
-        negotiated_capabilities = list(self._fetch_capabilities)
+        refs, server_capabilities = self._read_refs(proto)
+        negotiated_capabilities = self._fetch_capabilities & server_capabilities
         try:
         try:
             wants = determine_wants(refs)
             wants = determine_wants(refs)
         except:
         except:
@@ -708,7 +706,7 @@ class HttpGitClient(GitClient):
         url = self._get_url(path)
         url = self._get_url(path)
         old_refs, server_capabilities = self._discover_references(
         old_refs, server_capabilities = self._discover_references(
             "git-receive-pack", url)
             "git-receive-pack", url)
-        negotiated_capabilities = list(self._send_capabilities)
+        negotiated_capabilities = self._send_capabilities & server_capabilities
         new_refs = determine_wants(old_refs)
         new_refs = determine_wants(old_refs)
         if new_refs is None:
         if new_refs is None:
             return old_refs
             return old_refs
@@ -743,7 +741,7 @@ class HttpGitClient(GitClient):
         url = self._get_url(path)
         url = self._get_url(path)
         refs, server_capabilities = self._discover_references(
         refs, server_capabilities = self._discover_references(
             "git-upload-pack", url)
             "git-upload-pack", url)
-        negotiated_capabilities = list(server_capabilities)
+        negotiated_capabilities = server_capabilities
         wants = determine_wants(refs)
         wants = determine_wants(refs)
         if wants is not None:
         if wants is not None:
             wants = [cid for cid in wants if cid != ZERO_SHA]
             wants = [cid for cid in wants if cid != ZERO_SHA]

+ 13 - 0
dulwich/tests/test_client.py

@@ -152,6 +152,19 @@ class GitClientTests(TestCase):
         self.assertTrue(isinstance(client, HttpGitClient))
         self.assertTrue(isinstance(client, HttpGitClient))
         self.assertEquals('/jelmer/dulwich', path)
         self.assertEquals('/jelmer/dulwich', path)
 
 
+    def test_send_pack_no_sideband64k_with_update_ref_error(self):
+        # No side-bank-64k reported by server shouldn't try to parse
+        # side band data
+        pkts = ['55dcc6bf963f922e1ed5c4bbaaefcfacef57b1d7 capabilities^{}\x00 report-status ofs-delta\n',
+                '',
+                "unpack ok",
+                "ng refs/foo/bar pre-receive hook declined",
+                '']
+        for pkt in pkts:
+            self.rin.write("0000" if pkt == '' else "%04x%s" % (len(pkt)+4, pkt))
+        self.rin.seek(0)
+        self.assertRaises(UpdateRefsError, lambda : self.client.send_pack("blah", lambda x: {} , lambda h,w: []))
+
 
 
 class SSHGitClientTests(TestCase):
 class SSHGitClientTests(TestCase):