Merge branch 'jk/virtual-objects-do-exist'
authorJunio C Hamano <gitster@pobox.com>
Wed, 20 Mar 2019 06:16:07 +0000 (15:16 +0900)
committerJunio C Hamano <gitster@pobox.com>
Wed, 20 Mar 2019 06:16:07 +0000 (15:16 +0900)
A recent update broke "is this object available to us?" check for
well-known objects like an empty tree (which should yield "yes",
even when there is no on-disk object for an empty tree), which has
been corrected.

* jk/virtual-objects-do-exist:
rev-list: allow cached objects in existence check

1  2 
builtin/rev-list.c
t/t1060-object-corruption.sh
diff --combined builtin/rev-list.c
index 5b5b6dbb1c9b6f9893f3d0420c99655eb19501a8,877b6561f4aa8f50fd77dfa6a8e5c23dd8708c90..425a5774db0697774df499fc16a626ab1e1efcf9
@@@ -197,8 -197,7 +197,8 @@@ static void finish_commit(struct commi
                free_commit_list(commit->parents);
                commit->parents = NULL;
        }
 -      free_commit_buffer(commit);
 +      free_commit_buffer(the_repository->parsed_objects,
 +                         commit);
  }
  
  static inline void finish_object__ma(struct object *obj)
  static int finish_object(struct object *obj, const char *name, void *cb_data)
  {
        struct rev_list_info *info = cb_data;
-       if (!has_object_file(&obj->oid)) {
+       if (oid_object_info_extended(the_repository, &obj->oid, NULL, 0) < 0) {
                finish_object__ma(obj);
                return 1;
        }
@@@ -362,9 -361,6 +362,9 @@@ int cmd_rev_list(int argc, const char *
  {
        struct rev_info revs;
        struct rev_list_info info;
 +      struct setup_revision_opt s_r_opt = {
 +              .allow_exclude_promisor_objects = 1,
 +      };
        int i;
        int bisect_list = 0;
        int bisect_show_vars = 0;
                usage(rev_list_usage);
  
        git_config(git_default_config, NULL);
 -      init_revisions(&revs, prefix);
 +      repo_init_revisions(the_repository, &revs, prefix);
        revs.abbrev = DEFAULT_ABBREV;
        revs.commit_format = CMIT_FMT_UNSPECIFIED;
        revs.do_not_die_on_missing_tree = 1;
                }
        }
  
 -      argc = setup_revisions(argc, argv, &revs, NULL);
 +      argc = setup_revisions(argc, argv, &revs, &s_r_opt);
  
        memset(&info, 0, sizeof(info));
        info.revs = &revs;
        if ((!revs.commits && reflog_walk_empty(revs.reflog_info) &&
             (!(revs.tag_objects || revs.tree_objects || revs.blob_objects) &&
              !revs.pending.nr) &&
 -           !revs.rev_input_given) ||
 +           !revs.rev_input_given && !revs.read_from_stdin) ||
            revs.diff)
                usage(rev_list_usage);
  
        if (prepare_revision_walk(&revs))
                die("revision walk setup failed");
        if (revs.tree_objects)
 -              mark_edges_uninteresting(&revs, show_edge);
 +              mark_edges_uninteresting(&revs, show_edge, 0);
  
        if (bisect_list) {
                int reaches, all;
index 4feb65157d87e803a6cd2caf6cec2a945f54b085,807b63b473b45b0814003e6404204d03cf717e4a..bc89371f53436dbf3427f231f560ef1b1f8683f6
@@@ -117,14 -117,22 +117,24 @@@ test_expect_failure 'clone --local dete
  '
  
  test_expect_success 'fetch into corrupted repo with index-pack' '
 +      cp -R bit-error bit-error-cp &&
 +      test_when_finished "rm -rf bit-error-cp" &&
        (
 -              cd bit-error &&
 +              cd bit-error-cp &&
                test_must_fail git -c transfer.unpackLimit=1 \
                        fetch ../no-bit-error 2>stderr &&
                test_i18ngrep ! -i collision stderr
        )
  '
  
+ test_expect_success 'internal tree objects are not "missing"' '
+       git init missing-empty &&
+       (
+               cd missing-empty &&
+               empty_tree=$(git hash-object -t tree /dev/null) &&
+               commit=$(echo foo | git commit-tree $empty_tree) &&
+               git rev-list --objects $commit
+       )
+ '
  test_done