Standardize `strcmp(a, b) == 0` instead of `!strcmp(a, b)`
[babeltrace.git] / src / cli / babeltrace2.c
index 97ad6af9f85b6f68a16b041bda6a317dc51ae1ac..6f6a1f37d5991d01b7cf8b564855ed81313732ac 100644 (file)
@@ -173,7 +173,8 @@ int query(struct bt_config *cfg, const bt_component_class *comp_cls,
        }
 
        if (canceled) {
-               BT_LOGI("Canceled by user before executing the query: "
+               BT_CLI_LOGW_APPEND_CAUSE(
+                       "Canceled by user before executing the query: "
                        "comp-cls-addr=%p, comp-cls-name=\"%s\", "
                        "query-obj=\"%s\"", comp_cls,
                        bt_component_class_get_name(comp_cls), obj);
@@ -198,7 +199,8 @@ int query(struct bt_config *cfg, const bt_component_class *comp_cls,
 
                        if (usleep(sleep_time_us)) {
                                if (bt_query_executor_is_canceled(the_query_executor)) {
-                                       BT_LOGI("Query was canceled by user: "
+                                       BT_CLI_LOGW_APPEND_CAUSE(
+                                               "Query was canceled by user: "
                                                "comp-cls-addr=%p, comp-cls-name=\"%s\", "
                                                "query-obj=\"%s\"", comp_cls,
                                                bt_component_class_get_name(comp_cls),
@@ -400,9 +402,11 @@ void print_plugin_comp_cls_opt(FILE *fh, const char *plugin_name,
        GString *shell_plugin_name = NULL;
        GString *shell_comp_cls_name = NULL;
 
-       shell_plugin_name = bt_common_shell_quote(plugin_name, false);
-       if (!shell_plugin_name) {
-               goto end;
+       if (plugin_name) {
+               shell_plugin_name = bt_common_shell_quote(plugin_name, false);
+               if (!shell_plugin_name) {
+                       goto end;
+               }
        }
 
        shell_comp_cls_name = bt_common_shell_quote(comp_cls_name, false);
@@ -410,14 +414,20 @@ void print_plugin_comp_cls_opt(FILE *fh, const char *plugin_name,
                goto end;
        }
 
-       fprintf(fh, "'%s%s%s%s.%s%s%s.%s%s%s'",
+       fprintf(fh, "'%s%s%s%s",
                bt_common_color_bold(),
                bt_common_color_fg_cyan(),
                component_type_str(type),
-               bt_common_color_fg_default(),
-               bt_common_color_fg_blue(),
-               shell_plugin_name->str,
-               bt_common_color_fg_default(),
+               bt_common_color_fg_default());
+
+       if (shell_plugin_name) {
+               fprintf(fh, ".%s%s%s",
+                       bt_common_color_fg_blue(),
+                       shell_plugin_name->str,
+                       bt_common_color_fg_default());
+       }
+
+       fprintf(fh, ".%s%s%s'",
                bt_common_color_fg_yellow(),
                shell_comp_cls_name->str,
                bt_common_color_reset());
@@ -1473,8 +1483,8 @@ gboolean port_id_equal(gconstpointer v1, gconstpointer v2)
        const struct port_id *id1 = v1;
        const struct port_id *id2 = v2;
 
-       return !strcmp(id1->instance_name, id2->instance_name) &&
-               !strcmp(id1->port_name, id2->port_name);
+       return strcmp(id1->instance_name, id2->instance_name) == 0 &&
+               strcmp(id1->port_name, id2->port_name) == 0;
 }
 
 static
@@ -1785,7 +1795,7 @@ int cmd_run_ctx_connect_upstream_port_to_downstream_component(
                case BT_GRAPH_CONNECT_PORTS_STATUS_OK:
                        break;
                case BT_GRAPH_CONNECT_PORTS_STATUS_CANCELED:
-                       BT_LOGI_STR("Graph was canceled by user.");
+                       BT_CLI_LOGW_APPEND_CAUSE("Graph was canceled by user.");
                        break;
                default:
                        BT_CLI_LOGE_APPEND_CAUSE(
@@ -2512,7 +2522,8 @@ int cmd_run(struct bt_config *cfg)
        }
 
        if (canceled) {
-               BT_LOGI_STR("Canceled by user before creating components.");
+               BT_CLI_LOGW_APPEND_CAUSE(
+                       "Canceled by user before creating components.");
                goto error;
        }
 
@@ -2525,7 +2536,8 @@ int cmd_run(struct bt_config *cfg)
        }
 
        if (canceled) {
-               BT_LOGI_STR("Canceled by user before connecting components.");
+               BT_CLI_LOGW_APPEND_CAUSE(
+                       "Canceled by user before connecting components.");
                goto error;
        }
 
@@ -2539,7 +2551,8 @@ int cmd_run(struct bt_config *cfg)
        }
 
        if (canceled) {
-               BT_LOGI_STR("Canceled by user before running the graph.");
+               BT_CLI_LOGW_APPEND_CAUSE(
+                       "Canceled by user before running the graph.");
                goto error;
        }
 
@@ -2563,11 +2576,12 @@ int cmd_run(struct bt_config *cfg)
                case BT_GRAPH_RUN_STATUS_OK:
                        break;
                case BT_GRAPH_RUN_STATUS_CANCELED:
-                       BT_LOGI_STR("Graph was canceled by user.");
+                       BT_CLI_LOGW_APPEND_CAUSE("Graph was canceled by user.");
                        goto error;
                case BT_GRAPH_RUN_STATUS_AGAIN:
                        if (bt_graph_is_canceled(ctx.graph)) {
-                               BT_LOGI_STR("Graph was canceled by user.");
+                               BT_CLI_LOGW_APPEND_CAUSE(
+                                       "Graph was canceled by user.");
                                goto error;
                        }
 
@@ -2578,7 +2592,8 @@ int cmd_run(struct bt_config *cfg)
 
                                if (usleep(cfg->cmd_data.run.retry_duration_us)) {
                                        if (bt_graph_is_canceled(ctx.graph)) {
-                                               BT_LOGI_STR("Graph was canceled by user.");
+                                               BT_CLI_LOGW_APPEND_CAUSE(
+                                                       "Graph was canceled by user.");
                                                goto error;
                                        }
                                }
@@ -2622,7 +2637,7 @@ void warn_command_name_and_directory_clash(struct bt_config *cfg)
        if (g_file_test(cfg->command_name,
                        G_FILE_TEST_EXISTS | G_FILE_TEST_IS_DIR)) {
                _bt_log_write_d(_BT_LOG_SRCLOC_FUNCTION, __FILE__, __LINE__,
-                               BT_LOG_WARN, BT_LOG_TAG,
+                               BT_LOG_WARNING, BT_LOG_TAG,
                                "The `%s` command was executed. "
                                "If you meant to convert a trace located in "
                                "the local `%s` directory, please use:\n\n"
@@ -2719,6 +2734,123 @@ void set_auto_log_levels(struct bt_config *cfg)
        }
 }
 
+static
+void print_error_causes(void)
+{
+       const bt_error *error = bt_current_thread_take_error();
+       int64_t i;
+       GString *folded = NULL;
+       unsigned int columns;
+
+       if (!error || bt_error_get_cause_count(error) == 0) {
+               fprintf(stderr, "%s%sUnknown command-line error.%s\n",
+                       bt_common_color_bold(), bt_common_color_fg_red(),
+                       bt_common_color_reset());
+               goto end;
+       }
+
+       /* Try to get terminal width to fold the error cause messages */
+       if (bt_common_get_term_size(&columns, NULL) < 0) {
+               /* Width not found: default to 80 */
+               columns = 80;
+       }
+
+       /*
+        * This helps visually separate the error causes from the last
+        * logging statement.
+        */
+       fprintf(stderr, "\n");
+
+       /* Reverse order: deepest (root) cause printed at the end */
+       for (i = bt_error_get_cause_count(error) - 1; i >= 0; i--) {
+               const bt_error_cause *cause =
+                       bt_error_borrow_cause_by_index(error, (uint64_t) i);
+               const char *prefix_fmt =
+                       i == bt_error_get_cause_count(error) - 1 ?
+                               "%s%sERROR%s:    " : "%s%sCAUSED BY%s ";
+
+               /* Print prefix */
+               fprintf(stderr, prefix_fmt,
+                       bt_common_color_bold(), bt_common_color_fg_red(),
+                       bt_common_color_reset());
+
+               /* Print actor name */
+               fprintf(stderr, "[");
+               switch (bt_error_cause_get_actor_type(cause)) {
+               case BT_ERROR_CAUSE_ACTOR_TYPE_UNKNOWN:
+                       fprintf(stderr, "%s%s%s",
+                               bt_common_color_bold(),
+                               bt_error_cause_get_module_name(cause),
+                               bt_common_color_reset());
+                       break;
+               case BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT:
+                       fprintf(stderr, "%s%s%s: ",
+                               bt_common_color_bold(),
+                               bt_error_cause_component_actor_get_component_name(cause),
+                               bt_common_color_reset());
+                       print_plugin_comp_cls_opt(stderr,
+                               bt_error_cause_component_actor_get_plugin_name(cause),
+                               bt_error_cause_component_actor_get_component_class_name(cause),
+                               bt_error_cause_component_actor_get_component_class_type(cause));
+                       break;
+               case BT_ERROR_CAUSE_ACTOR_TYPE_COMPONENT_CLASS:
+                       print_plugin_comp_cls_opt(stderr,
+                               bt_error_cause_component_class_actor_get_plugin_name(cause),
+                               bt_error_cause_component_class_actor_get_component_class_name(cause),
+                               bt_error_cause_component_class_actor_get_component_class_type(cause));
+                       break;
+               case BT_ERROR_CAUSE_ACTOR_TYPE_MESSAGE_ITERATOR:
+                       fprintf(stderr, "%s%s%s (%s%s%s): ",
+                               bt_common_color_bold(),
+                               bt_error_cause_message_iterator_actor_get_component_name(cause),
+                               bt_common_color_reset(),
+                               bt_common_color_bold(),
+                               bt_error_cause_message_iterator_actor_get_component_output_port_name(cause),
+                               bt_common_color_reset());
+                       print_plugin_comp_cls_opt(stderr,
+                               bt_error_cause_message_iterator_actor_get_plugin_name(cause),
+                               bt_error_cause_message_iterator_actor_get_component_class_name(cause),
+                               bt_error_cause_message_iterator_actor_get_component_class_type(cause));
+                       break;
+               default:
+                       abort();
+               }
+
+               /* Print file name and line number */
+               fprintf(stderr, "] (%s%s%s%s:%s%" PRIu64 "%s)\n",
+                       bt_common_color_bold(),
+                       bt_common_color_fg_magenta(),
+                       bt_error_cause_get_file_name(cause),
+                       bt_common_color_reset(),
+                       bt_common_color_fg_green(),
+                       bt_error_cause_get_line_number(cause),
+                       bt_common_color_reset());
+
+               /* Print message */
+               folded = bt_common_fold(bt_error_cause_get_message(cause),
+                       columns, 2);
+               if (!folded) {
+                       BT_LOGE_STR("Could not fold string.");
+                       fprintf(stderr, "%s\n",
+                               bt_error_cause_get_message(cause));
+                       continue;
+               }
+
+               fprintf(stderr, "%s\n", folded->str);
+               g_string_free(folded, TRUE);
+               folded = NULL;
+       }
+
+end:
+       if (folded) {
+               g_string_free(folded, TRUE);
+       }
+
+       if (error) {
+               bt_error_release(error);
+       }
+}
+
 int main(int argc, const char **argv)
 {
        int ret;
@@ -2799,6 +2931,10 @@ end:
        BT_OBJECT_PUT_REF_AND_RESET(cfg);
        fini_static_data();
 
+       if (retcode != 0) {
+               print_error_causes();
+       }
+
        /*
         * Clear current thread's error in case there is one to avoid a
         * memory leak.
This page took 0.027458 seconds and 4 git commands to generate.