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