#define GRAFT_ENVIRONMENT "GIT_GRAFT_FILE"
#define TEMPLATE_DIR_ENVIRONMENT "GIT_TEMPLATE_DIR"
#define CONFIG_ENVIRONMENT "GIT_CONFIG"
+#define CONFIG_DATA_ENVIRONMENT "GIT_CONFIG_PARAMETERS"
#define EXEC_PATH_ENVIRONMENT "GIT_EXEC_PATH"
#define CEILING_DIRECTORIES_ENVIRONMENT "GIT_CEILING_DIRECTORIES"
#define NO_REPLACE_OBJECTS_ENVIRONMENT "GIT_NO_REPLACE_OBJECTS"
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 void git_config_push_parameter(const char *text);
extern int git_config_parse_parameter(const char *text);
+extern int git_config_parse_environment(void);
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 *);
#include "cache.h"
#include "exec_cmd.h"
#include "strbuf.h"
+#include "quote.h"
#define MAXNAME (256)
*p = tolower(*p);
}
+void git_config_push_parameter(const char *text)
+{
+ struct strbuf env = STRBUF_INIT;
+ const char *old = getenv(CONFIG_DATA_ENVIRONMENT);
+ if (old) {
+ strbuf_addstr(&env, old);
+ strbuf_addch(&env, ' ');
+ }
+ sq_quote_buf(&env, text);
+ setenv(CONFIG_DATA_ENVIRONMENT, env.buf, 1);
+ strbuf_release(&env);
+}
+
int git_config_parse_parameter(const char *text)
{
struct config_item *ct;
return 0;
}
+int git_config_parse_environment(void) {
+ const char *env = getenv(CONFIG_DATA_ENVIRONMENT);
+ char *envw;
+ const char **argv = NULL;
+ int nr = 0, alloc = 0;
+ int i;
+
+ if (!env)
+ return 0;
+ /* sq_dequote will write over it */
+ envw = xstrdup(env);
+
+ if (sq_dequote_to_argv(envw, &argv, &nr, &alloc) < 0) {
+ free(envw);
+ return error("bogus format in " CONFIG_DATA_ENVIRONMENT);
+ }
+
+ for (i = 0; i < nr; i++) {
+ if (git_config_parse_parameter(argv[i]) < 0) {
+ error("bogus config parameter: %s", argv[i]);
+ free(argv);
+ free(envw);
+ return -1;
+ }
+ }
+
+ free(argv);
+ free(envw);
+ return 0;
+}
+
static int get_next_char(void)
{
int c;
int git_config_from_parameters(config_fn_t fn, void *data)
{
+ static int loaded_environment;
const struct config_item *ct;
+
+ if (!loaded_environment) {
+ if (git_config_parse_environment() < 0)
+ return -1;
+ loaded_environment = 1;
+ }
for (ct = config_parameters; ct; ct = ct->next)
if (fn(ct->name, ct->value, data) < 0)
return -1;
}
free(repo_config);
- if (config_parameters) {
- ret += git_config_from_parameters(fn, data);
+ ret += git_config_from_parameters(fn, data);
+ if (config_parameters)
found += 1;
- }
if (found == 0)
return -1;