1717#include "utf8.h"
1818
1919static const char * const repo_usage [] = {
20- "git repo info [--format=(keyvalue|nul) | -z] [--all | <key>...]" ,
21- "git repo structure [--format=(table|keyvalue|nul) | -z]" ,
20+ "git repo info [--format=(lines|nul) | -z] [--all | <key>...]" ,
21+ "git repo info --keys [--format=(lines|nul) | -z]" ,
22+ "git repo structure [--format=(table|lines|nul) | -z]" ,
2223 NULL
2324};
2425
2526typedef int get_value_fn (struct repository * repo , struct strbuf * buf );
2627
2728enum output_format {
2829 FORMAT_TABLE ,
29- FORMAT_KEYVALUE ,
30+ FORMAT_NEWLINE_TERMINATED ,
3031 FORMAT_NUL_TERMINATED ,
3132};
3233
@@ -91,7 +92,7 @@ static void print_field(enum output_format format, const char *key,
9192 const char * value )
9293{
9394 switch (format ) {
94- case FORMAT_KEYVALUE :
95+ case FORMAT_NEWLINE_TERMINATED :
9596 printf ("%s=" , key );
9697 quote_c_style (value , NULL , stdout , 0 );
9798 putchar ('\n' );
@@ -148,6 +149,29 @@ static int print_all_fields(struct repository *repo,
148149 return 0 ;
149150}
150151
152+ static int print_keys (enum output_format format )
153+ {
154+ char sep ;
155+
156+ switch (format ) {
157+ case FORMAT_NEWLINE_TERMINATED :
158+ sep = '\n' ;
159+ break ;
160+ case FORMAT_NUL_TERMINATED :
161+ sep = '\0' ;
162+ break ;
163+ default :
164+ die (_ ("--keys can only be used with --format=lines or --format=nul" ));
165+ }
166+
167+ for (size_t i = 0 ; i < ARRAY_SIZE (repo_info_fields ); i ++ ) {
168+ const struct field * field = & repo_info_fields [i ];
169+ printf ("%s%c" , field -> key , sep );
170+ }
171+
172+ return 0 ;
173+ }
174+
151175static int parse_format_cb (const struct option * opt ,
152176 const char * arg , int unset UNUSED )
153177{
@@ -157,8 +181,8 @@ static int parse_format_cb(const struct option *opt,
157181 * format = FORMAT_NUL_TERMINATED ;
158182 else if (!strcmp (arg , "nul" ))
159183 * format = FORMAT_NUL_TERMINATED ;
160- else if (!strcmp (arg , "keyvalue " ))
161- * format = FORMAT_KEYVALUE ;
184+ else if (!strcmp (arg , "lines " ))
185+ * format = FORMAT_NEWLINE_TERMINATED ;
162186 else if (!strcmp (arg , "table" ))
163187 * format = FORMAT_TABLE ;
164188 else
@@ -170,8 +194,9 @@ static int parse_format_cb(const struct option *opt,
170194static int cmd_repo_info (int argc , const char * * argv , const char * prefix ,
171195 struct repository * repo )
172196{
173- enum output_format format = FORMAT_KEYVALUE ;
197+ enum output_format format = FORMAT_NEWLINE_TERMINATED ;
174198 int all_keys = 0 ;
199+ int show_keys = 0 ;
175200 struct option options [] = {
176201 OPT_CALLBACK_F (0 , "format" , & format , N_ ("format" ),
177202 N_ ("output format" ),
@@ -181,11 +206,19 @@ static int cmd_repo_info(int argc, const char **argv, const char *prefix,
181206 PARSE_OPT_NONEG | PARSE_OPT_NOARG ,
182207 parse_format_cb ),
183208 OPT_BOOL (0 , "all" , & all_keys , N_ ("print all keys/values" )),
209+ OPT_BOOL (0 , "keys" , & show_keys , N_ ("show keys" )),
184210 OPT_END ()
185211 };
186212
187213 argc = parse_options (argc , argv , prefix , options , repo_usage , 0 );
188- if (format != FORMAT_KEYVALUE && format != FORMAT_NUL_TERMINATED )
214+
215+ if (show_keys && (all_keys || argc ))
216+ die (_ ("--keys cannot be used with a <key> or --all" ));
217+
218+ if (show_keys )
219+ return print_keys (format );
220+
221+ if (format != FORMAT_NEWLINE_TERMINATED && format != FORMAT_NUL_TERMINATED )
189222 die (_ ("unsupported output format" ));
190223
191224 if (all_keys && argc )
@@ -671,7 +704,7 @@ static int cmd_repo_structure(int argc, const char **argv, const char *prefix,
671704 stats_table_setup_structure (& table , & stats );
672705 stats_table_print_structure (& table );
673706 break ;
674- case FORMAT_KEYVALUE :
707+ case FORMAT_NEWLINE_TERMINATED :
675708 structure_keyvalue_print (& stats , '=' , '\n' );
676709 break ;
677710 case FORMAT_NUL_TERMINATED :
0 commit comments