On Mon, Jun 12, 2017 at 01:04:09PM -0700, Jonathan Tan wrote:
> > I'm not sure I know what you mean by config variables which are static,
> > are you referring to the in-memory options which are populated by
> > querying the config? Those I wouldn't want to see placed in a
> > 'repository object'.
>
> Yes. I agree that I wouldn't want to see them placed in a repository
> object, but after reading Peff's e-mail, I was thinking of what happens
> if a file repeatedly invokes a config-sensitive function in another
> file. For example:
>
> a.c
> for (i = 0; i < 100; i++) b_output(repo, x);
>
> b.c
> void b_output(struct repository *repo, int x)
> {
> /* print the configured "b.prefix" followed by x */
> }
>
> We probably wouldn't want to parse the repo's configset every time
> b_output() is invoked, but then, where to store our parsed "b.prefix"?
> The only alternatives I see is to have a static hashmap in b.c (keyed by
> repo, as described above), which would work if such a situation is rare
> (or can be made rare), but if it is common, maybe we have no choice but
> to put it in struct repository.
I think besides optimization, we often parse the textual config into
variables and then _modify_ those variables based on other input (most
often command-line arguments provided by the user, but sometimes other
circumstances).
You can move the resolution to the point-of-use instead of
point-of-setting, but that's going to be a big change to how most of the
code already works.
-Peff