summaryrefslogtreecommitdiff
path: root/lib/git/index/base.py
diff options
context:
space:
mode:
authorSebastian Thiel <byronimo@gmail.com>2010-06-22 12:03:37 +0200
committerSebastian Thiel <byronimo@gmail.com>2010-06-22 12:03:37 +0200
commitc4f49fb232acb2c02761a82acc12c4040699685d (patch)
tree57e86ae1ca34f7e3e658b1f078f705ba1b397c10 /lib/git/index/base.py
parentd2d9197cfe5d3b43cb8aee182b2e65c73ef9ab7b (diff)
downloadgitpython-c4f49fb232acb2c02761a82acc12c4040699685d.tar.gz
index.write_tree: now uses MemoryDB, making tree handling more efficient as IO will only be done when required. A possible disadvantage though is that time is spent on compressing the trees, although only the raw data and their shas would theoretically be needed. On the other hand, compressing their data uses less memory. An optimal implementation would just sha the data, check for existance, and compress it to write it to the database right away. This would mean more specialized code though, introducing redundancy. If IStreams would know whether they contain compressed or uncompressed data, and if there was a method to get a sha from data, this would work nicely in the existing framework though
Diffstat (limited to 'lib/git/index/base.py')
-rw-r--r--lib/git/index/base.py10
1 files changed, 7 insertions, 3 deletions
diff --git a/lib/git/index/base.py b/lib/git/index/base.py
index 48b2d766..06437702 100644
--- a/lib/git/index/base.py
+++ b/lib/git/index/base.py
@@ -66,6 +66,7 @@ from fun import (
)
from gitdb.base import IStream
+from gitdb.db import MemoryDB
__all__ = ( 'IndexFile', 'CheckoutError' )
@@ -502,10 +503,13 @@ class IndexFile(LazyMixin, diff.Diffable, Serializable):
if not self.entries:
raise ValueError("Cannot write empty index")
- # TODO: use memory db, this helps to prevent IO if the resulting tree
- # already exists
+ mdb = MemoryDB()
entries = self._entries_sorted()
- binsha, tree_items = write_tree_from_cache(entries, self.repo.odb, slice(0, len(entries)))
+ binsha, tree_items = write_tree_from_cache(entries, mdb, slice(0, len(entries)))
+
+ # copy changed trees only
+ mdb.stream_copy(mdb.sha_iter(), self.repo.odb)
+
# note: additional deserialization could be saved if write_tree_from_cache
# would return sorted tree entries