Show changes to 6 files +57 −44
builtin/submodule--helper.c, object-name.c, refs.c, refs.h, revision.c, submodule.c
diff --git a/builtin/submodule--helper.c b/builtin/submodule--helper.c
index 88ce6be69c..d951b7acc5 100644
--- a/builtin/submodule--helper.c
+++ b/builtin/submodule--helper.c
@@ -801,15 +801,16 @@ static void status_submodule(const char *path, const struct object_id *ce_oid,
displaypath);
} else if (!(flags & OPT_CACHED)) {
struct object_id oid;
- struct ref_store *refs = get_submodule_ref_store(path);
+ struct repository subrepo;
- if (!refs) {
+ if (repo_submodule_init(&subrepo, the_repository, path, null_oid())) {
print_status(flags, '-', path, ce_oid, displaypath);
goto cleanup;
}
- if (refs_head_ref(refs, handle_submodule_head_ref, &oid))
+ if (refs_head_ref(&subrepo, handle_submodule_head_ref, &oid))
die(_("could not resolve HEAD ref inside the "
"submodule '%s'"), path);
+ repo_clear(&subrepo);
print_status(flags, '+', path, &oid, displaypath);
} else {
@@ -1018,9 +1019,12 @@ static void generate_submodule_summary(struct summary_cb *info,
if (!info->cached && oideq(&p->oid_dst, null_oid())) {
if (S_ISGITLINK(p->mod_dst)) {
- struct ref_store *refs = get_submodule_ref_store(p->sm_path);
- if (refs)
- refs_head_ref(refs, handle_submodule_head_ref, &p->oid_dst);
+ struct repository subrepo;
+
+ if (!repo_submodule_init(&subrepo, the_repository, p->sm_path, null_oid())) {
+ refs_head_ref(&subrepo, handle_submodule_head_ref, &p->oid_dst);
+ repo_clear(&subrepo);
+ }
} else if (S_ISLNK(p->mod_dst) || S_ISREG(p->mod_dst)) {
struct stat st;
int fd = open(p->sm_path, O_RDONLY);
diff --git a/object-name.c b/object-name.c
index fdff4601b2..f3012b5ec3 100644
--- a/object-name.c
+++ b/object-name.c
@@ -1822,8 +1822,8 @@ static enum get_oid_result get_oid_with_context_1(struct repository *repo,
cb.repo = repo;
cb.list = &list;
- refs_for_each_ref(get_main_ref_store(repo), handle_one_ref, &cb);
- refs_head_ref(get_main_ref_store(repo), handle_one_ref, &cb);
+ refs_for_each_ref(repo, handle_one_ref, &cb);
+ refs_head_ref(repo, handle_one_ref, &cb);
commit_list_sort_by_date(&list);
return get_oid_oneline(repo, name + 2, oid, list);
}
diff --git a/refs.c b/refs.c
index 5163e064ae..15a3aa47cf 100644
--- a/refs.c
+++ b/refs.c
@@ -408,34 +408,34 @@ void warn_dangling_symrefs(FILE *fp, const char *msg_fmt, const struct string_li
for_each_rawref(warn_if_dangling_symref, &data);
}
-int refs_for_each_tag_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+int refs_for_each_tag_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
- return refs_for_each_ref_in(refs, "refs/tags/", fn, cb_data);
+ return refs_for_each_ref_in(get_main_ref_store(repo), "refs/tags/", fn, cb_data);
}
int for_each_tag_ref(each_ref_fn fn, void *cb_data)
{
- return refs_for_each_tag_ref(get_main_ref_store(the_repository), fn, cb_data);
+ return refs_for_each_tag_ref(the_repository, fn, cb_data);
}
-int refs_for_each_branch_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+int refs_for_each_branch_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
- return refs_for_each_ref_in(refs, "refs/heads/", fn, cb_data);
+ return refs_for_each_ref_in(get_main_ref_store(repo), "refs/heads/", fn, cb_data);
}
int for_each_branch_ref(each_ref_fn fn, void *cb_data)
{
- return refs_for_each_branch_ref(get_main_ref_store(the_repository), fn, cb_data);
+ return refs_for_each_branch_ref(the_repository, fn, cb_data);
}
-int refs_for_each_remote_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+int refs_for_each_remote_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
- return refs_for_each_ref_in(refs, "refs/remotes/", fn, cb_data);
+ return refs_for_each_ref_in(get_main_ref_store(repo), "refs/remotes/", fn, cb_data);
}
int for_each_remote_ref(each_ref_fn fn, void *cb_data)
{
- return refs_for_each_remote_ref(get_main_ref_store(the_repository), fn, cb_data);
+ return refs_for_each_remote_ref(the_repository, fn, cb_data);
}
int head_ref_namespaced(each_ref_fn fn, void *cb_data)
@@ -1395,12 +1395,12 @@ int refs_rename_ref_available(struct ref_store *refs,
return ok;
}
-int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+int refs_head_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
struct object_id oid;
int flag;
- if (!refs_read_ref_full(refs, "HEAD", RESOLVE_REF_READING,
+ if (!refs_read_ref_full(get_main_ref_store(repo), "HEAD", RESOLVE_REF_READING,
&oid, &flag))
return fn("HEAD", &oid, flag, cb_data);
@@ -1409,7 +1409,7 @@ int refs_head_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
int head_ref(each_ref_fn fn, void *cb_data)
{
- return refs_head_ref(get_main_ref_store(the_repository), fn, cb_data);
+ return refs_head_ref(the_repository, fn, cb_data);
}
struct ref_iterator *refs_ref_iterator_begin(
@@ -1489,6 +1489,7 @@ static int do_for_each_ref_helper(struct repository *r,
static int do_for_each_ref(struct ref_store *refs, const char *prefix,
each_ref_fn fn, int trim,
+ struct repository *repo,
enum do_for_each_ref_flags flags, void *cb_data)
{
struct ref_iterator *iter;
@@ -1497,26 +1498,26 @@ static int do_for_each_ref(struct ref_store *refs, const char *prefix,
if (!refs)
return 0;
- iter = refs_ref_iterator_begin(refs, prefix, trim, the_repository, flags);
+ iter = refs_ref_iterator_begin(refs, prefix, trim, repo, flags);
- return do_for_each_repo_ref_iterator(the_repository, iter,
+ return do_for_each_repo_ref_iterator(repo, iter,
do_for_each_ref_helper, &hp);
}
-int refs_for_each_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+int refs_for_each_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
- return do_for_each_ref(refs, "", fn, 0, 0, cb_data);
+ return do_for_each_ref(get_main_ref_store(repo), "", fn, 0, repo, 0, cb_data);
}
int for_each_ref(each_ref_fn fn, void *cb_data)
{
- return refs_for_each_ref(get_main_ref_store(the_repository), fn, cb_data);
+ return refs_for_each_ref(the_repository, fn, cb_data);
}
int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
each_ref_fn fn, void *cb_data)
{
- return do_for_each_ref(refs, prefix, fn, strlen(prefix), 0, cb_data);
+ return do_for_each_ref(refs, prefix, fn, strlen(prefix), the_repository, 0, cb_data);
}
int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
@@ -1527,13 +1528,13 @@ int for_each_ref_in(const char *prefix, each_ref_fn fn, void *cb_data)
int for_each_fullref_in(const char *prefix, each_ref_fn fn, void *cb_data)
{
return do_for_each_ref(get_main_ref_store(the_repository),
- prefix, fn, 0, 0, cb_data);
+ prefix, fn, 0, the_repository, 0, cb_data);
}
int refs_for_each_fullref_in(struct ref_store *refs, const char *prefix,
each_ref_fn fn, void *cb_data)
{
- return do_for_each_ref(refs, prefix, fn, 0, 0, cb_data);
+ return do_for_each_ref(refs, prefix, fn, 0, the_repository, 0, cb_data);
}
int for_each_replace_ref(struct repository *r, each_repo_ref_fn fn, void *cb_data)
@@ -1549,14 +1550,14 @@ int for_each_namespaced_ref(each_ref_fn fn, void *cb_data)
int ret;
strbuf_addf(&buf, "%srefs/", get_git_namespace());
ret = do_for_each_ref(get_main_ref_store(the_repository),
- buf.buf, fn, 0, 0, cb_data);
+ buf.buf, fn, 0, the_repository, 0, cb_data);
strbuf_release(&buf);
return ret;
}
int refs_for_each_rawref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
{
- return do_for_each_ref(refs, "", fn, 0,
+ return do_for_each_ref(refs, "", fn, 0, the_repository,
DO_FOR_EACH_INCLUDE_BROKEN, cb_data);
}
@@ -1891,13 +1892,15 @@ static struct ref_store *ref_store_init(const char *gitdir,
struct ref_store *get_main_ref_store(struct repository *r)
{
+ unsigned flags = r == the_repository ?
+ REF_STORE_ALL_CAPS : REF_STORE_READ | REF_STORE_ODB;
if (r->refs_private)
return r->refs_private;
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->gitdir, flags);
r->refs_private = maybe_debug_wrap_ref_store(r->gitdir, r->refs_private);
return r->refs_private;
}
diff --git a/refs.h b/refs.h
index 10e7696a64..e9ecb5e54e 100644
--- a/refs.h
+++ b/refs.h
@@ -316,17 +316,17 @@ typedef int each_repo_ref_fn(struct repository *r,
* modifies the reference also returns a nonzero value to immediately
* stop the iteration. Returned references are sorted.
*/
-int refs_head_ref(struct ref_store *refs,
+int refs_head_ref(struct repository *repo,
each_ref_fn fn, void *cb_data);
-int refs_for_each_ref(struct ref_store *refs,
+int refs_for_each_ref(struct repository *repo,
each_ref_fn fn, void *cb_data);
int refs_for_each_ref_in(struct ref_store *refs, const char *prefix,
each_ref_fn fn, void *cb_data);
-int refs_for_each_tag_ref(struct ref_store *refs,
+int refs_for_each_tag_ref(struct repository *repo,
each_ref_fn fn, void *cb_data);
-int refs_for_each_branch_ref(struct ref_store *refs,
+int refs_for_each_branch_ref(struct repository *repo,
each_ref_fn fn, void *cb_data);
-int refs_for_each_remote_ref(struct ref_store *refs,
+int refs_for_each_remote_ref(struct repository *repo,
each_ref_fn fn, void *cb_data);
/* just iterates the head ref. */
diff --git a/revision.c b/revision.c
index 3ad217f2ff..cd34e12b2e 100644
--- a/revision.c
+++ b/revision.c
@@ -1565,7 +1565,7 @@ void add_ref_exclusion(struct string_list **ref_excludes_p, const char *exclude)
static void handle_refs(struct ref_store *refs,
struct rev_info *revs, unsigned flags,
- int (*for_each)(struct ref_store *, each_ref_fn, void *))
+ int (*for_each)(struct repository *, each_ref_fn, void *))
{
struct all_refs_cb cb;
@@ -1575,7 +1575,7 @@ static void handle_refs(struct ref_store *refs,
}
init_all_refs_cb(&cb, revs, flags);
- for_each(refs, handle_one_ref, &cb);
+ for_each(revs->repo, handle_one_ref, &cb);
}
static void handle_one_reflog_commit(struct object_id *oid, void *cb_data)
@@ -2553,14 +2553,14 @@ static int for_each_bisect_ref(struct ref_store *refs, each_ref_fn fn,
return status;
}
-static int for_each_bad_bisect_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+static int for_each_bad_bisect_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
- return for_each_bisect_ref(refs, fn, cb_data, term_bad);
+ return for_each_bisect_ref(get_main_ref_store(repo), fn, cb_data, term_bad);
}
-static int for_each_good_bisect_ref(struct ref_store *refs, each_ref_fn fn, void *cb_data)
+static int for_each_good_bisect_ref(struct repository *repo, each_ref_fn fn, void *cb_data)
{
- return for_each_bisect_ref(refs, fn, cb_data, term_good);
+ return for_each_bisect_ref(get_main_ref_store(repo), fn, cb_data, term_good);
}
static int handle_revision_pseudo_opt(struct rev_info *revs,
diff --git a/submodule.c b/submodule.c
index 62beb8fd5f..bc3ec4a242 100644
--- a/submodule.c
+++ b/submodule.c
@@ -92,8 +92,14 @@ int is_staging_gitmodules_ok(struct index_state *istate)
static int for_each_remote_ref_submodule(const char *submodule,
each_ref_fn fn, void *cb_data)
{
- return refs_for_each_remote_ref(get_submodule_ref_store(submodule),
- fn, cb_data);
+ struct repository subrepo;
+ int ret;
+
+ if (repo_submodule_init(&subrepo, the_repository, submodule, null_oid()))
+ return 0;
+ ret = refs_for_each_remote_ref(&subrepo, fn, cb_data);
+ repo_clear(&subrepo);
+ return ret;
}
/*