Browse Source

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
maint
Junio C Hamano 5 years ago
parent
commit
95ca48973d
  1. 8
      refs.c
  2. 8
      repository.h
  3. 4
      sha1-name.c
  4. 4
      t/t4208-log-magic-pathspec.sh

8
refs.c

@ -1852,14 +1852,14 @@ static struct ref_store *ref_store_init(const char *gitdir, @@ -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;
}

/*

8
repository.h

@ -67,8 +67,12 @@ struct repository { @@ -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.

4
sha1-name.c

@ -1815,8 +1815,8 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo, @@ -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);
}

4
t/t4208-log-magic-pathspec.sh

@ -55,6 +55,10 @@ test_expect_success '"git log -- :/a" should not be ambiguous' ' @@ -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' '

Loading…
Cancel
Save