config: don't depend on `the_repository` with branch conditions

When computing branch "includeIf" conditions we use `the_repository` to obtain the main ref store. We really shouldn't depend on this global repository though, but should instead use the repository that is being passed to us via `struct config_include_data`. Otherwise, when parsing configuration of e.g. submodules, we may end up evaluating the condition the via the wrong refdb. Fix this. Signed-off-by: Patrick Steinhardt <ps@pks.im> Signed-off-by: Junio C Hamano <gitster@pobox.com>

Patrick Steinhardt committed Aug 13, 2024 at 11:14 UTC f7d61c413530c53a55c5ff3fa345db6a9828943f
1 file changed +5 -4
config.c
+5 -4
@@ -300,13 +300,14 @@ done:
300 return ret;
301 }
302
303 -static int include_by_branch(const char *cond, size_t cond_len)
303 +static int include_by_branch(struct config_include_data *data,
304 + const char *cond, size_t cond_len)
305 {
306 int flags;
307 int ret;
308 struct strbuf pattern = STRBUF_INIT;
308 - const char *refname = !the_repository->gitdir ?
309 - NULL : refs_resolve_ref_unsafe(get_main_ref_store(the_repository),
309 + const char *refname = (!data->repo || !data->repo->gitdir) ?
310 + NULL : refs_resolve_ref_unsafe(get_main_ref_store(data->repo),
311 "HEAD", 0, NULL, &flags);
312 const char *shortname;
313
@@ -406,7 +407,7 @@ static int include_condition_is_true(const struct key_value_info *kvi,
407 else if (skip_prefix_mem(cond, cond_len, "gitdir/i:", &cond, &cond_len))
408 return include_by_gitdir(kvi, opts, cond, cond_len, 1);
409 else if (skip_prefix_mem(cond, cond_len, "onbranch:", &cond, &cond_len))
409 - return include_by_branch(cond, cond_len);
410 + return include_by_branch(inc, cond, cond_len);
411 else if (skip_prefix_mem(cond, cond_len, "hasconfig:remote.*.url:", &cond,
412 &cond_len))
413 return include_by_remote_url(inc, cond, cond_len);