From 1d79988228a9b08c86d9e595fdc1b92f7ca50424 Mon Sep 17 00:00:00 2001 From: Eric Sunshine Date: Tue, 13 Jan 2015 04:57:10 -0500 Subject: Blob: vend raw or cooked content Some blob representations require raw blob content, however, the 'blob' view is unconditionally handed cooked (utf8-encoded) content, thus representations which need raw content are forced to reload the blob in raw form, which is ugly and expensive. The ultimate goal is to eliminate the wasteful blob reloading when raw content is needed. Toward that end, teach Blob how to vend raw or cooked content. Signed-off-by: Eric Sunshine Signed-off-by: Alberto Bertogli --- git.py | 20 ++++++++++++-------- 1 file changed, 12 insertions(+), 8 deletions(-) (limited to 'git.py') diff --git a/git.py b/git.py index 78f5b1e..9f73fd1 100644 --- a/git.py +++ b/git.py @@ -339,12 +339,12 @@ class Repo: ref = self.branch return Tree(self, ref) - def blob(self, path, ref = None, raw = False): + def blob(self, path, ref = None): """Returns a Blob instance for the given path.""" if not ref: ref = self.branch cmd = self.cmd('cat-file') - cmd.raw(raw) + cmd.raw(True) cmd.batch = None if isinstance(ref, unicode): @@ -356,7 +356,7 @@ class Repo: if not head or head.strip().endswith('missing'): return None - return Blob(out.read(), raw) + return Blob(out.read()) def last_commit_timestamp(self): """Return the timestamp of the last commit.""" @@ -559,8 +559,12 @@ class Tree: class Blob: """A git blob.""" - def __init__(self, content, raw): - if raw: - self.raw_content = content - else: - self.utf8_content = content + def __init__(self, raw_content): + self.raw_content = raw_content + self._utf8_content = None + + @property + def utf8_content(self): + if not self._utf8_content: + self._utf8_content = self.raw_content.decode('utf8', 'replace') + return self._utf8_content -- cgit v1.2.3