summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorPeter Rajnoha <prajnoha@redhat.com>2016-05-26 15:20:27 +0200
committerPeter Rajnoha <prajnoha@redhat.com>2016-06-20 11:33:42 +0200
commitb864a062217cf31d86343f37ecbefeeeb15610cf (patch)
treedcccdd0547d3dc496cdcf2c3843ed53ffb3c8577
parente081203f3e2ee5e3270c7f5f2753ed446d8b72cb (diff)
downloadlvm2-b864a062217cf31d86343f37ecbefeeeb15610cf.tar.gz
report: recognize selection (-S|--select) for each subreport; make -S|--select groupable
-rw-r--r--WHATS_NEW1
-rw-r--r--lib/report/report.h1
-rw-r--r--tools/args.h2
-rw-r--r--tools/reporter.c54
-rw-r--r--tools/toollib.c7
5 files changed, 57 insertions, 8 deletions
diff --git a/WHATS_NEW b/WHATS_NEW
index fb5d3e775..01d6bbcf3 100644
--- a/WHATS_NEW
+++ b/WHATS_NEW
@@ -1,5 +1,6 @@
Version 2.02.158 -
=================================
+ Make -S|--select option groupable that allows this option to be repeated.
Make -O|--sort option groupable that allows this option to be repeated.
Add --configreport option to select report for which next options are applied.
Add support for priorities on grouping command arguments.
diff --git a/lib/report/report.h b/lib/report/report.h
index 20ccd998a..f5df51eb2 100644
--- a/lib/report/report.h
+++ b/lib/report/report.h
@@ -88,6 +88,7 @@ void *report_init(struct cmd_context *cmd, const char *format, const char *keys,
report_type_t *report_type, const char *separator,
int aligned, int buffered, int headings, int field_prefixes,
int quoted, int columns_as_rows, const char *selection);
+int report_get_single_selection(struct cmd_context *cmd, const char **selection);
void *report_init_for_selection(struct cmd_context *cmd, report_type_t *report_type,
const char *selection);
const char *report_get_field_prefix(report_type_t report_type);
diff --git a/tools/args.h b/tools/args.h
index 985f5d15f..b7b2262c0 100644
--- a/tools/args.h
+++ b/tools/args.h
@@ -206,7 +206,7 @@ arg(physicalextentsize_ARG, 's', "physicalextentsize", size_mb_arg, 0, 0)
arg(snapshot_ARG, 's', "snapshot", NULL, 0, 0)
arg(short_ARG, 's', "short", NULL, 0, 0)
arg(stdin_ARG, 's', "stdin", NULL, 0, 0)
-arg(select_ARG, 'S', "select", string_arg, 0, 0)
+arg(select_ARG, 'S', "select", string_arg, ARG_GROUPABLE, 0)
arg(test_ARG, 't', "test", NULL, 0, 0)
arg(thin_ARG, 'T', "thin", NULL, 0, 0)
arg(uuid_ARG, 'u', "uuid", NULL, 0, 0)
diff --git a/tools/reporter.c b/tools/reporter.c
index 8165288da..9dd302a45 100644
--- a/tools/reporter.c
+++ b/tools/reporter.c
@@ -915,16 +915,60 @@ out:
return r;
}
+static int _do_report_get_selection(struct cmd_context *cmd,
+ struct report_args *args,
+ struct single_report_args *single_args,
+ report_idx_t expected_idxs[],
+ const char **ret_selection)
+{
+ struct arg_value_group_list *current_group;
+ const char *final_selection = "", *selection = NULL;
+ const char *report_name = NULL;
+ report_idx_t idx = REPORT_IDX_SINGLE;
+ int i;
+
+ dm_list_iterate_items(current_group, &cmd->arg_value_groups) {
+ if (!grouped_arg_is_set(current_group->arg_values, select_ARG))
+ continue;
+
+ if (grouped_arg_is_set(current_group->arg_values, configreport_ARG)) {
+ report_name = grouped_arg_str_value(current_group->arg_values, configreport_ARG, NULL);
+ if ((idx = _get_report_idx_from_name(single_args->report_type, report_name)) == REPORT_IDX_NULL)
+ return_0;
+ }
+
+ selection = grouped_arg_str_value(current_group->arg_values, select_ARG, NULL);
+
+ if (single_args) {
+ if (!_should_process_report_idx(single_args->report_type, idx))
+ continue;
+ args->single_args[idx].selection = selection;
+ final_selection = selection;
+ } else {
+ for (i = 0; expected_idxs[i] != REPORT_IDX_NULL; i++) {
+ if (idx == expected_idxs[i])
+ final_selection = selection;
+ }
+ }
+ }
+
+ if (ret_selection)
+ *ret_selection = final_selection;
+
+ return 1;
+}
+
static int _get_report_selection(struct cmd_context *cmd,
struct report_args *args,
struct single_report_args *single_args)
{
- int r = ECMD_PROCESSED;
-
- if (arg_count(cmd, select_ARG))
- single_args->selection = arg_str_value(cmd, select_ARG, NULL);
+ return _do_report_get_selection(cmd, args, single_args, NULL, NULL) ? ECMD_PROCESSED : ECMD_FAILED;
+}
- return r;
+int report_get_single_selection(struct cmd_context *cmd, const char **selection)
+{
+ report_idx_t expected_idxs[] = {REPORT_IDX_SINGLE, REPORT_IDX_NULL};
+ return _do_report_get_selection(cmd, NULL, NULL, expected_idxs, selection);
}
static int _set_report_prefix_and_name(struct single_report_args *single_args)
diff --git a/tools/toollib.c b/tools/toollib.c
index 3b2ad6a20..e67e47abb 100644
--- a/tools/toollib.c
+++ b/tools/toollib.c
@@ -1742,15 +1742,18 @@ int init_selection_handle(struct cmd_context *cmd, struct processing_handle *han
report_type_t initial_report_type)
{
struct selection_handle *sh;
+ const char *selection;
if (!(sh = dm_pool_zalloc(cmd->mem, sizeof(struct selection_handle)))) {
log_error("_init_selection_handle: failed to allocate memory for selection handle");
return 0;
}
+ if (!report_get_single_selection(cmd, &selection))
+ return_0;
+
sh->report_type = initial_report_type;
- if (!(sh->selection_rh = report_init_for_selection(cmd, &sh->report_type,
- arg_str_value(cmd, select_ARG, NULL)))) {
+ if (!(sh->selection_rh = report_init_for_selection(cmd, &sh->report_type, selection))) {
dm_pool_free(cmd->mem, sh);
return_0;
}