Merge branch 'jt/cache-tree-avoid-lazy-fetch-during-merge'
authorJunio C Hamano <gitster@pobox.com>
Mon, 7 Oct 2019 02:32:58 +0000 (11:32 +0900)
committerJunio C Hamano <gitster@pobox.com>
Mon, 7 Oct 2019 02:32:58 +0000 (11:32 +0900)
The cache-tree code has been taught to be less aggressive in
attempting to see if a tree object it computed already exists in
the repository.

* jt/cache-tree-avoid-lazy-fetch-during-merge:
  cache-tree: do not lazy-fetch tentative tree

1  2 
cache-tree.c
t/t0410-partial-clone.sh

diff --combined cache-tree.c
@@@ -5,7 -5,6 +5,7 @@@
  #include "cache-tree.h"
  #include "object-store.h"
  #include "replace-object.h"
 +#include "promisor-remote.h"
  
  #ifndef DEBUG_CACHE_TREE
  #define DEBUG_CACHE_TREE 0
@@@ -358,7 -357,7 +358,7 @@@ static int update_one(struct cache_tre
                }
  
                ce_missing_ok = mode == S_IFGITLINK || missing_ok ||
 -                      (repository_format_partial_clone &&
 +                      (has_promisor_remote() &&
                         ce_skip_worktree(ce));
                if (is_null_oid(oid) ||
                    (!ce_missing_ok && !has_object_file(oid))) {
        if (repair) {
                struct object_id oid;
                hash_object_file(buffer.buf, buffer.len, tree_type, &oid);
-               if (has_object_file(&oid))
+               if (has_object_file_with_flags(&oid, OBJECT_INFO_SKIP_FETCH_OBJECT))
                        oidcpy(&it->oid, &oid);
                else
                        to_invalidate = 1;
diff --combined t/t0410-partial-clone.sh
@@@ -26,7 -26,7 +26,7 @@@ promise_and_delete () 
  test_expect_success 'extensions.partialclone without filter' '
        test_create_repo server &&
        git clone --filter="blob:none" "file://$(pwd)/server" client &&
 -      git -C client config --unset core.partialclonefilter &&
 +      git -C client config --unset remote.origin.partialclonefilter &&
        git -C client fetch origin
  '
  
@@@ -166,9 -166,8 +166,9 @@@ test_expect_success 'fetching of missin
        # associated packfile contains the object
        ls repo/.git/objects/pack/pack-*.promisor >promisorlist &&
        test_line_count = 1 promisorlist &&
 -      IDX=$(cat promisorlist | sed "s/promisor$/idx/") &&
 -      git verify-pack --verbose "$IDX" | grep "$HASH"
 +      IDX=$(sed "s/promisor$/idx/" promisorlist) &&
 +      git verify-pack --verbose "$IDX" >out &&
 +      grep "$HASH" out
  '
  
  test_expect_success 'fetching of missing objects works with ref-in-want enabled' '
        grep "git< fetch=.*ref-in-want" trace
  '
  
 +test_expect_success 'fetching of missing objects from another promisor remote' '
 +      git clone "file://$(pwd)/server" server2 &&
 +      test_commit -C server2 bar &&
 +      git -C server2 repack -a -d --write-bitmap-index &&
 +      HASH2=$(git -C server2 rev-parse bar) &&
 +
 +      git -C repo remote add server2 "file://$(pwd)/server2" &&
 +      git -C repo config remote.server2.promisor true &&
 +      git -C repo cat-file -p "$HASH2" &&
 +
 +      git -C repo fetch server2 &&
 +      rm -rf repo/.git/objects/* &&
 +      git -C repo cat-file -p "$HASH2" &&
 +
 +      # Ensure that the .promisor file is written, and check that its
 +      # associated packfile contains the object
 +      ls repo/.git/objects/pack/pack-*.promisor >promisorlist &&
 +      test_line_count = 1 promisorlist &&
 +      IDX=$(sed "s/promisor$/idx/" promisorlist) &&
 +      git verify-pack --verbose "$IDX" >out &&
 +      grep "$HASH2" out
 +'
 +
 +test_expect_success 'fetching of missing objects configures a promisor remote' '
 +      git clone "file://$(pwd)/server" server3 &&
 +      test_commit -C server3 baz &&
 +      git -C server3 repack -a -d --write-bitmap-index &&
 +      HASH3=$(git -C server3 rev-parse baz) &&
 +      git -C server3 config uploadpack.allowfilter 1 &&
 +
 +      rm repo/.git/objects/pack/pack-*.promisor &&
 +
 +      git -C repo remote add server3 "file://$(pwd)/server3" &&
 +      git -C repo fetch --filter="blob:none" server3 $HASH3 &&
 +
 +      test_cmp_config -C repo true remote.server3.promisor &&
 +
 +      # Ensure that the .promisor file is written, and check that its
 +      # associated packfile contains the object
 +      ls repo/.git/objects/pack/pack-*.promisor >promisorlist &&
 +      test_line_count = 1 promisorlist &&
 +      IDX=$(sed "s/promisor$/idx/" promisorlist) &&
 +      git verify-pack --verbose "$IDX" >out &&
 +      grep "$HASH3" out
 +'
 +
  test_expect_success 'fetching of missing blobs works' '
 -      rm -rf server repo &&
 +      rm -rf server server2 repo &&
 +      rm -rf server server3 repo &&
        test_create_repo server &&
        test_commit -C server foo &&
        git -C server repack -a -d --write-bitmap-index &&
@@@ -282,7 -234,7 +282,7 @@@ test_expect_success 'rev-list stops tra
  
        git -C repo config core.repositoryformatversion 1 &&
        git -C repo config extensions.partialclone "arbitrary string" &&
 -      GIT_TEST_COMMIT_GRAPH=0 git -C repo rev-list --exclude-promisor-objects --objects bar >out &&
 +      GIT_TEST_COMMIT_GRAPH=0 git -C repo -c core.commitGraph=false rev-list --exclude-promisor-objects --objects bar >out &&
        grep $(git -C repo rev-parse bar) out &&
        ! grep $FOO out
  '
@@@ -540,6 -492,20 +540,20 @@@ test_expect_success 'gc stops traversa
        ! grep "$TREE_HASH" out
  '
  
+ test_expect_success 'do not fetch when checking existence of tree we construct ourselves' '
+       rm -rf repo &&
+       test_create_repo repo &&
+       test_commit -C repo base &&
+       test_commit -C repo side1 &&
+       git -C repo checkout base &&
+       test_commit -C repo side2 &&
+       git -C repo config core.repositoryformatversion 1 &&
+       git -C repo config extensions.partialclone "arbitrary string" &&
+       git -C repo cherry-pick side1
+ '
  . "$TEST_DIRECTORY"/lib-httpd.sh
  start_httpd
  
@@@ -562,9 -528,8 +576,9 @@@ test_expect_success 'fetching of missin
        # associated packfile contains the object
        ls repo/.git/objects/pack/pack-*.promisor >promisorlist &&
        test_line_count = 1 promisorlist &&
 -      IDX=$(cat promisorlist | sed "s/promisor$/idx/") &&
 -      git verify-pack --verbose "$IDX" | grep "$HASH"
 +      IDX=$(sed "s/promisor$/idx/" promisorlist) &&
 +      git verify-pack --verbose "$IDX" >out &&
 +      grep "$HASH" out
  '
  
  # DO NOT add non-httpd-specific tests here, because the last part of this