Merge branch 'jt/no-abuse-alternate-odb-for-submodules'
Follow through the work to use the repo interface to access submodule objects in-process, instead of abusing the alternate object database interface. * jt/no-abuse-alternate-odb-for-submodules: submodule: trace adding submodule ODB as alternate submodule: pass repo to check_has_commit() object-file: only register submodule ODB if needed merge-{ort,recursive}: remove add_submodule_odb() refs: peeling non-the_repository iterators is BUG refs: teach arbitrary repo support to iterators refs: plumb repo into ref stores
This commit is contained in:
32
refs.c
32
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;
|
||||
}
|
||||
@ -1870,7 +1871,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";
|
||||
@ -1880,7 +1882,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;
|
||||
}
|
||||
|
||||
@ -1892,7 +1894,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;
|
||||
}
|
||||
@ -1922,6 +1924,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;
|
||||
@ -1947,8 +1950,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);
|
||||
@ -1974,10 +1988,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)
|
||||
|
Reference in New Issue
Block a user