[Goodies-commits] r2808 - in thunar-svn-plugin/trunk: . po thunar-svn-plugin tsp-svn-helper

Peter de Ridder peter at xfce.org
Sun Jun 3 23:11:29 CEST 2007


Author: peter
Date: 2007-06-03 21:11:29 +0000 (Sun, 03 Jun 2007)
New Revision: 2808

Added:
   thunar-svn-plugin/trunk/po/thunar-svn-plugin.pot
   thunar-svn-plugin/trunk/tsp-svn-helper/
   thunar-svn-plugin/trunk/tsp-svn-helper/Makefile.am
   thunar-svn-plugin/trunk/tsp-svn-helper/main.c
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.c
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.h
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.c
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.h
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.c
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.h
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.c
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.h
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.c
   thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.h
Modified:
   thunar-svn-plugin/trunk/Makefile.am
   thunar-svn-plugin/trunk/configure.ac.in
   thunar-svn-plugin/trunk/po/POTFILES.in
   thunar-svn-plugin/trunk/thunar-svn-plugin/Makefile.am
   thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-provider.c
   thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.c
   thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.h
Log:
thunar svn plugin svn helper program added.
it supports update and login.


Modified: thunar-svn-plugin/trunk/Makefile.am
===================================================================
--- thunar-svn-plugin/trunk/Makefile.am	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/Makefile.am	2007-06-03 21:11:29 UTC (rev 2808)
@@ -2,7 +2,8 @@
 SUBDIRS =								\
 	icons								\
 	po								\
-	thunar-svn-plugin
+	thunar-svn-plugin						\
+	tsp-svn-helper
 
 distclean-local:
 	rm -rf *.spec *.cache *~

Modified: thunar-svn-plugin/trunk/configure.ac.in
===================================================================
--- thunar-svn-plugin/trunk/configure.ac.in	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/configure.ac.in	2007-06-03 21:11:29 UTC (rev 2808)
@@ -172,5 +172,6 @@
 icons/16x16/Makefile
 po/Makefile.in
 thunar-svn-plugin/Makefile
+tsp-svn-helper/Makefile
 ])
 

Modified: thunar-svn-plugin/trunk/po/POTFILES.in
===================================================================
--- thunar-svn-plugin/trunk/po/POTFILES.in	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/po/POTFILES.in	2007-06-03 21:11:29 UTC (rev 2808)
@@ -2,3 +2,9 @@
 thunar-svn-plugin/tsp-provider.c
 thunar-svn-plugin/tsp-svn-action.c
 thunar-svn-plugin/tsp-svn-backend.c
+tsp-svn-helper/main.c
+tsp-svn-helper/tsh-common.c
+tsp-svn-helper/tsh-dialog-common.c
+tsp-svn-helper/tsh-login-dialog.c
+tsp-svn-helper/tsh-update.c
+tsp-svn-helper/tsh-update-dialog.c

Added: thunar-svn-plugin/trunk/po/thunar-svn-plugin.pot
===================================================================
--- thunar-svn-plugin/trunk/po/thunar-svn-plugin.pot	                        (rev 0)
+++ thunar-svn-plugin/trunk/po/thunar-svn-plugin.pot	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,164 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL at ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: PACKAGE VERSION\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2007-06-03 23:13+0200\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL at ADDRESS>\n"
+"Language-Team: LANGUAGE <LL at li.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#: thunar-svn-plugin/tsp-provider.c:402
+msgid "SVN _Import"
+msgstr ""
+
+#. append the svn submenu action
+#: thunar-svn-plugin/tsp-provider.c:409 thunar-svn-plugin/tsp-provider.c:444
+msgid "SVN"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-provider.c:455
+msgid "SVN _Checkout"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:225
+msgid "Add"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:232
+msgid "Blame"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:247
+msgid "Cleanup"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:254
+msgid "Commit"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:265
+msgid "Delete"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:272
+msgid "Diff"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:279
+msgid "Export"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:290
+msgid "Info"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:301
+msgid "Lock"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:308
+msgid "Log"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:333
+msgid "Edit Properties"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:342
+msgid "Resolve"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:349
+msgid "Revert"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:356
+msgid "Status"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:363
+msgid "Switch"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:370
+msgid "Unlock"
+msgstr ""
+
+#: thunar-svn-plugin/tsp-svn-action.c:377
+#: tsp-svn-helper/tsh-update-dialog.c:102
+msgid "Update"
+msgstr ""
+
+#: tsp-svn-helper/main.c:55
+msgid "Print version information"
+msgstr ""
+
+#: tsp-svn-helper/main.c:62
+msgid "Execute checkout action"
+msgstr ""
+
+#: tsp-svn-helper/main.c:68
+msgid "Execute update action"
+msgstr ""
+
+#: tsp-svn-helper/tsh-login-dialog.c:65
+msgid "_Username:"
+msgstr ""
+
+#: tsp-svn-helper/tsh-login-dialog.c:81
+msgid "_Password:"
+msgstr ""
+
+#: tsp-svn-helper/tsh-login-dialog.c:98
+msgid "Remember"
+msgstr ""
+
+#: tsp-svn-helper/tsh-login-dialog.c:106
+msgid "Login"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update.c:52
+msgid "Deleted"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update.c:55
+msgid "Added"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update.c:58
+msgid "Updated"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update.c:61
+#, c-format
+msgid "At revision: %li"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update.c:62
+msgid "Completed"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update.c:65
+msgid "External"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update-dialog.c:75
+msgid "Action"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update-dialog.c:81
+msgid "Path"
+msgstr ""
+
+#: tsp-svn-helper/tsh-update-dialog.c:87
+msgid "Mime type"
+msgstr ""

Modified: thunar-svn-plugin/trunk/thunar-svn-plugin/Makefile.am
===================================================================
--- thunar-svn-plugin/trunk/thunar-svn-plugin/Makefile.am	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/thunar-svn-plugin/Makefile.am	2007-06-03 21:11:29 UTC (rev 2808)
@@ -25,7 +25,8 @@
 	$(PLATFORM_CFLAGS)						\
 	$(THUNARX_CFLAGS)						\
 	$(THUNAR_VFS_CFLAGS)						\
-	$(APR_CFLAGS)
+	$(APR_CFLAGS)							\
+	-DTSP_SVN_HELPER=\"$(libexecdir)/tsp-svn-helper\"
 
 thunar_svn_plugin_la_LDFLAGS =						\
 	-avoid-version							\

Modified: thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-provider.c
===================================================================
--- thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-provider.c	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-provider.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -166,7 +166,7 @@
   gchar   *filename;
   gchar   *uri;
 
-  /* determine the parent URI for the file info */
+  /* determine the URI for the file info */
   uri = thunarx_file_info_get_uri (file_info);
   if (G_LIKELY (uri != NULL))
     {
@@ -406,7 +406,7 @@
 	if (parent_wc || directory_is_wc)
 	{
 		/* append the svn submenu action */
-		action = tsp_svn_action_new ("Tsp::svn", _("SVN"), FALSE, parent_wc, directory_is_wc, directory_is_not_wc, file_is_vc, file_is_not_vc);
+		action = tsp_svn_action_new ("Tsp::svn", _("SVN"), files, window, FALSE, parent_wc, directory_is_wc, directory_is_not_wc, file_is_vc, file_is_not_vc);
 		actions = g_list_append (actions, action);
 	}
 
@@ -424,8 +424,8 @@
   GList              *actions = NULL;
   ThunarVfsPathScheme scheme;
   ThunarVfsInfo      *info;
+	GList              *files;
 
-
 	/* check if the file is a local file */
 	info = thunarx_file_info_get_vfs_info (folder);
 	scheme = thunar_vfs_path_get_scheme (info->path);
@@ -438,9 +438,13 @@
 	/* Lets see if we are dealing with a working copy */
 	if (tsp_is_working_copy (folder))
 	{
+		files = g_list_append (NULL, folder);
+
 		/* append the svn submenu action */
-		action = tsp_svn_action_new ("Tsp::svn", _("SVN"), TRUE, TRUE, FALSE, FALSE, FALSE, FALSE);
+		action = tsp_svn_action_new ("Tsp::svn", _("SVN"), files, window, TRUE, TRUE, FALSE, FALSE, FALSE, FALSE);
 		actions = g_list_append (actions, action);
+
+		g_list_free (files);
 	}
 	else
 	{
@@ -452,7 +456,7 @@
 													 NULL);
 		actions = g_list_append (actions, action);
 		/* append the svn submenu action
-		action = tsp_svn_action_new ("Tsp::svn", _("SVN"), TRUE, FASLE, FALSE, FALSE, FALSE, FALSE);
+		action = tsp_svn_action_new ("Tsp::svn", _("SVN"), window, TRUE, FASLE, FALSE, FALSE, FALSE, FALSE);
 		actions = g_list_append (actions, action); */
 	}
 

Modified: thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.c
===================================================================
--- thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.c	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -21,12 +21,16 @@
 #include <config.h>
 #endif
 
+#include <thunarx/thunarx.h>
+
 #include <thunar-vfs/thunar-vfs.h>
 
 #include <thunar-svn-plugin/tsp-svn-action.h>
 
+#include <string.h>
 
 
+
 struct _TspSvnActionClass
 {
 	GtkActionClass __parent__;
@@ -46,6 +50,9 @@
 		unsigned file_version_control : 1;
 		unsigned file_no_version_control : 1;
 	} property;
+
+	GList *files;
+	GtkWidget *window;
 };
 
 
@@ -65,10 +72,16 @@
 
 
 
+static void tsp_svn_action_finalize (GObject*);
+
 static void tsp_svn_action_set_property (GObject*, guint, const GValue*, GParamSpec*);
 
 
 
+static void tsp_action_update (GtkMenuItem *item, TspSvnAction *action);
+
+
+
 G_DEFINE_TYPE (TspSvnAction, tsp_svn_action, GTK_TYPE_ACTION)
 
 
@@ -79,6 +92,7 @@
 	GObjectClass *gobject_class = G_OBJECT_CLASS (klass);
 	GtkActionClass *gtkaction_class = GTK_ACTION_CLASS (klass);
 
+	gobject_class->finalize = tsp_svn_action_finalize;
 	gobject_class->set_property = tsp_svn_action_set_property;
 
 	gtkaction_class->create_menu_item = tsp_svn_action_create_menu_item;
@@ -113,6 +127,8 @@
 	self->property.directory_no_version_control = 0;
 	self->property.file_version_control = 0;
 	self->property.file_no_version_control = 0;
+	self->files = NULL;
+	self->window = NULL;
 }
 
 
@@ -120,6 +136,8 @@
 GtkAction *
 tsp_svn_action_new (const gchar *name,
                     const gchar *label,
+										GList *files,
+										GtkWidget *window,
 										gboolean is_parent,
 										gboolean parent_version_control,
 										gboolean directory_version_control,
@@ -130,22 +148,39 @@
 	g_return_val_if_fail(name, NULL);
 	g_return_val_if_fail(label, NULL);
 
-	return g_object_new (TSP_TYPE_SVN_ACTION,
-	                     "hide-if-empty", FALSE,
-											 "name", name,
-											 "label", label,
-											 "is-parent", is_parent,
-											 "parent-version-control", parent_version_control,
-											 "directory-version-control", directory_version_control,
-											 "directory-no-version-control", directory_no_version_control,
-											 "file-version-control", file_version_control,
-											 "file-no-version-control", file_no_version_control,
-											 NULL);
+	GtkAction *action = g_object_new (TSP_TYPE_SVN_ACTION,
+	                  						  	"hide-if-empty", FALSE,
+																		"name", name,
+																		"label", label,
+																		"is-parent", is_parent,
+																		"parent-version-control", parent_version_control,
+																		"directory-version-control", directory_version_control,
+																		"directory-no-version-control", directory_no_version_control,
+																		"file-version-control", file_version_control,
+																		"file-no-version-control", file_no_version_control,
+																		NULL);
+	TSP_SVN_ACTION (action)->files = thunarx_file_info_list_copy (files);
+//	TSP_SVN_ACTION (action)->window = gtk_widget_ref (window);
+	TSP_SVN_ACTION (action)->window = window;
+	return action;
 }
 
 
 
 static void
+tsp_svn_action_finalize (GObject *object)
+{
+	thunarx_file_info_list_free (TSP_SVN_ACTION (object)->files);
+	TSP_SVN_ACTION (object)->files = NULL;
+//	gtk_widget_unref (TSP_SVN_ACTION (object)->window);
+	TSP_SVN_ACTION (object)->window = NULL;
+
+	G_OBJECT_CLASS (tsp_svn_action_parent_class)->finalize (object);
+}
+
+
+
+static void
 tsp_svn_action_set_property (GObject *object, guint property_id, const GValue *value, GParamSpec *pspec)
 {
 	switch (property_id)
@@ -340,6 +375,7 @@
 	if ((tsp_action->property.is_parent && tsp_action->property.parent_version_control) || tsp_action->property.directory_version_control || tsp_action->property.file_version_control)
 	{
 		subitem = gtk_menu_item_new_with_label (_("Update"));
+		g_signal_connect_object (subitem, "activate", G_CALLBACK (tsp_action_update), action, G_CONNECT_AFTER);
 		gtk_menu_shell_append (GTK_MENU_SHELL (menu), subitem);
 		gtk_widget_show(subitem);
 	}
@@ -347,3 +383,77 @@
 	return item;
 }
 
+
+
+static void tsp_action_update (GtkMenuItem *item, TspSvnAction *action)
+{
+	guint size, i;
+	gchar **argv;
+	GList *iter;
+	gchar *uri;
+	gchar *filename;
+	gchar *file;
+	gint pid;
+	GError *error = NULL;
+	GdkScreen *screen = gtk_window_get_screen (GTK_WINDOW (action->window));
+
+	iter = action->files;
+
+	size = g_list_length (iter);
+
+	argv = g_new (gchar *, size + 3);
+
+	argv[0] = g_strdup (TSP_SVN_HELPER);
+	argv[1] = g_strdup ("--update");
+	argv[size + 2] = NULL;
+
+	for (i = 0; i < size; i++)
+	{
+		/* determine the URI for the file info */
+		uri = thunarx_file_info_get_uri (iter->data);
+		if (G_LIKELY (uri != NULL))
+    {
+      /* determine the local filename for the URI */
+      filename = g_filename_from_uri (uri, NULL, NULL);
+      if (G_LIKELY (filename != NULL))
+			{
+				file = filename;
+				/* strip the "file://" part of the uri */
+				if (strncmp (file, "file://", 7) == 0)
+				{
+					file += 7;
+				}
+
+				file = g_strdup (file);
+
+				/* remove trailing '/' cause svn can't handle that */
+				if (file[strlen (file) - 1] == '/')
+				{
+					file[strlen (file) - 1] = '\0';
+				}
+
+				argv[i+2] = file;
+
+				/* release the filename */
+				g_free (filename);
+			}
+
+      /* release the URI */
+      g_free (uri);
+    }
+
+		iter = g_list_next (iter);
+	}
+
+	if (!gdk_spawn_on_screen (screen, NULL, argv, NULL, 0, NULL, NULL, &pid, &error))
+	{
+		GtkWidget *dialog = gtk_message_dialog_new (GTK_WINDOW (action->window), GTK_DIALOG_DESTROY_WITH_PARENT|GTK_DIALOG_MODAL, GTK_MESSAGE_ERROR, GTK_BUTTONS_CLOSE, "Could not spawn \'" TSP_SVN_HELPER "\'");
+		gtk_message_dialog_format_secondary_text (GTK_MESSAGE_DIALOG (dialog), "%s.", error->message);
+		gtk_dialog_run (GTK_DIALOG (dialog));
+		gtk_widget_destroy (dialog);
+		g_error_free (error);
+	}
+
+	g_strfreev (argv);
+}
+

Modified: thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.h
===================================================================
--- thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.h	2007-06-03 07:45:49 UTC (rev 2807)
+++ thunar-svn-plugin/trunk/thunar-svn-plugin/tsp-svn-action.h	2007-06-03 21:11:29 UTC (rev 2808)
@@ -38,6 +38,8 @@
 
 GtkAction *tsp_svn_action_new      (const gchar*,
                                     const gchar*,
+																		GList *,
+																		GtkWidget *,
 																		gboolean,
 																		gboolean,
 																		gboolean,

Added: thunar-svn-plugin/trunk/tsp-svn-helper/Makefile.am
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/Makefile.am	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/Makefile.am	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,47 @@
+
+AM_CPPFLAGS =								\
+	-I$(top_builddir)						\
+	-I$(top_srcdir)							\
+        -DBINDIR=\"$(bindir)\"                                          \
+        -DDATADIR=\"$(datadir)\"                                        \
+	-DLIBDIR=\"$(libdir)\"						\
+	-DLIBEXECDIR=\"$(libexecdir)\"					\
+	-DPACKAGE_LOCALE_DIR=\"$(localedir)\"				\
+	$(PLATFORM_CPPFLAGS)
+
+libexec_PROGRAMS =								\
+	tsp-svn-helper
+
+tsp_svn_helper_SOURCES =						\
+	main.c								\
+	tsh-common.h							\
+	tsh-common.c							\
+	tsh-update.h							\
+	tsh-update.c							\
+	tsh-dialog-common.h						\
+	tsh-dialog-common.c						\
+	tsh-login-dialog.h						\
+	tsh-login-dialog.c						\
+	tsh-update-dialog.h						\
+	tsh-update-dialog.c
+
+tsp_svn_helper_CPPFLAGS =						\
+	-DG_LOG_DOMAIN=\"tsp-svn-helper\"
+
+tsp_svn_helper_CFLAGS =							\
+	$(PLATFORM_CFLAGS)						\
+	$(THUNAR_VFS_CFLAGS)						\
+	$(GTK_CFLAGS)							\
+	$(GLIB_CFLAGS)							\
+	$(GOBJECT_CFLAGS)						\
+	$(APR_CFLAGS)
+
+tsp_svn_helper_LDFLAGS =						\
+	$(PLATFORM_LIBS)						\
+	$(THUNAR_VFS_LIBS)						\
+	$(GTK_LIBS)							\
+	$(GLIB_LIBS)							\
+	$(GOBJECT_LIBS)							\
+	$(APR_LIBS)
+
+# vi:set ts=8 sw=8 noet ai nocindent syntax=automake:

Added: thunar-svn-plugin/trunk/tsp-svn-helper/main.c
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/main.c	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/main.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,136 @@
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <thunar-vfs/thunar-vfs.h>
+
+#include <subversion-1/svn_cmdline.h>
+#include <subversion-1/svn_client.h>
+#include <subversion-1/svn_pools.h>
+#include <subversion-1/svn_config.h>
+
+#include "tsh-common.h"
+#include "tsh-update.h"
+
+int main (int argc, char *argv[])
+{
+	GThread *thread = NULL;
+
+	/* SVN variables */
+	apr_pool_t *pool;
+	svn_error_t *err;
+	svn_client_ctx_t *svn_ctx;
+
+	/* CMD-line options */
+	gboolean print_version = FALSE;
+	gboolean checkout = FALSE;
+	gboolean update = FALSE;
+	gchar **files = NULL;
+
+	GOptionEntry general_options_table[] =
+	{
+		{ "version", 'v', 0, G_OPTION_ARG_NONE, &print_version, N_("Print version information"), NULL },
+		{ G_OPTION_REMAINING, '\0', G_OPTION_ARG_FILENAME, G_OPTION_ARG_FILENAME_ARRAY, &files, NULL, NULL },
+		{ NULL, '\0', 0, 0, NULL, NULL, NULL }
+	};
+
+	GOptionEntry checkout_options_table[] =
+	{
+		{ "checkout", '\0', 0, G_OPTION_ARG_NONE, &checkout, N_("Execute checkout action"), NULL },
+		{ NULL, '\0', 0, 0, NULL, NULL, NULL }
+	};
+
+	GOptionEntry update_options_table[] =
+	{
+		{ "update", '\0', 0, G_OPTION_ARG_NONE, &update, N_("Execute update action"), NULL },
+		{ NULL, '\0', 0, 0, NULL, NULL, NULL }
+	};
+
+	GOptionGroup *option_group;
+	GOptionContext *option_context = g_option_context_new("<action> [options] [args]");
+
+	g_option_context_add_main_entries(option_context, general_options_table, GETTEXT_PACKAGE);
+	g_option_context_add_group(option_context, gtk_get_option_group(TRUE));
+
+	option_group = g_option_group_new("checkout", "Checkout Related Opions:", "Checkout", NULL, NULL);
+	g_option_group_add_entries(option_group, checkout_options_table);
+	g_option_context_add_group(option_context, option_group);
+
+	option_group = g_option_group_new("update", "Update Related Opions:", "Update", NULL, NULL);
+	g_option_group_add_entries(option_group, update_options_table);
+	g_option_context_add_group(option_context, option_group);
+
+	g_thread_init (NULL);
+	gdk_threads_init ();
+
+	g_option_context_parse(option_context, &argc, &argv, NULL);
+
+	if(print_version)
+	{
+		g_print(PACKAGE_STRING "\n\tcompiled on " __DATE__ ", " __TIME__ "\n");
+		return EXIT_SUCCESS;
+	}
+
+	if(!tsh_init(&pool, &err))
+	{
+		if(err)
+		{
+			svn_handle_error2(err, stderr, FALSE, G_LOG_DOMAIN ": ");
+			svn_error_clear(err);
+		}
+		if(pool)
+			svn_pool_destroy(pool);
+		return EXIT_FAILURE;
+	}
+
+	if(!tsh_create_context(&svn_ctx, pool, &err))
+	{
+		if(err)
+		{
+			svn_handle_error2(err, stderr, FALSE, G_LOG_DOMAIN ": ");
+			svn_error_clear(err);
+		}
+		svn_pool_destroy(pool);
+		return EXIT_FAILURE;
+	}
+
+	if(update)
+	{
+		thread = tsh_update(files, svn_ctx, pool);
+	}
+
+	if(thread)
+	{
+		gtk_main ();
+
+		g_thread_join (thread);
+	}
+
+	svn_pool_destroy(pool);
+
+	return EXIT_SUCCESS;
+}
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.c
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.c	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,352 @@
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <thunar-vfs/thunar-vfs.h>
+
+#include <apr_lib.h>
+
+#include <subversion-1/svn_cmdline.h>
+#include <subversion-1/svn_client.h>
+#include <subversion-1/svn_pools.h>
+#include <subversion-1/svn_config.h>
+#include <subversion-1/svn_fs.h>
+
+#include "tsh-login-dialog.h"
+
+#include "tsh-common.h"
+
+static svn_error_t* tsh_auth_simple_prompt(svn_auth_cred_simple_t**, void*, const char*, const char*, svn_boolean_t, apr_pool_t*);
+static svn_error_t* tsh_auth_username_prompt(svn_auth_cred_username_t**, void*, const char*, svn_boolean_t, apr_pool_t*);
+static svn_error_t* tsh_auth_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t**, void*, const char*, apr_uint32_t, const svn_auth_ssl_server_cert_info_t*, svn_boolean_t, apr_pool_t*);
+static svn_error_t* tsh_auth_ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t**, void*, const char*, svn_boolean_t, apr_pool_t*);
+static svn_error_t* tsh_auth_ssl_client_cert_pw_prompt(svn_auth_cred_ssl_client_cert_pw_t**, void*, const char*, svn_boolean_t, apr_pool_t*);
+
+static svn_error_t* tsh_check_cancel(void*);
+
+static gboolean cancelled = FALSE;
+
+gboolean tsh_init (apr_pool_t **ppool, svn_error_t **perr)
+{
+	apr_pool_t *pool;
+	svn_error_t *err;
+
+	if (perr)
+		*perr = NULL;
+
+	if (!ppool)
+		return FALSE;
+
+	/* Initialize svn stuff */
+	if (svn_cmdline_init (G_LOG_DOMAIN, stderr) != EXIT_SUCCESS)
+	{
+		*ppool = NULL;
+		return FALSE;
+	}
+
+	*ppool = pool = svn_pool_create (NULL);
+
+	/* Initialize utf routines */
+	svn_utf_initialize (pool);
+
+	/* Initialize FS lib */
+	if ((err = svn_fs_initialize (pool)))
+	{
+		if (perr)
+			*perr = err;
+		return FALSE;
+	}
+
+	if ((err = svn_config_ensure (NULL, pool)))
+	{
+		if (perr)
+			*perr = err;
+		return FALSE;
+	}
+
+#ifdef G_OS_WIN32
+	/* Set the working copy administrative directory name */
+	if (getenv ("SVN_ASP_DOT_NET_HACK"))
+	{
+		if(err = svn_wc_set_adm_dir ("_svn", pool))
+		{
+			if (perr)
+				*perr = err;
+			return FALSE;
+		}
+	}
+#endif
+
+	return TRUE;
+}
+
+gboolean tsh_create_context (svn_client_ctx_t **pctx, apr_pool_t *pool, svn_error_t **perr)
+{
+	svn_auth_provider_object_t *provider;
+	apr_array_header_t *providers;
+	svn_error_t *err;
+	svn_boolean_t cache = TRUE;
+	svn_auth_baton_t *ab;
+	svn_config_t *cfg;
+	svn_client_ctx_t *ctx;
+
+	if (perr)
+		*perr = NULL;
+
+	if (!pctx)
+		return FALSE;
+
+	if (!pool)
+		return FALSE;
+
+	/* Create the client context */
+	if ((err = svn_client_create_context (pctx, pool)))
+	{
+		if (perr)
+			*perr = err;
+		return FALSE;
+	}
+	ctx = *pctx;
+
+	/* Get the config */
+  if ((err = svn_config_get_config(&(ctx->config), NULL, pool)))
+	{
+		if (perr)
+			*perr = err;
+		return FALSE;
+	}
+  cfg = apr_hash_get(ctx->config, SVN_CONFIG_CATEGORY_CONFIG,
+                     APR_HASH_KEY_STRING);
+
+	/* Set cancel funvtion */
+	ctx->cancel_func = tsh_check_cancel;
+
+	/* Create an array to hold the providers */
+	providers = apr_array_make (pool, 12, sizeof (svn_auth_provider_object_t *));
+
+	/* Disk caching auth providers */
+#ifdef G_OS_WIN32
+	svn_auth_get_windows_simple_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+#endif
+#ifdef SVN_HAVE_KEYCHAIN_SERVICES
+	svn_auth_get_keychain_simple_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+#endif
+	svn_auth_get_simple_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+	svn_auth_get_username_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+	/* Cert auth providers */
+	svn_auth_get_ssl_server_trust_file_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+	svn_auth_get_ssl_client_cert_file_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+	svn_auth_get_ssl_client_cert_pw_file_provider (&provider, pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+	/* Prompt providers */
+	svn_auth_get_simple_prompt_provider (&provider,
+	                                     tsh_auth_simple_prompt,
+	                                     NULL,
+	                                     2,
+	                                     pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+	svn_auth_get_username_prompt_provider (&provider,
+	                                       tsh_auth_username_prompt,
+	                                       NULL,
+	                                       2,
+	                                       pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+	svn_auth_get_ssl_server_trust_prompt_provider (&provider,
+	                                               tsh_auth_ssl_server_trust_prompt,
+	                                               NULL,
+	                                               pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+	svn_auth_get_ssl_client_cert_prompt_provider (&provider,
+	                                              tsh_auth_ssl_client_cert_prompt,
+	                                              NULL,
+																								2,
+	                                              pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+	svn_auth_get_ssl_client_cert_pw_prompt_provider (&provider,
+	                                                 tsh_auth_ssl_client_cert_pw_prompt,
+	                                                 NULL,
+																									 2,
+	                                                 pool);
+	APR_ARRAY_PUSH (providers, svn_auth_provider_object_t *) = provider;
+
+	/* open the auth baton */
+  svn_auth_open(&ab, providers, pool);
+	ctx->auth_baton = ab;
+
+	/* Check config for cache settings */
+	if ((err = svn_config_get_bool (cfg, &cache,
+	                                SVN_CONFIG_SECTION_AUTH,
+																	SVN_CONFIG_OPTION_STORE_PASSWORDS,
+																	TRUE)))
+	{
+		if (perr)
+			*perr = err;
+		return FALSE;
+	}
+
+  if (!cache)
+    svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DONT_STORE_PASSWORDS, "");
+
+	/* Check config for cache settings */
+	if ((err = svn_config_get_bool (cfg, &cache,
+	                                SVN_CONFIG_SECTION_AUTH,
+																	SVN_CONFIG_OPTION_STORE_AUTH_CREDS,
+																	TRUE)))
+	{
+		if (perr)
+			*perr = err;
+		return FALSE;
+	}
+
+  if (!cache)
+    svn_auth_set_parameter(ab, SVN_AUTH_PARAM_NO_AUTH_CACHE, "");
+
+	return TRUE;
+}
+
+static svn_error_t*
+tsh_auth_simple_prompt(svn_auth_cred_simple_t **cred,
+                       void *baton,
+                       const char *realm,
+                       const char *username,
+                       svn_boolean_t may_save,
+                       apr_pool_t *pool)
+{
+	g_debug("prompt");
+
+	if(!username)
+		username = "";
+	GtkWidget *dialog = tsh_login_dialog_new(NULL, NULL, 0, username, TRUE, may_save);
+
+	if(gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK)
+	{
+		*cred = NULL;
+
+		gtk_widget_destroy(dialog);
+
+		cancelled = TRUE;
+		return svn_error_create(SVN_ERR_CANCELLED, NULL, NULL);
+	}
+
+  svn_auth_cred_simple_t *ret = apr_pcalloc(pool, sizeof(svn_auth_cred_simple_t));
+	TshLoginDialog *login_dialog = TSH_LOGIN_DIALOG(dialog);
+	ret->username = apr_pstrdup(pool, tsh_login_dialog_get_username(login_dialog));
+	ret->password = apr_pstrdup(pool, tsh_login_dialog_get_password(login_dialog));
+	ret->may_save = tsh_login_dialog_get_may_save(login_dialog);
+	*cred = ret;
+
+	gtk_widget_destroy(dialog);
+
+	return SVN_NO_ERROR;
+}
+
+static svn_error_t*
+tsh_auth_username_prompt(svn_auth_cred_username_t **cred,
+                                             void *baton,
+                                             const char *realm,
+                                             svn_boolean_t may_save,
+                                             apr_pool_t *pool)
+{
+	g_debug("prompt");
+
+	GtkWidget *dialog = tsh_login_dialog_new(NULL, NULL, 0, "", FALSE, may_save);
+
+	if(gtk_dialog_run(GTK_DIALOG(dialog)) != GTK_RESPONSE_OK)
+	{
+		*cred = NULL;
+
+		gtk_widget_destroy(dialog);
+
+		cancelled = TRUE;
+		return svn_error_create(SVN_ERR_CANCELLED, NULL, NULL);
+	}
+
+  svn_auth_cred_username_t *ret = apr_pcalloc(pool, sizeof(svn_auth_cred_username_t));
+	TshLoginDialog *login_dialog = TSH_LOGIN_DIALOG(dialog);
+	ret->username = apr_pstrdup(pool, tsh_login_dialog_get_username(login_dialog));
+	ret->may_save = tsh_login_dialog_get_may_save(login_dialog);
+	*cred = ret;
+
+	gtk_widget_destroy(dialog);
+
+	return SVN_NO_ERROR;
+}
+
+static svn_error_t*
+tsh_auth_ssl_server_trust_prompt(svn_auth_cred_ssl_server_trust_t **cred,
+                                 void *baton,
+                                 const char *realm,
+                                 apr_uint32_t failures,
+                                 const svn_auth_ssl_server_cert_info_t *cert_info,
+                                 svn_boolean_t may_save,
+                                 apr_pool_t *pool)
+{
+	g_debug("prompt");
+	cancelled = TRUE;
+	return SVN_NO_ERROR;
+}
+
+static svn_error_t*
+tsh_auth_ssl_client_cert_prompt(svn_auth_cred_ssl_client_cert_t **cred,
+                                void *baton,
+                                const char *realm,
+                                svn_boolean_t may_save,
+                                apr_pool_t *pool)
+{
+	g_debug("prompt");
+	cancelled = TRUE;
+	return SVN_NO_ERROR;
+}
+
+static svn_error_t*
+tsh_auth_ssl_client_cert_pw_prompt(svn_auth_cred_ssl_client_cert_pw_t **cred,
+                                   void *baton,
+                                   const char *realm,
+                                   svn_boolean_t may_save,
+                                   apr_pool_t *pool)
+{
+	g_debug("prompt");
+	cancelled = TRUE;
+	return SVN_NO_ERROR;
+}
+
+static svn_error_t*
+tsh_check_cancel(void *baton)
+{
+	if(cancelled)
+		return svn_error_create(SVN_ERR_CANCELLED, NULL, NULL);
+	return SVN_NO_ERROR;
+}
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.h
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.h	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-common.h	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,29 @@
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __TSH_COMMON_H__
+#define __TSH_COMMON_H__
+
+G_BEGIN_DECLS
+
+gboolean tsh_init (apr_pool_t**, svn_error_t**);
+
+gboolean tsh_create_context (svn_client_ctx_t**, apr_pool_t*, svn_error_t**);
+
+G_END_DECLS
+
+#endif /*__TSH_COMMON_H__*/
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.c
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.c	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,51 @@
+
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <thunar-vfs/thunar-vfs.h>
+#include <gtk/gtk.h>
+
+#include "tsh-dialog-common.h"
+
+static void quit_response (GtkDialog*, gint, gpointer);
+static void close_response (GtkDialog*, gint, gpointer);
+
+void
+tsh_dialog_start (GtkDialog *dialog, gboolean quit_on_exit)
+{
+	g_signal_connect (G_OBJECT (dialog), "response", G_CALLBACK (quit_on_exit?quit_response:close_response), NULL);
+
+	gtk_widget_show (GTK_WIDGET (dialog));
+}
+
+static void
+quit_response (GtkDialog *dialog, gint response, gpointer user_data)
+{
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+
+	gtk_main_quit();
+}
+
+static void
+close_response (GtkDialog *dialog, gint response, gpointer user_data)
+{
+	gtk_widget_destroy (GTK_WIDGET (dialog));
+}
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.h
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.h	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-dialog-common.h	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,27 @@
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __TSH_DIALOG_COMMON_H__
+#define __TSH_DIALOG_COMMON_H__
+
+G_BEGIN_DECLS
+
+void tsh_dialog_start (GtkDialog*, gboolean);
+
+G_END_DECLS
+
+#endif /*__TSH_DIALOG_COMMON_H__*/
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.c
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.c	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,193 @@
+/*-
+ * Copyright (c) 2006 Peter de Ridder <peter at xfce.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <thunar-vfs/thunar-vfs.h>
+#include <gtk/gtk.h>
+
+#include "tsh-login-dialog.h"
+
+static void username_activate (GtkEntry*, gpointer);
+static void password_activate (GtkEntry*, gpointer);
+
+struct _TshLoginDialog
+{
+	GtkDialog dialog;
+
+	GtkWidget *user_lbl;
+	GtkWidget *username;
+	GtkWidget *pass_lbl;
+	GtkWidget *password;
+	GtkWidget *may_save;
+};
+
+struct _TshLoginDialogClass
+{
+	GtkDialogClass dialog_class;
+};
+
+G_DEFINE_TYPE (TshLoginDialog, tsh_login_dialog, GTK_TYPE_DIALOG)
+
+static void
+tsh_login_dialog_class_init (TshLoginDialogClass *klass)
+{
+}
+
+static void
+tsh_login_dialog_init (TshLoginDialog *dialog)
+{
+	GtkWidget *table;
+
+	table = gtk_table_new (2, 3, FALSE);
+
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), table, FALSE, TRUE, 0);
+	gtk_widget_show (table);
+
+	dialog->user_lbl = gtk_label_new_with_mnemonic (_("_Username:"));
+	gtk_table_attach (GTK_TABLE (table), dialog->user_lbl,
+	                  0, 1, 0, 1,
+	                  GTK_SHRINK | GTK_FILL,
+	                  GTK_SHRINK | GTK_FILL,
+	                  0, 0);
+
+	dialog->username = gtk_entry_new();
+	gtk_table_attach (GTK_TABLE (table), dialog->username,
+	                  1, 2, 0, 1,
+	                  GTK_EXPAND | GTK_FILL,
+	                  GTK_SHRINK | GTK_FILL,
+	                  0, 0);
+
+	gtk_label_set_mnemonic_widget (GTK_LABEL (dialog->user_lbl), dialog->username);
+
+	dialog->pass_lbl = gtk_label_new_with_mnemonic (_("_Password:"));
+	gtk_table_attach (GTK_TABLE (table), dialog->pass_lbl,
+	                  0, 1, 1, 2,
+	                  GTK_SHRINK | GTK_FILL,
+	                  GTK_SHRINK | GTK_FILL,
+	                  0, 0);
+
+	dialog->password = gtk_entry_new();
+	gtk_table_attach (GTK_TABLE (table), dialog->password,
+	                  1, 2, 1, 2,
+	                  GTK_EXPAND | GTK_FILL,
+	                  GTK_SHRINK | GTK_FILL,
+	                  0, 0);
+
+	gtk_entry_set_visibility(GTK_ENTRY(dialog->password), FALSE);
+	gtk_label_set_mnemonic_widget (GTK_LABEL (dialog->pass_lbl), dialog->password);
+
+	dialog->may_save = gtk_check_button_new_with_label(_("Remember"));
+	gtk_table_attach (GTK_TABLE (table), dialog->may_save,
+	                  0, 2, 2, 3,
+	                  GTK_EXPAND | GTK_FILL,
+	                  GTK_SHRINK | GTK_FILL,
+	                  0, 0);
+	gtk_widget_show(dialog->may_save);
+
+	gtk_window_set_title (GTK_WINDOW (dialog), _("Login"));
+
+	gtk_dialog_add_buttons (GTK_DIALOG (dialog),
+	                        GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+	                        GTK_STOCK_OK, GTK_RESPONSE_OK,
+	                        NULL);
+	gtk_dialog_set_alternative_button_order (GTK_DIALOG (dialog), GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1);
+	gtk_dialog_set_default_response (GTK_DIALOG (dialog), GTK_RESPONSE_OK);
+
+	gtk_window_set_resizable (GTK_WINDOW (dialog), FALSE);
+}
+
+GtkWidget*
+tsh_login_dialog_new (const gchar *title, GtkWindow *parent, GtkDialogFlags flags, const gchar *username, gboolean password, gboolean may_save)
+{
+	TshLoginDialog *dialog = g_object_new (TSH_TYPE_LOGIN_DIALOG, NULL);
+
+	if(title)
+		gtk_window_set_title (GTK_WINDOW(dialog), title);
+
+	if(parent)
+		gtk_window_set_transient_for (GTK_WINDOW(dialog), parent);
+
+	if(flags & GTK_DIALOG_MODAL)
+		gtk_window_set_modal (GTK_WINDOW(dialog), TRUE);
+
+	if(flags & GTK_DIALOG_DESTROY_WITH_PARENT)
+		gtk_window_set_destroy_with_parent (GTK_WINDOW(dialog), TRUE);
+
+	if(flags & GTK_DIALOG_NO_SEPARATOR)
+		gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
+
+	if(username)
+	{
+		gtk_widget_show(dialog->user_lbl);
+		gtk_entry_set_text(GTK_ENTRY(dialog->username), username);
+		gtk_widget_show(dialog->username);
+		if(password)
+			g_signal_connect (dialog->username, "activate", G_CALLBACK (username_activate), dialog);
+		else
+			g_signal_connect (dialog->username, "activate", G_CALLBACK (password_activate), dialog);
+	}
+
+	if(password)
+	{
+		gtk_widget_show(dialog->pass_lbl);
+		gtk_widget_show(dialog->password);
+		g_signal_connect (dialog->password, "activate", G_CALLBACK (password_activate), dialog);
+	}
+
+	if(!may_save)
+		gtk_widget_set_sensitive(dialog->may_save, FALSE);
+
+	return GTK_WIDGET(dialog);
+}
+
+const gchar*
+tsh_login_dialog_get_username (TshLoginDialog *dialog)
+{
+	return gtk_entry_get_text(GTK_ENTRY(dialog->username));
+}
+
+const gchar*
+tsh_login_dialog_get_password (TshLoginDialog *dialog)
+{
+	return gtk_entry_get_text(GTK_ENTRY(dialog->password));
+}
+
+gboolean
+tsh_login_dialog_get_may_save (TshLoginDialog *dialog)
+{
+	return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(dialog->may_save));
+}
+
+static void
+username_activate (GtkEntry *entry, gpointer user_data)
+{
+	TshLoginDialog *dialog = TSH_LOGIN_DIALOG (user_data);
+
+	gtk_widget_grab_focus (dialog->password);
+}
+
+static void
+password_activate (GtkEntry *entry, gpointer user_data)
+{
+	gtk_dialog_response (GTK_DIALOG (user_data), GTK_RESPONSE_OK);
+}
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.h
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.h	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-login-dialog.h	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,52 @@
+/*-
+ * Copyright (c) 2006 Peter de Ridder <peter at xfce.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __TSH_LOGIN_DIALOG_H__
+#define __TSH_LOGIN_DIALOG_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS;
+
+typedef struct _TshLoginDialogClass TshLoginDialogClass;
+typedef struct _TshLoginDialog      TshLoginDialog;
+
+#define TSH_TYPE_LOGIN_DIALOG             (tsh_login_dialog_get_type ())
+#define TSH_LOGIN_DIALOG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), TSH_TYPE_LOGIN_DIALOG, TshLoginDialog))
+#define TSH_LOGIN_DIALOG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), TSH_TYPE_LOGIN_DIALOG, TshLoginDialogClass))
+#define TSH_IS_LOGIN_DIALOG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TSH_TYPE_LOGIN_DIALOG))
+#define TSH_IS_LOGIN_DIALOG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), TSH_TYPE_LOGIN_DIALOG))
+#define TSH_LOGIN_DIALOG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), TSH_TYPE_LOGIN_DIALOG, TshLoginDialogClass))
+
+GType      tsh_login_dialog_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL;
+
+GtkWidget* tsh_login_dialog_new      (const gchar *title,
+                                      GtkWindow *parent,
+                                      GtkDialogFlags flags,
+                                      const gchar *username,
+                                      gboolean password,
+                                      gboolean may_save) G_GNUC_MALLOC G_GNUC_INTERNAL;
+
+const gchar* tsh_login_dialog_get_username (TshLoginDialog*);
+const gchar* tsh_login_dialog_get_password (TshLoginDialog*);
+gboolean     tsh_login_dialog_get_may_save (TshLoginDialog*);
+
+G_END_DECLS;
+
+#endif /* !__TSH_LOGIN_DIALOG_H__ */

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.c
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.c	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,174 @@
+/*-
+ * Copyright (c) 2006 Peter de Ridder <peter at xfce.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <thunar-vfs/thunar-vfs.h>
+#include <gtk/gtk.h>
+
+#include "tsh-update-dialog.h"
+
+static void cancel_clicked (GtkButton*, gpointer);
+
+struct _TshUpdateDialog
+{
+	GtkDialog dialog;
+
+	GtkWidget *tree_view;
+	GtkWidget *close;
+	GtkWidget *cancel;
+};
+
+struct _TshUpdateDialogClass
+{
+	GtkDialogClass dialog_class;
+};
+
+G_DEFINE_TYPE (TshUpdateDialog, tsh_update_dialog, GTK_TYPE_DIALOG)
+
+static void
+tsh_update_dialog_class_init (TshUpdateDialogClass *klass)
+{
+}
+
+enum {
+	COLUMN_ACTION = 0,
+	COLUMN_PATH,
+	COLUMN_MIME,
+	COLUMN_COUNT
+};
+
+static void
+tsh_update_dialog_init (TshUpdateDialog *dialog)
+{
+	GtkWidget *button;
+	GtkWidget *tree_view;
+	GtkWidget *scroll_window;
+	GtkCellRenderer *renderer;
+	GtkTreeModel *model;
+
+	scroll_window = gtk_scrolled_window_new (NULL, NULL);
+	gtk_scrolled_window_set_policy (GTK_SCROLLED_WINDOW (scroll_window), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
+
+	dialog->tree_view = tree_view = gtk_tree_view_new ();
+	
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
+	                                             -1, _("Action"),
+	                                             renderer, "text",
+	                                             COLUMN_ACTION, NULL);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
+	                                             -1, _("Path"),
+	                                             renderer, "text",
+	                                             COLUMN_PATH, NULL);
+
+	renderer = gtk_cell_renderer_text_new ();
+	gtk_tree_view_insert_column_with_attributes (GTK_TREE_VIEW (tree_view),
+	                                             -1, _("Mime type"),
+	                                             renderer, "text",
+	                                             COLUMN_MIME, NULL);
+
+	model = GTK_TREE_MODEL (gtk_list_store_new (COLUMN_COUNT, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING));
+
+	gtk_tree_view_set_model (GTK_TREE_VIEW (tree_view), model);
+
+	g_object_unref (model);
+
+	gtk_container_add (GTK_CONTAINER (scroll_window), tree_view);
+	gtk_box_pack_start (GTK_BOX (GTK_DIALOG (dialog)->vbox), scroll_window, TRUE, TRUE, 0);
+	gtk_widget_show (tree_view);
+	gtk_widget_show (scroll_window);
+
+	gtk_window_set_title (GTK_WINDOW (dialog), _("Update"));
+
+	dialog->close = button = gtk_dialog_add_button (GTK_DIALOG (dialog), GTK_STOCK_CLOSE, GTK_RESPONSE_CLOSE);
+	gtk_widget_hide (button);
+
+	dialog->cancel = button = gtk_button_new_from_stock(GTK_STOCK_CANCEL);
+	gtk_box_pack_end (GTK_BOX (GTK_DIALOG (dialog)->action_area), button, FALSE, TRUE, 0);
+	g_signal_connect (G_OBJECT (button), "clicked", G_CALLBACK (cancel_clicked), dialog);
+	gtk_widget_show (button);
+
+	gtk_window_set_default_size (GTK_WINDOW (dialog), 500, 400);
+}
+
+GtkWidget*
+tsh_update_dialog_new (const gchar *title, GtkWindow *parent, GtkDialogFlags flags)
+{
+	TshUpdateDialog *dialog = g_object_new (TSH_TYPE_UPDATE_DIALOG, NULL);
+
+	if(title)
+		gtk_window_set_title (GTK_WINDOW(dialog), title);
+
+	if(parent)
+		gtk_window_set_transient_for (GTK_WINDOW(dialog), parent);
+
+	if(flags & GTK_DIALOG_MODAL)
+		gtk_window_set_modal (GTK_WINDOW(dialog), TRUE);
+
+	if(flags & GTK_DIALOG_DESTROY_WITH_PARENT)
+		gtk_window_set_destroy_with_parent (GTK_WINDOW(dialog), TRUE);
+
+	if(flags & GTK_DIALOG_NO_SEPARATOR)
+		gtk_dialog_set_has_separator (GTK_DIALOG(dialog), FALSE);
+
+	return GTK_WIDGET(dialog);
+}
+
+void       
+tsh_update_dialog_add (TshUpdateDialog *dialog, const char *action, const char *file, const char *mime_type)
+{
+	GtkTreeModel *model;
+	GtkTreeIter iter;
+	GtkTreePath *path;
+
+	model = gtk_tree_view_get_model (GTK_TREE_VIEW (dialog->tree_view));
+
+	gtk_list_store_append (GTK_LIST_STORE (model), &iter);
+	gtk_list_store_set (GTK_LIST_STORE (model), &iter,
+	                    COLUMN_ACTION, action,
+	                    COLUMN_PATH, file,
+	                    COLUMN_MIME, mime_type, 
+	                    -1);
+
+	path = gtk_tree_model_get_path (model, &iter);
+	gtk_tree_view_scroll_to_cell (GTK_TREE_VIEW (dialog->tree_view), path, NULL, FALSE, 0, 0);
+	gtk_tree_path_free (path);
+}
+
+void
+tsh_update_dialog_done (TshUpdateDialog *dialog)
+{
+	gtk_widget_hide (dialog->cancel);
+	gtk_widget_show (dialog->close);
+}
+
+static void
+cancel_clicked (GtkButton *button, gpointer user_data)
+{
+	TshUpdateDialog *dialog = TSH_UPDATE_DIALOG (user_data);
+	
+	gtk_widget_hide (dialog->cancel);
+	gtk_widget_show (dialog->close);
+}
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.h
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.h	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update-dialog.h	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,51 @@
+/*-
+ * Copyright (c) 2006 Peter de Ridder <peter at xfce.org>
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Library General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Library General Public License for more details.
+ *
+ * You should have received a copy of the GNU Library General Public
+ * License along with this library; if not, write to the
+ * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
+ * Boston, MA 02111-1307, USA.
+ */
+
+#ifndef __TSH_UPDATE_DIALOG_H__
+#define __TSH_UPDATE_DIALOG_H__
+
+#include <gtk/gtk.h>
+
+G_BEGIN_DECLS;
+
+typedef struct _TshUpdateDialogClass TshUpdateDialogClass;
+typedef struct _TshUpdateDialog      TshUpdateDialog;
+
+#define TSH_TYPE_UPDATE_DIALOG             (tsh_update_dialog_get_type ())
+#define TSH_UPDATE_DIALOG(obj)             (G_TYPE_CHECK_INSTANCE_CAST ((obj), TSH_TYPE_UPDATE_DIALOG, TshUpdateDialog))
+#define TSH_UPDATE_DIALOG_CLASS(klass)     (G_TYPE_CHECK_CLASS_CAST ((klass), TSH_TYPE_UPDATE_DIALOG, TshUpdateDialogClass))
+#define TSH_IS_UPDATE_DIALOG(obj)          (G_TYPE_CHECK_INSTANCE_TYPE ((obj), TSH_TYPE_UPDATE_DIALOG))
+#define TSH_IS_UPDATE_DIALOG_CLASS(klass)  (G_TYPE_CHECK_CLASS_TYPE ((klass), TSH_TYPE_UPDATE_DIALOG))
+#define TSH_UPDATE_DIALOG_GET_CLASS(obj)   (G_TYPE_INSTANCE_GET_CLASS ((obj), TSH_TYPE_UPDATE_DIALOG, TshUpdateDialogClass))
+
+GType      tsh_update_dialog_get_type (void) G_GNUC_CONST G_GNUC_INTERNAL;
+
+GtkWidget* tsh_update_dialog_new      (const gchar *title,
+                                       GtkWindow *parent,
+                                       GtkDialogFlags flags) G_GNUC_MALLOC G_GNUC_INTERNAL;
+
+void       tsh_update_dialog_add      (TshUpdateDialog *dialog,
+                                       const char *action,
+                                       const char *path,
+                                       const char *mime_type);
+void       tsh_update_dialog_done     (TshUpdateDialog *dialog);
+
+G_END_DECLS;
+
+#endif /* !__TSH_UPDATE_DIALOG_H__ */

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.c
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.c	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.c	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,149 @@
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#ifdef HAVE_STDLIB_H
+#include <stdlib.h>
+#endif
+
+#include <glib.h>
+#include <gtk/gtk.h>
+
+#include <thunar-vfs/thunar-vfs.h>
+
+#include <subversion-1/svn_cmdline.h>
+#include <subversion-1/svn_client.h>
+#include <subversion-1/svn_pools.h>
+#include <subversion-1/svn_config.h>
+#include <subversion-1/svn_fs.h>
+
+#include "tsh-common.h"
+#include "tsh-dialog-common.h"
+#include "tsh-update-dialog.h"
+
+#include "tsh-update.h"
+
+static void tsh_notify_func2(void *baton, const svn_wc_notify_t *notify, apr_pool_t *pool)
+{
+	TshUpdateDialog *dialog = TSH_UPDATE_DIALOG (baton);
+	char buffer[256];
+
+	gdk_threads_enter ();
+
+	switch(notify->action)
+	{
+		case svn_wc_notify_update_delete:
+			tsh_update_dialog_add(dialog, _("Deleted"), notify->path, notify->mime_type);
+			break;
+		case svn_wc_notify_update_add:
+			tsh_update_dialog_add(dialog, _("Added"), notify->path, notify->mime_type);
+			break;
+		case svn_wc_notify_update_update:
+			tsh_update_dialog_add(dialog, _("Updated"), notify->path, notify->mime_type);
+			break;
+		case svn_wc_notify_update_completed:
+			g_snprintf(buffer, 256, _("At revision: %li"), notify->revision);
+			tsh_update_dialog_add(dialog, _("Completed"), buffer, NULL);
+			break;
+		case svn_wc_notify_update_external:
+			tsh_update_dialog_add(dialog, _("External"), notify->path, notify->mime_type);
+			break;
+		default:
+			break;
+	}
+
+	gdk_threads_leave ();
+}
+
+struct thread_args {
+	svn_client_ctx_t *ctx;
+	apr_pool_t *pool;
+	TshUpdateDialog *dialog;
+	gchar **files;
+};
+
+gpointer update_thread (gpointer user_data)
+{
+	struct thread_args *args = user_data;
+  svn_opt_revision_t revision;
+	svn_error_t *err;
+	apr_array_header_t *paths;
+	svn_client_ctx_t *ctx = args->ctx;
+	apr_pool_t *pool = args->pool;
+	TshUpdateDialog *dialog = args->dialog;
+	gchar **files = args->files;
+	gint size, i;
+
+	g_free (args);
+
+	size = files?g_strv_length(files):0;
+
+	if(size)
+	{
+		paths = apr_array_make (pool, size, sizeof (const char *));
+		
+		for (i = 0; i < size; i++)
+		{
+			APR_ARRAY_PUSH (paths, const char *) = files[i];
+		}
+	}
+	else
+	{
+		paths = apr_array_make (pool, 1, sizeof (const char *));
+		
+		APR_ARRAY_PUSH (paths, const char *) = ""; // current directory
+	}
+
+	//APR_ARRAY_PUSH (paths, const char *) = "/home/cavalier/xfce/svn/squeeze";
+
+  revision.kind = svn_opt_revision_head;
+	if ((err = svn_client_update2(NULL, paths, &revision, TRUE, TRUE, ctx, pool)))
+	{
+		tsh_update_dialog_done (dialog);
+
+		svn_handle_error2(err, stderr, FALSE, G_LOG_DOMAIN ": ");
+		svn_error_clear(err);
+		return GINT_TO_POINTER (FALSE);
+	}
+
+	tsh_update_dialog_done (dialog);
+	
+	return GINT_TO_POINTER (TRUE);
+}
+
+GThread *tsh_update (gchar **files, svn_client_ctx_t *ctx, apr_pool_t *pool)
+{
+	GtkWidget *dialog;
+	struct thread_args *args;
+
+	dialog = tsh_update_dialog_new (NULL, NULL, 0);
+	tsh_dialog_start (GTK_DIALOG (dialog), TRUE);
+
+	ctx->notify_func2 = tsh_notify_func2;
+	ctx->notify_baton2 = dialog;
+
+	args = g_malloc (sizeof (struct thread_args));
+	args->ctx = ctx;
+	args->pool = pool;
+	args->dialog = TSH_UPDATE_DIALOG (dialog);
+	args->files = files;
+
+	return g_thread_create (update_thread, args, TRUE, NULL);
+}
+

Added: thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.h
===================================================================
--- thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.h	                        (rev 0)
+++ thunar-svn-plugin/trunk/tsp-svn-helper/tsh-update.h	2007-06-03 21:11:29 UTC (rev 2808)
@@ -0,0 +1,27 @@
+/*-
+ * 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 the Free
+ * Software Foundation; either version 2 of the License, or (at your option)
+ * any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for
+ * more details.
+ *
+ * You should have received a copy of the GNU General Public License along with
+ * this program; if not, write to the Free Software Foundation, Inc., 59 Temple
+ * Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+
+#ifndef __TSH_UPDATE_H__
+#define __TSH_UPDATE_H__
+
+G_BEGIN_DECLS
+
+GThread *tsh_update (gchar**, svn_client_ctx_t*, apr_pool_t*);
+
+G_END_DECLS
+
+#endif /*__TSH_UPDATE_H__*/
+




More information about the Goodies-commits mailing list