diff options
author | Michael Haggerty <mhagger@alum.mit.edu> | 2016-06-18 06:15:12 +0200 |
---|---|---|
committer | Junio C Hamano <gitster@pobox.com> | 2016-06-20 11:38:19 -0700 |
commit | 2eed2780f0e36e4a9038d65d9125cde5d5e1d2c6 (patch) | |
tree | 4a8529ab521096b0c04423f39457a13475dcab95 /refs | |
parent | 29a7cf96441241a291edca8136ab3cc80201e7ee (diff) | |
download | git-2eed2780f0e36e4a9038d65d9125cde5d5e1d2c6.tar.gz git-2eed2780f0e36e4a9038d65d9125cde5d5e1d2c6.tar.xz |
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>
Diffstat (limited to 'refs')
-rw-r--r-- | refs/files-backend.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/refs/files-backend.c b/refs/files-backend.c index e15f7ae68..b563a7e87 100644 --- a/refs/files-backend.c +++ b/refs/files-backend.c @@ -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; |