From b65d35e7cc97fc6322a895fd65db2534289ea373 Mon Sep 17 00:00:00 2001 From: Pierre Pronchery Date: Sat, 6 Apr 2013 02:02:53 +0200 Subject: [PATCH] Sharing some more code between the SCM plug-ins --- src/plugins/common.c | 92 ++++++++++++++++++++++++++++++++++++++++ src/plugins/cvs.c | 76 +-------------------------------- src/plugins/git.c | 76 +-------------------------------- src/plugins/subversion.c | 77 +-------------------------------- 4 files changed, 98 insertions(+), 223 deletions(-) diff --git a/src/plugins/common.c b/src/plugins/common.c index 9c05840..f4898e5 100644 --- a/src/plugins/common.c +++ b/src/plugins/common.c @@ -54,6 +54,9 @@ typedef struct _CommonTask /* prototypes */ /* tasks */ +static CommonTask * _common_task_new(BrowserPluginHelper * helper, + BrowserPluginDefinition * plugin, char const * title, + char const * directory, char * argv[]); static void _common_task_delete(CommonTask * task); static void _common_task_set_status(CommonTask * task, char const * status); static void _common_task_close(CommonTask * task); @@ -72,6 +75,95 @@ static void _common_rtrim(char * string); /* functions */ /* tasks */ +/* common_task_new */ +static CommonTask * _common_task_new(BrowserPluginHelper * helper, + BrowserPluginDefinition * plugin, char const * title, + char const * directory, char * argv[]) +{ + CommonTask * task; + GSpawnFlags flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD; + gboolean res; + GError * error = NULL; + PangoFontDescription * font; + char buf[256]; + GtkWidget * vbox; + GtkWidget * widget; + + if((task = object_new(sizeof(*task))) == NULL) + return NULL; + task->helper = helper; +#ifdef DEBUG + argv[0] = "echo"; +#endif + res = g_spawn_async_with_pipes(directory, argv, NULL, flags, NULL, NULL, + &task->pid, NULL, &task->o_fd, &task->e_fd, &error); + if(res != TRUE) + { + helper->error(helper->browser, error->message, 1); + g_error_free(error); + object_delete(task); + return NULL; + } + /* widgets */ + font = pango_font_description_new(); + pango_font_description_set_family(font, "monospace"); + task->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + gtk_window_set_default_size(GTK_WINDOW(task->window), 600, 400); +#if GTK_CHECK_VERSION(2, 6, 0) + if(plugin->icon != NULL) + gtk_window_set_icon_name(GTK_WINDOW(task->window), + plugin->icon); +#endif + snprintf(buf, sizeof(buf), "%s - %s (%s)", _(plugin->name), title, + directory); + gtk_window_set_title(GTK_WINDOW(task->window), buf); + g_signal_connect_swapped(task->window, "delete-event", G_CALLBACK( + _common_task_on_closex), task); + vbox = gtk_vbox_new(FALSE, 0); + widget = gtk_scrolled_window_new(NULL, NULL); + gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), + GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); + task->view = gtk_text_view_new(); + gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(task->view), FALSE); + gtk_text_view_set_editable(GTK_TEXT_VIEW(task->view), FALSE); + gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(task->view), + GTK_WRAP_WORD_CHAR); + gtk_widget_modify_font(task->view, font); + gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget), + task->view); + gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); + task->statusbar = gtk_statusbar_new(); + task->statusbar_id = 0; + gtk_box_pack_start(GTK_BOX(vbox), task->statusbar, FALSE, TRUE, 0); + gtk_container_add(GTK_CONTAINER(task->window), vbox); + gtk_widget_show_all(task->window); + pango_font_description_free(font); + /* events */ + task->source = g_child_watch_add(task->pid, _common_task_on_child_watch, + task); + task->o_channel = g_io_channel_unix_new(task->o_fd); + if((g_io_channel_set_encoding(task->o_channel, NULL, &error)) + != G_IO_STATUS_NORMAL) + { + helper->error(helper->browser, error->message, 1); + g_error_free(error); + } + task->o_source = g_io_add_watch(task->o_channel, G_IO_IN, + _common_task_on_io_can_read, task); + task->e_channel = g_io_channel_unix_new(task->e_fd); + if((g_io_channel_set_encoding(task->e_channel, NULL, &error)) + != G_IO_STATUS_NORMAL) + { + helper->error(helper->browser, error->message, 1); + g_error_free(error); + } + task->e_source = g_io_add_watch(task->e_channel, G_IO_IN, + _common_task_on_io_can_read, task); + _common_task_set_status(task, _("Running command...")); + return task; +} + + /* common_task_delete */ static void _common_task_delete(CommonTask * task) { diff --git a/src/plugins/cvs.c b/src/plugins/cvs.c index a5e4b0f..8f38b90 100644 --- a/src/plugins/cvs.c +++ b/src/plugins/cvs.c @@ -528,86 +528,14 @@ static int _cvs_add_task(CVS * cvs, char const * title, BrowserPluginHelper * helper = cvs->helper; CVSTask ** p; CVSTask * task; - GSpawnFlags flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD; - gboolean res; - GError * error = NULL; - PangoFontDescription * font; - char buf[256]; - GtkWidget * vbox; - GtkWidget * widget; if((p = realloc(cvs->tasks, sizeof(*p) * (cvs->tasks_cnt + 1))) == NULL) return -helper->error(helper->browser, strerror(errno), 1); cvs->tasks = p; - if((task = object_new(sizeof(*task))) == NULL) + if((task = _common_task_new(helper, &plugin, title, directory, argv)) + == NULL) return -helper->error(helper->browser, error_get(), 1); - task->helper = helper; -#ifdef DEBUG - argv[0] = "echo"; -#endif - res = g_spawn_async_with_pipes(directory, argv, NULL, flags, NULL, NULL, - &task->pid, NULL, &task->o_fd, &task->e_fd, &error); - if(res != TRUE) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - object_delete(task); - return -1; - } cvs->tasks[cvs->tasks_cnt++] = task; - /* widgets */ - font = pango_font_description_new(); - pango_font_description_set_family(font, "monospace"); - task->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(task->window), 600, 400); -#if GTK_CHECK_VERSION(2, 6, 0) - gtk_window_set_icon_name(GTK_WINDOW(task->window), plugin.icon); -#endif - snprintf(buf, sizeof(buf), "%s - %s (%s)", _("CVS"), title, directory); - gtk_window_set_title(GTK_WINDOW(task->window), buf); - g_signal_connect_swapped(task->window, "delete-event", G_CALLBACK( - _common_task_on_closex), task); - vbox = gtk_vbox_new(FALSE, 0); - widget = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - task->view = gtk_text_view_new(); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(task->view), FALSE); - gtk_text_view_set_editable(GTK_TEXT_VIEW(task->view), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(task->view), - GTK_WRAP_WORD_CHAR); - gtk_widget_modify_font(task->view, font); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget), - task->view); - gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); - task->statusbar = gtk_statusbar_new(); - task->statusbar_id = 0; - gtk_box_pack_start(GTK_BOX(vbox), task->statusbar, FALSE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(task->window), vbox); - gtk_widget_show_all(task->window); - pango_font_description_free(font); - /* events */ - task->source = g_child_watch_add(task->pid, _common_task_on_child_watch, - task); - task->o_channel = g_io_channel_unix_new(task->o_fd); - if((g_io_channel_set_encoding(task->o_channel, NULL, &error)) - != G_IO_STATUS_NORMAL) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - } - task->o_source = g_io_add_watch(task->o_channel, G_IO_IN, - _common_task_on_io_can_read, task); - task->e_channel = g_io_channel_unix_new(task->e_fd); - if((g_io_channel_set_encoding(task->e_channel, NULL, &error)) - != G_IO_STATUS_NORMAL) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - } - task->e_source = g_io_add_watch(task->e_channel, G_IO_IN, - _common_task_on_io_can_read, task); - _common_task_set_status(task, _("Running command...")); return 0; } diff --git a/src/plugins/git.c b/src/plugins/git.c index a2c82df..4c8cee3 100644 --- a/src/plugins/git.c +++ b/src/plugins/git.c @@ -332,86 +332,14 @@ static int _git_add_task(Git * git, char const * title, BrowserPluginHelper * helper = git->helper; GitTask ** p; GitTask * task; - GSpawnFlags flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD; - gboolean res; - GError * error = NULL; - PangoFontDescription * font; - char buf[256]; - GtkWidget * vbox; - GtkWidget * widget; if((p = realloc(git->tasks, sizeof(*p) * (git->tasks_cnt + 1))) == NULL) return -helper->error(helper->browser, strerror(errno), 1); git->tasks = p; - if((task = object_new(sizeof(*task))) == NULL) + if((task = _common_task_new(helper, &plugin, title, directory, argv)) + == NULL) return -helper->error(helper->browser, error_get(), 1); - task->helper = helper; -#ifdef DEBUG - argv[0] = "echo"; -#endif - res = g_spawn_async_with_pipes(directory, argv, NULL, flags, NULL, NULL, - &task->pid, NULL, &task->o_fd, &task->e_fd, &error); - if(res != TRUE) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - object_delete(task); - return -1; - } git->tasks[git->tasks_cnt++] = task; - /* widgets */ - font = pango_font_description_new(); - pango_font_description_set_family(font, "monospace"); - task->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(task->window), 600, 400); -#if GTK_CHECK_VERSION(2, 6, 0) - gtk_window_set_icon_name(GTK_WINDOW(task->window), plugin.icon); -#endif - snprintf(buf, sizeof(buf), "%s - %s (%s)", _("Git"), title, directory); - gtk_window_set_title(GTK_WINDOW(task->window), buf); - g_signal_connect_swapped(task->window, "delete-event", G_CALLBACK( - _common_task_on_closex), task); - vbox = gtk_vbox_new(FALSE, 0); - widget = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - task->view = gtk_text_view_new(); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(task->view), FALSE); - gtk_text_view_set_editable(GTK_TEXT_VIEW(task->view), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(task->view), - GTK_WRAP_WORD_CHAR); - gtk_widget_modify_font(task->view, font); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget), - task->view); - gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); - task->statusbar = gtk_statusbar_new(); - task->statusbar_id = 0; - gtk_box_pack_start(GTK_BOX(vbox), task->statusbar, FALSE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(task->window), vbox); - gtk_widget_show_all(task->window); - pango_font_description_free(font); - /* events */ - task->source = g_child_watch_add(task->pid, _common_task_on_child_watch, - task); - task->o_channel = g_io_channel_unix_new(task->o_fd); - if((g_io_channel_set_encoding(task->o_channel, NULL, &error)) - != G_IO_STATUS_NORMAL) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - } - task->o_source = g_io_add_watch(task->o_channel, G_IO_IN, - _common_task_on_io_can_read, task); - task->e_channel = g_io_channel_unix_new(task->e_fd); - if((g_io_channel_set_encoding(task->e_channel, NULL, &error)) - != G_IO_STATUS_NORMAL) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - } - task->e_source = g_io_add_watch(task->e_channel, G_IO_IN, - _common_task_on_io_can_read, task); - _common_task_set_status(task, _("Running command...")); return 0; } diff --git a/src/plugins/subversion.c b/src/plugins/subversion.c index a9294fa..fefdd85 100644 --- a/src/plugins/subversion.c +++ b/src/plugins/subversion.c @@ -295,87 +295,14 @@ static int _subversion_add_task(SVN * svn, char const * title, BrowserPluginHelper * helper = svn->helper; SVNTask ** p; SVNTask * task; - GSpawnFlags flags = G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD; - gboolean res; - GError * error = NULL; - PangoFontDescription * font; - char buf[256]; - GtkWidget * vbox; - GtkWidget * widget; if((p = realloc(svn->tasks, sizeof(*p) * (svn->tasks_cnt + 1))) == NULL) return -helper->error(helper->browser, strerror(errno), 1); svn->tasks = p; - if((task = object_new(sizeof(*task))) == NULL) + if((task = _common_task_new(helper, &plugin, title, directory, argv)) + == NULL) return -helper->error(helper->browser, error_get(), 1); - task->helper = helper; -#ifdef DEBUG - argv[0] = "echo"; -#endif - res = g_spawn_async_with_pipes(directory, argv, NULL, flags, NULL, NULL, - &task->pid, NULL, &task->o_fd, &task->e_fd, &error); - if(res != TRUE) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - object_delete(task); - return -1; - } svn->tasks[svn->tasks_cnt++] = task; - /* widgets */ - font = pango_font_description_new(); - pango_font_description_set_family(font, "monospace"); - task->window = gtk_window_new(GTK_WINDOW_TOPLEVEL); - gtk_window_set_default_size(GTK_WINDOW(task->window), 600, 400); -#if GTK_CHECK_VERSION(2, 6, 0) - gtk_window_set_icon_name(GTK_WINDOW(task->window), plugin.icon); -#endif - snprintf(buf, sizeof(buf), "%s - %s (%s)", _("Subversion"), title, - directory); - gtk_window_set_title(GTK_WINDOW(task->window), buf); - g_signal_connect_swapped(task->window, "delete-event", G_CALLBACK( - _common_task_on_closex), task); - vbox = gtk_vbox_new(FALSE, 0); - widget = gtk_scrolled_window_new(NULL, NULL); - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(widget), - GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - task->view = gtk_text_view_new(); - gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(task->view), FALSE); - gtk_text_view_set_editable(GTK_TEXT_VIEW(task->view), FALSE); - gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(task->view), - GTK_WRAP_WORD_CHAR); - gtk_widget_modify_font(task->view, font); - gtk_scrolled_window_add_with_viewport(GTK_SCROLLED_WINDOW(widget), - task->view); - gtk_box_pack_start(GTK_BOX(vbox), widget, TRUE, TRUE, 0); - task->statusbar = gtk_statusbar_new(); - task->statusbar_id = 0; - gtk_box_pack_start(GTK_BOX(vbox), task->statusbar, FALSE, TRUE, 0); - gtk_container_add(GTK_CONTAINER(task->window), vbox); - gtk_widget_show_all(task->window); - pango_font_description_free(font); - /* events */ - task->source = g_child_watch_add(task->pid, - _common_task_on_child_watch, task); - task->o_channel = g_io_channel_unix_new(task->o_fd); - if((g_io_channel_set_encoding(task->o_channel, NULL, &error)) - != G_IO_STATUS_NORMAL) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - } - task->o_source = g_io_add_watch(task->o_channel, G_IO_IN, - _common_task_on_io_can_read, task); - task->e_channel = g_io_channel_unix_new(task->e_fd); - if((g_io_channel_set_encoding(task->e_channel, NULL, &error)) - != G_IO_STATUS_NORMAL) - { - helper->error(helper->browser, error->message, 1); - g_error_free(error); - } - task->e_source = g_io_add_watch(task->e_channel, G_IO_IN, - _common_task_on_io_can_read, task); - _common_task_set_status(task, _("Running command...")); return 0; }