refs: make create_symref() virtual
[gitweb.git] / refs.c
diff --git a/refs.c b/refs.c
index 7b86b4eab5dba2cb2c9fb89a719b5a0ec0639500..312c76619f75846aa1c4c363430a3ff929bf3ac3 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -1251,8 +1251,8 @@ static const char *resolve_ref_recursively(struct ref_store *refs,
        for (symref_count = 0; symref_count < SYMREF_MAXDEPTH; symref_count++) {
                unsigned int read_flags = 0;
 
-               if (read_raw_ref(refs, refname,
-                                sha1, &sb_refname, &read_flags)) {
+               if (refs->be->read_raw_ref(refs, refname,
+                                          sha1, &sb_refname, &read_flags)) {
                        *flags |= read_flags;
                        if (errno != ENOENT || (resolve_flags & RESOLVE_REF_READING))
                                return NULL;
@@ -1299,21 +1299,29 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
                                       resolve_flags, sha1, flags);
 }
 
-int resolve_gitlink_ref(const char *path, const char *refname, unsigned char *sha1)
+int resolve_gitlink_ref(const char *submodule, const char *refname,
+                       unsigned char *sha1)
 {
-       int len = strlen(path);
-       struct strbuf submodule = STRBUF_INIT;
+       size_t len = strlen(submodule);
        struct ref_store *refs;
        int flags;
 
-       while (len && path[len-1] == '/')
+       while (len && submodule[len - 1] == '/')
                len--;
+
        if (!len)
                return -1;
 
-       strbuf_add(&submodule, path, len);
-       refs = get_ref_store(submodule.buf);
-       strbuf_release(&submodule);
+       if (submodule[len]) {
+               /* We need to strip off one or more trailing slashes */
+               char *stripped = xmemdupz(submodule, len);
+
+               refs = get_ref_store(stripped);
+               free(stripped);
+       } else {
+               refs = get_ref_store(submodule);
+       }
+
        if (!refs)
                return -1;
 
@@ -1413,6 +1421,22 @@ void assert_main_repository(struct ref_store *refs, const char *caller)
 }
 
 /* backend functions */
+int pack_refs(unsigned int flags)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->pack_refs(refs, flags);
+}
+
+int create_symref(const char *ref_target, const char *refs_heads_master,
+                 const char *logmsg)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->create_symref(refs, ref_target, refs_heads_master,
+                                      logmsg);
+}
+
 int ref_transaction_commit(struct ref_transaction *transaction,
                           struct strbuf *err)
 {
@@ -1420,3 +1444,13 @@ int ref_transaction_commit(struct ref_transaction *transaction,
 
        return refs->be->transaction_commit(refs, transaction, err);
 }
+
+int verify_refname_available(const char *refname,
+                            const struct string_list *extra,
+                            const struct string_list *skip,
+                            struct strbuf *err)
+{
+       struct ref_store *refs = get_ref_store(NULL);
+
+       return refs->be->verify_refname_available(refs, refname, extra, skip, err);
+}