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> --- Scratch the first version. This one actually works. cache-tree.c | 9 +++++++++ t/t1013-read-tree-empty.sh | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 47 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 from 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..a9279f0 --- /dev/null +++ b/t/t1013-read-tree-empty.sh @@ -0,0 +1,38 @@ +#!/bin/sh + +test_description='read-tree with empty trees' + +. ./test-lib.sh + +T1=f4ec99e8174c01eab488469b4c2680500bbb18da +T2=4b825dc642cb6eb9a060e54bf8d69288fbee4904 + +test_expect_success 'setup' ' + printf "40000 empty\0\x4b\x82\x5d\xc6\x42\xcb\x6e\xb9\xa0\x60\xe5\x4b\xf8\xd6\x92\x88\xfb\xee\x49\x04" >newtree && + git hash-object -w -t tree newtree >actual && + echo $T1 >expected + test_cmp expected actual +' + +test_expect_success 'ls-tree T1 (with empty tree)' ' + git ls-tree $T1 >actual && + cat <<EOF >expected && +040000 tree 4b825dc642cb6eb9a060e54bf8d69288fbee4904 empty +EOF + test_cmp expected actual +' + +test_expect_success 'write-tree removes empty tree' ' + git read-tree "$T1" && + git write-tree >actual + echo $T2 >expected + test_cmp expected actual +' + +test_expect_success 'ls-tree T2 (without empty tree)' ' + git ls-tree $T2 >actual && + : >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