get_ref_dir(): take the containing directory as argument
authorMichael Haggerty <mhagger@alum.mit.edu>
Tue, 24 Apr 2012 22:45:12 +0000 (00:45 +0200)
committerJunio C Hamano <gitster@pobox.com>
Thu, 3 May 2012 20:15:09 +0000 (13:15 -0700)
Previously, the "dir" argument to get_ref_dir() was a pointer to the
top-level ref_dir.  Change the function to expect a pointer to the
ref_dir corresponding to dirname.  This allows entries to be added
directly to dir, without having to recurse through the reference trie
each time (i.e., we can use add_entry_to_dir() instead of add_ref()).

Signed-off-by: Michael Haggerty <mhagger@alum.mit.edu>
Signed-off-by: Junio C Hamano <gitster@pobox.com>
refs.c

diff --git a/refs.c b/refs.c
index 9471b1d8a6c4d7e6d59b311f2de0967877ef47d6..afd0cf75bc1292a046bad3524532f4ddcb0fe08d 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -765,7 +765,8 @@ void add_packed_ref(const char *refname, const unsigned char *sha1)
 
 /*
  * Read the loose references for refs from the namespace dirname.
- * dirname must end with '/'.
+ * dirname must end with '/'.  dir must be the directory entry
+ * corresponding to dirname.
  */
 static void get_ref_dir(struct ref_cache *refs, const char *dirname,
                        struct ref_dir *dir)
@@ -806,7 +807,8 @@ static void get_ref_dir(struct ref_cache *refs, const char *dirname,
                        ; /* silently ignore */
                } else if (S_ISDIR(st.st_mode)) {
                        strbuf_addch(&refname, '/');
-                       get_ref_dir(refs, refname.buf, dir);
+                       get_ref_dir(refs, refname.buf,
+                                   &search_for_subdir(dir, refname.buf, 1)->u.subdir);
                } else {
                        if (*refs->name) {
                                hashclr(sha1);
@@ -819,7 +821,8 @@ static void get_ref_dir(struct ref_cache *refs, const char *dirname,
                                hashclr(sha1);
                                flag |= REF_ISBROKEN;
                        }
-                       add_ref(dir, create_ref_entry(refname.buf, sha1, flag, 1));
+                       add_entry_to_dir(dir,
+                                        create_ref_entry(refname.buf, sha1, flag, 1));
                }
                strbuf_setlen(&refname, dirnamelen);
        }
@@ -830,7 +833,8 @@ static void get_ref_dir(struct ref_cache *refs, const char *dirname,
 static struct ref_dir *get_loose_refs(struct ref_cache *refs)
 {
        if (!refs->did_loose) {
-               get_ref_dir(refs, "refs/", &refs->loose);
+               get_ref_dir(refs, "refs/",
+                           &search_for_subdir(&refs->loose, "refs/", 1)->u.subdir);
                refs->did_loose = 1;
        }
        return &refs->loose;