diff --git a/src/basic/format-table.c b/src/basic/format-table.c index 94e796d1ca..89cdd06b2a 100644 --- a/src/basic/format-table.c +++ b/src/basic/format-table.c @@ -36,7 +36,7 @@ that. The first row is always the header row. If header display is turned off we simply skip outputting the first row. Also, when sorting rows we always leave the first row where it is, as the header shouldn't move. - - Note because there's no row and no column object some properties that might be approproate as row/column properties + - Note because there's no row and no column object some properties that might be appropriate as row/column properties are exposed as cell properties instead. For example, the "weight" of a column (which is used to determine where to add/remove space preferable when expanding/compressing tables horizontally) is actually made the "weight" of a cell. Given that we usually need it per-column though we will calculate the average across every cell of the column @@ -1134,14 +1134,12 @@ int table_print(Table *t, FILE *f) { assert(weight_sum >= column_weight[j]); weight_sum -= column_weight[j]; - if (restart) + if (restart && !finalize) break; } - if (finalize) { - assert(!restart); + if (finalize) break; - } if (!restart) finalize = true; diff --git a/src/test/test-format-table.c b/src/test/test-format-table.c index adcc414161..2527cacbbd 100644 --- a/src/test/test-format-table.c +++ b/src/test/test-format-table.c @@ -5,6 +5,30 @@ #include "string-util.h" #include "time-util.h" +static void test_issue_9549(void) { + _cleanup_(table_unrefp) Table *table = NULL; + _cleanup_free_ char *formatted = NULL; + + assert_se(table = table_new("NAME", "TYPE", "RO", "USAGE", "CREATED", "MODIFIED")); + assert_se(table_set_align_percent(table, TABLE_HEADER_CELL(3), 100) >= 0); + assert_se(table_add_many(table, + TABLE_STRING, "foooo", + TABLE_STRING, "raw", + TABLE_BOOLEAN, false, + TABLE_SIZE, (uint64_t) (673.7*1024*1024), + TABLE_STRING, "Wed 2018-07-11 00:10:33 JST", + TABLE_STRING, "Wed 2018-07-11 00:16:00 JST") >= 0); + + table_set_width(table, 75); + assert_se(table_format(table, &formatted) >= 0); + + printf("%s\n", formatted); + assert_se(streq(formatted, + "NAME TYPE RO USAGE CREATED MODIFIED \n" + "foooo raw no 673.6M Wed 2018-07-11 00:10:33 J… Wed 2018-07-11 00:16:00 JST\n" + )); +} + int main(int argc, char *argv[]) { _cleanup_(table_unrefp) Table *t = NULL; @@ -135,5 +159,7 @@ int main(int argc, char *argv[]) { " yes xxx yes xxx xxx \n" "5min 5min \n")); + test_issue_9549(); + return 0; }