summaryrefslogtreecommitdiff
path: root/config.c
diff options
context:
space:
mode:
authorAlex Riesen <raa.lkml@gmail.com>2010-03-26 22:53:57 (GMT)
committerJunio C Hamano <gitster@pobox.com>2010-03-28 16:48:25 (GMT)
commit8b1fa778676ae94f7a6d4113fa90947b548154dd (patch)
treeebdd33abc21f7dc32fa413bdf6b77b651c0daeda /config.c
parentf1ba1c90e1704e937ff59ee510a8d46a5ab52a1a (diff)
downloadgit-8b1fa778676ae94f7a6d4113fa90947b548154dd.zip
git-8b1fa778676ae94f7a6d4113fa90947b548154dd.tar.gz
git-8b1fa778676ae94f7a6d4113fa90947b548154dd.tar.bz2
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>
Diffstat (limited to 'config.c')
-rw-r--r--config.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/config.c b/config.c
index 6963fbe..b6a4257 100644
--- a/config.c
+++ b/config.c
@@ -18,6 +18,62 @@ static int zlib_compression_seen;
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)
{
int c;
@@ -699,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;
@@ -730,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;