Merge branch 'bw/config-h'

Fix configuration codepath to pay proper attention to commondir
that is used in multi-worktree situation, and isolate config API
into its own header file.

* bw/config-h:
  config: don't implicitly use gitdir or commondir
  config: respect commondir
  setup: teach discover_git_directory to respect the commondir
  config: don't include config.h by default
  config: remove git_config_iter
  config: create config.h
This commit is contained in:
Junio C Hamano
2017-06-24 14:28:40 -07:00
147 changed files with 396 additions and 228 deletions

View File

@ -6,6 +6,7 @@
*
*/
#include "cache.h"
#include "config.h"
#include "lockfile.h"
#include "exec_cmd.h"
#include "strbuf.h"
@ -218,8 +219,6 @@ static int include_by_gitdir(const struct config_options *opts,
if (opts->git_dir)
git_dir = opts->git_dir;
else if (have_git_dir())
git_dir = get_git_dir();
else
goto done;
@ -1546,10 +1545,8 @@ static int do_git_config_sequence(const struct config_options *opts,
char *user_config = expand_user_path("~/.gitconfig", 0);
char *repo_config;
if (opts->git_dir)
repo_config = mkpathdup("%s/config", opts->git_dir);
else if (have_git_dir())
repo_config = git_pathdup("config");
if (opts->commondir)
repo_config = mkpathdup("%s/config", opts->commondir);
else
repo_config = NULL;
@ -1580,9 +1577,9 @@ static int do_git_config_sequence(const struct config_options *opts,
return ret;
}
int git_config_with_options(config_fn_t fn, void *data,
struct git_config_source *config_source,
const struct config_options *opts)
int config_with_options(config_fn_t fn, void *data,
struct git_config_source *config_source,
const struct config_options *opts)
{
struct config_include_data inc = CONFIG_INCLUDE_INIT;
@ -1613,9 +1610,14 @@ static void git_config_raw(config_fn_t fn, void *data)
struct config_options opts = {0};
opts.respect_includes = 1;
if (git_config_with_options(fn, data, NULL, &opts) < 0)
if (have_git_dir()) {
opts.commondir = get_git_common_dir();
opts.git_dir = get_git_dir();
}
if (config_with_options(fn, data, NULL, &opts) < 0)
/*
* git_config_with_options() normally returns only
* config_with_options() normally returns only
* zero, as most errors are fatal, and
* non-fatal potential errors are guarded by "if"
* statements that are entered only when no error is
@ -1654,11 +1656,13 @@ static void configset_iter(struct config_set *cs, config_fn_t fn, void *data)
void read_early_config(config_fn_t cb, void *data)
{
struct config_options opts = {0};
struct strbuf buf = STRBUF_INIT;
struct strbuf commondir = STRBUF_INIT;
struct strbuf gitdir = STRBUF_INIT;
opts.respect_includes = 1;
if (have_git_dir())
if (have_git_dir()) {
opts.commondir = get_git_common_dir();
opts.git_dir = get_git_dir();
/*
* When setup_git_directory() was not yet asked to discover the
@ -1668,12 +1672,15 @@ void read_early_config(config_fn_t cb, void *data)
* notably, the current working directory is still the same after the
* call).
*/
else if (discover_git_directory(&buf))
opts.git_dir = buf.buf;
} else if (!discover_git_directory(&commondir, &gitdir)) {
opts.commondir = commondir.buf;
opts.git_dir = gitdir.buf;
}
git_config_with_options(cb, data, NULL, &opts);
config_with_options(cb, data, NULL, &opts);
strbuf_release(&buf);
strbuf_release(&commondir);
strbuf_release(&gitdir);
}
static void git_config_check_init(void);