Current index does not support empty trees. But users can construct empty trees directly using plumbing. When empty trees are checked out, things become inconsistent: - If cache-tree somehow is invalidated, when a tree is read to index, empty trees disappear. When we write trees back, empty trees will be gone. - If cache-tree is generated by read-tree and remains valid by the time trees are written back, empty trees remain. 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. Signed-off-by: Nguyán ThÃi Ngác Duy <pclouds@xxxxxxxxx> --- Third version. Cleaned up t1013. Also needs [1] for mktree to work with empty trees. [1] http://mid.gmane.org/1296914582-619-1-git-send-email-pclouds@xxxxxxxxx cache-tree.c | 9 +++++++++ t/t1013-read-tree-empty.sh | 20 ++++++++++++++++++++ 2 files changed, 29 insertions(+), 0 deletions(-) create mode 100755 t/t1013-read-tree-empty.sh diff --git a/cache-tree.c b/cache-tree.c index f755590..03732ad 100644 --- 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; + } 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; + } cnt += sub->cache_tree->entry_count; } } diff --git a/t/t1013-read-tree-empty.sh b/t/t1013-read-tree-empty.sh new file mode 100755 index 0000000..8d2ab97 --- /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 + +test_expect_success 'setup' ' + echo "040000 tree $EMPTY_TREE empty" | git mktree >tree +' + +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 +' + +test_done -- 1.7.3.4.878.g439c7 -- To unsubscribe from this list: send the line "unsubscribe git" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html