Merge branch 'jc/missing-ref-store-fix'

We've left the command line parsing of "git log :/a/b/" broken for
about a full year without anybody noticing, which has been
corrected.

* jc/missing-ref-store-fix:
  repository: mark the "refs" pointer as private
  sha1-name: do not assume that the ref store is initialized
This commit is contained in:
Junio C Hamano 2020-04-22 13:42:55 -07:00
commit 95ca48973d
4 changed files with 16 additions and 8 deletions

8
refs.c
View File

@ -1852,14 +1852,14 @@ static struct ref_store *ref_store_init(const char *gitdir,
struct ref_store *get_main_ref_store(struct repository *r)
{
if (r->refs)
return r->refs;
if (r->refs_private)
return r->refs_private;
if (!r->gitdir)
BUG("attempting to get main_ref_store outside of repository");
r->refs = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
return r->refs;
r->refs_private = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
return r->refs_private;
}
/*

View File

@ -67,8 +67,12 @@ struct repository {
*/
struct parsed_object_pool *parsed_objects;
/* The store in which the refs are held. */
struct ref_store *refs;
/*
* The store in which the refs are held. This should generally only be
* accessed via get_main_ref_store(), as that will lazily initialize
* the ref object.
*/
struct ref_store *refs_private;
/*
* Contains path to often used file names.

View File

@ -1815,8 +1815,8 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
cb.repo = repo;
cb.list = &list;
refs_for_each_ref(repo->refs, handle_one_ref, &cb);
refs_head_ref(repo->refs, handle_one_ref, &cb);
refs_for_each_ref(get_main_ref_store(repo), handle_one_ref, &cb);
refs_head_ref(get_main_ref_store(repo), handle_one_ref, &cb);
commit_list_sort_by_date(&list);
return get_oid_oneline(repo, name + 2, oid, list);
}

View File

@ -55,6 +55,10 @@ test_expect_success '"git log -- :/a" should not be ambiguous' '
git log -- :/a
'
test_expect_success '"git log :/any/path/" should not segfault' '
test_must_fail git log :/any/path/
'
# This differs from the ":/a" check above in that :/in looks like a pathspec,
# but doesn't match an actual file.
test_expect_success '"git log :/in" should not be ambiguous' '