aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Sunshine <sunshine@sunshineco.com>2015-01-13 10:57:12 +0100
committerAlberto Bertogli <albertito@blitiri.com.ar>2015-01-13 20:51:44 +0100
commit58037e57c591b1c55594a0adb637d1880bfacaee (patch)
tree72de02b4ddaefa686fa69e3810124c5d54f3cb13
parent50c004f8a5f26ad27f03597b050f9b1a1910cc45 (diff)
downloadgit-arr-fork-58037e57c591b1c55594a0adb637d1880bfacaee.zip
Repo.blob: respect reported blob size
Batch output of git-cat-file has the form: <sha1> SP <type> SP <size> LF <contents> LF It unconditionally includes a trailing line-feed which Repo.blob() incorrectly returns as part of blob content. For textual blobs, this extra character is often benign, however, for binary blobs, it can easily change the meaning of the data in unexpected or disastrous ways. Fix this by respecting the blob size reported by git-cat-file. (The alternate approach of unconditionally dropping the final LF also works, however, respecting the reported size is perhaps a bit more robust and "correct".) Signed-off-by: Eric Sunshine <sunshine@sunshineco.com> Signed-off-by: Alberto Bertogli <albertito@blitiri.com.ar>
-rw-r--r--git.py4
1 files changed, 2 insertions, 2 deletions
diff --git a/git.py b/git.py
index 9f73fd1..ad3952d 100644
--- a/git.py
+++ b/git.py
@@ -345,7 +345,7 @@ class Repo:
ref = self.branch
cmd = self.cmd('cat-file')
cmd.raw(True)
- cmd.batch = None
+ cmd.batch = '%(objectsize)'
if isinstance(ref, unicode):
ref = ref.encode('utf8')
@@ -356,7 +356,7 @@ class Repo:
if not head or head.strip().endswith('missing'):
return None
- return Blob(out.read())
+ return Blob(out.read()[:int(head)])
def last_commit_timestamp(self):
"""Return the timestamp of the last commit."""