* 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;
}
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);
}
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;
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);
}
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);
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);
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);
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,
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)
{
{
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);
}
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;
* 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";
if (!be)
BUG("reference backend %s is unknown", be_name);
- refs = be->init(gitdir, flags);
+ refs = be->init(repo, gitdir, flags);
return refs;
}
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;
}
struct ref_store *refs;
char *to_free = NULL;
size_t len;
+ struct repository *subrepo;
if (!submodule)
return NULL;
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);
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)
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;
}
}