@@ -114,6 +114,49 @@ struct slot_expansion {
114114 int found ;
115115};
116116
117+ static void set_config_vars (struct string_list * keys_uniq , struct string_list_item * var )
118+ {
119+ struct strbuf sb = STRBUF_INIT ;
120+ const char * str = var -> string ;
121+ const char * wildcard = strchr (str , '*' );
122+ const char * tag = strchr (str , '<' );
123+ const char * cut ;
124+
125+ if (wildcard && tag )
126+ cut = wildcard < tag ? wildcard : tag ;
127+ else if (wildcard )
128+ cut = wildcard ;
129+ else if (tag )
130+ cut = tag ;
131+ else {
132+ string_list_append (keys_uniq , str );
133+ return ;
134+ }
135+
136+ strbuf_add (& sb , str , cut - str );
137+ string_list_append (keys_uniq , sb .buf );
138+ strbuf_release (& sb );
139+ }
140+
141+ static void set_config_sections (struct string_list * keys_uniq , struct string_list_item * var )
142+ {
143+ struct strbuf sb = STRBUF_INIT ;
144+ const char * str = var -> string ;
145+ const char * dot = strchr (str , '.' );
146+ const char * cut ;
147+
148+ if (dot )
149+ cut = dot ;
150+ else {
151+ set_config_vars (keys_uniq , var );
152+ return ;
153+ }
154+
155+ strbuf_add (& sb , str , cut - str );
156+ string_list_append (keys_uniq , sb .buf );
157+ strbuf_release (& sb );
158+ }
159+
117160static void list_config_help (enum show_config_type type )
118161{
119162 struct slot_expansion slot_expansions [] = {
@@ -134,13 +177,12 @@ static void list_config_help(enum show_config_type type)
134177 struct string_list keys = STRING_LIST_INIT_DUP ;
135178 struct string_list keys_uniq = STRING_LIST_INIT_DUP ;
136179 struct string_list_item * item ;
180+ struct strbuf sb = STRBUF_INIT ;
137181
138182 for (p = config_name_list ; * p ; p ++ ) {
139183 const char * var = * p ;
140- struct strbuf sb = STRBUF_INIT ;
141184
142185 for (e = slot_expansions ; e -> prefix ; e ++ ) {
143-
144186 strbuf_reset (& sb );
145187 strbuf_addf (& sb , "%s.%s" , e -> prefix , e -> placeholder );
146188 if (!strcasecmp (var , sb .buf )) {
@@ -149,60 +191,39 @@ static void list_config_help(enum show_config_type type)
149191 break ;
150192 }
151193 }
152- strbuf_release ( & sb );
194+
153195 if (!e -> prefix )
154196 string_list_append (& keys , var );
155197 }
156198
199+ strbuf_release (& sb );
200+
157201 for (e = slot_expansions ; e -> prefix ; e ++ )
158202 if (!e -> found )
159203 BUG ("slot_expansion %s.%s is not used" ,
160204 e -> prefix , e -> placeholder );
161205
162- string_list_sort (& keys );
163206 for (size_t i = 0 ; i < keys .nr ; i ++ ) {
164- const char * var = keys .items [i ].string ;
165- const char * wildcard , * tag , * cut ;
166- const char * dot = NULL ;
167- struct strbuf sb = STRBUF_INIT ;
168-
169207 switch (type ) {
170208 case SHOW_CONFIG_HUMAN :
171- puts ( var );
172- continue ;
209+ string_list_append ( & keys_uniq , keys . items [ i ]. string );
210+ break ;
173211 case SHOW_CONFIG_SECTIONS :
174- dot = strchr ( var , '.' );
212+ set_config_sections ( & keys_uniq , & keys . items [ i ] );
175213 break ;
176214 case SHOW_CONFIG_VARS :
215+ set_config_vars (& keys_uniq , & keys .items [i ]);
177216 break ;
217+ default :
218+ BUG ("%d: unexpected type" , type );
178219 }
179- wildcard = strchr (var , '*' );
180- tag = strchr (var , '<' );
181-
182- if (!dot && !wildcard && !tag ) {
183- string_list_append (& keys_uniq , var );
184- continue ;
185- }
186-
187- if (dot )
188- cut = dot ;
189- else if (wildcard && !tag )
190- cut = wildcard ;
191- else if (!wildcard && tag )
192- cut = tag ;
193- else
194- cut = wildcard < tag ? wildcard : tag ;
195-
196- strbuf_add (& sb , var , cut - var );
197- string_list_append (& keys_uniq , sb .buf );
198- strbuf_release (& sb );
199-
200220 }
201- string_list_clear ( & keys , 0 );
202- string_list_remove_duplicates (& keys_uniq , 0 );
221+
222+ string_list_sort_u (& keys_uniq , 0 );
203223 for_each_string_list_item (item , & keys_uniq )
204224 puts (item -> string );
205225 string_list_clear (& keys_uniq , 0 );
226+ string_list_clear (& keys , 0 );
206227}
207228
208229static enum help_format parse_help_format (const char * format )
0 commit comments