@@ -1203,32 +1203,34 @@ int git_config_system(void)
12031203 return !git_env_bool ("GIT_CONFIG_NOSYSTEM" , 0 );
12041204}
12051205
1206+ static inline void config_from_file_gently (config_fn_t fn , const char * filename ,
1207+ void * data , unsigned access_flags , int * ret , int * found ) {
1208+ if (!filename || access_or_die (filename , R_OK , access_flags ))
1209+ return ;
1210+
1211+ * ret += git_config_from_file (fn , filename , data );
1212+ (* found )++ ;
1213+ }
1214+
12061215int git_config_early (config_fn_t fn , void * data , const char * repo_config )
12071216{
12081217 int ret = 0 , found = 0 ;
12091218 char * xdg_config = xdg_config_home ("config" );
12101219 char * user_config = expand_user_path ("~/.gitconfig" );
12111220
1212- if (git_config_system () && !access_or_die (git_etc_gitconfig (), R_OK , 0 )) {
1213- ret += git_config_from_file (fn , git_etc_gitconfig (),
1214- data );
1215- found += 1 ;
1221+ if (git_config_system ()) {
1222+ config_from_file_gently (fn , git_program_data_config (), data ,
1223+ 0 , & ret , & found );
1224+ config_from_file_gently (fn , git_etc_gitconfig (), data , 0 ,
1225+ & ret , & found );
12161226 }
12171227
1218- if (xdg_config && !access_or_die (xdg_config , R_OK , ACCESS_EACCES_OK )) {
1219- ret += git_config_from_file (fn , xdg_config , data );
1220- found += 1 ;
1221- }
1222-
1223- if (user_config && !access_or_die (user_config , R_OK , ACCESS_EACCES_OK )) {
1224- ret += git_config_from_file (fn , user_config , data );
1225- found += 1 ;
1226- }
1228+ config_from_file_gently (fn , xdg_config , data , ACCESS_EACCES_OK ,
1229+ & ret , & found );
1230+ config_from_file_gently (fn , user_config , data , ACCESS_EACCES_OK ,
1231+ & ret , & found );
12271232
1228- if (repo_config && !access_or_die (repo_config , R_OK , 0 )) {
1229- ret += git_config_from_file (fn , repo_config , data );
1230- found += 1 ;
1231- }
1233+ config_from_file_gently (fn , repo_config , data , 0 , & ret , & found );
12321234
12331235 switch (git_config_from_parameters (fn , data )) {
12341236 case -1 : /* error */
@@ -1925,6 +1927,24 @@ int git_config_parse_key(const char *key, char **store_key, int *baselen_)
19251927 return - CONFIG_INVALID_KEY ;
19261928}
19271929
1930+ static int lock_config_file (const char * config_filename ,
1931+ struct lock_file * * result )
1932+ {
1933+ int fd ;
1934+
1935+ /* make sure the parent directory exists */
1936+ if (safe_create_leading_directories_const (config_filename ))
1937+ return error ("could not create parent directory of %s" ,
1938+ config_filename );
1939+ * result = xcalloc (1 , sizeof (struct lock_file ));
1940+ fd = hold_lock_file_for_update (* result , config_filename , 0 );
1941+ if (fd < 0 )
1942+ error ("could not lock config file %s: %s" , config_filename ,
1943+ strerror (errno ));
1944+
1945+ return fd ;
1946+ }
1947+
19281948/*
19291949 * If value==NULL, unset in (remove from) config,
19301950 * if value_regex!=NULL, disregard key/value pairs where value does not match.
@@ -1975,10 +1995,8 @@ int git_config_set_multivar_in_file(const char *config_filename,
19751995 * The lock serves a purpose in addition to locking: the new
19761996 * contents of .git/config will be written into it.
19771997 */
1978- lock = xcalloc (1 , sizeof (struct lock_file ));
1979- fd = hold_lock_file_for_update (lock , config_filename , 0 );
1998+ fd = lock_config_file (config_filename , & lock );
19801999 if (fd < 0 ) {
1981- error ("could not lock config file %s: %s" , config_filename , strerror (errno ));
19822000 free (store .key );
19832001 ret = CONFIG_NO_LOCK ;
19842002 goto out_free ;
@@ -2257,12 +2275,9 @@ int git_config_rename_section_in_file(const char *config_filename,
22572275 if (!config_filename )
22582276 config_filename = filename_buf = git_pathdup ("config" );
22592277
2260- lock = xcalloc (1 , sizeof (struct lock_file ));
2261- out_fd = hold_lock_file_for_update (lock , config_filename , 0 );
2262- if (out_fd < 0 ) {
2263- ret = error ("could not lock config file %s" , config_filename );
2278+ out_fd = lock_config_file (config_filename , & lock );
2279+ if (out_fd < 0 )
22642280 goto out ;
2265- }
22662281
22672282 if (!(config_file = fopen (config_filename , "rb" ))) {
22682283 /* no config file means nothing to rename, no error */
0 commit comments