[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