int name_col_width;
int value_col_width;
+ int unit_col_width;
};
/*
*/
struct stats_table_entry {
char *value;
+ const char *unit;
};
static void stats_table_vaddf(struct stats_table *table,
if (name_width > table->name_col_width)
table->name_col_width = name_width;
- if (entry) {
+ if (!entry)
+ return;
+ if (entry->value) {
int value_width = utf8_strwidth(entry->value);
if (value_width > table->value_col_width)
table->value_col_width = value_width;
}
+ if (entry->unit) {
+ int unit_width = utf8_strwidth(entry->unit);
+ if (unit_width > table->unit_col_width)
+ table->unit_col_width = unit_width;
+ }
}
static void stats_table_addf(struct stats_table *table, const char *format, ...)
va_list ap;
CALLOC_ARRAY(entry, 1);
- entry->value = xstrfmt("%" PRIuMAX, (uintmax_t)value);
+ humanise_count(value, &entry->value, &entry->unit);
va_start(ap, format);
stats_table_vaddf(table, entry, format, ap);
{
const char *name_col_title = _("Repository structure");
const char *value_col_title = _("Value");
- int name_col_width = utf8_strwidth(name_col_title);
- int value_col_width = utf8_strwidth(value_col_title);
+ int title_name_width = utf8_strwidth(name_col_title);
+ int title_value_width = utf8_strwidth(value_col_title);
+ int name_col_width = table->name_col_width;
+ int value_col_width = table->value_col_width;
+ int unit_col_width = table->unit_col_width;
struct string_list_item *item;
struct strbuf buf = STRBUF_INIT;
- if (table->name_col_width > name_col_width)
- name_col_width = table->name_col_width;
- if (table->value_col_width > value_col_width)
- value_col_width = table->value_col_width;
+ if (title_name_width > name_col_width)
+ name_col_width = title_name_width;
+ if (title_value_width > value_col_width + unit_col_width + 1)
+ value_col_width = title_value_width - unit_col_width;
strbuf_addstr(&buf, "| ");
strbuf_utf8_align(&buf, ALIGN_LEFT, name_col_width, name_col_title);
strbuf_addstr(&buf, " | ");
- strbuf_utf8_align(&buf, ALIGN_LEFT, value_col_width, value_col_title);
+ strbuf_utf8_align(&buf, ALIGN_LEFT,
+ value_col_width + unit_col_width + 1, value_col_title);
strbuf_addstr(&buf, " |");
printf("%s\n", buf.buf);
for (int i = 0; i < name_col_width; i++)
putchar('-');
printf(" | ");
- for (int i = 0; i < value_col_width; i++)
+ for (int i = 0; i < value_col_width + unit_col_width + 1; i++)
putchar('-');
printf(" |\n");
for_each_string_list_item(item, &table->rows) {
struct stats_table_entry *entry = item->util;
const char *value = "";
+ const char *unit = "";
if (entry) {
struct stats_table_entry *entry = item->util;
value = entry->value;
+ if (entry->unit)
+ unit = entry->unit;
}
strbuf_reset(&buf);
strbuf_utf8_align(&buf, ALIGN_LEFT, name_col_width, item->string);
strbuf_addstr(&buf, " | ");
strbuf_utf8_align(&buf, ALIGN_RIGHT, value_col_width, value);
+ strbuf_addch(&buf, ' ');
+ strbuf_utf8_align(&buf, ALIGN_LEFT, unit_col_width, unit);
strbuf_addstr(&buf, " |");
printf("%s\n", buf.buf);
}
strbuf_add_urlencode(sb, s, strlen(s), allow_unencoded_fn);
}
+void humanise_count(size_t count, char **value, const char **unit)
+{
+ if (count >= 1000000000) {
+ size_t x = count + 5000000; /* for rounding */
+ *value = xstrfmt(_("%u.%2.2u"), (unsigned)(x / 1000000000),
+ (unsigned)(x % 1000000000 / 10000000));
+ /* TRANSLATORS: SI decimal prefix symbol for 10^9 */
+ *unit = _("G");
+ } else if (count >= 1000000) {
+ size_t x = count + 5000; /* for rounding */
+ *value = xstrfmt(_("%u.%2.2u"), (unsigned)(x / 1000000),
+ (unsigned)(x % 1000000 / 10000));
+ /* TRANSLATORS: SI decimal prefix symbol for 10^6 */
+ *unit = _("M");
+ } else if (count >= 1000) {
+ size_t x = count + 5; /* for rounding */
+ *value = xstrfmt(_("%u.%2.2u"), (unsigned)(x / 1000),
+ (unsigned)(x % 1000 / 10));
+ /* TRANSLATORS: SI decimal prefix symbol for 10^3 */
+ *unit = _("k");
+ } else {
+ *value = xstrfmt("%u", (unsigned)count);
+ *unit = NULL;
+ }
+}
+
void humanise_bytes(off_t bytes, char **value, const char **unit,
unsigned flags)
{
(
cd repo &&
cat >expect <<-\EOF &&
- | Repository structure | Value |
- | -------------------- | ----- |
- | * References | |
- | * Count | 0 |
- | * Branches | 0 |
- | * Tags | 0 |
- | * Remotes | 0 |
- | * Others | 0 |
- | | |
- | * Reachable objects | |
- | * Count | 0 |
- | * Commits | 0 |
- | * Trees | 0 |
- | * Blobs | 0 |
- | * Tags | 0 |
+ | Repository structure | Value |
+ | -------------------- | ------ |
+ | * References | |
+ | * Count | 0 |
+ | * Branches | 0 |
+ | * Tags | 0 |
+ | * Remotes | 0 |
+ | * Others | 0 |
+ | | |
+ | * Reachable objects | |
+ | * Count | 0 |
+ | * Commits | 0 |
+ | * Trees | 0 |
+ | * Blobs | 0 |
+ | * Tags | 0 |
EOF
git repo structure >out 2>err &&
git init repo &&
(
cd repo &&
- test_commit_bulk 42 &&
+ test_commit_bulk 1005 &&
git tag -a foo -m bar &&
oid="$(git rev-parse HEAD)" &&
git notes add -m foo &&
cat >expect <<-\EOF &&
- | Repository structure | Value |
- | -------------------- | ----- |
- | * References | |
- | * Count | 4 |
- | * Branches | 1 |
- | * Tags | 1 |
- | * Remotes | 1 |
- | * Others | 1 |
- | | |
- | * Reachable objects | |
- | * Count | 130 |
- | * Commits | 43 |
- | * Trees | 43 |
- | * Blobs | 43 |
- | * Tags | 1 |
+ | Repository structure | Value |
+ | -------------------- | ------ |
+ | * References | |
+ | * Count | 4 |
+ | * Branches | 1 |
+ | * Tags | 1 |
+ | * Remotes | 1 |
+ | * Others | 1 |
+ | | |
+ | * Reachable objects | |
+ | * Count | 3.02 k |
+ | * Commits | 1.01 k |
+ | * Trees | 1.01 k |
+ | * Blobs | 1.01 k |
+ | * Tags | 1 |
EOF
git repo structure >out 2>err &&