Pārlūkot izejas kodu

List all known capabilities.

Jelmer Vernooij 7 gadi atpakaļ
vecāks
revīzija
f0a8a9c6bb
2 mainītis faili ar 54 papildinājumiem un 7 dzēšanām
  1. 26 7
      dulwich/client.py
  2. 28 0
      dulwich/protocol.py

+ 26 - 7
dulwich/client.py

@@ -69,6 +69,7 @@ from dulwich.errors import (
 from dulwich.protocol import (
     _RBUFSIZE,
     capability_agent,
+    extract_capability_names,
     CAPABILITY_DELETE_REFS,
     CAPABILITY_MULTI_ACK,
     CAPABILITY_MULTI_ACK_DETAILED,
@@ -76,8 +77,11 @@ from dulwich.protocol import (
     CAPABILITY_QUIET,
     CAPABILITY_REPORT_STATUS,
     CAPABILITY_SIDE_BAND_64K,
+    CAPABILITY_SYMREF,
     CAPABILITY_THIN_PACK,
     CAPABILITIES_REF,
+    KNOWN_RECEIVE_CAPABILITIES,
+    KNOWN_UPLOAD_CAPABILITIES,
     COMMAND_DONE,
     COMMAND_HAVE,
     COMMAND_WANT,
@@ -118,10 +122,10 @@ def _win32_peek_avail(handle):
 
 
 COMMON_CAPABILITIES = [CAPABILITY_OFS_DELTA, CAPABILITY_SIDE_BAND_64K]
-FETCH_CAPABILITIES = ([CAPABILITY_THIN_PACK, CAPABILITY_MULTI_ACK,
-                       CAPABILITY_MULTI_ACK_DETAILED] +
-                      COMMON_CAPABILITIES)
-SEND_CAPABILITIES = [CAPABILITY_REPORT_STATUS] + COMMON_CAPABILITIES
+UPLOAD_CAPABILITIES = ([CAPABILITY_THIN_PACK, CAPABILITY_MULTI_ACK,
+                        CAPABILITY_MULTI_ACK_DETAILED] +
+                        COMMON_CAPABILITIES)
+RECEIVE_CAPABILITIES = [CAPABILITY_REPORT_STATUS] + COMMON_CAPABILITIES
 
 
 class ReportStatusParser(object):
@@ -219,9 +223,9 @@ class GitClient(object):
         """
         self._report_activity = report_activity
         self._report_status_parser = None
-        self._fetch_capabilities = set(FETCH_CAPABILITIES)
+        self._fetch_capabilities = set(UPLOAD_CAPABILITIES)
         self._fetch_capabilities.add(capability_agent())
-        self._send_capabilities = set(SEND_CAPABILITIES)
+        self._send_capabilities = set(RECEIVE_CAPABILITIES)
         self._send_capabilities.add(capability_agent())
         if quiet:
             self._send_capabilities.add(CAPABILITY_QUIET)
@@ -569,7 +573,10 @@ class TraditionalGitClient(GitClient):
             old_refs, server_capabilities = read_pkt_refs(proto)
             negotiated_capabilities = (
                 self._send_capabilities & server_capabilities)
-
+            unknown_capabilities = (
+                extract_capability_names(server_capabilities) -
+                KNOWN_RECEIVE_CAPABILITIES)
+            # TODO(jelmer): warn about unknown capabilities
             if CAPABILITY_REPORT_STATUS in negotiated_capabilities:
                 self._report_status_parser = ReportStatusParser()
             report_status_parser = self._report_status_parser
@@ -637,6 +644,10 @@ class TraditionalGitClient(GitClient):
         proto, can_read = self._connect(b'upload-pack', path)
         with proto:
             refs, server_capabilities = read_pkt_refs(proto)
+            unknown_capabilities = (
+                extract_capability_names(server_capabilities) -
+                KNOWN_UPLOAD_CAPABILITIES)
+            # TODO(jelmer): warn about unknown capabilities
             negotiated_capabilities = (
                 self._fetch_capabilities & server_capabilities)
 
@@ -1220,6 +1231,10 @@ class HttpGitClient(GitClient):
         url = self._get_url(path)
         old_refs, server_capabilities = self._discover_references(
             b"git-receive-pack", url)
+        unknown_capabilities = (
+            extract_capability_names(server_capabilities) -
+            KNOWN_RECEIVE_CAPABILITIES)
+        # TODO(jelmer): warn about unknown capabilities
         negotiated_capabilities = self._send_capabilities & server_capabilities
 
         if CAPABILITY_REPORT_STATUS in negotiated_capabilities:
@@ -1263,6 +1278,10 @@ class HttpGitClient(GitClient):
         url = self._get_url(path)
         refs, server_capabilities = self._discover_references(
             b"git-upload-pack", url)
+        unknown_capabilities = (
+            extract_capability_names(server_capabilities) -
+            KNOWN_UPLOAD_CAPABILITIES)
+        # TODO(jelmer): warn about unknown capabilities
         negotiated_capabilities = (
             self._fetch_capabilities & server_capabilities)
         wants = determine_wants(refs)

+ 28 - 0
dulwich/protocol.py

@@ -48,6 +48,9 @@ SIDE_BAND_CHANNEL_PROGRESS = 2
 # fatal error message just before stream aborts
 SIDE_BAND_CHANNEL_FATAL = 3
 
+CAPABILITY_DEEPEN_SINCE = b'deepen-since'
+CAPABILITY_DEEPEN_NOT = b'deepen-not'
+CAPABILITY_DEEPEN_RELATIVE = b'deepen-relative'
 CAPABILITY_DELETE_REFS = b'delete-refs'
 CAPABILITY_INCLUDE_TAG = b'include-tag'
 CAPABILITY_MULTI_ACK = b'multi_ack'
@@ -58,6 +61,7 @@ CAPABILITY_OFS_DELTA = b'ofs-delta'
 CAPABILITY_QUIET = b'quiet'
 CAPABILITY_REPORT_STATUS = b'report-status'
 CAPABILITY_SHALLOW = b'shallow'
+CAPABILITY_SIDE_BAND = b'side-band'
 CAPABILITY_SIDE_BAND_64K = b'side-band-64k'
 CAPABILITY_THIN_PACK = b'thin-pack'
 CAPABILITY_AGENT = b'agent'
@@ -67,6 +71,26 @@ CAPABILITY_SYMREF = b'symref'
 # there are no refs. Should always be ste to ZERO_SHA.
 CAPABILITIES_REF = b'capabilities^{}'
 
+COMMON_CAPABILITIES = [
+    CAPABILITY_OFS_DELTA,
+    CAPABILITY_SIDE_BAND,
+    CAPABILITY_SIDE_BAND_64K,
+    CAPABILITY_AGENT,
+    CAPABILITY_NO_PROGRESS]
+KNOWN_UPLOAD_CAPABILITIES = set(COMMON_CAPABILITIES + [
+    CAPABILITY_THIN_PACK,
+    CAPABILITY_MULTI_ACK,
+    CAPABILITY_MULTI_ACK_DETAILED,
+    CAPABILITY_INCLUDE_TAG,
+    CAPABILITY_DEEPEN_SINCE,
+    CAPABILITY_SYMREF,
+    CAPABILITY_SHALLOW,
+    CAPABILITY_DEEPEN_NOT,
+    CAPABILITY_DEEPEN_RELATIVE,
+    ])
+KNOWN_RECEIVE_CAPABILITIES = set(COMMON_CAPABILITIES + [
+    CAPABILITY_REPORT_STATUS])
+
 
 def agent_string():
     return ('dulwich/%d.%d.%d' % dulwich.__version__).encode('ascii')
@@ -80,6 +104,10 @@ def capability_symref(from_ref, to_ref):
     return CAPABILITY_SYMREF + b'=' + from_ref + b':' + to_ref
 
 
+def extract_capability_names(capabilities):
+    return set(c.split(b'=')[0] for c in capabilities)
+
+
 COMMAND_DEEPEN = b'deepen'
 COMMAND_SHALLOW = b'shallow'
 COMMAND_UNSHALLOW = b'unshallow'