mirror of
https://github.com/openvswitch/ovs
synced 2025-08-22 09:58:01 +00:00
table: Add --max-column-width option.
This can make it easier to read tables that contain wide data in some columns. Signed-off-by: Ben Pfaff <blp@ovn.org> Acked-by: Justin Pettit <jpettit@ovn.org>
This commit is contained in:
parent
bc7bcc408e
commit
80f66ee041
2
NEWS
2
NEWS
@ -8,6 +8,8 @@ Post-v2.8.0
|
|||||||
* ovsdb-client: New "get-schema-cksum" and "query" commands.
|
* ovsdb-client: New "get-schema-cksum" and "query" commands.
|
||||||
* ovsdb-client: New "backup" and "restore" commands.
|
* ovsdb-client: New "backup" and "restore" commands.
|
||||||
* ovsdb-tool: New "db-name" and "schema-name" commands.
|
* ovsdb-tool: New "db-name" and "schema-name" commands.
|
||||||
|
- ovs-vsctl and other commands that display data in tables now support a
|
||||||
|
--max-column-width option to limit column width.
|
||||||
- OVN:
|
- OVN:
|
||||||
* The "requested-chassis" option for a logical switch port now accepts a
|
* The "requested-chassis" option for a logical switch port now accepts a
|
||||||
chassis "hostname" in addition to a chassis "name".
|
chassis "hostname" in addition to a chassis "name".
|
||||||
|
22
lib/table.c
22
lib/table.c
@ -255,19 +255,31 @@ table_print_table__(const struct table *table, const struct table_style *style)
|
|||||||
puts(table->caption);
|
puts(table->caption);
|
||||||
}
|
}
|
||||||
|
|
||||||
widths = xmalloc(table->n_columns * sizeof *widths);
|
widths = xzalloc(table->n_columns * sizeof *widths);
|
||||||
for (x = 0; x < table->n_columns; x++) {
|
for (x = 0; x < table->n_columns; x++) {
|
||||||
const struct column *column = &table->columns[x];
|
const struct column *column = &table->columns[x];
|
||||||
|
|
||||||
widths[x] = strlen(column->heading);
|
int w = 0;
|
||||||
for (y = 0; y < table->n_rows; y++) {
|
for (y = 0; y < table->n_rows; y++) {
|
||||||
const char *text = cell_to_text(table_cell__(table, y, x), style);
|
const char *text = cell_to_text(table_cell__(table, y, x), style);
|
||||||
size_t length = strlen(text);
|
size_t length = strlen(text);
|
||||||
|
|
||||||
if (length > widths[x]) {
|
if (length > w) {
|
||||||
widths[x] = length;
|
w = length;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int max = style->max_column_width;
|
||||||
|
if (max > 0 && w > max) {
|
||||||
|
w = max;
|
||||||
|
}
|
||||||
|
if (style->headings) {
|
||||||
|
int min = strlen(column->heading);
|
||||||
|
if (w < min) {
|
||||||
|
w = min;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
widths[x] = w;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (style->headings) {
|
if (style->headings) {
|
||||||
@ -295,7 +307,7 @@ table_print_table__(const struct table *table, const struct table_style *style)
|
|||||||
if (x) {
|
if (x) {
|
||||||
ds_put_char(&line, ' ');
|
ds_put_char(&line, ' ');
|
||||||
}
|
}
|
||||||
ds_put_format(&line, "%-*s", widths[x], text);
|
ds_put_format(&line, "%-*.*s", widths[x], widths[x], text);
|
||||||
}
|
}
|
||||||
table_print_table_line__(&line);
|
table_print_table_line__(&line);
|
||||||
}
|
}
|
||||||
|
13
lib/table.h
13
lib/table.h
@ -78,21 +78,24 @@ struct table_style {
|
|||||||
enum cell_format cell_format; /* CF_*. */
|
enum cell_format cell_format; /* CF_*. */
|
||||||
bool headings; /* Include headings? */
|
bool headings; /* Include headings? */
|
||||||
int json_flags; /* CF_JSON: Flags for json_to_string(). */
|
int json_flags; /* CF_JSON: Flags for json_to_string(). */
|
||||||
|
int max_column_width; /* CF_STRING: Limit for column width. */
|
||||||
};
|
};
|
||||||
|
|
||||||
#define TABLE_STYLE_DEFAULT { TF_LIST, CF_STRING, true, JSSF_SORT }
|
#define TABLE_STYLE_DEFAULT { TF_LIST, CF_STRING, true, JSSF_SORT, 0 }
|
||||||
|
|
||||||
#define TABLE_OPTION_ENUMS \
|
#define TABLE_OPTION_ENUMS \
|
||||||
OPT_NO_HEADINGS, \
|
OPT_NO_HEADINGS, \
|
||||||
OPT_PRETTY, \
|
OPT_PRETTY, \
|
||||||
OPT_BARE
|
OPT_BARE, \
|
||||||
|
OPT_MAX_COLUMN_WIDTH
|
||||||
|
|
||||||
#define TABLE_LONG_OPTIONS \
|
#define TABLE_LONG_OPTIONS \
|
||||||
{"format", required_argument, NULL, 'f'}, \
|
{"format", required_argument, NULL, 'f'}, \
|
||||||
{"data", required_argument, NULL, 'd'}, \
|
{"data", required_argument, NULL, 'd'}, \
|
||||||
{"no-headings", no_argument, NULL, OPT_NO_HEADINGS}, \
|
{"no-headings", no_argument, NULL, OPT_NO_HEADINGS}, \
|
||||||
{"pretty", no_argument, NULL, OPT_PRETTY}, \
|
{"pretty", no_argument, NULL, OPT_PRETTY}, \
|
||||||
{"bare", no_argument, NULL, OPT_BARE}
|
{"bare", no_argument, NULL, OPT_BARE}, \
|
||||||
|
{"max-column-width", required_argument, NULL, OPT_MAX_COLUMN_WIDTH}
|
||||||
|
|
||||||
#define TABLE_OPTION_HANDLERS(STYLE) \
|
#define TABLE_OPTION_HANDLERS(STYLE) \
|
||||||
case 'f': \
|
case 'f': \
|
||||||
@ -115,6 +118,10 @@ struct table_style {
|
|||||||
(STYLE)->format = TF_LIST; \
|
(STYLE)->format = TF_LIST; \
|
||||||
(STYLE)->cell_format = CF_BARE; \
|
(STYLE)->cell_format = CF_BARE; \
|
||||||
(STYLE)->headings = false; \
|
(STYLE)->headings = false; \
|
||||||
|
break; \
|
||||||
|
\
|
||||||
|
case OPT_MAX_COLUMN_WIDTH: \
|
||||||
|
(STYLE)->max_column_width = atoi(optarg); \
|
||||||
break;
|
break;
|
||||||
|
|
||||||
void table_parse_format(struct table_style *, const char *format);
|
void table_parse_format(struct table_style *, const char *format);
|
||||||
|
@ -69,3 +69,8 @@ This option does not affect JSON in tables, which is always printed
|
|||||||
compactly.
|
compactly.
|
||||||
.IP "\fB\-\-bare\fR"
|
.IP "\fB\-\-bare\fR"
|
||||||
Equivalent to \fB\-\-format=list \-\-data=bare \-\-no\-headings\fR.
|
Equivalent to \fB\-\-format=list \-\-data=bare \-\-no\-headings\fR.
|
||||||
|
.IP "\fB\-\-max\-column-width=\fIn\fR"
|
||||||
|
For table output only, limits the width of any column in the output to
|
||||||
|
\fIn\fR columns. Longer cell data is truncated to fit, as necessary.
|
||||||
|
Columns are always wide enough to display the column names, if the
|
||||||
|
heading row is printed.
|
||||||
|
@ -64,12 +64,12 @@ AT_CHECK(
|
|||||||
]])
|
]])
|
||||||
AT_CHECK([ovsdb-client --no-headings dump ordinals | sort -k 3 | uuidfilt], [0], [dnl
|
AT_CHECK([ovsdb-client --no-headings dump ordinals | sort -k 3 | uuidfilt], [0], [dnl
|
||||||
ordinals table
|
ordinals table
|
||||||
<0> "" 0
|
<0> "" 0
|
||||||
<1> "" 1
|
<1> "" 1
|
||||||
<2> "" 2
|
<2> "" 2
|
||||||
<3> "" 3
|
<3> "" 3
|
||||||
<4> "" 4
|
<4> "" 4
|
||||||
<5> "" 5
|
<5> "" 5
|
||||||
])
|
])
|
||||||
AT_CHECK([ovsdb-client restore < backup])
|
AT_CHECK([ovsdb-client restore < backup])
|
||||||
AT_CHECK([ovsdb-client dump | tr -s ' ' | sort -k 3 | uuidfilt], [0], [dnl
|
AT_CHECK([ovsdb-client dump | tr -s ' ' | sort -k 3 | uuidfilt], [0], [dnl
|
||||||
|
Loading…
x
Reference in New Issue
Block a user