2003-05-07 (Wed) [長年日記]

Subversion クライアント

Subversion のリポジトリがWebDAV ライブラリからうまくアクセスできないのは、リポジトリに XSLT を設定しているからでは?

himi さんによると現状の Subversion が吐き出す XML は、ダメダメで

SVNIndexXSLT "/~svn/svnindex.xsl"

を設定しているとクライアントが正しくファイルシステムを認識できない可能性があるかもとのこと。

しかしこれを外してしまうと著しく表示が寂しくなるので、ウチのリポジトリでは Subversion repository に習って HTML と XML の両方のビューを用意しました。

あとリポジトリをチェックアウトするような AntTask は、Subversion が提供している SWIG Java binding を利用するのが手っ取り早いでしょう。Java から Subversion API のほとんどが呼び出せます。

参考

Tags: Subversion

SWIG Java binding

...手っ取り早いと思ったので実際やってみました。

んが、ちっとも手っ取り早くないことが判明。

  • Subversion 0.20.1 ではダメ
  • Python の例は豊富だけど Java は、あんまり情報ナシ
  • Windows 環境だとますます情報少な目

乗りかかった船なので Ant からチェックアウトできるところまでやってみました。

Subversion の SWIG インターフェースは、リポジトリと同じサーバで動かすことを想定しているのか、認証関係のサポートがほとんどないみたい。結局適当に svn_client.i へ、svn_client_ctx を構築するヘルパ関数を追加して対処。

Index: svn_client.i
===================================================================
--- svn_client.i	(revision 5817)
+++ svn_client.i	(working copy)
@@ -270,3 +270,36 @@
 %include svn_client.h


+/* -----------------------------------------------------------------------
+  simple client context setup.
+*/
+
+%inline %{
+
+void svn_client_setup_ctx(svn_client_ctx_t *ctx, apr_pool_t *pool, char *username, char *password)
+{
+    apr_array_header_t *providers
+      = apr_array_make(pool, 1, sizeof(svn_auth_provider_object_t *));
+    svn_auth_provider_object_t *simple_provider
+      = (svn_auth_provider_object_t *)apr_pcalloc(pool, sizeof(*simple_provider));
+    svn_auth_baton_t *ab;
+
+    svn_client_get_simple_provider(&simple_provider, pool);
+
+    *(svn_auth_provider_object_t **)apr_array_push(providers) = simple_provider;
+    svn_auth_open(&ab, providers, pool);
+    svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_USERNAME,
+                           username);
+    svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
+                           password);
+
+    ctx->auth_baton = ab;
+    ctx->prompt_func = NULL;
+    ctx->prompt_baton = NULL;
+    ctx->log_msg_func = NULL;
+    ctx->log_msg_baton = NULL;
+    ctx->notify_func = NULL;
+    ctx->notify_baton = NULL;
+}
+
+%}

あとは swig を使って生成した C と Java の Subversion wrapper をコンパイルすればよいのですが、これも一苦労。C ソースは JNI から呼び出せるように DLL としてコンパイルする必要があります。

大変なので wrapper のソースと Win32 用の DLL をまとめて以下に置きます。

アーカイブ中の lib/win32/svn_swig_java-rev5817-2.dll を Subversion のインストールしたディレクトリへ起きます。ここには PATH が通っている必要があります。インストーラで Subversion をインストールしていれば問題ないでしょう。

このへんの Subversion binding 回りを見ていると、なんだか林くんの足跡を辿っているような気分になるな。

参考

Tags: Subversion

SvnTask

肝心の AntTask はこちら

使い方は同梱の build.xml を参考にどうぞ。

Tags: Subversion