Kaydet (Commit) 04c7d00a authored tarafından Frank Lanitz's avatar Frank Lanitz

SVNdiff: Improvment of handling of non-UTF diffs

git-svn-id: https://geany.svn.sourceforge.net/svnroot/geany/trunk@1968 ea778897-0a13-0410-b9d1-a72fbfd435f5
üst 0c79897d
2007-10-23 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
* plugins/svndiff.c:
Small improvments in handling of non UTF-8 diffs.
2007-10-22 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de> 2007-10-22 Enrico Tröger <enrico(dot)troeger(at)uvena(dot)de>
* src/notebook.c: Don't make notebook tabs higher than necessary. * src/notebook.c: Don't make notebook tabs higher than necessary.
......
...@@ -18,11 +18,9 @@ ...@@ -18,11 +18,9 @@
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*/ */
/* SVNdiff plugin */ /* SVNdiff plugin */
/* This small plugin uses svn to generate a diff against the current /* This small plugin uses svn to generate a diff against the current
* version inside svn. Keep in mind, that it saves your version you currently working * version inside svn.*/
* on and some changes may get lost by accident. */
#include "geany.h" #include "geany.h"
#include "support.h" #include "support.h"
...@@ -38,9 +36,9 @@ GeanyData *geany_data; ...@@ -38,9 +36,9 @@ GeanyData *geany_data;
#define doc_array geany_data->doc_array #define doc_array geany_data->doc_array
VERSION_CHECK(21) VERSION_CHECK(25)
PLUGIN_INFO(_("SVNdiff"), _("Plugin to create a patch of a file against svn"), "0.0.2") PLUGIN_INFO(_("SVNdiff"), _("Plugin to create a patch of a file against svn"), "0.0.3")
/* Callback if menu item was acitvated */ /* Callback if menu item was acitvated */
...@@ -52,23 +50,32 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata) ...@@ -52,23 +50,32 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata)
gchar *std_output = NULL; gchar *std_output = NULL;
gchar *std_err = NULL; gchar *std_err = NULL;
gint exit_code; gint exit_code;
GError *error_code = NULL; GError *error = NULL;
gint new_idx;
gchar *text = NULL;
gchar *base_name = NULL;
gchar *short_name = NULL;
gchar *locale_filename = NULL;
idx = geany_data->document->get_cur_idx(); idx = geany_data->document->get_cur_idx();
if (doc_list[idx].file_name == NULL)
{
geany_data->dialogs->show_save_as();
}
else if (doc_list[idx].changed)
{
geany_data->document->save_file(idx, FALSE);
}
// Stolen from export.c. Thanks for it, Enrico ;) // Stolen from export.c. Thanks for it, Enrico ;)
if (doc_list[idx].file_name != NULL) if (doc_list[idx].file_name != NULL)
{ {
gchar *base_name = g_path_get_basename(doc_list[idx].file_name); base_name = g_path_get_basename(doc_list[idx].file_name);
gchar *short_name = utils->remove_ext_from_filename(base_name); short_name = utils->remove_ext_from_filename(base_name);
gchar *locale_filename = utils->get_locale_from_utf8(doc_list[idx].file_name); locale_filename = utils->get_locale_from_utf8(doc_list[idx].file_name);
if (! geany_data->document->save_file(idx, TRUE))
{
geany_data->msgwindow->status_add(_("File %s couldn't be saved."
"Will go on with last saved version."),base_name);
}
// use '' quotation for Windows compatibility // use '' quotation for Windows compatibility
command = g_strdup_printf("svn diff --non-interactive '%s'", locale_filename); command = g_strdup_printf("svn diff --non-interactive '%s'", locale_filename);
...@@ -79,14 +86,29 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata) ...@@ -79,14 +86,29 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata)
g_free(locale_filename); g_free(locale_filename);
if (g_spawn_command_line_sync(command, &std_output, &std_err, &exit_code, &error_code)) if (g_spawn_command_line_sync(command, &std_output, &std_err, &exit_code, &error))
{ {
if (! exit_code) if (! exit_code)
{ {
if (std_output == NULL || std_output[0] != '\0') if (std_output == NULL || std_output[0] != '\0')
{ {
geany_data->document->new_file(diff_file_name,
geany_data->filetypes[GEANY_FILETYPES_DIFF], std_output); // need to convert input text from the encoding of the original file into
// UTF-8 because internally Geany always needs UTF-8
text = geany_data->encoding->convert_to_utf8_from_charset(
std_output, -1, doc_list[idx].encoding, TRUE);
if (text == NULL)
{
geany_data->msgwindow->status_add(_("Could not parse the output of svn diff"));
}
else
{
new_idx = geany_data->document->new_file(diff_file_name,
geany_data->filetypes[GEANY_FILETYPES_DIFF], text);
geany_data->document->set_encoding(new_idx, doc_list[idx].encoding);
g_free(text);
}
} }
else else
{ {
...@@ -95,7 +117,7 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata) ...@@ -95,7 +117,7 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata)
} }
else // SVN returns some error else // SVN returns some error
{ {
// TODO print std_err or print detailed error messages based on exit_code /// TODO print std_err or print detailed error messages based on exit_code
geany_data->msgwindow->status_add( geany_data->msgwindow->status_add(
_("SVN exited with an error. Error code was: %d."), exit_code); _("SVN exited with an error. Error code was: %d."), exit_code);
} }
...@@ -115,6 +137,7 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata) ...@@ -115,6 +137,7 @@ static void item_activated(GtkMenuItem *menuitem, gpointer gdata)
} }
g_free(std_output); g_free(std_output);
g_free(std_err); g_free(std_err);
g_free(error);
} }
...@@ -129,9 +152,8 @@ void init(GeanyData *data) ...@@ -129,9 +152,8 @@ void init(GeanyData *data)
gtk_container_add(GTK_CONTAINER(geany_data->tools_menu), svndiff_item); gtk_container_add(GTK_CONTAINER(geany_data->tools_menu), svndiff_item);
g_signal_connect(G_OBJECT(svndiff_item), "activate", G_CALLBACK(item_activated), NULL); g_signal_connect(G_OBJECT(svndiff_item), "activate", G_CALLBACK(item_activated), NULL);
// keep a pointer to the menu item, so we can remove it when the
// plugin is unloaded
plugin_fields->menu_item = svndiff_item; plugin_fields->menu_item = svndiff_item;
plugin_fields->flags = PLUGIN_IS_DOCUMENT_SENSITIVE;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment