15
16
static const char *const repo_usage[] = {
17
"git repo info [--format=(keyvalue|nul)] [-z] [<key>...]",
18
- "git repo structure",
18
+ "git repo structure [--format=(table|keyvalue|nul)]",
19
NULL
20
};
21
22
typedef int get_value_fn(struct repository *repo, struct strbuf *buf);
23
24
enum output_format {
25
+ FORMAT_TABLE,
26
FORMAT_KEYVALUE,
27
FORMAT_NUL_TERMINATED,
28
};
137
*format = FORMAT_NUL_TERMINATED;
138
else if (!strcmp(arg, "keyvalue"))
139
*format = FORMAT_KEYVALUE;
140
+ else if (!strcmp(arg, "table"))
141
+ *format = FORMAT_TABLE;
142
else
143
die(_("invalid format '%s'"), arg);
144
161
};
162
163
argc = parse_options(argc, argv, prefix, options, repo_usage, 0);
164
+ if (format != FORMAT_KEYVALUE && format != FORMAT_NUL_TERMINATED)
165
+ die(_("unsupported output format"));
166
167
return print_fields(argc, argv, repo, format);
168
}
335
string_list_clear(&table->rows, 1);
336
}
337
338
+static void structure_keyvalue_print(struct repo_structure *stats,
339
+ char key_delim, char value_delim)
340
+{
341
+ printf("references.branches.count%c%" PRIuMAX "%c", key_delim,
342
+ (uintmax_t)stats->refs.branches, value_delim);
343
+ printf("references.tags.count%c%" PRIuMAX "%c", key_delim,
344
+ (uintmax_t)stats->refs.tags, value_delim);
345
+ printf("references.remotes.count%c%" PRIuMAX "%c", key_delim,
346
+ (uintmax_t)stats->refs.remotes, value_delim);
347
+ printf("references.others.count%c%" PRIuMAX "%c", key_delim,
348
+ (uintmax_t)stats->refs.others, value_delim);
349
+
350
+ printf("objects.commits.count%c%" PRIuMAX "%c", key_delim,
351
+ (uintmax_t)stats->objects.commits, value_delim);
352
+ printf("objects.trees.count%c%" PRIuMAX "%c", key_delim,
353
+ (uintmax_t)stats->objects.trees, value_delim);
354
+ printf("objects.blobs.count%c%" PRIuMAX "%c", key_delim,
355
+ (uintmax_t)stats->objects.blobs, value_delim);
356
+ printf("objects.tags.count%c%" PRIuMAX "%c", key_delim,
357
+ (uintmax_t)stats->objects.tags, value_delim);
358
+
359
+ fflush(stdout);
360
+}
361
+
362
struct count_references_data {
363
struct ref_stats *stats;
364
struct rev_info *revs;
455
struct stats_table table = {
456
.rows = STRING_LIST_INIT_DUP,
457
};
458
+ enum output_format format = FORMAT_TABLE;
459
struct repo_structure stats = { 0 };
460
struct rev_info revs;
431
- struct option options[] = { 0 };
461
+ struct option options[] = {
462
+ OPT_CALLBACK_F(0, "format", &format, N_("format"),
463
+ N_("output format"),
464
+ PARSE_OPT_NONEG, parse_format_cb),
465
+ OPT_END()
466
+ };
467
468
argc = parse_options(argc, argv, prefix, options, repo_usage, 0);
469
if (argc)
474
structure_count_references(&stats.refs, &revs, repo);
475
structure_count_objects(&stats.objects, &revs);
476
442
- stats_table_setup_structure(&table, &stats);
443
- stats_table_print_structure(&table);
477
+ switch (format) {
478
+ case FORMAT_TABLE:
479
+ stats_table_setup_structure(&table, &stats);
480
+ stats_table_print_structure(&table);
481
+ break;
482
+ case FORMAT_KEYVALUE:
483
+ structure_keyvalue_print(&stats, '=', '\n');
484
+ break;
485
+ case FORMAT_NUL_TERMINATED:
486
+ structure_keyvalue_print(&stats, '\n', '\0');
487
+ break;
488
+ default:
489
+ BUG("invalid output format");
490
+ }
491
492
stats_table_clear(&table);
493
release_revisions(&revs);