SF.net SVN: geany: [2018] trunk
frlan at users.sourceforge.net
frlan at xxxxx
Mon Nov 5 14:21:47 UTC 2007
Revision: 2018
http://geany.svn.sourceforge.net/geany/?rev=2018&view=rev
Author: frlan
Date: 2007-11-05 06:21:46 -0800 (Mon, 05 Nov 2007)
Log Message:
-----------
Added support for svn revert and a little patch from Yura Siamashka to re-use an already created tab for a new diff on the same file.
Modified Paths:
--------------
trunk/ChangeLog
trunk/plugins/svndiff.c
Modified: trunk/ChangeLog
===================================================================
--- trunk/ChangeLog 2007-11-04 19:26:02 UTC (rev 2017)
+++ trunk/ChangeLog 2007-11-05 14:21:46 UTC (rev 2018)
@@ -1,3 +1,12 @@
+2007-11-05 Frank Lanitz <frank(at)frank(dot)uvena(dot)de>
+
+ * plugins/svndiff.c:
+ Added function for svn revert and check before complete loading of
+ then plugin if svn is inside $PATH.
+ Added patch from Yura Siamashka to re-use an already created tab
+ for a new diff on the same file. Thanks.
+
+
2007-11-04 Enrico Tröger <enrico.troeger at uvena.de>
* src/build.c:
Modified: trunk/plugins/svndiff.c
===================================================================
--- trunk/plugins/svndiff.c 2007-11-04 19:26:02 UTC (rev 2017)
+++ trunk/plugins/svndiff.c 2007-11-05 14:21:46 UTC (rev 2018)
@@ -37,17 +37,29 @@
GeanyData *geany_data;
-VERSION_CHECK(25)
+VERSION_CHECK(27)
PLUGIN_INFO(_("SVNdiff"), _("Plugin to create a patch of a file against svn"), VERSION)
+static int find_by_filename(const gchar* filename)
+{
+ guint i;
+ for (i = 0; i < doc_array->len; i++)
+ {
+ if ( DOC_IDX_VALID(i) && doc_list[i].file_name &&
+ strcmp(doc_list[i].file_name, filename) == 0)
+ return i;
+ }
+ return -1;
+}
/* 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;
+ gint idx, page;
+ GtkNotebook *book;
gchar *filename;
filename = g_path_get_basename(name_prefix);
@@ -66,10 +78,23 @@
}
if (text)
{
- new_idx = geany_data->document->new_file(filename,
+ idx = find_by_filename(filename);
+ if ( idx == -1)
+ {
+ idx = geany_data->document->new_file(filename,
geany_data->filetypes[GEANY_FILETYPES_DIFF], text);
+ }
+ else
+ {
+ scintilla->set_text(doc_list[idx].sci, text);
+ book = GTK_NOTEBOOK(app->notebook);
+ page = gtk_notebook_page_num(book, GTK_WIDGET(doc_list[idx].sci));
+ gtk_notebook_set_current_page(book, page);
+ doc_list[idx].changed = FALSE;
+ documents->set_text_changed(idx);
+ }
- geany_data->document->set_encoding(new_idx,
+ geany_data->document->set_encoding(idx,
force_encoding ? force_encoding : detect_enc);
}
else
@@ -81,7 +106,47 @@
g_free(filename);
}
+static gboolean make_revert(const gchar *svn_file)
+{
+ gchar *std_output = NULL;
+ gchar *std_error = NULL;
+ gint exit_code;
+ gchar *command = NULL;
+ // use '' quotation for Windows compatibility
+ command = g_strdup_printf("svn revert '%s'", svn_file);
+
+ if (g_spawn_command_line_sync(command, &std_output, &std_error, &exit_code, NULL))
+ {
+ if (! exit_code)
+ {
+ if (NZV(std_output))
+ {
+ ui->set_statusbar(FALSE, std_output);
+ }
+ else
+ {
+ ui->set_statusbar(FALSE, _("No changes were made."));
+ return FALSE;
+ }
+ }
+ else
+ { // SVN returns some error
+ dialogs->show_msgbox(1,
+ _("SVN exited with an error: \n%s."), g_strstrip(std_error));
+ return FALSE;
+ }
+ }
+ else
+ {
+ ui->set_statusbar(FALSE,
+ _("Something went really wrong. Is there any svn-binary in your path?"));
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
static gchar *make_diff(const gchar *svn_file)
{
gchar *std_output = NULL;
@@ -201,10 +266,32 @@
g_free(locale_filename);
}
+/* Callback if menu item for a single file was activated */
+static void svnrevert_activated(GtkMenuItem *menuitem, gpointer gdata)
+{
+ gint idx;
+ gchar *locale_filename;
+ idx = documents->get_cur_idx();
+
+ g_return_if_fail(DOC_IDX_VALID(idx) && doc_list[idx].file_name != NULL);
+
+ if (dialogs->show_question(_("Do you realy want to revert '%s'?"), doc_list[idx].file_name))
+ {
+ locale_filename = utils->get_locale_from_utf8(doc_list[idx].file_name);
+
+ if (make_revert(locale_filename))
+ {
+ documents->reload_file(idx, NULL);
+ }
+ g_free(locale_filename);
+ }
+}
+
static GtkWidget *menu_svndiff_file = NULL;
static GtkWidget *menu_svndiff_dir = NULL;
static GtkWidget *menu_svndiff_project = NULL;
+static GtkWidget *menu_svndiff_revert = NULL;
static void update_menu_items()
{
@@ -216,6 +303,7 @@
gtk_widget_set_sensitive(menu_svndiff_file, have_file);
gtk_widget_set_sensitive(menu_svndiff_dir, have_file);
+ gtk_widget_set_sensitive(menu_svndiff_revert, have_file);
gtk_widget_set_sensitive(menu_svndiff_project,
project != NULL && NZV(project->base_path));
}
@@ -227,7 +315,16 @@
GtkWidget *menu_svndiff = NULL;
GtkWidget *menu_svndiff_menu = NULL;
GtkTooltips *tooltips = NULL;
+ gchar *tmp = NULL;
+ gboolean have_svn = FALSE;
+ // Check for svn inside $PATH. Thanks to Yura Siamashka <yurand2 at gmail.com>
+ tmp = g_find_program_in_path("svn");
+ if (!tmp)
+ return;
+ have_svn = TRUE;
+ g_free(tmp);
+
tooltips = gtk_tooltips_new();
plugin_fields->flags = PLUGIN_IS_DOCUMENT_SENSITIVE;
@@ -268,6 +365,12 @@
g_signal_connect((gpointer) menu_svndiff_project, "activate",
G_CALLBACK(svnproject_activated), NULL);
+ // SVN revert
+ menu_svndiff_revert = gtk_menu_item_new_with_mnemonic(_("Revert changes"));
+ gtk_container_add(GTK_CONTAINER (menu_svndiff_menu), menu_svndiff_revert);
+ gtk_tooltips_set_tip(tooltips, menu_svndiff_revert, _("Revert all made changes at this file"), NULL);
+ g_signal_connect((gpointer) menu_svndiff_revert, "activate", G_CALLBACK(svnrevert_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