Index: src/libtracker/tracker-search.c =================================================================== RCS file: /cvs/gnome/tracker/src/libtracker/tracker-search.c,v retrieving revision 1.15 diff -u -p -r1.15 tracker-search.c --- src/libtracker/tracker-search.c 5 Nov 2006 23:31:39 -0000 1.15 +++ src/libtracker/tracker-search.c 11 Nov 2006 23:26:39 -0000 @@ -19,11 +19,11 @@ #include #include +#include #include "../libtracker/tracker.h" static gint limit = 0; -static gchar **terms = NULL; static gchar *service = NULL; static gboolean detailed; @@ -31,14 +31,13 @@ static GOptionEntry entries[] = { {"limit", 'l', 0, G_OPTION_ARG_INT, &limit, "limit the number of results showed", "limit"}, {"service", 's', 0, G_OPTION_ARG_STRING, &service, "search from a specific service", "service"}, {"detailed", 'd', 0, G_OPTION_ARG_NONE, &detailed, "Show more detailed results with service and mime type as well", NULL}, - {G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &terms, "search terms", NULL}, + //{G_OPTION_REMAINING, 0, 0, G_OPTION_ARG_STRING_ARRAY, &terms, "search terms", NULL}, {NULL} }; static void get_meta_table_data (gpointer value) - { char **meta, **meta_p; @@ -73,6 +72,9 @@ main (int argc, char **argv) gchar **result; char **p_strarray; GPtrArray *out_array = NULL; + int i; + gboolean build_exec_command; + gchar *exec_command; setlocale (LC_ALL, ""); @@ -80,6 +82,8 @@ main (int argc, char **argv) g_option_context_add_main_entries (context, entries, NULL); g_option_context_parse (context, &argc, &argv, &error); + +#if 0 if (error) { g_printerr ("invalid arguments: %s\n", error->message); return 1; @@ -89,6 +93,7 @@ main (int argc, char **argv) g_printerr ("missing search terms, try --help for help\n"); return 1; } +#endif if (limit <= 0) limit = 512; @@ -119,7 +124,50 @@ main (int argc, char **argv) type = SERVICE_OTHER_FILES; } - search = g_strjoinv (" ", terms); + search = NULL; + exec_command = NULL; + build_exec_command = FALSE; + for (i =1; i < argc; i++) { + if (strcmp (argv[i], "-exec") == 0 || strcmp (argv[i], "--exec") == 0) { + build_exec_command = TRUE; + } + else if (build_exec_command) { + if (strcmp (argv[i], ";") == 0) { + build_exec_command = FALSE; + } + else { + if (exec_command) { + gchar *tmp = g_strconcat (exec_command, " ", argv[i], NULL); + g_free (exec_command); + exec_command = tmp; + } + else { + exec_command = g_strdup (argv[i]); + } + } + } + else if (argv[i][0] == '-') { + g_printerr ("invalid arguments: %s\n", argv[i]); + return 1; + } + else { + if (search) { + gchar *tmp = g_strconcat (search, " ", argv[i], NULL); + g_free (search); + search = tmp; + } + else { + search = g_strdup (argv[i]); + } + } + } + + if (!search) { + g_printerr ("missing search terms, try --help for help\n"); + return 1; + } + + error = NULL; if (!detailed) { result = tracker_search_text (client, -1, type, search, 0, limit, &error); @@ -160,7 +208,18 @@ main (int argc, char **argv) if (!s) continue; - g_print ("%s\n", s); + if (exec_command) { + gchar **split = g_strsplit (exec_command, "{}", -1); + gchar *e = g_shell_quote (s); + gchar *cmd = g_strjoinv (e, split); + g_free (e); + g_strfreev (split); + g_spawn_command_line_sync (cmd, NULL, NULL, NULL, NULL); + g_free (cmd); + } + else { + g_print ("%s\n", s); + } g_free (s); }