diff options
-rw-r--r-- | lib/git/cmd.py | 21 | ||||
-rw-r--r-- | lib/git/objects/fun.py | 3 | ||||
-rw-r--r-- | lib/git/repo.py | 1 | ||||
-rw-r--r-- | test/testlib/helper.py | 5 |
4 files changed, 23 insertions, 7 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])) diff --git a/lib/git/objects/fun.py b/lib/git/objects/fun.py index c2e7358f..5b39ab0c 100644 --- a/lib/git/objects/fun.py +++ b/lib/git/objects/fun.py @@ -1,6 +1,7 @@ """Module with functions which are supposed to be as fast as possible""" -__all__ = ('tree_to_stream', 'tree_entries_from_data') +__all__ = ('tree_to_stream', 'tree_entries_from_data', 'traverse_trees_recursive', + 'traverse_tree_recursive') from stat import S_ISDIR diff --git a/lib/git/repo.py b/lib/git/repo.py index 79275106..d665a40c 100644 --- a/lib/git/repo.py +++ b/lib/git/repo.py @@ -42,6 +42,7 @@ def is_git_dir(d): os.readlink(headref).startswith('refs')) return False + class Repo(object): """ Represents a git repository and allows you to query references, diff --git a/test/testlib/helper.py b/test/testlib/helper.py index 3a5d7b8f..4399561c 100644 --- a/test/testlib/helper.py +++ b/test/testlib/helper.py @@ -109,11 +109,14 @@ def with_rw_repo(working_tree_ref): return func(self, rw_repo) except: print >> sys.stderr, "Keeping repo after failure: %s" % repo_dir + repo_dir = None raise finally: os.chdir(prev_cwd) rw_repo.git.clear_cache() - shutil.rmtree(repo_dir, onerror=_rmtree_onerror) + if repo_dir is not None: + shutil.rmtree(repo_dir, onerror=_rmtree_onerror) + # END rm test repo if possible # END cleanup # END rw repo creator repo_creator.__name__ = func.__name__ |