Merge branch 'ar/config-from-command-line'

* ar/config-from-command-line:
  Complete prototype of git_config_from_parameters()
  Use strbufs instead of open-coded string manipulation
  Allow passing of configuration parameters in the command line
This commit is contained in:
Junio C Hamano 2010-05-21 04:02:14 -07:00
commit 7f3ed824a4
6 changed files with 89 additions and 1 deletions

View File

@ -12,6 +12,7 @@ SYNOPSIS
'git' [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]
[-p|--paginate|--no-pager] [--no-replace-objects]
[--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]
[-c name=value]
[--help] COMMAND [ARGS]
DESCRIPTION
@ -228,6 +229,12 @@ displayed. See linkgit:git-help[1] for more information,
because `git --help ...` is converted internally into `git
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::
Path to wherever your core git programs are installed.
This can also be controlled by setting the GIT_EXEC_PATH

View File

@ -197,7 +197,11 @@ static int get_value(const char *key_, const char *regex_)
git_config_from_file(show_config, system_wide, NULL);
if (do_all && global)
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)
git_config_from_file(show_config, global, NULL);
if (!do_all && !seen && system_wide)

View File

@ -938,6 +938,8 @@ extern int update_server_info(int);
typedef int (*config_fn_t)(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_parse_parameter(const char *text);
extern int git_config_from_parameters(config_fn_t fn, void *data);
extern int git_config(config_fn_t fn, void *);
extern int git_parse_ulong(const char *, unsigned long *);
extern int git_config_int(const char *, const char *);

View File

@ -7,6 +7,7 @@
*/
#include "cache.h"
#include "exec_cmd.h"
#include "strbuf.h"
#define MAXNAME (256)
@ -18,6 +19,48 @@ static int zlib_compression_seen;
const char *config_exclusive_filename = NULL;
struct config_item
{
struct config_item *next;
char *name;
char *value;
};
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);
}
int git_config_parse_parameter(const char *text)
{
struct config_item *ct;
struct strbuf tmp = STRBUF_INIT;
struct strbuf **pair;
strbuf_addstr(&tmp, text);
pair = strbuf_split(&tmp, '=');
if (pair[0]->len && pair[0]->buf[pair[0]->len - 1] == '=')
strbuf_setlen(pair[0], pair[0]->len - 1);
strbuf_trim(pair[0]);
if (!pair[0]->len) {
strbuf_list_free(pair);
return -1;
}
ct = xcalloc(1, sizeof(struct config_item));
ct->name = strbuf_detach(pair[0], NULL);
if (pair[1]) {
strbuf_trim(pair[1]);
ct->value = strbuf_detach(pair[1], NULL);
}
strbuf_list_free(pair);
lowercase(ct->name);
*config_parameters_tail = ct;
config_parameters_tail = &ct->next;
return 0;
}
static int get_next_char(void)
{
int c;
@ -712,6 +755,15 @@ int git_config_global(void)
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 ret = 0, found = 0;
@ -743,6 +795,12 @@ int git_config(config_fn_t fn, void *data)
found += 1;
}
free(repo_config);
if (config_parameters) {
ret += git_config_from_parameters(fn, data);
found += 1;
}
if (found == 0)
return -1;
return ret;

9
git.c
View File

@ -8,6 +8,7 @@ const char git_usage_string[] =
"git [--version] [--exec-path[=GIT_EXEC_PATH]] [--html-path]\n"
" [-p|--paginate|--no-pager] [--no-replace-objects]\n"
" [--bare] [--git-dir=GIT_DIR] [--work-tree=GIT_WORK_TREE]\n"
" [-c name=value\n"
" [--help] COMMAND [ARGS]";
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);
if (envchanged)
*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 {
fprintf(stderr, "Unknown option: %s\n", cmd);
usage(git_usage_string);

View File

@ -824,4 +824,12 @@ test_expect_success 'check split_cmdline return' "
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