SF.net SVN: geany: [1987] trunk
ntrel at users.sourceforge.net
ntrel at xxxxx
Mon Oct 29 12:57:23 UTC 2007
Revision: 1987
http://geany.svn.sourceforge.net/geany/?rev=1987&view=rev
Author: ntrel
Date: 2007-10-29 05:57:23 -0700 (Mon, 29 Oct 2007)
Log Message:
-----------
Factor out common make_diff() and show_output() functions for both
file and directory diffs.
Show any SVN error message on the status bar.
Use directory name as prefix for output filename when doing a
directory diff.
Don't remove filename extension for file diffs.
Fix some memory leaks.
Modified Paths:
--------------
trunk/ChangeLog
trunk/plugins/svndiff.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-10-28 21:14:35 UTC (rev 1986)
+++ trunk/ChangeLog 2007-10-29 12:57:23 UTC (rev 1987)
@@ -1,3 +1,15 @@
+2007-10-29 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
+
+ * plugins/svndiff.c:
+ Factor out common make_diff() and show_output() functions for both
+ file and directory diffs.
+ Show any SVN error message on the status bar.
+ Use directory name as prefix for output filename when doing a
+ directory diff.
+ Don't remove filename extension for file diffs.
+ Fix some memory leaks.
+
+
2007-10-28 Enrico Tröger <enrico.troeger at uvena.de>
* doc/geany.txt, src/build.c, src/project.c, src/project.h:
Modified: trunk/plugins/svndiff.c
===================================================================
--- trunk/plugins/svndiff.c 2007-10-28 21:14:35 UTC (rev 1986)
+++ trunk/plugins/svndiff.c 2007-10-29 12:57:23 UTC (rev 1987)
@@ -42,21 +42,93 @@
PLUGIN_INFO(_("SVNdiff"), _("Plugin to create a patch of a file against svn"), VERSION)
+/* name_prefix should be in UTF-8, and can have a path. */
+static void show_output(const gchar *std_output, const gchar *name_prefix,
+ const gchar *force_encoding)
+{
+ gchar *text, *detect_enc = NULL;
+ gint new_idx;
+ gchar *filename;
+
+ filename = g_path_get_basename(name_prefix);
+ setptr(filename, g_strconcat(filename, ".svn.diff", NULL));
+
+ // need to convert input text from the encoding of the original file into
+ // UTF-8 because internally Geany always needs UTF-8
+ if (force_encoding)
+ {
+ text = geany_data->encoding->convert_to_utf8_from_charset(
+ std_output, -1, force_encoding, TRUE);
+ }
+ else
+ {
+ text = geany_data->encoding->convert_to_utf8(std_output, -1, &detect_enc);
+ }
+ if (text)
+ {
+ new_idx = geany_data->document->new_file(filename,
+ geany_data->filetypes[GEANY_FILETYPES_DIFF], text);
+
+ geany_data->document->set_encoding(new_idx,
+ force_encoding ? force_encoding : detect_enc);
+ }
+ else
+ {
+ ui->set_statusbar(FALSE, _("Could not parse the output of svn diff"));
+ }
+ g_free(text);
+ g_free(detect_enc);
+ g_free(filename);
+}
+
+
+static gchar *make_diff(const gchar *svn_file)
+{
+ gchar *std_output = NULL;
+ gchar *std_error = NULL;
+ gint exit_code;
+ gchar *command, *text = NULL;
+
+ // use '' quotation for Windows compatibility
+ command = g_strdup_printf("svn diff --non-interactive '%s'", svn_file);
+
+ if (g_spawn_command_line_sync(command, &std_output, &std_error, &exit_code, NULL))
+ {
+ if (! exit_code)
+ {
+ if (NZV(std_output))
+ {
+ text = std_output;
+ }
+ else
+ {
+ ui->set_statusbar(FALSE, _("No changes were made."));
+ }
+ }
+ else
+ { // SVN returns some error
+ ui->set_statusbar(FALSE,
+ _("SVN exited with an error: %s."), g_strstrip(std_error));
+ }
+ }
+ else
+ {
+ ui->set_statusbar(FALSE,
+ _("Something went really wrong. Is there any svn-binary in your path?"));
+ }
+ g_free(std_error);
+ g_free(command);
+ return text;
+}
+
+
/* Callback if menu item for the current project or directory was activated */
static void svndirectory_activated(GtkMenuItem *menuitem, gpointer gdata)
{
- guint idx, new_idx;
+ guint idx;
gchar *base_name = NULL;
- gchar *command = NULL;
- gchar *project_name = NULL;
- gchar *std_output = NULL;
- gchar *std_err = NULL;
- gint exit_code;
- GError *error = NULL;
- gchar *filename = NULL;
gchar *locale_filename = NULL;
- gchar *text = NULL;
- gchar *dir_enc = NULL;
+ const gchar *project_name = NULL;
idx = documents->get_cur_idx();
@@ -66,7 +138,7 @@
{
documents->save_file(idx, FALSE);
}
- base_name = project->base_path;
+ base_name = g_strdup(project->base_path);
project_name = project->name;
}
else if (doc_list[idx].file_name != NULL)
@@ -89,69 +161,35 @@
if (base_name != NULL)
{
- command = g_strconcat("svn diff ", base_name, NULL);
-
+ const gchar *filename;
+ gchar *text;
+
if (project_name != NULL)
{
- filename = g_strconcat(project_name,".diff", NULL);
+ filename = project_name;
}
else
{
- filename = g_strdup("dir.diff");
+ filename = base_name;
}
-
- if (g_spawn_command_line_sync(command, &std_output, &std_err, &exit_code, &error))
- {
- if (! exit_code)
- {
- if (std_output == NULL || std_output[0] != '\0')
- {
- if (filename != NULL)
- // Be carefull with mixed up encodings
- {
- text = encodings->convert_to_utf8(std_output, -1, &dir_enc);
- new_idx = documents->new_file(filename, NULL, std_output);
- documents->set_encoding(new_idx, dir_enc);
- g_free(text);
- g_free(dir_enc);
- g_free(filename);
- }
-
- }
- else
- {
- ui->set_statusbar(FALSE, _("No changes were made."));
- }
- }
- else
- { // SVN returns some error
- ui->set_statusbar(FALSE,
- _("Something went really wrong. Is there any svn-binary in your path?"));
- }
- }
+ text = make_diff(base_name);
+ if (text)
+ show_output(text, filename, NULL);
+ g_free(text);
}
else
{
ui->set_statusbar(FALSE, _("Could not determine a path to work in"));
}
+ g_free(locale_filename);
+ g_free(base_name);
}
-/* Callback if menu item for a single file was acitvated */
+/* Callback if menu item for a single file was activated */
static void svnfile_activated(GtkMenuItem *menuitem, gpointer gdata)
{
- gchar *command;
gint idx;
- gchar *diff_file_name = NULL;
- gchar *std_output = NULL;
- gchar *std_err = NULL;
- gint exit_code;
- GError *error = NULL;
- gint new_idx;
- gchar *text = NULL;
- gchar *base_name = NULL;
- gchar *short_name = NULL;
- gchar *locale_filename = NULL;
idx = documents->get_cur_idx();
@@ -164,76 +202,23 @@
documents->save_file(idx, FALSE);
}
- // Stolen from export.c. Thanks for it, Enrico ;)
if (doc_list[idx].file_name != NULL)
{
- base_name = g_path_get_basename(doc_list[idx].file_name);
- short_name = utils->remove_ext_from_filename(base_name);
+ gchar *locale_filename, *text;
+
locale_filename = utils->get_locale_from_utf8(doc_list[idx].file_name);
-
- // use '' quotation for Windows compatibility
- command = g_strdup_printf("svn diff --non-interactive '%s'", locale_filename);
-
- diff_file_name = g_strconcat(short_name, ".svn.diff", NULL);
-
- g_free(base_name);
- g_free(short_name);
+ text = make_diff(locale_filename);
+ if (text)
+ show_output(text, doc_list[idx].file_name, doc_list[idx].encoding);
+ g_free(text);
g_free(locale_filename);
-
-
- if (g_spawn_command_line_sync(command, &std_output, &std_err, &exit_code, &error))
- {
- if (! exit_code)
- {
- if (std_output == NULL || std_output[0] != '\0')
- {
-
- // need to convert input text from the encoding of the original file into
- // UTF-8 because internally Geany always needs UTF-8
- text = encodings->convert_to_utf8_from_charset(
- std_output, -1, doc_list[idx].encoding, TRUE);
-
- if (text == NULL)
- {
- ui->set_statusbar(FALSE, _("Could not parse the output of svn diff"));
- }
- else
- {
- new_idx = documents->new_file(diff_file_name,
- geany_data->filetypes[GEANY_FILETYPES_DIFF], text);
- documents->set_encoding(new_idx, doc_list[idx].encoding);
- g_free(text);
- }
- }
- else
- {
- ui->set_statusbar(FALSE, _("Current file has no changes."));
- }
- }
- else // SVN returns some error
- {
- /// TODO print std_err or print detailed error messages based on exit_code
- ui->set_statusbar(FALSE,
- _("SVN exited with an error. Error code was: %d."), exit_code);
- }
- }
- else
- {
- ui->set_statusbar(FALSE,
- _("Something went really wrong. Is there any svn-binary in your path?"));
- }
- g_free(command);
- g_free(diff_file_name);
}
else
{
ui->set_statusbar(FALSE,
_("File is unnamed. Can't go on with processing."));
}
- g_free(std_output);
- g_free(std_err);
- g_free(error);
}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
More information about the Commits
mailing list