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) struct ref_store *get_main_ref_store(struct repository *r)
{ {
if (r->refs) if (r->refs_private)
return r->refs; return r->refs_private;
if (!r->gitdir) if (!r->gitdir)
BUG("attempting to get main_ref_store outside of repository"); BUG("attempting to get main_ref_store outside of repository");
r->refs = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS); r->refs_private = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
return r->refs; return r->refs_private;
} }
/* /*

View File

@ -67,8 +67,12 @@ struct repository {
*/ */
struct parsed_object_pool *parsed_objects; 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. * 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.repo = repo;
cb.list = &list; cb.list = &list;
refs_for_each_ref(repo->refs, handle_one_ref, &cb); refs_for_each_ref(get_main_ref_store(repo), handle_one_ref, &cb);
refs_head_ref(repo->refs, handle_one_ref, &cb); refs_head_ref(get_main_ref_store(repo), handle_one_ref, &cb);
commit_list_sort_by_date(&list); commit_list_sort_by_date(&list);
return get_oid_oneline(repo, name + 2, oid, 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 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, # This differs from the ":/a" check above in that :/in looks like a pathspec,
# but doesn't match an actual file. # but doesn't match an actual file.
test_expect_success '"git log :/in" should not be ambiguous' ' test_expect_success '"git log :/in" should not be ambiguous' '