On Sun, Apr 16, 2017 at 11:51:32AM -0400, Jeff King wrote:
> > diff --git a/cache.h b/cache.h
> > index e29a093839..27b7286f99 100644
> > --- a/cache.h
> > +++ b/cache.h
> > @@ -1884,6 +1884,8 @@ enum config_origin_type {
> >
> > struct config_options {
> > unsigned int respect_includes : 1;
> > + unsigned int early_config : 1;
> > + const char *git_dir; /* only valid when early_config is true */
> > };
>
> Why do we need both the flag and the string? Later, you do:
>
> > -static int include_by_gitdir(const char *cond, size_t cond_len, int icase)
> > +static int include_by_gitdir(const struct config_options *opts,
> > + const char *cond, size_t cond_len, int icase)
> > {
> > struct strbuf text = STRBUF_INIT;
> > struct strbuf pattern = STRBUF_INIT;
> > int ret = 0, prefix;
> >
> > - strbuf_add_absolute_path(&text, get_git_dir());
> > + if (!opts->early_config)
> > + strbuf_add_absolute_path(&text, get_git_dir());
> > + else if (opts->git_dir)
> > + strbuf_add_absolute_path(&text, opts->git_dir);
> > + else
> > + goto done;
>
> So we call get_git_dir() always when we're not in early config. Even if
> we don't have a git dir! Doesn't this mean that programs operating
> outside of a repo will still hit the BUG? I.e.:
>
> git config --global includeif.gitdir:/whatever.path foo
> cd /not/a/git/dir
> git diff --no-index foo bar
>
> ?
>
> I think instead the logic should be:
>
> if (opts->git_dir)
> strbuf_add_absolute_path(&text, opts->git_dir);
> else if (have_git_dir())
> strbuf_add_absolute_path(&text, get_git_dir());
> else
> goto done;
Do we care about the case when the override instruction is "we don't
have $GIT_DIR, act as if it does not exist, even though have_git_dir()
returns true"?
I'm guessing no, we won't run into that situation (and am inclined to
restructure the code as you suggested). Just throwing it out there if
I'm mistaken.
--
Duy