get_ref_cache(): only create an instance if there is a submodule

If there is not a nonbare repository where a submodule is supposedly
located, then don't instantiate a ref_cache for it.

The analogous check can be removed from resolve_gitlink_ref().

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
maint
Michael Haggerty 2016-06-18 06:15:12 +02:00 committed by Junio C Hamano
parent 29a7cf9644
commit 2eed2780f0
1 changed files with 22 additions and 11 deletions

View File

@ -954,15 +954,26 @@ static struct ref_cache *lookup_ref_cache(const char *submodule)

/*
* Return a pointer to a ref_cache for the specified submodule. For
* the main repository, use submodule==NULL. The returned structure
* will be allocated and initialized but not necessarily populated; it
* should not be freed.
* the main repository, use submodule==NULL; such a call cannot fail.
* For a submodule, the submodule must exist and be a nonbare
* repository, otherwise return NULL.
*
* The returned structure will be allocated and initialized but not
* necessarily populated; it should not be freed.
*/
static struct ref_cache *get_ref_cache(const char *submodule)
{
struct ref_cache *refs = lookup_ref_cache(submodule);
if (!refs)
refs = create_ref_cache(submodule);

if (!refs) {
struct strbuf submodule_sb = STRBUF_INIT;

strbuf_addstr(&submodule_sb, submodule);
if (is_nonbare_repository_dir(&submodule_sb))
refs = create_ref_cache(submodule);
strbuf_release(&submodule_sb);
}

return refs;
}

@ -1341,13 +1352,10 @@ int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sh
return -1;

strbuf_add(&submodule, path, len);
refs = lookup_ref_cache(submodule.buf);
refs = get_ref_cache(submodule.buf);
if (!refs) {
if (!is_nonbare_repository_dir(&submodule)) {
strbuf_release(&submodule);
return -1;
}
refs = create_ref_cache(submodule.buf);
strbuf_release(&submodule);
return -1;
}
strbuf_release(&submodule);

@ -1885,6 +1893,9 @@ int do_for_each_ref(const char *submodule, const char *prefix,
struct ref_cache *refs;

refs = get_ref_cache(submodule);
if (!refs)
return 0;

data.prefix = prefix;
data.trim = trim;
data.flags = flags;