[ABRT PATCH 2/2] cli list: add --since/--until cmd arguments

Jakub Filak jfilak at redhat.com
Mon May 20 13:56:07 UTC 2013


Closes #650

Signed-off-by: Jakub Filak <jfilak at redhat.com>
---
 src/cli/abrt-cli-core.c | 39 +++++++++++----------------------------
 src/cli/abrt-cli-core.h |  2 ++
 src/cli/list.c          | 38 +++++++++++++++++++++++---------------
 src/cli/report.c        |  2 +-
 4 files changed, 37 insertions(+), 44 deletions(-)

diff --git a/src/cli/abrt-cli-core.c b/src/cli/abrt-cli-core.c
index 862b825..61aa81c 100644
--- a/src/cli/abrt-cli-core.c
+++ b/src/cli/abrt-cli-core.c
@@ -57,38 +57,21 @@ problem_data_t *fill_crash_info(const char *dump_dir_name)
     return problem_data;
 }
 
+static void
+append_crash_info(struct dump_dir *dd, GPtrArray *ci)
+{
+    problem_data_t *problem_data = create_problem_data_from_dump_dir(dd);
+    problem_data_add(problem_data, CD_DUMPDIR, dd->dd_dirname,
+                            CD_FLAG_TXT + CD_FLAG_ISNOTEDITABLE + CD_FLAG_LIST);
+    g_ptr_array_add(ci, problem_data);
+}
+
 vector_of_problem_data_t *fetch_crash_infos(GList *dir_list)
 {
     vector_of_problem_data_t *ci = new_vector_of_problem_data();
+
     for (GList *li = dir_list; li; li = li->next)
-    {
-        char *dir_name = (char *)li->data;
-        VERB1 log("Loading dumps from '%s'", dir_name);
-
-        DIR *dir = opendir(dir_name);
-        if (dir != NULL)
-        {
-            struct dirent *dent;
-            while ((dent = readdir(dir)) != NULL)
-            {
-                if (dot_or_dotdot(dent->d_name))
-                    continue; /* skip "." and ".." */
-
-                char *dump_dir_name = concat_path_file(dir_name, dent->d_name);
-
-                struct stat statbuf;
-                if (stat(dump_dir_name, &statbuf) == 0
-                    && S_ISDIR(statbuf.st_mode))
-                {
-                    problem_data_t *problem_data = fill_crash_info(dump_dir_name);
-                    if (problem_data)
-                        g_ptr_array_add(ci, problem_data);
-                }
-                free(dump_dir_name);
-            }
-            closedir(dir);
-        }
-    }
+        foreach_problem_dir_matching(li->data, /*uid*/-1, /*condition*/NULL, (dump_dir_callback)append_crash_info, ci);
 
     return ci;
 }
diff --git a/src/cli/abrt-cli-core.h b/src/cli/abrt-cli-core.h
index 55a307b..b0f6186 100644
--- a/src/cli/abrt-cli-core.h
+++ b/src/cli/abrt-cli-core.h
@@ -20,6 +20,8 @@
 #ifndef ABRT_CLI_CORE_H_
 #define ABRT_CLI_CORE_H_
 
+#include "problem_api.h"
+
 typedef GPtrArray vector_of_problem_data_t;
 
 problem_data_t *get_problem_data(vector_of_problem_data_t *vector, unsigned i);
diff --git a/src/cli/list.c b/src/cli/list.c
index b574cb1..2f975d3 100644
--- a/src/cli/list.c
+++ b/src/cli/list.c
@@ -63,19 +63,15 @@ static void print_crash(problem_data_t *problem_data, int detailed)
  * @param include_reported
  *   Do not skip entries marked as already reported.
  */
-static void print_crash_list(vector_of_problem_data_t *crash_list, int include_reported,
+static void print_crash_list(vector_of_problem_data_t *crash_list, const struct problem_condition *const *filter,
                              int detailed)
 {
     unsigned i;
     for (i = 0; i < crash_list->len; ++i)
     {
         problem_data_t *crash = get_problem_data(crash_list, i);
-        if (!include_reported)
-        {
-            const char *msg = problem_data_get_content_or_NULL(crash, FILENAME_REPORTED_TO);
-            if (msg)
-                continue;
-        }
+        if (!problem_condition_evaluate_problem_data_and(crash, filter))
+            continue;
 
         printf("@%i\n", i);
         print_crash(crash, detailed);
@@ -91,12 +87,16 @@ int cmd_list(int argc, const char **argv)
         );
 
     static int opt_full, opt_detailed;
+    static int opt_since = 0;
+    static int opt_until = 0;
     struct options program_options[] = {
         OPT__VERBOSE(&g_verbose),
         OPT_GROUP(""),
         OPT_BOOL('f', "full"     , &opt_full,      _("List even reported problems")),
         /* deprecate -d option with --pretty=full*/
         OPT_BOOL('d', "detailed" , &opt_detailed,  _("Show detailed report")),
+        OPT_INTEGER('s', "since" , &opt_since,  _("List only the problems more recent than specified timestamp")),
+        OPT_INTEGER('u', "until" , &opt_until,  _("List only the problems older than specified timestamp")),
         OPT_END()
     };
 
@@ -107,19 +107,27 @@ int cmd_list(int argc, const char **argv)
     while (*argv)
         D_list = g_list_append(D_list, xstrdup(*argv++));
     if (!D_list)
-    {
-        load_abrt_conf();
-        D_list = g_list_append(D_list, concat_path_file(g_get_user_cache_dir(), "abrt/spool"));
-        D_list = g_list_append(D_list, xstrdup(g_settings_dump_location));
-        free_abrt_conf_data();
-    }
+        D_list = get_problem_storages();
+
+    struct problem_condition *filter[3] = { 0 };
+    struct problem_condition **cur_filter = filter;
+
+    if (opt_since != 0)
+        *cur_filter++ = time_interval_problem_condition_new(FILENAME_LAST_OCCURRENCE, opt_since, opt_until);
+
+    if (opt_full)
+        *cur_filter++ = empty_element_problem_condition_new(FILENAME_REPORTED_TO, /*inverted*/false);
 
     vector_of_problem_data_t *ci = fetch_crash_infos(D_list);
 
-    g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_TIME);
+    g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_LAST_OCCURRENCE);
 
-    print_crash_list(ci, opt_full, opt_detailed);
+    print_crash_list(ci, (const struct problem_condition *const *)filter, opt_detailed);
     free_vector_of_problem_data(ci);
+
+    for(cur_filter = filter; *cur_filter != NULL; ++cur_filter)
+        problem_condition_free(*cur_filter);
+
     list_free_with_free(D_list);
 
     return 0;
diff --git a/src/cli/report.c b/src/cli/report.c
index e155e2b..781c691 100644
--- a/src/cli/report.c
+++ b/src/cli/report.c
@@ -61,7 +61,7 @@ int cmd_report(int argc, const char **argv)
             if (at >= ci->len)
                 error_msg_and_die("error: number is out of range '%s'", dir_name);
 
-            g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_TIME);
+            g_ptr_array_sort_with_data(ci, &cmp_problem_data, (char *) FILENAME_LAST_OCCURRENCE);
             problem_data_t *pd = get_problem_data(ci, at);
 
             dir_name = problem_data_get_content_or_NULL(pd, CD_DUMPDIR);
-- 
1.8.1.4



More information about the Crash-catcher mailing list