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 <mhag...@alum.mit.edu>
---
This doesn't actually reduce the number of ref_cache instances
generated by out test suite, but it is a more logical place for
the check that was added in

  a2d5156c resolve_gitlink_ref: ignore non-repository paths

 refs/files-backend.c | 33 ++++++++++++++++++++++-----------
 1 file changed, 22 insertions(+), 11 deletions(-)

diff --git a/refs/files-backend.c b/refs/files-backend.c
index a0d09f4..142c977 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;
-- 
2.8.1

--
To unsubscribe from this list: send the line "unsubscribe git" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to