]> git.ipfire.org Git - thirdparty/git.git/blobdiff - refs.c
t1405: check for_each_reflog_ent_reverse() more thoroughly
[thirdparty/git.git] / refs.c
diff --git a/refs.c b/refs.c
index 43fe9e6d89dfe1843f624a6f06a023abd0a00538..996ac2716417de5e84f919782091d03ff75624b0 100644 (file)
--- a/refs.c
+++ b/refs.c
@@ -251,12 +251,13 @@ int refname_is_safe(const char *refname)
  * does not exist, emit a warning and return false.
  */
 int ref_resolves_to_object(const char *refname,
+                          struct repository *repo,
                           const struct object_id *oid,
                           unsigned int flags)
 {
        if (flags & REF_ISBROKEN)
                return 0;
-       if (!has_object_file(oid)) {
+       if (!repo_has_object_file(repo, oid)) {
                error(_("%s does not point to a valid object!"), refname);
                return 0;
        }
@@ -270,7 +271,7 @@ char *refs_resolve_refdup(struct ref_store *refs,
        const char *result;
        int ignore_errno;
 
-       result = refs_werrres_ref_unsafe(refs, refname, resolve_flags,
+       result = refs_resolve_ref_unsafe(refs, refname, resolve_flags,
                                         oid, flags, &ignore_errno);
        return xstrdup_or_null(result);
 }
@@ -296,7 +297,7 @@ int read_ref_full(const char *refname, int resolve_flags, struct object_id *oid,
        int ignore_errno;
        struct ref_store *refs = get_main_ref_store(the_repository);
 
-       if (refs_werrres_ref_unsafe(refs, refname, resolve_flags,
+       if (refs_resolve_ref_unsafe(refs, refname, resolve_flags,
                                    oid, flags, &ignore_errno))
                return 0;
        return -1;
@@ -310,7 +311,7 @@ int read_ref(const char *refname, struct object_id *oid)
 int refs_ref_exists(struct ref_store *refs, const char *refname)
 {
        int ignore_errno;
-       return !!refs_werrres_ref_unsafe(refs, refname, RESOLVE_REF_READING,
+       return !!refs_resolve_ref_unsafe(refs, refname, RESOLVE_REF_READING,
                                         NULL, NULL, &ignore_errno);
 }
 
@@ -660,7 +661,7 @@ int expand_ref(struct repository *repo, const char *str, int len,
                this_result = refs_found ? &oid_from_ref : oid;
                strbuf_reset(&fullref);
                strbuf_addf(&fullref, *p, len, str);
-               r = refs_werrres_ref_unsafe(refs, fullref.buf,
+               r = refs_resolve_ref_unsafe(refs, fullref.buf,
                                            RESOLVE_REF_READING,
                                            this_result, &flag,
                                            &ignore_errno);
@@ -696,7 +697,7 @@ int repo_dwim_log(struct repository *r, const char *str, int len,
 
                strbuf_reset(&path);
                strbuf_addf(&path, *p, len, str);
-               ref = refs_werrres_ref_unsafe(refs, path.buf,
+               ref = refs_resolve_ref_unsafe(refs, path.buf,
                                              RESOLVE_REF_READING,
                                              oid ? &hash : NULL, NULL,
                                              &ignore_errno);
@@ -1383,7 +1384,7 @@ int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
        int flag;
        int ignore_errno;
 
-       if (refs_werrres_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
+       if (refs_resolve_ref_unsafe(refs, "HEAD", RESOLVE_REF_READING,
                                    &oid, &flag, &ignore_errno))
                return fn("HEAD", &oid, flag, cb_data);
 
@@ -1669,7 +1670,7 @@ int refs_read_raw_ref(struct ref_store *ref_store, const char *refname,
                                           type, failure_errno);
 }
 
-const char *refs_werrres_ref_unsafe(struct ref_store *refs,
+const char *refs_resolve_ref_unsafe(struct ref_store *refs,
                                    const char *refname,
                                    int resolve_flags,
                                    struct object_id *oid,
@@ -1766,19 +1767,6 @@ const char *refs_werrres_ref_unsafe(struct ref_store *refs,
        return NULL;
 }
 
-const char *refs_resolve_ref_unsafe(struct ref_store *refs, const char *refname,
-                                   int resolve_flags, struct object_id *oid,
-                                   int *flags)
-{
-       int failure_errno = 0;
-       const char *refn;
-       refn = refs_werrres_ref_unsafe(refs, refname, resolve_flags,
-                                      oid, flags, &failure_errno);
-       if (!refn)
-               errno = failure_errno;
-       return refn;
-}
-
 /* backend functions */
 int refs_init_db(struct strbuf *err)
 {
@@ -1792,7 +1780,7 @@ const char *resolve_ref_unsafe(const char *refname, int resolve_flags,
 {
        int ignore_errno;
 
-       return refs_werrres_ref_unsafe(get_main_ref_store(the_repository), refname,
+       return refs_resolve_ref_unsafe(get_main_ref_store(the_repository), refname,
                                       resolve_flags, oid, flags, &ignore_errno);
 }
 
@@ -1808,7 +1796,7 @@ int resolve_gitlink_ref(const char *submodule, const char *refname,
        if (!refs)
                return -1;
 
-       if (!refs_werrres_ref_unsafe(refs, refname, 0, oid, &flags,
+       if (!refs_resolve_ref_unsafe(refs, refname, 0, oid, &flags,
                                     &ignore_errno) || is_null_oid(oid))
                return -1;
        return 0;
@@ -1880,7 +1868,8 @@ static struct ref_store *lookup_ref_store_map(struct hashmap *map,
  * Create, record, and return a ref_store instance for the specified
  * gitdir.
  */
-static struct ref_store *ref_store_init(const char *gitdir,
+static struct ref_store *ref_store_init(struct repository *repo,
+                                       const char *gitdir,
                                        unsigned int flags)
 {
        const char *be_name = "files";
@@ -1890,7 +1879,7 @@ static struct ref_store *ref_store_init(const char *gitdir,
        if (!be)
                BUG("reference backend %s is unknown", be_name);
 
-       refs = be->init(gitdir, flags);
+       refs = be->init(repo, gitdir, flags);
        return refs;
 }
 
@@ -1902,7 +1891,7 @@ struct ref_store *get_main_ref_store(struct repository *r)
        if (!r->gitdir)
                BUG("attempting to get main_ref_store outside of repository");
 
-       r->refs_private = ref_store_init(r->gitdir, REF_STORE_ALL_CAPS);
+       r->refs_private = ref_store_init(r, r->gitdir, REF_STORE_ALL_CAPS);
        r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
        return r->refs_private;
 }
@@ -1932,6 +1921,7 @@ struct ref_store *get_submodule_ref_store(const char *submodule)
        struct ref_store *refs;
        char *to_free = NULL;
        size_t len;
+       struct repository *subrepo;
 
        if (!submodule)
                return NULL;
@@ -1957,8 +1947,19 @@ struct ref_store *get_submodule_ref_store(const char *submodule)
        if (submodule_to_gitdir(&submodule_sb, submodule))
                goto done;
 
-       /* assume that add_submodule_odb() has been called */
-       refs = ref_store_init(submodule_sb.buf,
+       subrepo = xmalloc(sizeof(*subrepo));
+       /*
+        * NEEDSWORK: Make get_submodule_ref_store() work with arbitrary
+        * superprojects other than the_repository. This probably should be
+        * done by making it take a struct repository * parameter instead of a
+        * submodule path.
+        */
+       if (repo_submodule_init(subrepo, the_repository, submodule,
+                               null_oid())) {
+               free(subrepo);
+               goto done;
+       }
+       refs = ref_store_init(subrepo, submodule_sb.buf,
                              REF_STORE_READ | REF_STORE_ODB);
        register_ref_store_map(&submodule_ref_stores, "submodule",
                               refs, submodule);
@@ -1984,10 +1985,12 @@ struct ref_store *get_worktree_ref_store(const struct worktree *wt)
                return refs;
 
        if (wt->id)
-               refs = ref_store_init(git_common_path("worktrees/%s", wt->id),
+               refs = ref_store_init(the_repository,
+                                     git_common_path("worktrees/%s", wt->id),
                                      REF_STORE_ALL_CAPS);
        else
-               refs = ref_store_init(get_git_common_dir(),
+               refs = ref_store_init(the_repository,
+                                     get_git_common_dir(),
                                      REF_STORE_ALL_CAPS);
 
        if (refs)
@@ -2096,8 +2099,11 @@ static int run_transaction_hook(struct ref_transaction *transaction,
                            update->refname);
 
                if (write_in_full(proc.in, buf.buf, buf.len) < 0) {
-                       if (errno != EPIPE)
+                       if (errno != EPIPE) {
+                               /* Don't leak errno outside this API */
+                               errno = 0;
                                ret = -1;
+                       }
                        break;
                }
        }