diff options
Diffstat (limited to 'git/util.py')
-rw-r--r-- | git/util.py | 173 |
1 files changed, 83 insertions, 90 deletions
diff --git a/git/util.py b/git/util.py index b3963d3b..7c07b0f3 100644 --- a/git/util.py +++ b/git/util.py @@ -379,101 +379,94 @@ class RemoteProgress(object): - Lines that do not contain progress info are stored in :attr:`other_lines`. - Lines that seem to contain an error (i.e. start with error: or fatal:) are stored - in :attr:`error_lines`. - - :return: list(line, ...) list of lines that could not be processed""" + in :attr:`error_lines`.""" # handle # Counting objects: 4, done. - # Compressing objects: 50% (1/2) \rCompressing objects: 100% (2/2) \rCompressing objects: 100% (2/2), done. + # Compressing objects: 50% (1/2) + # Compressing objects: 100% (2/2) + # Compressing objects: 100% (2/2), done. self._cur_line = line = line.decode('utf-8') if isinstance(line, bytes) else line if len(self.error_lines) > 0 or self._cur_line.startswith(('error:', 'fatal:')): self.error_lines.append(self._cur_line) - return [] - - sub_lines = line.split('\r') - failed_lines = [] - for sline in sub_lines: - # find escape characters and cut them away - regex will not work with - # them as they are non-ascii. As git might expect a tty, it will send them - last_valid_index = None - for i, c in enumerate(reversed(sline)): - if ord(c) < 32: - # its a slice index - last_valid_index = -i - 1 - # END character was non-ascii - # END for each character in sline - if last_valid_index is not None: - sline = sline[:last_valid_index] - # END cut away invalid part - sline = sline.rstrip() - - cur_count, max_count = None, None - match = self.re_op_relative.match(sline) - if match is None: - match = self.re_op_absolute.match(sline) - - if not match: - self.line_dropped(sline) - failed_lines.append(sline) - continue - # END could not get match - - op_code = 0 - remote, op_name, percent, cur_count, max_count, message = match.groups() # @UnusedVariable - - # get operation id - if op_name == "Counting objects": - op_code |= self.COUNTING - elif op_name == "Compressing objects": - op_code |= self.COMPRESSING - elif op_name == "Writing objects": - op_code |= self.WRITING - elif op_name == 'Receiving objects': - op_code |= self.RECEIVING - elif op_name == 'Resolving deltas': - op_code |= self.RESOLVING - elif op_name == 'Finding sources': - op_code |= self.FINDING_SOURCES - elif op_name == 'Checking out files': - op_code |= self.CHECKING_OUT - else: - # Note: On windows it can happen that partial lines are sent - # Hence we get something like "CompreReceiving objects", which is - # a blend of "Compressing objects" and "Receiving objects". - # This can't really be prevented, so we drop the line verbosely - # to make sure we get informed in case the process spits out new - # commands at some point. - self.line_dropped(sline) - # Note: Don't add this line to the failed lines, as we have to silently - # drop it - self.other_lines.extend(failed_lines) - return failed_lines - # END handle op code - - # figure out stage - if op_code not in self._seen_ops: - self._seen_ops.append(op_code) - op_code |= self.BEGIN - # END begin opcode - - if message is None: - message = '' - # END message handling - - message = message.strip() - if message.endswith(self.DONE_TOKEN): - op_code |= self.END - message = message[:-len(self.DONE_TOKEN)] - # END end message handling - message = message.strip(self.TOKEN_SEPARATOR) - - self.update(op_code, - cur_count and float(cur_count), - max_count and float(max_count), - message) - # END for each sub line - self.other_lines.extend(failed_lines) - return failed_lines + return + + # find escape characters and cut them away - regex will not work with + # them as they are non-ascii. As git might expect a tty, it will send them + last_valid_index = None + for i, c in enumerate(reversed(line)): + if ord(c) < 32: + # its a slice index + last_valid_index = -i - 1 + # END character was non-ascii + # END for each character in line + if last_valid_index is not None: + line = line[:last_valid_index] + # END cut away invalid part + line = line.rstrip() + + cur_count, max_count = None, None + match = self.re_op_relative.match(line) + if match is None: + match = self.re_op_absolute.match(line) + + if not match: + self.line_dropped(line) + self.other_lines.append(line) + return + # END could not get match + + op_code = 0 + remote, op_name, percent, cur_count, max_count, message = match.groups() # @UnusedVariable + + # get operation id + if op_name == "Counting objects": + op_code |= self.COUNTING + elif op_name == "Compressing objects": + op_code |= self.COMPRESSING + elif op_name == "Writing objects": + op_code |= self.WRITING + elif op_name == 'Receiving objects': + op_code |= self.RECEIVING + elif op_name == 'Resolving deltas': + op_code |= self.RESOLVING + elif op_name == 'Finding sources': + op_code |= self.FINDING_SOURCES + elif op_name == 'Checking out files': + op_code |= self.CHECKING_OUT + else: + # Note: On windows it can happen that partial lines are sent + # Hence we get something like "CompreReceiving objects", which is + # a blend of "Compressing objects" and "Receiving objects". + # This can't really be prevented, so we drop the line verbosely + # to make sure we get informed in case the process spits out new + # commands at some point. + self.line_dropped(line) + # Note: Don't add this line to the other lines, as we have to silently + # drop it + return + # END handle op code + + # figure out stage + if op_code not in self._seen_ops: + self._seen_ops.append(op_code) + op_code |= self.BEGIN + # END begin opcode + + if message is None: + message = '' + # END message handling + + message = message.strip() + if message.endswith(self.DONE_TOKEN): + op_code |= self.END + message = message[:-len(self.DONE_TOKEN)] + # END end message handling + message = message.strip(self.TOKEN_SEPARATOR) + + self.update(op_code, + cur_count and float(cur_count), + max_count and float(max_count), + message) def new_message_handler(self): """ |