88#include "cache.h"
99#include "exec_cmd.h"
1010#include "strbuf.h"
11+ #include "quote.h"
1112
1213#define MAXNAME (256)
1314
@@ -34,6 +35,19 @@ static void lowercase(char *p)
3435 * p = tolower (* p );
3536}
3637
38+ void git_config_push_parameter (const char * text )
39+ {
40+ struct strbuf env = STRBUF_INIT ;
41+ const char * old = getenv (CONFIG_DATA_ENVIRONMENT );
42+ if (old ) {
43+ strbuf_addstr (& env , old );
44+ strbuf_addch (& env , ' ' );
45+ }
46+ sq_quote_buf (& env , text );
47+ setenv (CONFIG_DATA_ENVIRONMENT , env .buf , 1 );
48+ strbuf_release (& env );
49+ }
50+
3751int git_config_parse_parameter (const char * text )
3852{
3953 struct config_item * ct ;
@@ -61,6 +75,37 @@ int git_config_parse_parameter(const char *text)
6175 return 0 ;
6276}
6377
78+ int git_config_parse_environment (void ) {
79+ const char * env = getenv (CONFIG_DATA_ENVIRONMENT );
80+ char * envw ;
81+ const char * * argv = NULL ;
82+ int nr = 0 , alloc = 0 ;
83+ int i ;
84+
85+ if (!env )
86+ return 0 ;
87+ /* sq_dequote will write over it */
88+ envw = xstrdup (env );
89+
90+ if (sq_dequote_to_argv (envw , & argv , & nr , & alloc ) < 0 ) {
91+ free (envw );
92+ return error ("bogus format in " CONFIG_DATA_ENVIRONMENT );
93+ }
94+
95+ for (i = 0 ; i < nr ; i ++ ) {
96+ if (git_config_parse_parameter (argv [i ]) < 0 ) {
97+ error ("bogus config parameter: %s" , argv [i ]);
98+ free (argv );
99+ free (envw );
100+ return -1 ;
101+ }
102+ }
103+
104+ free (argv );
105+ free (envw );
106+ return 0 ;
107+ }
108+
64109static int get_next_char (void )
65110{
66111 int c ;
@@ -773,7 +818,14 @@ int git_config_global(void)
773818
774819int git_config_from_parameters (config_fn_t fn , void * data )
775820{
821+ static int loaded_environment ;
776822 const struct config_item * ct ;
823+
824+ if (!loaded_environment ) {
825+ if (git_config_parse_environment () < 0 )
826+ return -1 ;
827+ loaded_environment = 1 ;
828+ }
777829 for (ct = config_parameters ; ct ; ct = ct -> next )
778830 if (fn (ct -> name , ct -> value , data ) < 0 )
779831 return -1 ;
@@ -812,10 +864,9 @@ int git_config(config_fn_t fn, void *data)
812864 }
813865 free (repo_config );
814866
815- if ( config_parameters ) {
816- ret += git_config_from_parameters ( fn , data );
867+ ret += git_config_from_parameters ( fn , data );
868+ if ( config_parameters )
817869 found += 1 ;
818- }
819870
820871 if (found == 0 )
821872 return -1 ;
0 commit comments