diff options
m--------- | lib/git/ext/gitdb | 0 | ||||
-rw-r--r-- | lib/git/index/base.py | 10 | ||||
-rw-r--r-- | test/git/test_index.py | 7 |
3 files changed, 13 insertions, 4 deletions
diff --git a/lib/git/ext/gitdb b/lib/git/ext/gitdb -Subproject 92ca2e4ad606fbec7c934ad9e467a1b51fddcc9 +Subproject 9b53ab02cb44571e6167a125a5296b7c3395563 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 diff --git a/test/git/test_index.py b/test/git/test_index.py index cd005c1d..d0063e89 100644 --- a/test/git/test_index.py +++ b/test/git/test_index.py @@ -6,7 +6,6 @@ from test.testlib import * from git import * -from git.index.util import TemporaryFileSwap import inspect import os import sys @@ -580,7 +579,13 @@ class TestIndex(TestBase): # END git cmd write tree # write all trees and compare them + # its important to have a few submodules in there too + max_count = 100 + count = 0 for commit in rw_repo.head.commit.traverse(): + if count >= max_count: + break + count += 1 index = rw_repo.index.reset(commit) orig_tree = commit.tree new_git_tree = write_tree(index) |