Lazily read the contents of ShaFiles from disk.
authorDave Borowitz <dborowitz@google.com>
Thu, 4 Mar 2010 20:39:40 +0000 (12:39 -0800)
committerJelmer Vernooij <jelmer@samba.org>
Mon, 12 Apr 2010 15:07:31 +0000 (08:07 -0700)
commit79b760a98784fc284eacedf56c756539fa72b995
tree895b8093b40abfa555ea409131ec8dc37c33c0d5
parent2782f6edb9565794439d74d723d17bdf1a65ca0d
Lazily read the contents of ShaFiles from disk.

Previously, ShaFile.from_file read and inflated the entire contents of a
ShaFile, storing the inflated text in memory. Parsing that text was done
lazily, but this resulted in a confusing performance profile, since the
"lazy" part was in fact faster (memory/CPU-bound) than the eager part
(I/O-bound).

This change ensures that a file is only read fully from disk right
before it is about to be parsed. The first few bytes are still read
from disk to get the file type, but there is no need to slurp the
whole file. Moreover, we now maintain a distinction between ShaFiles
that are initialized from (possibly raw) strings and files initialized
with filenames. In order to parse the contents of a file, we need to
have one or the other. There is a third category of ShaFiles that
should never be parsed, where all the properties are intended to be set
explicitly (usually (but not always) during testing). These objects are
created as usual via __init__.

The tests all pass, but we do not currently have a way of testing the
point at which the implementation reads the whole file from disk.

Also, note that a call to foo.id still results in reading the whole file
and calculating its SHA-1; this behavior may change in the future.

Change-Id: Ib9f67ead0d2a812a2e43cffa54c37a1c4a219841
dulwich/object_store.py
dulwich/objects.py
dulwich/tests/test_objects.py