diff options
author | Sebastian Thiel <byronimo@gmail.com> | 2010-06-24 19:41:43 +0200 |
---|---|---|
committer | Sebastian Thiel <byronimo@gmail.com> | 2010-06-24 19:41:46 +0200 |
commit | feb1ea0f4aacb9ea6dc4133900e65bf34c0ee02d (patch) | |
tree | 042d920af46e7a5774107e390a3962afa8390388 /lib/git/cmd.py | |
parent | 55dcc17c331f580b3beeb4d5decf64d3baf94f2e (diff) | |
download | gitpython-feb1ea0f4aacb9ea6dc4133900e65bf34c0ee02d.tar.gz |
GitCmdStreamReader: fixed terrible bug which only kicked in if the stream was actually empty. This is a rare case that can happen during stream testing. Theoretically there shouldn't be any empty streams of course, but practically they do exist sometimes ;); fixed stream.seek implementation, which previously used seek on standard output
Improved GitCmd error handling
Diffstat (limited to 'lib/git/cmd.py')
-rw-r--r-- | lib/git/cmd.py | 21 |
1 files changed, 16 insertions, 5 deletions
diff --git a/lib/git/cmd.py b/lib/git/cmd.py index 5cae2998..1bdf38a8 100644 --- a/lib/git/cmd.py +++ b/lib/git/cmd.py @@ -109,6 +109,12 @@ class Git(object): self._size = size self._nbr = 0 # num bytes read + # special case: if the object is empty, has null bytes, get the + # final newline right away. + if size == 0: + stream.read(1) + # END handle empty streams + def read(self, size=-1): bytes_left = self._size - self._nbr if bytes_left == 0: @@ -127,7 +133,6 @@ class Git(object): if self._size - self._nbr == 0: self._stream.read(1) # final newline # END finish reading - return data def readline(self, size=-1): @@ -146,7 +151,6 @@ class Git(object): self._nbr += len(data) # handle final byte - # we inline everything, it must be fast ! if self._size - self._nbr == 0: self._stream.read(1) # END finish reading @@ -185,8 +189,9 @@ class Git(object): def __del__(self): bytes_left = self._size - self._nbr if bytes_left: - # seek and discard - self._stream.seek(bytes_left + 1, os.SEEK_CUR) # includes terminating newline + # read and discard - seeking is impossible within a stream + # includes terminating newline + self._stream.read(bytes_left + 1) # END handle incomplete read @@ -454,7 +459,13 @@ class Git(object): """ tokens = header_line.split() if len(tokens) != 3: - raise ValueError("SHA named %s could not be resolved, git returned: %r" % (tokens[0], header_line.strip()) ) + if not tokens: + raise ValueError("SHA could not be resolved, git returned: %r" % (header_line.strip())) + else: + raise ValueError("SHA %s could not be resolved, git returned: %r" % (tokens[0], header_line.strip())) + # END handle actual return value + # END error handling + if len(tokens[0]) != 40: raise ValueError("Failed to parse header: %r" % header_line) return (tokens[0], tokens[1], int(tokens[2])) |