Updating branch refs/heads/thunarx-2 to 308bd813b02dc820e6a5857d8c765afd13120222 (commit) from ef4219bf85cd30b554dab08ba8e3d6730b51304b (commit)
commit 308bd813b02dc820e6a5857d8c765afd13120222 Author: Peter de Ridder <pe...@xfce.org> Date: Sun Oct 25 23:07:25 2009 +0100 * thunar-vcs-plugin/tvp-git-action.c tvp-git-helper/main.c tvp-git-helper/tgh-common.[ch] tvp-git-helper/tgh-clean{,-dialog}.[ch]: Added clean action. README | 3 +- thunar-vcs-plugin/tvp-git-action.c | 1 + tvp-git-helper/Makefile.am | 4 + tvp-git-helper/main.c | 17 +++ tvp-git-helper/tgh-clean-dialog.c | 171 +++++++++++++++++++++++++++ tvp-git-helper/tgh-clean-dialog.h | 58 +++++++++ tvp-git-helper/{tgh-add.c => tgh-clean.c} | 77 ++++++++---- tvp-git-helper/{tgh-clone.h => tgh-clean.h} | 8 +- tvp-git-helper/tgh-common.c | 86 +++++++++++++- tvp-git-helper/tgh-common.h | 2 + 10 files changed, 389 insertions(+), 38 deletions(-) diff --git a/README b/README index 5ec7ec6..f74b1cc 100644 --- a/README +++ b/README @@ -9,7 +9,8 @@ The current features are: export, import, lock, log, move, properties, relocate, resolved, revert, status, switch, unlock, update. - Subversion info in file properties dialog. -- Limmited git support: add, blame, branch, clone, log, reset, stash, status. +- Limmited git support: add, blame, branch, clean, clone, log, reset, stash, + status. Usage diff --git a/thunar-vcs-plugin/tvp-git-action.c b/thunar-vcs-plugin/tvp-git-action.c index ce1edba..59d58a4 100644 --- a/thunar-vcs-plugin/tvp-git-action.c +++ b/thunar-vcs-plugin/tvp-git-action.c @@ -268,6 +268,7 @@ tvp_git_action_create_menu_item (GtkAction *action) if(tvp_action->property.is_parent) add_subaction (action, GTK_MENU_SHELL(menu), "tvp::branch", Q_("Menu|Branch"), _("Branch"), NULL, "--branch"); add_subaction_u(GTK_MENU_SHELL(menu), "tvp::checkout", Q_("Menu|Checkout"), _("Checkout"), GTK_STOCK_CONNECT, _("Checkout")); + add_subaction (action, GTK_MENU_SHELL(menu), "tvp::clean", Q_("Menu|Clean"), _("Clean"), GTK_STOCK_CLEAR, "--clean"); if(tvp_action->property.is_parent) add_subaction (action, GTK_MENU_SHELL(menu), "tvp::clone", Q_("Menu|Clone"), _("Clone"), GTK_STOCK_COPY, "--clone"); add_subaction_u(GTK_MENU_SHELL(menu), "tvp::commit", Q_("Menu|Commit"), _("Commit"), GTK_STOCK_APPLY, _("Commit")); diff --git a/tvp-git-helper/Makefile.am b/tvp-git-helper/Makefile.am index 12a1932..1957d9c 100644 --- a/tvp-git-helper/Makefile.am +++ b/tvp-git-helper/Makefile.am @@ -20,6 +20,8 @@ tvp_git_helper_SOURCES = \ tgh-blame.c \ tgh-branch.h \ tgh-branch.c \ + tgh-clean.h \ + tgh-clean.c \ tgh-clone.h \ tgh-clone.c \ tgh-common.h \ @@ -38,6 +40,8 @@ tvp_git_helper_SOURCES = \ tgh-blame-dialog.c \ tgh-branch-dialog.h \ tgh-branch-dialog.c \ + tgh-clean-dialog.h \ + tgh-clean-dialog.c \ tgh-file-selection-dialog.h \ tgh-file-selection-dialog.c \ tgh-log-dialog.h \ diff --git a/tvp-git-helper/main.c b/tvp-git-helper/main.c index c1e6458..0690662 100644 --- a/tvp-git-helper/main.c +++ b/tvp-git-helper/main.c @@ -34,6 +34,7 @@ #include "tgh-blame.h" #include "tgh-branch.h" #include "tgh-clone.h" +#include "tgh-clean.h" #include "tgh-log.h" #include "tgh-reset.h" #include "tgh-stash.h" @@ -58,6 +59,7 @@ int main (int argc, char *argv[]) gboolean add = FALSE; gboolean blame = FALSE; gboolean branch = FALSE; + gboolean clean = FALSE; gboolean clone = FALSE; gboolean log = FALSE; gboolean reset = FALSE; @@ -94,6 +96,12 @@ int main (int argc, char *argv[]) { NULL, '\0', 0, 0, NULL, NULL, NULL } }; + GOptionEntry clean_options_table[] = + { + { "clean", '\0', 0, G_OPTION_ARG_NONE, &clean, N_("Execute clean action"), NULL }, + { NULL, '\0', 0, 0, NULL, NULL, NULL } + }; + GOptionEntry clone_options_table[] = { { "clone", '\0', 0, G_OPTION_ARG_NONE, &clone, N_("Execute clone action"), NULL }, @@ -144,6 +152,10 @@ int main (int argc, char *argv[]) g_option_group_add_entries(option_group, branch_options_table); g_option_context_add_group(option_context, option_group); + option_group = g_option_group_new("clean", N_("Clone Related Options:"), N_("Clean"), NULL, NULL); + g_option_group_add_entries(option_group, clean_options_table); + g_option_context_add_group(option_context, option_group); + option_group = g_option_group_new("clone", N_("Clone Related Options:"), N_("Clone"), NULL, NULL); g_option_group_add_entries(option_group, clone_options_table); g_option_context_add_group(option_context, option_group); @@ -191,6 +203,11 @@ int main (int argc, char *argv[]) has_child = tgh_branch(files, &pid); } + if(clean) + { + has_child = tgh_clean(files, &pid); + } + if(clone) { has_child = tgh_clone(files, &pid); diff --git a/tvp-git-helper/tgh-clean-dialog.c b/tvp-git-helper/tgh-clean-dialog.c new file mode 100644 index 0000000..24c2f6c --- /dev/null +++ b/tvp-git-helper/tgh-clean-dialog.c @@ -0,0 +1,171 @@ +/*- + * Copyright (c) 2006 Peter de Ridder <pe...@xfce.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#include <thunar-vfs/thunar-vfs.h> +#include <gtk/gtk.h> + +#include "tgh-clean-dialog.h" + +struct _TghCleanDialog +{ + GtkDialog dialog; + + GtkWidget *directories; + GtkWidget *ignore; + GtkWidget *force; +}; + +struct _TghCleanDialogClass +{ + GtkDialogClass dialog_class; +}; + +G_DEFINE_TYPE (TghCleanDialog, tgh_clean_dialog, GTK_TYPE_DIALOG) + +static void +tgh_clean_dialog_class_init (TghCleanDialogClass *klass) +{ +} + +static void +tgh_clean_dialog_init (TghCleanDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + GtkCellRenderer *renderer; + + dialog->directories = gtk_check_button_new_with_label (_("Remove directories.")); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), dialog->directories, FALSE, TRUE, 0); + gtk_widget_show(dialog->directories); + + model = GTK_TREE_MODEL (gtk_list_store_new (2, G_TYPE_STRING, G_TYPE_INT)); + + dialog->ignore = gtk_combo_box_new_with_model (model); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), dialog->ignore, FALSE, TRUE, 0); + gtk_widget_show(dialog->ignore); + + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + 0, _("Excldue ignored files"), + 1, TGH_CLEAN_IGNORE_EXCLUDE, + -1); + + gtk_combo_box_set_active_iter (GTK_COMBO_BOX (dialog->ignore), &iter); + + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + 0, _("Include ignored files"), + 1, TGH_CLEAN_IGNORE_INCLUDE, + -1); + + gtk_list_store_append (GTK_LIST_STORE (model), &iter); + gtk_list_store_set (GTK_LIST_STORE (model), &iter, + 0, _("Only ignored files"), + 1, TGH_CLEAN_IGNORE_ONLY, + -1); + + g_object_unref (model); + + renderer = gtk_cell_renderer_text_new (); + gtk_cell_layout_pack_start(GTK_CELL_LAYOUT (dialog->ignore), renderer, TRUE); + gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT (dialog->ignore), renderer, "text", 0); + + dialog->force = gtk_check_button_new_with_label (_("Force clean.")); + gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), dialog->force, FALSE, TRUE, 0); + gtk_widget_show(dialog->force); + + gtk_window_set_title (GTK_WINDOW (dialog), _("Clean")); + + gtk_dialog_add_buttons (GTK_DIALOG (dialog), + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_OK, GTK_RESPONSE_OK, + NULL); + gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); + gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK); + + gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE); +} + +GtkWidget* +tgh_clean_dialog_new (const gchar *title, GtkWindow *parent, GtkDialogFlags flags) +{ + TghCleanDialog *dialog = g_object_new (TSH_TYPE_TRUST_DIALOG, NULL); + + if(title) + gtk_window_set_title (GTK_WINDOW(dialog), title); + + if(parent) + gtk_window_set_transient_for (GTK_WINDOW(dialog), parent); + + if(flags & GTK_DIALOG_MODAL) + gtk_window_set_modal (GTK_WINDOW(dialog), TRUE); + + if(flags & GTK_DIALOG_DESTROY_WITH_PARENT) + gtk_window_set_destroy_with_parent (GTK_WINDOW(dialog), TRUE); + + if(flags & GTK_DIALOG_NO_SEPARATOR) + gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE); + + return GTK_WIDGET(dialog); +} + +gboolean +tgh_clean_dialog_get_diretories (TghCleanDialog *dialog) +{ + g_return_val_if_fail (TGH_IS_CLEAN_DIALOG (dialog), FALSE); + + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->directories)); +} + +TghCleanIgnore +tgh_clean_dialog_get_ignore (TghCleanDialog *dialog) +{ + GtkTreeModel *model; + GtkTreeIter iter; + TghCleanIgnore ignore; + GValue value; + + memset(&value, 0, sizeof(GValue)); + + g_return_val_if_fail (TGH_IS_CLEAN_DIALOG (dialog), TGH_CLEAN_IGNORE_EXCLUDE); + + g_return_val_if_fail (gtk_combo_box_get_active_iter (GTK_COMBO_BOX (dialog->ignore), &iter), TGH_CLEAN_IGNORE_EXCLUDE); + + model = gtk_combo_box_get_model (GTK_COMBO_BOX (dialog->ignore)); + gtk_tree_model_get_value (model, &iter, 1, &value); + + ignore = g_value_get_int (&value); + + g_value_unset(&value); + + return ignore; +} + +gboolean +tgh_clean_dialog_get_force (TghCleanDialog *dialog) +{ + g_return_val_if_fail (TGH_IS_CLEAN_DIALOG (dialog), FALSE); + + return gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (dialog->force)); +} + diff --git a/tvp-git-helper/tgh-clean-dialog.h b/tvp-git-helper/tgh-clean-dialog.h new file mode 100644 index 0000000..78ddeec --- /dev/null +++ b/tvp-git-helper/tgh-clean-dialog.h @@ -0,0 +1,58 @@ +/*- + * Copyright (c) 2006 Peter de Ridder <pe...@xfce.org> + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Library General Public + * License as published by the Free Software Foundation; either + * version 2 of the License, or (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Library General Public License for more details. + * + * You should have received a copy of the GNU Library General Public + * License along with this library; if not, write to the + * Free Software Foundation, Inc., 59 Temple Place - Suite 330, + * Boston, MA 02111-1307, USA. + */ + +#ifndef __TGH_CLEAN_DIALOG_H__ +#define __TGH_CLEAN_DIALOG_H__ + +#include <gtk/gtk.h> + +G_BEGIN_DECLS; + +typedef enum +{ + TGH_CLEAN_IGNORE_EXCLUDE, + TGH_CLEAN_IGNORE_INCLUDE, + TGH_CLEAN_IGNORE_ONLY +} TghCleanIgnore; + +typedef struct _TghCleanDialogClass TghCleanDialogClass; +typedef struct _TghCleanDialog TghCleanDialog; + +#define TSH_TYPE_TRUST_DIALOG (tgh_clean_dialog_get_type ()) +#define TGH_CLEAN_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), TSH_TYPE_TRUST_DIALOG, TghCleanDialog)) +#define TGH_CLEAN_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_CAST ((klass), TSH_TYPE_TRUST_DIALOG, TghCleanDialogClass)) +#define TGH_IS_CLEAN_DIALOG(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TSH_TYPE_TRUST_DIALOG)) +#define TGH_IS_CLEAN_DIALOG_CLASS(klass) (G_TYPE_CHECK_CLASS_TYPE ((klass), TSH_TYPE_TRUST_DIALOG)) +#define TGH_CLEAN_DIALOG_GET_CLASS(obj) (G_TYPE_INSTANCE_GET_CLASS ((obj), TSH_TYPE_TRUST_DIALOG, TghCleanDialogClass)) + +GType tgh_clean_dialog_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL; + +GtkWidget* tgh_clean_dialog_new (const gchar *title, + GtkWindow *parent, + GtkDialogFlags flags) G_GNUC_MALLOC G_GNUC_INTERNAL; + +gboolean tgh_clean_dialog_get_diretories (TghCleanDialog *dialog); + +TghCleanIgnore tgh_clean_dialog_get_ignore (TghCleanDialog *dialog); + +gboolean tgh_clean_dialog_get_force (TghCleanDialog *dialog); + +G_END_DECLS; + +#endif /* !__TGH_CLEAN_DIALOG_H__ */ diff --git a/tvp-git-helper/tgh-add.c b/tvp-git-helper/tgh-clean.c similarity index 51% copy from tvp-git-helper/tgh-add.c copy to tvp-git-helper/tgh-clean.c index f55816d..ca1fa53 100644 --- a/tvp-git-helper/tgh-add.c +++ b/tvp-git-helper/tgh-clean.c @@ -37,12 +37,12 @@ #include "tgh-common.h" #include "tgh-dialog-common.h" -#include "tgh-file-selection-dialog.h" +#include "tgh-clean-dialog.h" #include "tgh-notify-dialog.h" -#include "tgh-add.h" +#include "tgh-clean.h" -static gboolean add_spawn (GtkWidget *dialog, gchar **files, GPid *pid) +static gboolean clean_spawn (GtkWidget *dialog, gchar **files, gboolean direcotries, TghCleanIgnore ignore, gboolean force, GPid *pid) { GError *error = NULL; gint fd_out, fd_err; @@ -52,43 +52,66 @@ static gboolean add_spawn (GtkWidget *dialog, gchar **files, GPid *pid) gint i; gchar **argv; - length = 5; - length += g_strv_length(files); + length = 4; + if (direcotries) + length++; + if (ignore != TGH_CLEAN_IGNORE_EXCLUDE) + length++; + if (force) + length++; + length += g_strv_length (files); - argv = g_new(gchar*, length); + argv = g_new (gchar*, length); argv[0] = "git"; - argv[1] = "add"; - argv[2] = "-v"; - argv[3] = "--"; + argv[1] = "clean"; argv[length-1] = NULL; - i = 4; - while(*files) + i = 2; + if (direcotries) + argv[i++] = "-d"; + switch (ignore) + { + case TGH_CLEAN_IGNORE_EXCLUDE: + break; + case TGH_CLEAN_IGNORE_INCLUDE: + argv[i++] = "-x"; + break; + case TGH_CLEAN_IGNORE_ONLY: + argv[i++] = "-X"; + break; + } + if (force) + argv[i++] = "-f"; + argv[i++] = "--"; + + while (*files) argv[i++] = *files++; - if(!g_spawn_async_with_pipes(NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, NULL, NULL, pid, NULL, &fd_out, &fd_err, &error)) + if (!g_spawn_async_with_pipes (NULL, argv, NULL, G_SPAWN_DO_NOT_REAP_CHILD | G_SPAWN_SEARCH_PATH, NULL, NULL, pid, NULL, &fd_out, &fd_err, &error)) { g_free (argv); return FALSE; } g_free (argv); - parser = tgh_error_parser_new(GTK_WIDGET(dialog)); + parser = tgh_error_parser_new (GTK_WIDGET (dialog)); - g_child_watch_add(*pid, (GChildWatchFunc)tgh_child_exit, parser); + g_child_watch_add (*pid, (GChildWatchFunc)tgh_child_exit, parser); - chan_out = g_io_channel_unix_new(fd_out); - chan_err = g_io_channel_unix_new(fd_err); - g_io_add_watch(chan_out, G_IO_IN|G_IO_HUP, (GIOFunc)tgh_parse_output_func, tgh_notify_parser_new(GTK_WIDGET(dialog))); - g_io_add_watch(chan_err, G_IO_IN|G_IO_HUP, (GIOFunc)tgh_parse_output_func, parser); + chan_out = g_io_channel_unix_new (fd_out); + chan_err = g_io_channel_unix_new (fd_err); + g_io_add_watch (chan_out, G_IO_IN|G_IO_HUP, (GIOFunc)tgh_parse_output_func, tgh_clean_parser_new (dialog)); + g_io_add_watch (chan_err, G_IO_IN|G_IO_HUP, (GIOFunc)tgh_parse_output_func, parser); return TRUE; } -gboolean tgh_add (gchar **files, GPid *pid) +gboolean tgh_clean (gchar **files, GPid *pid) { GtkWidget *dialog; + gboolean direcotries, force; + TghCleanIgnore ignore; if (files) if (chdir(files[0])) @@ -102,23 +125,23 @@ gboolean tgh_add (gchar **files, GPid *pid) g_free (dirname); } - dialog = tgh_file_selection_dialog_new (_("Add"), NULL, 0, TGH_FILE_SELECTION_FLAG_MODIFIED|TGH_FILE_SELECTION_FLAG_UNTRACKED); + dialog = tgh_clean_dialog_new (NULL, NULL, 0); if (gtk_dialog_run (GTK_DIALOG (dialog)) != GTK_RESPONSE_OK) { gtk_widget_destroy (dialog); return FALSE; } - g_strfreev (files); - files = tgh_file_selection_dialog_get_files (TGH_FILE_SELECTION_DIALOG (dialog)); - gtk_widget_destroy (dialog); - if (!files) - return FALSE; + direcotries = tgh_clean_dialog_get_diretories (TGH_CLEAN_DIALOG (dialog)); + ignore = tgh_clean_dialog_get_ignore (TGH_CLEAN_DIALOG (dialog)); + force = tgh_clean_dialog_get_force (TGH_CLEAN_DIALOG (dialog)); + + gtk_widget_destroy (dialog); - dialog = tgh_notify_dialog_new (_("Add"), NULL, 0); + dialog = tgh_notify_dialog_new (_("Clean"), NULL, 0); g_signal_connect (dialog, "cancel-clicked", tgh_cancel, NULL); tgh_dialog_start (GTK_DIALOG(dialog), TRUE); - return add_spawn (dialog, files, pid); + return clean_spawn (dialog, files, direcotries, ignore, force, pid); } diff --git a/tvp-git-helper/tgh-clone.h b/tvp-git-helper/tgh-clean.h similarity index 86% copy from tvp-git-helper/tgh-clone.h copy to tvp-git-helper/tgh-clean.h index d8af9da..cadb048 100644 --- a/tvp-git-helper/tgh-clone.h +++ b/tvp-git-helper/tgh-clean.h @@ -14,14 +14,14 @@ * Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifndef __TGH_CLONE_H__ -#define __TGH_CLONE_H__ +#ifndef __TGH_CLEAN_H__ +#define __TGH_CLEAN_H__ G_BEGIN_DECLS -gboolean tgh_clone (gchar **, GPid *); +gboolean tgh_clean (gchar **, GPid *); G_END_DECLS -#endif /*__TGH_CLONE_H__*/ +#endif /*__TGH_CLEAN_H__*/ diff --git a/tvp-git-helper/tgh-common.c b/tvp-git-helper/tgh-common.c index 26150ca..8daddac 100644 --- a/tvp-git-helper/tgh-common.c +++ b/tvp-git-helper/tgh-common.c @@ -46,12 +46,41 @@ #include "tgh-common.h" static void -create_error_dialog(GtkWindow *parent, gchar *message) +create_error_dialog (GtkWindow *parent, gchar *message) { - GtkWidget *error; - error = gtk_message_dialog_new(GTK_WINDOW(parent), GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Status failed")); - gtk_message_dialog_format_secondary_text(GTK_MESSAGE_DIALOG(error), "%s", g_strstrip(message)); - tgh_dialog_start(GTK_DIALOG(error), FALSE); + if (TGH_IS_NOTIFY_DIALOG (parent)) + { + gchar **lines, **iter; + lines = g_strsplit_set (message, "\r\n", -1); + + for (iter = lines; *iter; iter++) + { + gchar *action, *text; + + if ((*iter)[1]) + { + text = *iter; + action = strchr (text, ':'); + if (action) + { + *action = '\0'; + text = action+2; + action = *iter; + } + + tgh_notify_dialog_add (TGH_NOTIFY_DIALOG (parent), action, text); + } + } + + g_strfreev (lines); + } + else + { + GtkWidget *error; + error = gtk_message_dialog_new (parent?GTK_WINDOW (parent):NULL, parent?GTK_DIALOG_DESTROY_WITH_PARENT | GTK_DIALOG_MODAL:0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK, _("Failed")); + gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (error), "%s", g_strstrip (message)); + tgh_dialog_start (GTK_DIALOG (error), FALSE); + } } void @@ -70,7 +99,7 @@ void tgh_child_exit(GPid pid, gint status, gpointer user_data) { TghErrorParser *parser = user_data; - if(WEXITSTATUS(status) > 1) + if(WEXITSTATUS(status)) { if(parser->done) create_error_dialog(GTK_WINDOW(parser->dialog), parser->error); @@ -493,6 +522,51 @@ tgh_blame_parser_new (GtkWidget *dialog) return TGH_OUTPUT_PARSER (parser); } +typedef struct { + TghOutputParser parent; + GtkWidget *dialog; +} TghCleanParser; + +static void +clean_parser_func(TghNotifyParser *parser, gchar *line) +{ + TghNotifyDialog *dialog = TGH_NOTIFY_DIALOG(parser->dialog); + if(line) + { + gchar *action, *file; + + action = file = line; + if (g_ascii_strncasecmp (line, "Would ", 6) == 0) + file += 6; + + if (g_ascii_strncasecmp (file, "Not ", 4) == 0) + file += 4; + + file = strchr (file, ' '); + *file++ = '\0'; + file[strlen (file)-1] = '\0'; + + tgh_notify_dialog_add(dialog, action, file); + } + else + { + tgh_notify_dialog_done(dialog); + g_free(parser); + } +} + +TghOutputParser* +tgh_clean_parser_new (GtkWidget *dialog) +{ + TghCleanParser *parser = g_new(TghCleanParser,1); + + TGH_OUTPUT_PARSER(parser)->parse = TGH_OUTPUT_PARSER_FUNC(clean_parser_func); + + parser->dialog = dialog; + + return TGH_OUTPUT_PARSER(parser); +} + gboolean tgh_parse_output_func(GIOChannel *source, GIOCondition condition, gpointer data) { diff --git a/tvp-git-helper/tgh-common.h b/tvp-git-helper/tgh-common.h index d324aee..a8c26fb 100644 --- a/tvp-git-helper/tgh-common.h +++ b/tvp-git-helper/tgh-common.h @@ -49,6 +49,8 @@ TghOutputParser* tgh_stash_show_parser_new (GtkWidget *); TghOutputParser* tgh_blame_parser_new (GtkWidget *); +TghOutputParser* tgh_clean_parser_new (GtkWidget *); + gboolean tgh_parse_output_func (GIOChannel *, GIOCondition, gpointer); G_END_DECLS _______________________________________________ Xfce4-commits mailing list Xfce4-commits@xfce.org http://foo-projects.org/mailman/listinfo/xfce4-commits