SF.net SVN: geany: [1977] trunk
frlan at users.sourceforge.net
frlan at xxxxx
Thu Oct 25 17:38:35 UTC 2007
Revision: 1977
http://geany.svn.sourceforge.net/geany/?rev=1977&view=rev
Author: frlan
Date: 2007-10-25 10:38:35 -0700 (Thu, 25 Oct 2007)
Log Message:
-----------
Added feature to make a diff from an open project or a current directory
Modified Paths:
--------------
trunk/ChangeLog
trunk/plugins/svndiff.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-10-25 07:21:31 UTC (rev 1976)
+++ trunk/ChangeLog 2007-10-25 17:38:35 UTC (rev 1977)
@@ -1,3 +1,10 @@
+2007-10-25 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
+
+ * plugins/svndiff.c:
+ Added feature to make a diff from an open project or a
+ current directory.
+
+
2007-10-24 Nick Treleaven <nick(dot)treleaven(at)btinternet(dot)com>
* src/build.c, src/ui_utils.h, src/tools.c, src/project.c, src/geany.h,
Modified: trunk/plugins/svndiff.c
===================================================================
--- trunk/plugins/svndiff.c 2007-10-25 07:21:31 UTC (rev 1976)
+++ trunk/plugins/svndiff.c 2007-10-25 17:38:35 UTC (rev 1977)
@@ -2,6 +2,8 @@
* svndiff.c - this file is part of Geany, a fast and lightweight IDE
*
* Copyright 2007 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
+ * Copyright 2007 Enrico Tröger <enrico.troeger at uvena.de>
+ * Copyright 2007 Nick Treleaven <nick.treleaven at btinternet.com>
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
@@ -27,8 +29,9 @@
#include "plugindata.h"
#include "document.h"
#include "filetypes.h"
+#include "utils.h"
+#include "project.h"
-
PluginFields *plugin_fields;
GeanyData *geany_data;
@@ -39,11 +42,106 @@
VERSION_CHECK(25)
-PLUGIN_INFO(_("SVNdiff"), _("Plugin to create a patch of a file against svn"), "0.0.3")
+PLUGIN_INFO(_("SVNdiff"), _("Plugin to create a patch of a file against svn"), "0.0.4")
+/* Callback if menu item for the current procet or directory was acitvated */
+static void svndirectory_activated(GtkMenuItem *menuitem, gpointer gdata)
+{
+ guint idx, new_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;
-/* Callback if menu item was acitvated */
-static void item_activated(GtkMenuItem *menuitem, gpointer gdata)
+ GeanyProject *geany_project = geany_data->app->project;
+
+ idx = geany_data->document->get_cur_idx();
+
+ if (geany_project != NULL && NZV(geany_project->base_path))
+ {
+ if (doc_list[idx].file_name != NULL)
+ {
+ geany_data->document->save_file(idx, FALSE);
+ }
+ base_name = geany_project->base_path;
+ project_name = geany_project->name;
+ }
+ else if (doc_list[idx].file_name != NULL)
+ {
+ if (doc_list[idx].changed)
+ {
+ geany_data->document->save_file(idx, FALSE);
+ }
+ locale_filename = utils->get_locale_from_utf8(doc_list[idx].file_name);
+ base_name = g_path_get_dirname(locale_filename);
+ }
+ else if (doc_list[idx].file_name == NULL)
+ {
+ if ( geany_data->dialogs->show_save_as() )
+ {
+ locale_filename = utils->get_locale_from_utf8(doc_list[idx].file_name);
+ base_name = g_path_get_dirname(locale_filename);
+ }
+ }
+
+ if (base_name != NULL)
+ {
+ command = g_strconcat("svn diff ", base_name, NULL);
+
+ if (project_name != NULL)
+ {
+ filename = g_strconcat(project_name,".diff", NULL);
+ }
+ else
+ {
+ filename = g_strdup("dir.diff");
+ }
+
+ 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 = geany_data->encoding->convert_to_utf8(std_output, -1, &dir_enc);
+ new_idx = geany_data->document->new_file(filename, NULL, std_output);
+ geany_data->document->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?"));
+ }
+ }
+ }
+ else
+ {
+ ui->set_statusbar(FALSE, _("Could not determinate a path working in"));
+ }
+}
+
+/* Callback if menu item for a single file was acitvated */
+static void svnfile_activated(GtkMenuItem *menuitem, gpointer gdata)
{
gchar *command;
gint idx;
@@ -145,16 +243,50 @@
/* Called by Geany to initialize the plugin */
void init(GeanyData *data)
{
- GtkWidget *svndiff_item;
+ GtkWidget *menu_svndiff = NULL;
+ GtkWidget *menu_svndiff_menu = NULL;
+ GtkWidget *menu_svndiff_dir = NULL;
+ GtkWidget *menu_svndiff_file = NULL;
+ GtkTooltips *tooltips = NULL;
- // Add an item to the Tools menu
- svndiff_item = gtk_menu_item_new_with_mnemonic(_("_SVNdiff"));
- gtk_widget_show(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);
+ tooltips = gtk_tooltips_new();
+ //// Add an item to the Tools menu
+ //svndiff_item = gtk_menu_item_new_with_mnemonic(_("_SVNdiff"));
+ //gtk_widget_show(svndiff_item);
+ //gtk_container_add(GTK_CONTAINER(geany_data->tools_menu), svndiff_item);
+ //g_signal_connect(G_OBJECT(svndiff_item), "activate", G_CALLBACK(svnfile_activated), NULL);
- plugin_fields->menu_item = svndiff_item;
+
plugin_fields->flags = PLUGIN_IS_DOCUMENT_SENSITIVE;
+
+ menu_svndiff = gtk_image_menu_item_new_with_mnemonic(_("_SVNdiff"));
+ gtk_container_add(GTK_CONTAINER(data->tools_menu), menu_svndiff);
+
+ menu_svndiff_menu = gtk_menu_new ();
+ gtk_menu_item_set_submenu(GTK_MENU_ITEM(menu_svndiff), menu_svndiff_menu);
+
+ // Directory
+ menu_svndiff_dir = gtk_menu_item_new_with_mnemonic(_("From current _project"));
+ gtk_container_add(GTK_CONTAINER (menu_svndiff_menu), menu_svndiff_dir);
+ gtk_tooltips_set_tip (tooltips, menu_svndiff_dir,
+ _("Makes a svn diff from the a complete projekt or if there is no "
+ "project avaible of the directory of current activeted file"), NULL);
+
+ g_signal_connect((gpointer) menu_svndiff_dir, "activate",
+ G_CALLBACK(svndirectory_activated), NULL);
+
+ // Singe file
+ menu_svndiff_file = gtk_menu_item_new_with_mnemonic(_("From single _file"));
+ gtk_container_add(GTK_CONTAINER (menu_svndiff_menu), menu_svndiff_file);
+ gtk_tooltips_set_tip (tooltips, menu_svndiff_file,
+ _("Makes a svn diff from the of current activeted file"), NULL);
+
+ g_signal_connect((gpointer) menu_svndiff_file, "activate",
+ G_CALLBACK(svnfile_activated), NULL);
+
+ gtk_widget_show_all(menu_svndiff);
+
+ plugin_fields->menu_item = menu_svndiff;
}
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