[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