perf config: Let show_config() work with perf_config_set
PATCH v4 2/4 perf config: Let show_config() work with perf_config_set
Current show_config() has a problem when user or system config files have same config variables i.e.
# cat ~/.perfconfig
[top]
children = false when $(sysconfdir) is /usr/local/etc # cat /usr/local/etc/perfconfig
[top]
children = true
Before:
# perf config --user --list
top.children=false # perf config --system --list
top.children=true # perf config --list
top.children=true
top.children=falseBecause perf_config() can call show_config() each the config file (user and system). So fix it.
After:
# perf config --user --list
top.children=false # perf config --system --list
top.children=true # perf config --list
top.children=false--- tools/perf/builtin-config.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-)
tools/perf/builtin-config.c +28 -7
@@ -12,6 +12,7 @@#include <subcmd/parse-options.h> #include "util/util.h" #include "util/debug.h" +#include "util/config.h" static bool use_system_config, use_user_config;
@@ -32,13 +33,24 @@ static struct option config_options[] = { OPT_END() }; -static int show_config (const char *key,const char *value, -void *cb__maybe_unused ) +static int show_config (struct perf_config_set *perf_configs) { -if (value) -printf ("%s=%s\n" , key, value); -else -printf ("%s\n" , key); +struct perf_config_section *section; +struct perf_config_item *config_item; +struct list_head *sections = &perf_configs->sections; + +if (list_empty (sections)) +return -1 ; + +list_for_each_entry (section, sections, list) { +list_for_each_entry (config_item, §ion->config_items, list) { +char *value = config_item->value; + +if (value) +printf ("%s.%s=%s\n" , section->name, + config_item->name, value); + } + }return 0 ; }
@@ -46,6 +58,7 @@ static int show_config(const char *key, const char *value,int cmd_config (int argc,const char **argv,const char *prefix__maybe_unused ) {int ret =0 ; +struct perf_config_set *perf_configs;char *user_config =mkpath ("%s/.perfconfig" ,getenv ("HOME" )); argc = parse_options(argc, argv, config_options, config_usage,
@@ -63,13 +76,19 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)else if (use_user_config) config_exclusive_filename = user_config; + perf_configs =perf_config_set__new (); +if (!perf_configs) { + ret =-1 ; + goto out_err; + } +switch (actions) {case ACTION_LIST :if (argc) {pr_err ("Error: takes no arguments\n" );parse_options_usage (config_usage, config_options,"l" ,1 ); }else { - ret =perf_config (show_config,NULL ); + ret =show_config (perf_configs);if (ret <0 ) {const char * config_filename = config_exclusive_filename;if (!config_exclusive_filename)
@@ -83,5 +102,7 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)usage_with_options (config_usage, config_options); } +perf_config_set__delete (perf_configs); +out_err:return ret; }
Signature · 1 line
2.5.0
Em Tue, Mar 29, 2016 at 09:43:42AM +0900, Taeung Song escreveu:
Quoted 31 lines
Current
show_config()has a problem when user or system config files have same config variables i.e.# cat ~/.perfconfig [top] children = falsewhen $(sysconfdir) is
/usr/local/etc# cat/usr/local/etc/perfconfig
[top]
children = trueBefore:
# perf config --user --list top.children=false# perf config --system --list top.children=true# perf config --list top.children=true top.children=falseBecause
perf_config()can callshow_config()each the config file (user and system). So fix it.After:
# perf config --user --list top.children=false
Quoted 7 lines
# perf config --system --list top.children=true# perf config --list top.children=falseAcked-by Namhyung Kim <[email protected]>
Applied
Quoted 88 lines
Cc Jiri Olsa <[email protected]>Signed-off-by Taeung Song <[email protected]>--- tools/perf/builtin-config.c | 35 ++++++++++++++++++++++++++++------- 1 file changed, 28 insertions(+), 7 deletions(-)tools/perf/builtin-config.c +28
-7@@ -12,6 +12,7 @@#include <subcmd/parse-options.h> #include "util/util.h" #include "util/debug.h" +#include "util/config.h" static bool use_system_config, use_user_config;@@ -32,13 +33,24 @@ static struct option config_options[] = { OPT_END() }; -static int show_config (const char *key,const char *value, -void *cb__maybe_unused ) +static int show_config (struct perf_config_set *perf_configs) { -if (value) -printf ("%s=%s\n" , key, value); -else -printf ("%s\n" , key); +struct perf_config_section *section; +struct perf_config_item *config_item; +struct list_head *sections = &perf_configs->sections; + +if (list_empty (sections)) +return -1 ; + +list_for_each_entry (section, sections, list) { +list_for_each_entry (config_item, §ion->config_items, list) { +char *value = config_item->value; + +if (value) +printf ("%s.%s=%s\n" , section->name, + config_item->name, value); + } + }return 0 ; }@@ -46,6 +58,7 @@ static int show_config(const char *key, const char *value,int cmd_config (int argc,const char **argv,const char *prefix__maybe_unused ) {int ret =0 ; +struct perf_config_set *perf_configs;char *user_config =mkpath ("%s/.perfconfig" ,getenv ("HOME" )); argc = parse_options(argc, argv, config_options, config_usage,@@ -63,13 +76,19 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)else if (use_user_config) config_exclusive_filename = user_config; + perf_configs =perf_config_set__new (); +if (!perf_configs) { + ret =-1 ; + goto out_err; + } +switch (actions) {case ACTION_LIST :if (argc) {pr_err ("Error: takes no arguments\n" );parse_options_usage (config_usage, config_options,"l" ,1 ); }else { - ret =perf_config (show_config,NULL ); + ret =show_config (perf_configs);if (ret <0 ) {const char * config_filename = config_exclusive_filename;if (!config_exclusive_filename)@@ -83,5 +102,7 @@ int cmd_config(int argc, const char **argv, const char *prefix __maybe_unused)usage_with_options (config_usage, config_options); } +perf_config_set__delete (perf_configs); +out_err:return ret; }Signature · 1 line
2.5.0