Allow passing of configuration parameters in the command line
The values passed this way will override whatever is defined in the config files. Signed-off-by: Alex Riesen <raa.lkml@gmail.com> Signed-off-by: Junio C Hamano <gitster@pobox.com>
This commit is contained in:
parent
f1ba1c90e1
commit
8b1fa77867
@ -12,6 +12,7 @@ SYNOPSIS
|
|||||||
'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]
|
'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]
|
||||||
[-p|--paginate|--no-pager] [--no-replace-objects]
|
[-p|--paginate|--no-pager] [--no-replace-objects]
|
||||||
[--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]
|
[--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]
|
||||||
|
[-c name=value]
|
||||||
[--help] COMMAND [ARGS]
|
[--help] COMMAND [ARGS]
|
||||||
|
|
||||||
DESCRIPTION
|
DESCRIPTION
|
||||||
@ -219,6 +220,12 @@ displayed. See linkgit:git-help[1] for more information,
|
|||||||
because `git --help ...` is converted internally into `git
|
because `git --help ...` is converted internally into `git
|
||||||
help ...`.
|
help ...`.
|
||||||
|
|
||||||
|
-c <name>=<value>::
|
||||||
|
Pass a configuration parameter to the command. The value
|
||||||
|
given will override values from configuration files.
|
||||||
|
The <name> is expected in the same format as listed by
|
||||||
|
'git config' (subkeys separated by dots).
|
||||||
|
|
||||||
--exec-path::
|
--exec-path::
|
||||||
Path to wherever your core git programs are installed.
|
Path to wherever your core git programs are installed.
|
||||||
This can also be controlled by setting the GIT_EXEC_PATH
|
This can also be controlled by setting the GIT_EXEC_PATH
|
||||||
|
@ -197,7 +197,11 @@ static int get_value(const char *key_, const char *regex_)
|
|||||||
git_config_from_file(show_config, system_wide, NULL);
|
git_config_from_file(show_config, system_wide, NULL);
|
||||||
if (do_all && global)
|
if (do_all && global)
|
||||||
git_config_from_file(show_config, global, NULL);
|
git_config_from_file(show_config, global, NULL);
|
||||||
git_config_from_file(show_config, local, NULL);
|
if (do_all)
|
||||||
|
git_config_from_file(show_config, local, NULL);
|
||||||
|
git_config_from_parameters(show_config, NULL);
|
||||||
|
if (!do_all && !seen)
|
||||||
|
git_config_from_file(show_config, local, NULL);
|
||||||
if (!do_all && !seen && global)
|
if (!do_all && !seen && global)
|
||||||
git_config_from_file(show_config, global, NULL);
|
git_config_from_file(show_config, global, NULL);
|
||||||
if (!do_all && !seen && system_wide)
|
if (!do_all && !seen && system_wide)
|
||||||
|
2
cache.h
2
cache.h
@ -932,6 +932,8 @@ extern int update_server_info(int);
|
|||||||
typedef int (*config_fn_t)(const char *, const char *, void *);
|
typedef int (*config_fn_t)(const char *, const char *, void *);
|
||||||
extern int git_default_config(const char *, const char *, void *);
|
extern int git_default_config(const char *, const char *, void *);
|
||||||
extern int git_config_from_file(config_fn_t fn, const char *, void *);
|
extern int git_config_from_file(config_fn_t fn, const char *, void *);
|
||||||
|
extern int git_config_parse_parameter(const char *text);
|
||||||
|
extern int git_config_from_parameters();
|
||||||
extern int git_config(config_fn_t fn, void *);
|
extern int git_config(config_fn_t fn, void *);
|
||||||
extern int git_parse_ulong(const char *, unsigned long *);
|
extern int git_parse_ulong(const char *, unsigned long *);
|
||||||
extern int git_config_int(const char *, const char *);
|
extern int git_config_int(const char *, const char *);
|
||||||
|
71
config.c
71
config.c
@ -18,6 +18,62 @@ static int zlib_compression_seen;
|
|||||||
|
|
||||||
const char *config_exclusive_filename = NULL;
|
const char *config_exclusive_filename = NULL;
|
||||||
|
|
||||||
|
struct config_item
|
||||||
|
{
|
||||||
|
struct config_item *next;
|
||||||
|
char *value;
|
||||||
|
char name[1 /* NUL */];
|
||||||
|
};
|
||||||
|
static struct config_item *config_parameters;
|
||||||
|
static struct config_item **config_parameters_tail = &config_parameters;
|
||||||
|
|
||||||
|
static void lowercase(char *p)
|
||||||
|
{
|
||||||
|
for (; *p; p++)
|
||||||
|
*p = tolower(*p);
|
||||||
|
}
|
||||||
|
static char *skip_space(const char *p)
|
||||||
|
{
|
||||||
|
for (; *p; p++)
|
||||||
|
if (!isspace(*p))
|
||||||
|
break;
|
||||||
|
return (char *)p;
|
||||||
|
}
|
||||||
|
static char *trailing_space(const char *begin, const char *p)
|
||||||
|
{
|
||||||
|
while (p-- > begin)
|
||||||
|
if (!isspace(*p))
|
||||||
|
break;
|
||||||
|
return (char *)p + 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
int git_config_parse_parameter(const char *text)
|
||||||
|
{
|
||||||
|
struct config_item *ct;
|
||||||
|
const char *name;
|
||||||
|
const char *val;
|
||||||
|
name = skip_space(text);
|
||||||
|
text = val = strchr(name, '=');
|
||||||
|
if (!text)
|
||||||
|
text = name + strlen(name);
|
||||||
|
text = trailing_space(name, text);
|
||||||
|
if (text <= name)
|
||||||
|
return -1;
|
||||||
|
ct = xcalloc(1, sizeof(struct config_item) + (text - name));
|
||||||
|
memcpy(ct->name, name, text - name);
|
||||||
|
lowercase(ct->name);
|
||||||
|
if (!val)
|
||||||
|
ct->value = NULL;
|
||||||
|
else {
|
||||||
|
val = skip_space(++val /* skip "=" */);
|
||||||
|
text = trailing_space(val, val + strlen(val));
|
||||||
|
ct->value = xstrndup(val, text - val);
|
||||||
|
}
|
||||||
|
*config_parameters_tail = ct;
|
||||||
|
config_parameters_tail = &ct->next;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
static int get_next_char(void)
|
static int get_next_char(void)
|
||||||
{
|
{
|
||||||
int c;
|
int c;
|
||||||
@ -699,6 +755,15 @@ int git_config_global(void)
|
|||||||
return !git_env_bool("GIT_CONFIG_NOGLOBAL", 0);
|
return !git_env_bool("GIT_CONFIG_NOGLOBAL", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int git_config_from_parameters(config_fn_t fn, void *data)
|
||||||
|
{
|
||||||
|
const struct config_item *ct;
|
||||||
|
for (ct = config_parameters; ct; ct = ct->next)
|
||||||
|
if (fn(ct->name, ct->value, data) < 0)
|
||||||
|
return -1;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
int git_config(config_fn_t fn, void *data)
|
int git_config(config_fn_t fn, void *data)
|
||||||
{
|
{
|
||||||
int ret = 0, found = 0;
|
int ret = 0, found = 0;
|
||||||
@ -730,6 +795,12 @@ int git_config(config_fn_t fn, void *data)
|
|||||||
found += 1;
|
found += 1;
|
||||||
}
|
}
|
||||||
free(repo_config);
|
free(repo_config);
|
||||||
|
|
||||||
|
if (config_parameters) {
|
||||||
|
ret += git_config_from_parameters(fn, data);
|
||||||
|
found += 1;
|
||||||
|
}
|
||||||
|
|
||||||
if (found == 0)
|
if (found == 0)
|
||||||
return -1;
|
return -1;
|
||||||
return ret;
|
return ret;
|
||||||
|
9
git.c
9
git.c
@ -8,6 +8,7 @@ const char git_usage_string[] =
|
|||||||
"git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]\n"
|
"git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]\n"
|
||||||
" [-p|--paginate|--no-pager] [--no-replace-objects]\n"
|
" [-p|--paginate|--no-pager] [--no-replace-objects]\n"
|
||||||
" [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]\n"
|
" [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]\n"
|
||||||
|
" [-c name=value\n"
|
||||||
" [--help] COMMAND [ARGS]";
|
" [--help] COMMAND [ARGS]";
|
||||||
|
|
||||||
const char git_more_info_string[] =
|
const char git_more_info_string[] =
|
||||||
@ -130,6 +131,14 @@ static int handle_options(const char ***argv, int *argc, int *envchanged)
|
|||||||
setenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);
|
setenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0);
|
||||||
if (envchanged)
|
if (envchanged)
|
||||||
*envchanged = 1;
|
*envchanged = 1;
|
||||||
|
} else if (!strcmp(cmd, "-c")) {
|
||||||
|
if (*argc < 2) {
|
||||||
|
fprintf(stderr, "-c expects a configuration string\n" );
|
||||||
|
usage(git_usage_string);
|
||||||
|
}
|
||||||
|
git_config_parse_parameter((*argv)[1]);
|
||||||
|
(*argv)++;
|
||||||
|
(*argc)--;
|
||||||
} else {
|
} else {
|
||||||
fprintf(stderr, "Unknown option: %s\n", cmd);
|
fprintf(stderr, "Unknown option: %s\n", cmd);
|
||||||
usage(git_usage_string);
|
usage(git_usage_string);
|
||||||
|
@ -824,4 +824,12 @@ test_expect_success 'check split_cmdline return' "
|
|||||||
test_must_fail git merge master
|
test_must_fail git merge master
|
||||||
"
|
"
|
||||||
|
|
||||||
|
test_expect_success 'git -c "key=value" support' '
|
||||||
|
test "z$(git -c name=value config name)" = zvalue &&
|
||||||
|
test "z$(git -c core.name=value config core.name)" = zvalue &&
|
||||||
|
test "z$(git -c CamelCase=value config camelcase)" = zvalue &&
|
||||||
|
test "z$(git -c flag config --bool flag)" = ztrue &&
|
||||||
|
test_must_fail git -c core.name=value config name
|
||||||
|
'
|
||||||
|
|
||||||
test_done
|
test_done
|
||||||
|
Loading…
Reference in New Issue
Block a user