On Thu, Aug 29, 2019 at 11:00 AM Jeff King <peff@xxxxxxxx> wrote: > > On Thu, Aug 29, 2019 at 04:31:34PM +0700, Duy Nguyen wrote: > > > > If so, how could we get R there? I mean, we could pass it through this > > > chain, but the chain already passes a "struct config_options", which > > > carries the "commondir" and "git_dir" fields. So it would probably be > > > confusing to have them and an extra repository parameter (which also > > > has "commondir" and "git_dir"), right? Any ideas on how to better > > > approach this? > > > > I would change 'struct config_options' to carry 'struct repository' > > which also contains git_dir and other info inside. Though I have no > > idea how big that change would be (didn't check the code). Config code > > relies on plenty callbacks without "void *cb_data" so relying on > > global state is the only way in some cases. > > I'm not sure about that, at least for this particular git_pathdup(). We > pass along the git_dir because we might not have a repository struct yet > (i.e., when reading config before repo discovery has happened). Yes, I think read_early_config(), for example, may call config_with_options() before the_repo is initialized. > So it might be that this case should actually be making a path out of > $git_dir/config.worktree (but I'm not 100% sure, as I don't know the ins > and outs of worktree config files). Makes sense, config.worktree files are per-worktree, which have different git_dir's, right? > I'm sure there are other gotchas in the config code, though, related to > things for which we _do_ need a repository. E.g., include_by_branch() > looks at the_repository, and should use a repository struct matching the > git_dir we're looking at (though it may be acceptable to bail during > early pre-repo-initialization config and just disallow branch includes, > which is what happens now). I think config_with_options() is another example of a place where we should have a reference to a repo (but we currently don't). When configuring from a given blob, it will call git_config_from_blob_ref(), which calls get_oid() and read_object_file(). Both of these functions will use the_repo by default. But the git_dir and commondir fields passed to config_with_options() through 'struct config_options' may not refer to the_repo, right? I'm not sure what is the best solution to this, though. I mean, we could add a 'struct repository' in 'struct config_options', but as you already pointed out, some callers might not have a repository struct yet... > -Peff