And make the function work for submodules.

Signed-off-by: Michael Haggerty <mhag...@alum.mit.edu>
---
 refs.c               |  4 +++-
 refs/files-backend.c | 18 +++++++++++++-----
 refs/refs-internal.h |  9 ++++++---
 3 files changed, 22 insertions(+), 9 deletions(-)

diff --git a/refs.c b/refs.c
index 904e758..9d36dfe 100644
--- a/refs.c
+++ b/refs.c
@@ -1222,6 +1222,7 @@ const char *resolve_ref_unsafe(const char *refname, int 
resolve_flags,
        static struct strbuf sb_refname = STRBUF_INIT;
        int unused_flags;
        int symref_count;
+       struct ref_store *refs = get_ref_store(NULL);
 
        if (!flags)
                flags = &unused_flags;
@@ -1249,7 +1250,8 @@ const char *resolve_ref_unsafe(const char *refname, int 
resolve_flags,
        for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
                unsigned int read_flags = 0;
 
-               if (read_raw_ref(refname, sha1, &sb_refname, &read_flags)) {
+               if (read_raw_ref(refs, refname,
+                                sha1, &sb_refname, &read_flags)) {
                        *flags |= read_flags;
                        if (errno != ENOENT || (resolve_flags & 
RESOLVE_REF_READING))
                                return NULL;
diff --git a/refs/files-backend.c b/refs/files-backend.c
index 5f14227..ff7ee7d 100644
--- a/refs/files-backend.c
+++ b/refs/files-backend.c
@@ -1353,11 +1353,12 @@ static int resolve_packed_ref(struct files_ref_store 
*refs,
        return -1;
 }
 
-int read_raw_ref(const char *refname, unsigned char *sha1,
+int read_raw_ref(struct ref_store *ref_store,
+                const char *refname, unsigned char *sha1,
                 struct strbuf *referent, unsigned int *type)
 {
        struct files_ref_store *refs =
-               get_files_ref_store(NULL, "read_raw_ref");
+               files_downcast(ref_store, 1, "read_raw_ref");
        struct strbuf sb_contents = STRBUF_INIT;
        struct strbuf sb_path = STRBUF_INIT;
        const char *path;
@@ -1369,7 +1370,12 @@ int read_raw_ref(const char *refname, unsigned char 
*sha1,
 
        *type = 0;
        strbuf_reset(&sb_path);
-       strbuf_git_path(&sb_path, "%s", refname);
+
+       if (*refs->base.submodule)
+               strbuf_git_path_submodule(&sb_path, refs->base.submodule, "%s", 
refname);
+       else
+               strbuf_git_path(&sb_path, "%s", refname);
+
        path = sb_path.buf;
 
 stat_ref:
@@ -1596,8 +1602,9 @@ static int lock_raw_ref(const char *refname, int 
mustexist,
                        unsigned int *type,
                        struct strbuf *err)
 {
+       struct ref_store *ref_store = get_ref_store(NULL);
        struct files_ref_store *refs =
-               get_files_ref_store(NULL, "lock_raw_ref");
+               files_downcast(ref_store, 0, "lock_raw_ref");
        struct ref_lock *lock;
        struct strbuf ref_file = STRBUF_INIT;
        int attempts_remaining = 3;
@@ -1687,7 +1694,8 @@ retry:
         * fear that its value will change.
         */
 
-       if (read_raw_ref(refname, lock->old_oid.hash, referent, type)) {
+       if (read_raw_ref(ref_store, refname,
+                        lock->old_oid.hash, referent, type)) {
                if (errno == ENOENT) {
                        if (mustexist) {
                                /* Garden variety missing reference. */
diff --git a/refs/refs-internal.h b/refs/refs-internal.h
index e24366b..8c45ee3 100644
--- a/refs/refs-internal.h
+++ b/refs/refs-internal.h
@@ -479,9 +479,11 @@ extern struct ref_iterator *current_ref_iter;
 int do_for_each_ref_iterator(struct ref_iterator *iter,
                             each_ref_fn fn, void *cb_data);
 
+struct ref_store;
+
 /*
- * Read the specified reference from the filesystem or packed refs
- * file, non-recursively. Set type to describe the reference, and:
+ * Read a reference from the specified reference store, non-recursively.
+ * Set type to describe the reference, and:
  *
  * - If refname is the name of a normal reference, fill in sha1
  *   (leaving referent unchanged).
@@ -517,7 +519,8 @@ int do_for_each_ref_iterator(struct ref_iterator *iter,
  * - in all other cases, referent will be untouched, and therefore
  *   refname will still be valid and unchanged.
  */
-int read_raw_ref(const char *refname, unsigned char *sha1,
+int read_raw_ref(struct ref_store *ref_store,
+                const char *refname, unsigned char *sha1,
                 struct strbuf *referent, unsigned int *type);
 
 /* refs backends */
-- 
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