From 0ba89d75e6e26bf14f5b6cfb6526e601f7ad7e2d Mon Sep 17 00:00:00 2001 From: Eric Sunshine Date: Tue, 13 Jan 2015 04:57:09 -0500 Subject: git.py: introduce Blob abstraction Some blob representations (such as embedded images) 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 (due to shelling out to git-cat-file a second time). The ultimate goal is to eliminate the wasteful blob reloading when raw content is needed. As a first step, introduce a Blob abstraction to be returned by Repo.blob() rather than the cooked content. A subsequent change will flesh out Blob, allowing it to return raw or cooked content on demand without the client having to specify one or the other when invoking Repo.blob(). Signed-off-by: Eric Sunshine Signed-off-by: Alberto Bertogli --- git.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) (limited to 'git.py') diff --git a/git.py b/git.py index 58b0c4c..78f5b1e 100644 --- a/git.py +++ b/git.py @@ -340,7 +340,7 @@ class Repo: return Tree(self, ref) def blob(self, path, ref = None, raw = False): - """Returns the contents of the given path.""" + """Returns a Blob instance for the given path.""" if not ref: ref = self.branch cmd = self.cmd('cat-file') @@ -356,7 +356,7 @@ class Repo: if not head or head.strip().endswith('missing'): return None - return out.read() + return Blob(out.read(), raw) def last_commit_timestamp(self): """Return the timestamp of the last commit.""" @@ -555,3 +555,12 @@ class Tree: # manipulate otherwise. yield otype, smstr(name), size + +class Blob: + """A git blob.""" + + def __init__(self, content, raw): + if raw: + self.raw_content = content + else: + self.utf8_content = content -- cgit v1.2.3