[geany/geany] 74171c: Alter search.c to use the new spawning module
Dimitar Zhekov
git-noreply at xxxxx
Fri May 15 17:07:23 UTC 2015
Branch: refs/heads/master
Author: Dimitar Zhekov <dimitar.zhekov at gmail.com>
Committer: Dimitar Zhekov <dimitar.zhekov at gmail.com>
Date: Thu, 19 Mar 2015 18:03:33 UTC
Commit: 74171cca5026e915e68b55f420b986b266ddcf7f
https://github.com/geany/geany/commit/74171cca5026e915e68b55f420b986b266ddcf7f
Log Message:
-----------
Alter search.c to use the new spawning module
Also enabled the Grep tool setting to be used as a command line,
instead of an executable name only, and fixed a small bug where the
search text displayed in Messages was re-utf8-ed.
Modified Paths:
--------------
src/search.c
Modified: src/search.c
162 lines changed, 61 insertions(+), 101 deletions(-)
===================================================================
@@ -37,6 +37,7 @@
#include "msgwindow.h"
#include "prefs.h"
#include "sciwrappers.h"
+#include "spawn.h"
#include "stash.h"
#include "support.h"
#include "toolbar.h"
@@ -149,10 +150,10 @@ static struct
fif_dlg = {NULL, NULL, NULL, NULL, NULL, NULL, {0, 0}};
-static gboolean search_read_io(GIOChannel *source, GIOCondition condition, gpointer data);
-static gboolean search_read_io_stderr(GIOChannel *source, GIOCondition condition, gpointer data);
+static void search_read_io(GString *string, GIOCondition condition, gpointer data);
+static void search_read_io_stderr(GString *string, GIOCondition condition, gpointer data);
-static void search_close_pid(GPid child_pid, gint status, gpointer user_data);
+static void search_finished(GPid child_pid, gint status, gpointer user_data);
static gchar **search_get_argv(const gchar **argv_prefix, const gchar *dir);
@@ -1647,13 +1648,10 @@ static gboolean
search_find_in_files(const gchar *utf8_search_text, const gchar *dir, const gchar *opts,
const gchar *enc)
{
- gchar **argv_prefix, **argv, **opts_argv;
- gchar *command_grep;
+ gchar **argv_prefix = g_new(gchar*, 3);
+ gchar *command_grep, *command_line;
+ gchar **argv;
gchar *search_text = NULL;
- gint opts_argv_len, i;
- GPid child_pid;
- gint stdout_fd;
- gint stderr_fd;
GError *error = NULL;
gboolean ret = FALSE;
gssize utf8_text_len;
@@ -1662,18 +1660,11 @@ search_find_in_files(const gchar *utf8_search_text, const gchar *dir, const gcha
command_grep = g_find_program_in_path(tool_prefs.grep_cmd);
if (command_grep == NULL)
+ command_line = g_strdup_printf("%s %s --", tool_prefs.grep_cmd, opts);
+ else
{
- ui_set_statusbar(TRUE, _("Cannot execute grep tool '%s';"
- " check the path setting in Preferences."), tool_prefs.grep_cmd);
- return FALSE;
- }
-
- if (! g_shell_parse_argv(opts, &opts_argv_len, &opts_argv, &error))
- {
- ui_set_statusbar(TRUE, _("Cannot parse extra options: %s"), error->message);
- g_error_free(error);
+ command_line = g_strdup_printf("\"%s\" %s --", command_grep, opts);
g_free(command_grep);
- return FALSE;
}
/* convert the search text in the preferred encoding (if the text is not valid UTF-8. assume
@@ -1686,74 +1677,58 @@ search_find_in_files(const gchar *utf8_search_text, const gchar *dir, const gcha
if (search_text == NULL)
search_text = g_strdup(utf8_search_text);
- /* set grep command and options */
- argv_prefix = g_new0(gchar*, 1 + opts_argv_len + 3 + 1); /* last +1 for recursive arg */
-
- argv_prefix[0] = command_grep;
- for (i = 0; i < opts_argv_len; i++)
- {
- argv_prefix[i + 1] = g_strdup(opts_argv[i]);
- }
- g_strfreev(opts_argv);
-
- i++; /* correct for tool_prefs.grep_cmd */
- argv_prefix[i++] = g_strdup("--");
- argv_prefix[i++] = search_text;
+ argv_prefix[0] = search_text;
/* finally add the arguments(files to be searched) */
- if (strstr(argv_prefix[1], "r")) /* recursive option set */
+ if (settings.fif_recursive) /* recursive option set */
{
/* Use '.' so we get relative paths in the output */
- argv_prefix[i++] = g_strdup(".");
- argv_prefix[i++] = NULL;
+ argv_prefix[1] = g_strdup(".");
+ argv_prefix[2] = NULL;
argv = argv_prefix;
}
else
{
- argv_prefix[i++] = NULL;
+ argv_prefix[1] = NULL;
argv = search_get_argv((const gchar**)argv_prefix, dir);
g_strfreev(argv_prefix);
- }
- if (argv == NULL) /* no files */
- {
- return FALSE;
+ if (argv == NULL) /* no files */
+ {
+ g_free(command_line);
+ return FALSE;
+ }
}
gtk_list_store_clear(msgwindow.store_msg);
gtk_notebook_set_current_page(GTK_NOTEBOOK(msgwindow.notebook), MSG_MESSAGE);
- if (! g_spawn_async_with_pipes(dir, (gchar**)argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD,
- NULL, NULL, &child_pid,
- NULL, &stdout_fd, &stderr_fd, &error))
- {
- geany_debug("%s: g_spawn_async_with_pipes() failed: %s", G_STRFUNC, error->message);
- ui_set_statusbar(TRUE, _("Process failed (%s)"), error->message);
- g_error_free(error);
- ret = FALSE;
+ /* we can pass 'enc' without strdup'ing it here because it's a global const string and
+ * always exits longer than the lifetime of this function */
+ if (spawn_with_callbacks(dir, command_line, argv, NULL, 0, NULL, NULL, search_read_io,
+ (gpointer) enc, 0, search_read_io_stderr, (gpointer) enc, 0, search_finished, NULL,
+ NULL, &error))
+ {
+ gchar *utf8_command_line = utils_get_utf8_from_locale(command_line);
+ gchar *utf8_dir = utils_get_utf8_from_locale(dir);
+ gchar *utf8_str;
+
+ ui_progress_bar_start(_("Searching..."));
+ msgwin_set_messages_dir(dir);
+ utf8_str = g_strdup_printf(_("%s %s (in directory: %s)"),
+ utf8_command_line, utf8_search_text, utf8_dir);
+ msgwin_msg_add_string(COLOR_BLUE, -1, NULL, utf8_str);
+ utils_free_pointers(3, utf8_command_line, utf8_dir, utf8_str, NULL);
+ ret = TRUE;
}
else
{
- gchar *str, *utf8_str;
-
- ui_progress_bar_start(_("Searching..."));
-
- msgwin_set_messages_dir(dir);
- /* we can pass 'enc' without strdup'ing it here because it's a global const string and
- * always exits longer than the lifetime of this function */
- utils_set_up_io_channel(stdout_fd, G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
- TRUE, search_read_io, (gpointer) enc);
- utils_set_up_io_channel(stderr_fd, G_IO_IN | G_IO_PRI | G_IO_ERR | G_IO_HUP | G_IO_NVAL,
- TRUE, search_read_io_stderr, (gpointer) enc);
- g_child_watch_add(child_pid, search_close_pid, NULL);
-
- str = g_strdup_printf(_("%s %s -- %s (in directory: %s)"),
- tool_prefs.grep_cmd, opts, utf8_search_text, dir);
- utf8_str = utils_get_utf8_from_locale(str);
- msgwin_msg_add_string(COLOR_BLUE, -1, NULL, utf8_str);
- utils_free_pointers(2, str, utf8_str, NULL);
- ret = TRUE;
+ geany_debug("%s: spawn_with_callbacks() failed: %s", G_STRFUNC, error->message);
+ ui_set_statusbar(TRUE, _("Process failed (%s)"), error->message);
+ g_error_free(error);
}
+
+ g_free(command_line);
g_strfreev(argv);
return ret;
}
@@ -1836,61 +1811,47 @@ static gchar **search_get_argv(const gchar **argv_prefix, const gchar *dir)
}
-static gboolean read_fif_io(GIOChannel *source, GIOCondition condition, gchar *enc, gint msg_color)
+static void read_fif_io(gchar *msg, GIOCondition condition, gchar *enc, gint msg_color)
{
if (condition & (G_IO_IN | G_IO_PRI))
{
- gchar *msg, *utf8_msg;
- GIOStatus st;
+ gchar *utf8_msg = NULL;
- while ((st = g_io_channel_read_line(source, &msg, NULL, NULL, NULL)) != G_IO_STATUS_ERROR &&
- st != G_IO_STATUS_EOF && msg)
+ g_strstrip(msg);
+ /* enc is NULL when encoding is set to UTF-8, so we can skip any conversion */
+ if (enc != NULL)
{
- utf8_msg = NULL;
-
- g_strstrip(msg);
- /* enc is NULL when encoding is set to UTF-8, so we can skip any conversion */
- if (enc != NULL)
+ if (! g_utf8_validate(msg, -1, NULL))
{
- if (! g_utf8_validate(msg, -1, NULL))
- {
- utf8_msg = g_convert(msg, -1, "UTF-8", enc, NULL, NULL, NULL);
- }
- if (utf8_msg == NULL)
- utf8_msg = msg;
+ utf8_msg = g_convert(msg, -1, "UTF-8", enc, NULL, NULL, NULL);
}
- else
+ if (utf8_msg == NULL)
utf8_msg = msg;
+ }
+ else
+ utf8_msg = msg;
- msgwin_msg_add_string(msg_color, -1, NULL, utf8_msg);
+ msgwin_msg_add_string(msg_color, -1, NULL, utf8_msg);
- if (utf8_msg != msg)
- g_free(utf8_msg);
- g_free(msg);
- }
- if (st == G_IO_STATUS_ERROR || st == G_IO_STATUS_EOF)
- return FALSE;
+ if (utf8_msg != msg)
+ g_free(utf8_msg);
}
- if (condition & (G_IO_ERR | G_IO_HUP | G_IO_NVAL))
- return FALSE;
-
- return TRUE;
}
-static gboolean search_read_io(GIOChannel *source, GIOCondition condition, gpointer data)
+static void search_read_io(GString *string, GIOCondition condition, gpointer data)
{
- return read_fif_io(source, condition, data, COLOR_BLACK);
+ return read_fif_io(string->str, condition, data, COLOR_BLACK);
}
-static gboolean search_read_io_stderr(GIOChannel *source, GIOCondition condition, gpointer data)
+static void search_read_io_stderr(GString *string, GIOCondition condition, gpointer data)
{
- return read_fif_io(source, condition, data, COLOR_DARK_RED);
+ return read_fif_io(string->str, condition, data, COLOR_DARK_RED);
}
-static void search_close_pid(GPid child_pid, gint status, gpointer user_data)
+static void search_finished(GPid child_pid, gint status, gpointer user_data)
{
const gchar *msg = _("Search failed.");
#ifdef G_OS_UNIX
@@ -1931,7 +1892,6 @@ static void search_close_pid(GPid child_pid, gint status, gpointer user_data)
break;
}
utils_beep();
- g_spawn_close_pid(child_pid);
ui_progress_bar_stop();
}
--------------
This E-Mail was brought to you by github_commit_mail.py (Source: https://github.com/geany/infrastructure).
More information about the Commits
mailing list