|
@@ -88,6 +88,45 @@ class GitClient(object):
|
|
|
refs[ref] = sha
|
|
|
return refs, server_capabilities
|
|
|
|
|
|
+ def _parse_status_report(self):
|
|
|
+ unpack = self.proto.read_pkt_line().strip()
|
|
|
+ if unpack != 'unpack ok':
|
|
|
+ st = True
|
|
|
+ # flush remaining error data
|
|
|
+ while st is not None:
|
|
|
+ st = self.proto.read_pkt_line()
|
|
|
+ raise SendPackError(unpack)
|
|
|
+ statuses = []
|
|
|
+ errs = False
|
|
|
+ ref_status = self.proto.read_pkt_line()
|
|
|
+ while ref_status:
|
|
|
+ ref_status = ref_status.strip()
|
|
|
+ statuses.append(ref_status)
|
|
|
+ if not ref_status.startswith('ok '):
|
|
|
+ errs = True
|
|
|
+ ref_status = self.proto.read_pkt_line()
|
|
|
+
|
|
|
+ if errs:
|
|
|
+ ref_status = {}
|
|
|
+ ok = set()
|
|
|
+ for status in statuses:
|
|
|
+ if ' ' not in status:
|
|
|
+ # malformed response, move on to the next one
|
|
|
+ continue
|
|
|
+ status, ref = status.split(' ', 1)
|
|
|
+
|
|
|
+ if status == 'ng':
|
|
|
+ if ' ' in ref:
|
|
|
+ ref, status = ref.split(' ', 1)
|
|
|
+ else:
|
|
|
+ ok.add(ref)
|
|
|
+ ref_status[ref] = status
|
|
|
+ raise UpdateRefsError('%s failed to update' %
|
|
|
+ ', '.join([ref for ref in ref_status
|
|
|
+ if ref not in ok]),
|
|
|
+ ref_status=ref_status)
|
|
|
+
|
|
|
+
|
|
|
# TODO(durin42): add side-band-64k capability support here and advertise it
|
|
|
def send_pack(self, path, determine_wants, generate_pack_contents):
|
|
|
"""Upload a pack to a remote repository.
|
|
@@ -132,42 +171,7 @@ class GitClient(object):
|
|
|
len(objects))
|
|
|
|
|
|
if 'report-status' in self._send_capabilities:
|
|
|
- unpack = self.proto.read_pkt_line().strip()
|
|
|
- if unpack != 'unpack ok':
|
|
|
- st = True
|
|
|
- # flush remaining error data
|
|
|
- while st is not None:
|
|
|
- st = self.proto.read_pkt_line()
|
|
|
- raise SendPackError(unpack)
|
|
|
- statuses = []
|
|
|
- errs = False
|
|
|
- ref_status = self.proto.read_pkt_line()
|
|
|
- while ref_status:
|
|
|
- ref_status = ref_status.strip()
|
|
|
- statuses.append(ref_status)
|
|
|
- if not ref_status.startswith('ok '):
|
|
|
- errs = True
|
|
|
- ref_status = self.proto.read_pkt_line()
|
|
|
-
|
|
|
- if errs:
|
|
|
- ref_status = {}
|
|
|
- ok = set()
|
|
|
- for status in statuses:
|
|
|
- if ' ' not in status:
|
|
|
- # malformed response, move on to the next one
|
|
|
- continue
|
|
|
- status, ref = status.split(' ', 1)
|
|
|
-
|
|
|
- if status == 'ng':
|
|
|
- if ' ' in ref:
|
|
|
- ref, status = ref.split(' ', 1)
|
|
|
- else:
|
|
|
- ok.add(ref)
|
|
|
- ref_status[ref] = status
|
|
|
- raise UpdateRefsError('%s failed to update' %
|
|
|
- ', '.join([ref for ref in ref_status
|
|
|
- if ref not in ok]),
|
|
|
- ref_status=ref_status)
|
|
|
+ self._parse_status_report()
|
|
|
# wait for EOF before returning
|
|
|
data = self.proto.read()
|
|
|
if data:
|