Don't leak the log message in commit and merge dialogs.
[anjuta-git-plugin.git] / plugins / git / git-commit-dialog.c
blob65c0ac938b6579dca83dfee4d6afdb85721794bc
1 /* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 4; tab-width: 4 -*- */
2 /*
3 * anjuta
4 * Copyright (C) James Liggett 2008 <jrliggett@cox.net>
5 *
6 * anjuta is free software.
7 *
8 * You may redistribute it and/or modify it under the terms of the
9 * GNU General Public License, as published by the Free Software
10 * Foundation; either version 2 of the License, or (at your option)
11 * any later version.
13 * anjuta is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
16 * See the GNU General Public License for more details.
18 * You should have received a copy of the GNU General Public License
19 * along with anjuta. If not, write to:
20 * The Free Software Foundation, Inc.,
21 * 51 Franklin Street, Fifth Floor
22 * Boston, MA 02110-1301, USA.
25 #include "git-commit-dialog.h"
27 static void
28 on_commit_command_finished (AnjutaCommand *command, guint return_code,
29 Git *plugin)
31 AnjutaStatus *status;
33 status = anjuta_shell_get_status (ANJUTA_PLUGIN (plugin)->shell,
34 NULL);
36 anjuta_status (status, _("Git: Commit complete."), 5);
38 report_errors (command, return_code);
40 g_object_unref (command);
44 static void
45 on_commit_dialog_response (GtkDialog *dialog, gint response_id,
46 GitUIData *data)
48 GtkWidget *log_view;
49 gchar *log;
50 GtkWidget *log_prompt_dialog;
51 gint prompt_response;
52 GtkWidget *status_view;
53 GtkWidget *resolve_check;
54 GList *selected_paths;
55 GitCommitCommand *commit_command;
57 if (response_id == GTK_RESPONSE_OK)
59 log_view = glade_xml_get_widget (data->gxml, "log_view");
60 log = get_log_from_textview (log_view);
62 if (!g_utf8_strlen(log, -1))
64 log_prompt_dialog = gtk_message_dialog_new(GTK_WINDOW(dialog),
65 GTK_DIALOG_DESTROY_WITH_PARENT,
66 GTK_MESSAGE_INFO,
67 GTK_BUTTONS_YES_NO,
68 _("Are you sure that you want to pass an empty log message?"));
70 prompt_response = gtk_dialog_run(GTK_DIALOG (log_prompt_dialog));
71 gtk_widget_destroy (log_prompt_dialog);
73 if (prompt_response == GTK_RESPONSE_NO)
74 return;
77 status_view = glade_xml_get_widget (data->gxml, "status_view");
78 resolve_check = glade_xml_get_widget (data->gxml, "resolve_check");
79 selected_paths = anjuta_vcs_status_tree_view_get_selected (ANJUTA_VCS_STATUS_TREE_VIEW (status_view));
80 commit_command = git_commit_command_new (data->plugin->project_root_directory,
81 gtk_toggle_button_get_active (GTK_TOGGLE_BUTTON (resolve_check)),
82 log,
83 selected_paths);
85 g_free (log);
86 git_command_free_path_list (selected_paths);
88 create_message_view (data->plugin);
90 g_signal_connect (G_OBJECT (commit_command), "command-finished",
91 G_CALLBACK (on_commit_command_finished),
92 data->plugin);
94 g_signal_connect (G_OBJECT (commit_command), "data-arrived",
95 G_CALLBACK (on_command_info_arrived),
96 data->plugin);
98 anjuta_command_start (ANJUTA_COMMAND (commit_command));
101 gtk_widget_destroy (GTK_WIDGET (dialog));
102 git_ui_data_free (data);
105 static void
106 select_all_files (AnjutaCommand *command, guint return_code,
107 AnjutaVcsStatusTreeView *status_view)
109 anjuta_vcs_status_tree_view_select_all (status_view);
112 static void
113 commit_dialog (Git *plugin)
115 GladeXML *gxml;
116 GtkWidget *dialog;
117 GtkWidget *select_all_button;
118 GtkWidget *clear_button;
119 GtkWidget *status_view;
120 GtkWidget *status_progress_bar;
121 GitStatusCommand *status_command;
122 GitUIData *data;
124 gxml = glade_xml_new (GLADE_FILE, "commit_dialog", NULL);
126 dialog = glade_xml_get_widget (gxml, "commit_dialog");
127 select_all_button = glade_xml_get_widget (gxml, "select_all_button");
128 clear_button = glade_xml_get_widget (gxml, "clear_button");
129 status_view = glade_xml_get_widget (gxml, "status_view");
130 status_progress_bar = glade_xml_get_widget (gxml, "status_progress_bar");
132 status_command = git_status_command_new (plugin->project_root_directory);
134 g_signal_connect (G_OBJECT (select_all_button), "clicked",
135 G_CALLBACK (select_all_status_items),
136 status_view);
138 g_signal_connect (G_OBJECT (clear_button), "clicked",
139 G_CALLBACK (clear_all_status_selections),
140 status_view);
142 g_signal_connect (G_OBJECT (status_command), "command-finished",
143 G_CALLBACK (select_all_files),
144 status_view);
146 pulse_progress_bar (GTK_PROGRESS_BAR (status_progress_bar));
148 g_signal_connect (G_OBJECT (status_command), "command-finished",
149 G_CALLBACK (cancel_data_arrived_signal_disconnect),
150 status_view);
152 g_signal_connect (G_OBJECT (status_command), "command-finished",
153 G_CALLBACK (hide_pulse_progress_bar),
154 status_progress_bar);
156 g_signal_connect (G_OBJECT (status_command), "command-finished",
157 G_CALLBACK (on_command_finished),
158 NULL);
160 g_signal_connect (G_OBJECT (status_command), "data-arrived",
161 G_CALLBACK (on_status_command_data_arrived),
162 status_view);
164 g_object_weak_ref (G_OBJECT (status_view),
165 (GWeakNotify) disconnect_data_arrived_signals,
166 status_command);
168 anjuta_command_start (ANJUTA_COMMAND (status_command));
170 data = git_ui_data_new (plugin, gxml);
172 g_signal_connect(G_OBJECT (dialog), "response",
173 G_CALLBACK (on_commit_dialog_response),
174 data);
176 gtk_widget_show_all (dialog);
179 void
180 on_menu_git_commit (GtkAction *action, Git *plugin)
182 commit_dialog (plugin);