From a31ea71e0ad0d4b15517751cbc335944ccbdda27 Mon Sep 17 00:00:00 2001 From: "Dirk-Jan C. Binnema" Date: Wed, 6 Jul 2011 23:35:52 +0300 Subject: [PATCH] * basic implementation of --exec for mu find (WIP) --- src/mu-cmd-extract.c | 2 -- src/mu-cmd-find.c | 50 ++++++++++++++++++++++++++++++++++++++++++++ src/mu-config.c | 4 ++-- 3 files changed, 52 insertions(+), 4 deletions(-) diff --git a/src/mu-cmd-extract.c b/src/mu-cmd-extract.c index ba40bd9a..e99b10a7 100644 --- a/src/mu-cmd-extract.c +++ b/src/mu-cmd-extract.c @@ -296,8 +296,6 @@ save_parts (const char *path, const char *filename, MuConfig *opts) return rv; } - - #define color_maybe(C) do{ if (color) fputs ((C),stdout);}while(0) static void diff --git a/src/mu-cmd-find.c b/src/mu-cmd-find.c index ec1c02ec..564b0ac3 100644 --- a/src/mu-cmd-find.c +++ b/src/mu-cmd-find.c @@ -216,6 +216,54 @@ process_query (MuQuery *xapian, const gchar *query, MuConfig *opts, +static gboolean +exec_cmd_on_query (MuQuery *xapian, const gchar *query, MuConfig *opts, + size_t *count) +{ + MuMsgIter *iter; + gboolean rv; + + iter = run_query (xapian, query, opts, count); + if (!iter) + return FALSE; + + rv = TRUE; + while (!mu_msg_iter_is_done (iter)) { + const char* path; + path = mu_msg_get_path (mu_msg_iter_get_msg (iter, NULL)); + if (access (path, R_OK) == 0) { + gint status; + GError *err; + char *cmd; + cmd = g_strdup_printf ("%s %s", opts->exec, path); + err = NULL; /* FIXME: stdout/stderr */ + rv = g_spawn_command_line_sync (cmd, NULL, NULL, &status, + &err); + g_free (cmd); + if (!rv) { + g_warning ("command returned %d on %s: %s\n", + status, path, err->message); + g_error_free (err); + break; + } + } else + g_warning ("cannot execute command on %s: %s", + path, strerror(errno)); + + mu_msg_iter_next (iter); + } + + if (rv && count && *count == 0) + g_warning ("no matching messages found"); + + mu_msg_iter_destroy (iter); + + return rv; +} + + + + static gboolean format_params_valid (MuConfig *opts) { @@ -863,6 +911,8 @@ mu_cmd_find (MuConfig *opts) if (format == FORMAT_XQUERY) rv = print_xapian_query (xapian, query, &count); + else if (opts->exec) + rv = exec_cmd_on_query (xapian, query, opts, &count); else rv = process_query (xapian, query, opts, format, &count); diff --git a/src/mu-config.c b/src/mu-config.c index 732f16b8..4fb9b78f 100644 --- a/src/mu-config.c +++ b/src/mu-config.c @@ -177,8 +177,8 @@ config_options_group_find (MuConfig *opts) {"format", 'o', 0, G_OPTION_ARG_STRING, &opts->formatstr, "output format ('plain'(*), 'links', 'xml'," "'json', 'sexp', 'xquery')", NULL}, - /* {"exec", 'e', 0, G_OPTION_ARG_STRING, &opts->exec, */ - /* "execute command on each match message", NULL}, */ + {"exec", 'e', 0, G_OPTION_ARG_STRING, &opts->exec, + "execute command on each match message", NULL}, {NULL, 0, 0, 0, NULL, NULL, NULL} };