Re: [PATCH] cache-tree: do not cache empty trees
- From
Jonathan Nieder <jrnieder@gmail.com>
- Date
- Feb 7, 2011, 09:17 UTC
- Message-ID
- <20110207091740.GA5391@elie>
- In-Reply-To
- <1296914835-808-1-git-send-email-pclouds@gmail.com>
Nguyễn Thái Ngọc Duy wrote:
> Let's do it in a consistent way, always disregard empty trees in > index. If users choose to create empty trees their own way, they > should not use index at all.
While this violates some seeming invariants, like
1.
git reset --hard
git commit --allow-empty
git rev-parse HEAD^^{tree} >expect
git rev-parse HEAD^{tree} >actual
test_cmp expect actual2.
git reset --hard
git revert HEAD
if git rev-parse HEAD~2
then
git rev-parse HEAD~2^{tree} >expect
git rev-parse HEAD^{tree} >actual
test_cmp expect actual
fi, I think it's a good change. Malformed modes in trees already break those false invariants iiuc.
Thanks.
Show 11 quoted lines
> --- a/cache-tree.c
> +++ b/cache-tree.c
> @@ -621,9 +621,18 @@ static void prime_cache_tree_rec(struct cache_tree *it, struct tree *tree)
> struct tree *subtree = lookup_tree(entry.sha1);
> if (!subtree->object.parsed)
> parse_tree(subtree);
> + if (!hashcmp(entry.sha1, (unsigned char *)EMPTY_TREE_SHA1_BIN)) {
> + warning("empty tree detected! Will be removed in new commits");
> + cnt = -1;
> + break;
> + }Aside from the warning, this part is an optimization, right?
Show 7 quoted lines
> sub = cache_tree_sub(it, entry.path);
> sub->cache_tree = cache_tree();
> prime_cache_tree_rec(sub->cache_tree, subtree);
> + if (sub->cache_tree->entry_count == -1) {
> + cnt = -1;
> + break;
> + }Would be nice to include a test for this, like so:
subdir/ empty1/ subsubdir/ empty2/ empty3/
Show 10 quoted lines
> --- /dev/null > +++ b/t/t1013-read-tree-empty.sh > @@ -0,0 +1,20 @@ > +#!/bin/sh > + > +test_description='read-tree with empty trees' > + > +. ./test-lib.sh > + > +EMPTY_TREE=4b825dc642cb6eb9a060e54bf8d69288fbee4904
If we _have_ to hard-code this (why?) then I'd prefer to do so in test-lib.sh.
[...]
Show 5 quoted lines
> +test_expect_success 'write-tree removes empty tree' ' > + git read-tree `cat tree` && > + git write-tree >actual > + echo $EMPTY_TREE >expected > + test_cmp expected actual
Broken &&-chain. Not sure why this test relies on virtual objects and another (independently nice) patch instead of adding the empty tree to the object db --- is there something subtle I am missing?
The test does not distinguish between success due to git read-tree omitting empty trees and success due to git mktree omitting empty trees.
Hope that helps, Jonathan