@@ -1848,7 +1848,7 @@ int git_config_set(const char *key, const char *value)
18481848 * baselen - pointer to int which will hold the length of the
18491849 * section + subsection part, can be NULL
18501850 */
1851- int git_config_parse_key (const char * key , char * * store_key , int * baselen_ )
1851+ static int git_config_parse_key_1 (const char * key , char * * store_key , int * baselen_ , int quiet )
18521852{
18531853 int i , dot , baselen ;
18541854 const char * last_dot = strrchr (key , '.' );
@@ -1859,12 +1859,14 @@ int git_config_parse_key(const char *key, char **store_key, int *baselen_)
18591859 */
18601860
18611861 if (last_dot == NULL || last_dot == key ) {
1862- error ("key does not contain a section: %s" , key );
1862+ if (!quiet )
1863+ error ("key does not contain a section: %s" , key );
18631864 return - CONFIG_NO_SECTION_OR_NAME ;
18641865 }
18651866
18661867 if (!last_dot [1 ]) {
1867- error ("key does not contain variable name: %s" , key );
1868+ if (!quiet )
1869+ error ("key does not contain variable name: %s" , key );
18681870 return - CONFIG_NO_SECTION_OR_NAME ;
18691871 }
18701872
@@ -1875,7 +1877,8 @@ int git_config_parse_key(const char *key, char **store_key, int *baselen_)
18751877 /*
18761878 * Validate the key and while at it, lower case it for matching.
18771879 */
1878- * store_key = xmalloc (strlen (key ) + 1 );
1880+ if (store_key )
1881+ * store_key = xmalloc (strlen (key ) + 1 );
18791882
18801883 dot = 0 ;
18811884 for (i = 0 ; key [i ]; i ++ ) {
@@ -1886,26 +1889,42 @@ int git_config_parse_key(const char *key, char **store_key, int *baselen_)
18861889 if (!dot || i > baselen ) {
18871890 if (!iskeychar (c ) ||
18881891 (i == baselen + 1 && !isalpha (c ))) {
1889- error ("invalid key: %s" , key );
1892+ if (!quiet )
1893+ error ("invalid key: %s" , key );
18901894 goto out_free_ret_1 ;
18911895 }
18921896 c = tolower (c );
18931897 } else if (c == '\n' ) {
1894- error ("invalid key (newline): %s" , key );
1898+ if (!quiet )
1899+ error ("invalid key (newline): %s" , key );
18951900 goto out_free_ret_1 ;
18961901 }
1897- (* store_key )[i ] = c ;
1902+ if (store_key )
1903+ (* store_key )[i ] = c ;
18981904 }
1899- (* store_key )[i ] = 0 ;
1905+ if (store_key )
1906+ (* store_key )[i ] = 0 ;
19001907
19011908 return 0 ;
19021909
19031910out_free_ret_1 :
1904- free (* store_key );
1905- * store_key = NULL ;
1911+ if (store_key ) {
1912+ free (* store_key );
1913+ * store_key = NULL ;
1914+ }
19061915 return - CONFIG_INVALID_KEY ;
19071916}
19081917
1918+ int git_config_parse_key (const char * key , char * * store_key , int * baselen )
1919+ {
1920+ return git_config_parse_key_1 (key , store_key , baselen , 0 );
1921+ }
1922+
1923+ int git_config_key_is_valid (const char * key )
1924+ {
1925+ return !git_config_parse_key_1 (key , NULL , NULL , 1 );
1926+ }
1927+
19091928/*
19101929 * If value==NULL, unset in (remove from) config,
19111930 * if value_regex!=NULL, disregard key/value pairs where value does not match.
0 commit comments