During the commit process, the cache-tree is updated. We need to write
this updated cache-tree so that it's ready for subsequent commands.

Add test code which demonstrates that git commit now writes the cache
tree.  Also demonstrate that cache-tree invalidation is correct.

Signed-off-by: David Turner <dtur...@twitter.com>
---
 builtin/commit.c      | 15 ++++++-------
 t/t0090-cache-tree.sh | 61 ++++++++++++++++++++++++++++++++++++++++++++++++---
 2 files changed, 65 insertions(+), 11 deletions(-)

diff --git a/builtin/commit.c b/builtin/commit.c
index 9cfef6c..dbd4f4b 100644
--- a/builtin/commit.c
+++ b/builtin/commit.c
@@ -342,6 +342,8 @@ static char *prepare_index(int argc, const char **argv, 
const char *prefix,
 
                discard_cache();
                read_cache_from(index_lock.filename);
+               if (update_main_cache_tree(WRITE_TREE_SILENT) >= 0)
+                       write_cache(fd, active_cache, active_nr);
 
                commit_style = COMMIT_NORMAL;
                return index_lock.filename;
@@ -383,14 +385,10 @@ static char *prepare_index(int argc, const char **argv, 
const char *prefix,
        if (!only && !pathspec.nr) {
                fd = hold_locked_index(&index_lock, 1);
                refresh_cache_or_die(refresh_flags);
-               if (active_cache_changed) {
-                       update_main_cache_tree(WRITE_TREE_SILENT);
-                       if (write_cache(fd, active_cache, active_nr) ||
-                           commit_locked_index(&index_lock))
-                               die(_("unable to write new_index file"));
-               } else {
-                       rollback_lock_file(&index_lock);
-               }
+               update_main_cache_tree(WRITE_TREE_SILENT);
+               if (write_cache(fd, active_cache, active_nr) ||
+                   commit_locked_index(&index_lock))
+                       die(_("unable to write new_index file"));
                commit_style = COMMIT_AS_IS;
                return get_index_file();
        }
@@ -435,6 +433,7 @@ static char *prepare_index(int argc, const char **argv, 
const char *prefix,
        fd = hold_locked_index(&index_lock, 1);
        add_remove_files(&partial);
        refresh_cache(REFRESH_QUIET);
+       update_main_cache_tree(WRITE_TREE_SILENT);
        if (write_cache(fd, active_cache, active_nr) ||
            close_lock_file(&index_lock))
                die(_("unable to write new_index file"));
diff --git a/t/t0090-cache-tree.sh b/t/t0090-cache-tree.sh
index 5383258..d50acb8 100755
--- a/t/t0090-cache-tree.sh
+++ b/t/t0090-cache-tree.sh
@@ -16,8 +16,31 @@ cmp_cache_tree () {
 # We don't bother with actually checking the SHA1:
 # test-dump-cache-tree already verifies that all existing data is
 # correct.
+generate_expected_cache_tree () {
+       if [ -n "$1" ]
+       then
+               local dir="$1/"
+       else
+               local dir="$1"
+       fi
+       # ls-files might have foo/bar, foo/bar/baz, and foo/bar/quux
+       # We want to count only foo because it's the only direct child
+       local subtrees=$(git ls-files|egrep '/' |cut -d / -f 1|uniq) &&
+       local subtree_count=$(echo "$subtrees"|grep -c .) &&
+       local files_count=$(git ls-files|grep -v /|wc -l) &&
+       local entries=$(expr "$subtree_count" + "$files_count") &&
+       printf "SHA $dir (%d entries, %d subtrees)\n" $entries $subtree_count &&
+       local subtree &&
+       for subtree in $subtrees
+       do
+           cd "$subtree"
+           generate_expected_cache_tree "$dir$subtree" || return 1
+           cd ..
+       done
+}
+
 test_shallow_cache_tree () {
-       printf "SHA  (%d entries, 0 subtrees)\n" $(git ls-files|wc -l) >expect 
&&
+       generate_expected_cache_tree > expect &&
        cmp_cache_tree expect
 }
 
@@ -35,7 +58,7 @@ test_no_cache_tree () {
        cmp_cache_tree expect
 }
 
-test_expect_failure 'initial commit has cache-tree' '
+test_expect_success 'initial commit has cache-tree' '
        test_commit foo &&
        test_shallow_cache_tree
 '
@@ -60,15 +83,28 @@ test_expect_success 'git-add in subdir invalidates 
cache-tree' '
        test_invalid_cache_tree
 '
 
+cat >before <<\EOF
+SHA  (3 entries, 2 subtrees)
+SHA dir1/ (1 entries, 0 subtrees)
+SHA dir2/ (1 entries, 0 subtrees)
+EOF
+
+cat >expect <<\EOF
+invalid                                   (2 subtrees)
+invalid                                  dir1/ (0 subtrees)
+SHA dir2/ (1 entries, 0 subtrees)
+EOF
+
 test_expect_success 'git-add in subdir does not invalidate sibling cache-tree' 
'
        git tag no-children
        test_when_finished "git reset --hard no-children; git read-tree HEAD" &&
        mkdir dir1 dir2 &&
        test_commit dir1/a &&
        test_commit dir2/b &&
+       cmp_cache_tree before &&
        echo "I changed this file" > dir1/a &&
        git add dir1/a &&
-       test_invalid_cache_tree dir1/
+       cmp_cache_tree expect
 '
 
 test_expect_success 'update-index invalidates cache-tree' '
@@ -95,6 +131,14 @@ test_expect_success 'second commit has cache-tree' '
        test_shallow_cache_tree
 '
 
+test_expect_success 'commit in child dir has cache-tree' '
+       mkdir dir &&
+       >dir/child.t &&
+       git add dir/child.t &&
+       git commit -m dir/child.t
+       test_shallow_cache_tree
+'
+
 test_expect_success 'reset --hard gives cache-tree' '
        test-scrap-cache-tree &&
        git reset --hard &&
@@ -125,4 +169,15 @@ test_expect_success 'checkout -B gives cache-tree' '
        test_shallow_cache_tree
 '
 
+test_expect_success 'partial commit gives cache-tree' '
+       git checkout -b partial no-children &&
+       test_commit one &&
+       test_commit two &&
+       echo "some change" > one.t &&
+       git add one.t &&
+       echo "some other change" > two.t &&
+       git commit two.t -m partial &&
+       test_shallow_cache_tree
+'
+
 test_done
-- 
2.0.0.390.gcb682f8

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to