[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[PATCH] javahl

From: Cédric Chabanois <cchabanois_at_ifrance.com>
Date: 2003-08-17 23:33:43 CEST

Hi all,

In this patch :
- handleSVNError now takes only one parameter. The second parameter was
never used
- mkdir takes an array of paths instead of a single path, same thing for
remove
- many modifications in Status class
- propertyGet added
- some other modifications

Daniel Bradby and I use javahl with svnant and subclipse (
http://subclipse.tigris.org/ )

I use svnant junit testcases to test these modifications.

Cédric

Index: native/SVNClient.cpp
===================================================================
--- native/SVNClient.cpp (revision 6771)
+++ native/SVNClient.cpp (working copy)
@@ -35,6 +35,7 @@
 #include <svn_path.h>
 #include "org_tigris_subversion_javahl_Status_Kind.h"
 #include "org_tigris_subversion_javahl_Revision.h"
+#include "org_tigris_subversion_javahl_NodeKind.h"
 #include <vector>
 #include <iostream>
 //////////////////////////////////////////////////////////////////////
@@ -126,6 +127,9 @@
     return m_lastPath.c_str();
 }
 
+/**
+ * List directory entries of a URL
+ */
 jobjectArray SVNClient::list(const char *url, Revision &revision, bool
recurse)
 {
     Pool subPool;
@@ -189,7 +193,7 @@
     }
     else
     {
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
         return NULL;
     }
 }
@@ -260,15 +264,13 @@
     }
     else
     {
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
         return NULL;
     }
 }
 
 jobject SVNClient::singleStatus(const char *path, bool onServer)
 {
- //JNIUtil::logMessage("entering singleStatus");
- //JNIUtil::logMessage(path);
     Pool subPool;
     apr_hash_t *status_hash;
     svn_revnum_t youngest = SVN_INVALID_REVNUM;
@@ -279,13 +281,11 @@
         return NULL;
     }
 
- //JNIUtil::logMessage("after getContext");
     svn_error_t *Err = svn_client_status (&status_hash, &youngest,
path, false, TRUE,
                              onServer ? TRUE : FALSE, //update
                              FALSE, //no_ignore,
                              ctx,
                              subPool.pool());
- //JNIUtil::logMessage("after svn_client_status");
     if(Err == NULL)
     {
       apr_array_header_t *statusarray =
@@ -297,12 +297,11 @@
       item = &APR_ARRAY_IDX (statusarray, 0, const svn_item_t);
       status = (svn_wc_status_t *) item->value;
 
- //JNIUtil::logMessage("before createJavaStatus");
       return createJavaStatus((const char *) item->key, status);
     }
     else
     {
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
         return NULL;
     }
 }
@@ -383,7 +382,7 @@
     }
     else
     {
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
         return NULL;
     }
 }
@@ -409,7 +408,7 @@
                                  apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -419,24 +418,22 @@
     m_notify = notify;
 }
 
-void SVNClient::remove(const char *path, const char *message, bool force)
+void SVNClient::remove(Targets &targets, const char *message, bool force)
 {
     svn_client_commit_info_t *commit_info = NULL;
     Pool subPool;
     apr_pool_t * apr_pool = subPool.pool ();
- m_lastPath = path;
+// m_lastPath = path;
     svn_client_ctx_t *ctx = getContext(message);
     if(ctx == NULL)
     {
         return;
     }
 
- Targets targets(path);
-
- svn_error_t *Err = svn_client_delete (&commit_info,
targets.array(subPool), force,
+ svn_error_t *Err = svn_client_delete (&commit_info,
(apr_array_header_t *)targets.array(subPool), force,
                                 ctx, apr_pool);
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -453,7 +450,7 @@
     svn_error_t *Err = svn_client_revert (m_lastPath.c_str (), recurse,
ctx, apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -471,7 +468,7 @@
     svn_error_t *Err = svn_client_add (m_lastPath.c_str (), recurse,
ctx, apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 
 }
@@ -492,7 +489,7 @@
                                ctx,
                                apr_pool);
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -512,13 +509,12 @@
                                targets.array (subPool),
                                !recurse, ctx, apr_pool);
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
     if(commit_info && SVN_IS_VALID_REVNUM (commit_info->revision))
       return commit_info->revision;
 
     return -1;
- return -1;
 }
 
 void SVNClient::copy(const char *srcPath, const char *destPath, const
char *message, Revision &revision)
@@ -539,11 +535,10 @@
                              sourcePath.c_str (),
                              revision.revision(),
                              m_lastPath.c_str (),
- NULL,
                              ctx,
                              apr_pool);
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -569,29 +564,28 @@
                              ctx,
                              apr_pool);
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 }
 
-void SVNClient::mkdir(const char *path, const char *message)
+void SVNClient::mkdir(Targets &targets, const char *message)
 {
     Pool subPool;
     apr_pool_t * apr_pool = subPool.pool ();
     svn_client_commit_info_t *commit_info = NULL;
- m_lastPath = path;
+// m_lastPath = path;
        svn_client_ctx_t *ctx = getContext(message);
     if(ctx == NULL)
     {
         return;
     }
 
- Targets targets(path);
     svn_error_t *Err = svn_client_mkdir (&commit_info,
- targets.array(subPool),
+ (apr_array_header_t *)targets.array(subPool),
                               ctx,
                               apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -608,7 +602,7 @@
     svn_error_t *Err = svn_client_cleanup (m_lastPath.c_str (), ctx,
apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -628,11 +622,11 @@
                                 apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
-void SVNClient::doExport(const char *srcPath, const char *destPath,
Revision &revision)
+void SVNClient::doExport(const char *srcPath, const char *destPath,
Revision &revision,bool force)
 {
     Pool subPool;
     apr_pool_t * apr_pool = subPool.pool ();
@@ -647,12 +641,12 @@
                                m_lastPath.c_str (),
                                const_cast<svn_opt_revision_t*>(
                                  revision.revision ()),
- false, // force
+ force,
                                ctx,
                                apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 
 }
@@ -676,10 +670,10 @@
                                apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 }
 
-void SVNClient::doImport(const char *path, const char *url, const char
*newEntry, const char *message, bool recurse)
+void SVNClient::doImport(const char *path, const char *url, const char
*message, bool recurse)
 {
     Pool subPool;
     apr_pool_t * apr_pool = subPool.pool ();
@@ -694,13 +688,12 @@
     svn_error_t *Err = svn_client_import (&commit_info,
                                m_lastPath.c_str (),
                                url,
- //newEntry,
                                !recurse,
                                ctx,
                                apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
@@ -723,17 +716,60 @@
                               revision2.revision (),
                               localPath,
                               recurse,
+ FALSE, // ignore_ancestry
                               force,
                               FALSE,
- FALSE,
                               ctx,
                               apr_pool);
 
     if(Err != NULL)
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
 
 }
 
+/**
+ * Get a property
+ */
+jobject SVNClient::propertyGet(jobject jthis, const char *path, const
char *name)
+{
+ Pool subPool;
+ apr_pool_t * apr_pool = subPool.pool ();
+ m_lastPath = path;
+
+ Revision rev(Revision::START);
+ svn_client_ctx_t *ctx = getContext(NULL);
+ if(ctx == NULL)
+ {
+ return NULL;
+ }
+
+ apr_hash_t *props;
+ svn_error_t *Err = svn_client_propget(&props,
+ name,
+ m_lastPath.c_str(),
+ rev.revision(),
+ false,
+ ctx,
+ apr_pool);
+
+ if(Err != NULL)
+ {
+ JNIUtil::handleSVNError(Err);
+ return NULL;
+ }
+
+ apr_hash_index_t *hi;
+ hi = apr_hash_first (apr_pool, props); // only one element since we
disabled recurse
+ if (hi == NULL)
+ return NULL; // no property with this name
+
+ const char *filename;
+ svn_string_t *propval;
+ apr_hash_this (hi, (const void **)&filename, NULL, (void**)&propval);
+
+ return createJavaProperty(jthis, path, name, propval);
+}
+
 jobjectArray SVNClient::properties(jobject jthis, const char *path)
 {
   apr_array_header_t * props;
@@ -748,7 +784,6 @@
     return NULL;
   }
 
-
   svn_error_t *Err = svn_client_proplist (&props,
                                m_lastPath.c_str (),
                                rev.revision(),
@@ -757,7 +792,7 @@
                                apr_pool);
   if(Err != NULL)
   {
- JNIUtil::handleSVNError(Err, NULL);
+ JNIUtil::handleSVNError(Err);
     return NULL;
   }
 
@@ -918,6 +953,7 @@
       svn_auth_set_parameter(ab, SVN_AUTH_PARAM_DEFAULT_PASSWORD,
                              m_passWord.c_str());
 
+
     ctx->auth_baton = ab;
     ctx->prompt_func = NULL;
     ctx->prompt_baton = NULL;
@@ -926,9 +962,9 @@
     ctx->log_msg_func = getCommitMessage;
     ctx->log_msg_baton = getCommitMessageBaton(message);
     svn_error_t *err = NULL;
- if (( err = svn_config_get_config (&(ctx->config),
JNIUtil::getRequestPool()->pool())))
+ if (( err = svn_config_get_config (&(ctx->config), NULL,
JNIUtil::getRequestPool()->pool())))
     {
- JNIUtil::handleSVNError(err, NULL);
+ JNIUtil::handleSVNError(err);
         return NULL;
     }
 
@@ -964,6 +1000,7 @@
     }
     return NULL;
 }
+
 jobject SVNClient::createJavaStatus(const char *path, svn_wc_status_t
*status)
 {
     JNIEnv *env = JNIUtil::getEnv();
@@ -972,45 +1009,41 @@
     {
         return NULL;
     }
- //JNIUtil::logMessage("after FindClass");
     static jmethodID mid = 0;
     if(mid == 0)
     {
- mid = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;ZJJLjava/lang/String;IIZZZIILjava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;J)V");
+ mid = env->GetMethodID(clazz, "<init>",
+
 "(Ljava/lang/String;Ljava/lang/String;IJJJLjava/lang/String;IIIIZZLjava/lang/String;Ljava/lang/String;Ljava/lang/String;)V");
         if(JNIUtil::isJavaExceptionThrown())
         {
             return NULL;
         }
- //JNIUtil::logMessage("after MethodID");
     }
     jstring jPath = JNIUtil::makeJString(path);
     if(JNIUtil::isJavaExceptionThrown())
     {
         return NULL;
     }
- //JNIUtil::logMessage("after makeJString(path)");
 
- jboolean jIsVersioned = JNI_FALSE;
- jboolean jIsDir = JNI_FALSE;
- jboolean jIsCopied = JNI_FALSE;
- jboolean jIsLocked = JNI_FALSE;
+ jstring jUrl = NULL;
+ jint jNodeKind = org_tigris_subversion_javahl_NodeKind_unknown;
     jlong jRevision =
org_tigris_subversion_javahl_Revision_SVN_INVALID_REVNUM;
- jlong jLastChanged = 0;
+ jlong jLastChangedRevision =
org_tigris_subversion_javahl_Revision_SVN_INVALID_REVNUM;
+ jlong jLastChangedDate = 0;
     jstring jLastCommitAuthor = NULL;
     jint jTextType = org_tigris_subversion_javahl_Status_Kind_none;
     jint jPropType = org_tigris_subversion_javahl_Status_Kind_none;
     jint jRepositoryTextType =
org_tigris_subversion_javahl_Status_Kind_none;
     jint jRepositoryPropType =
org_tigris_subversion_javahl_Status_Kind_none;
+ jboolean jIsLocked = JNI_FALSE;
+ jboolean jIsCopied = JNI_FALSE;
+ jstring jConflictOld = NULL;
     jstring jConflictNew = NULL;
- jstring jConflictOld = NULL;
     jstring jConflictWorking = NULL;
- jstring jURL = NULL;
- jstring jURLCopiedFrom = NULL;
- jlong jRevisionCopiedFrom =
org_tigris_subversion_javahl_Revision_SVN_INVALID_REVNUM;
 
     if(status != NULL)
     {
- jIsVersioned = (status->text_status >
svn_wc_status_unversioned) ? JNI_TRUE : JNI_FALSE;
+
         jTextType = mapStatusKind(status->text_status);
         jPropType = mapStatusKind(status->prop_status);
         jRepositoryTextType = mapStatusKind(status->repos_text_status);
@@ -1018,72 +1051,67 @@
         jIsCopied = (status->copied == 1) ? JNI_TRUE: JNI_FALSE;
         jIsLocked = (status->locked == 1) ? JNI_TRUE: JNI_FALSE;
 
+
         svn_wc_entry_t * entry = status->entry;
         if (entry != NULL)
         {
+ jUrl = JNIUtil::makeJString(entry->url);
+ if(JNIUtil::isJavaExceptionThrown())
+ {
+ return NULL;
+ }
+ jNodeKind = entry->kind;
             jRevision = entry->revision;
- jLastChanged = entry->cmt_rev;
+ jLastChangedRevision = entry->cmt_rev;
+ jLastChangedDate = entry->cmt_date;
             jLastCommitAuthor = JNIUtil::makeJString(entry->cmt_author);
             if(JNIUtil::isJavaExceptionThrown())
             {
                 return NULL;
             }
- //JNIUtil::logMessage("after makeJString(entry->cmt_author)");
- jIsDir = (entry->kind == svn_node_dir) ? JNI_TRUE: JNI_FALSE;
+
             jConflictNew = JNIUtil::makeJString(entry->conflict_new);
             if(JNIUtil::isJavaExceptionThrown())
             {
                 return NULL;
             }
- //JNIUtil::logMessage("after
makeJString(entry->conflict_new)");
             jConflictOld = JNIUtil::makeJString(entry->conflict_old);
             if(JNIUtil::isJavaExceptionThrown())
             {
                 return NULL;
             }
- //JNIUtil::logMessage("after
makeJString(entry->conflict_old)");
             jConflictWorking= JNIUtil::makeJString(entry->conflict_wrk);
             if(JNIUtil::isJavaExceptionThrown())
             {
                 return NULL;
             }
- //JNIUtil::logMessage("after
makeJString(entry->conflict_work)");
- jURL = JNIUtil::makeJString(entry->url);
+ }
+ }
+
+ jobject ret = env->NewObject(clazz, mid, jPath, jUrl, jNodeKind,
jRevision, jLastChangedRevision, jLastChangedDate, jLastCommitAuthor,
+ jTextType, jPropType, jRepositoryTextType, jRepositoryPropType,
jIsLocked, jIsCopied, jConflictOld, jConflictNew, jConflictWorking);
             if(JNIUtil::isJavaExceptionThrown())
             {
                 return NULL;
             }
- //JNIUtil::logMessage("after
makeJString(entry->conflict_work)");
- jURLCopiedFrom = JNIUtil::makeJString(entry->copyfrom_url);
+ env->DeleteLocalRef(clazz);
             if(JNIUtil::isJavaExceptionThrown())
             {
                 return NULL;
             }
- //JNIUtil::logMessage("after
makeJString(entry->copyfrom_url)");
- jRevisionCopiedFrom = entry->copyfrom_rev;
- }
- }
-
- jobject ret = env->NewObject(clazz, mid, jPath, jIsDir, jRevision,
jLastChanged, jLastCommitAuthor,
- jTextType, jPropType, jIsVersioned, jIsLocked, jIsCopied,
jRepositoryTextType, jRepositoryPropType,
- jConflictOld, jConflictNew, jConflictWorking, jURL,
jURLCopiedFrom, jRevisionCopiedFrom);
+ env->DeleteLocalRef(jPath);
     if(JNIUtil::isJavaExceptionThrown())
     {
         return NULL;
     }
- //JNIUtil::logMessage("NewObject");
- env->DeleteLocalRef(clazz);
- if(JNIUtil::isJavaExceptionThrown())
+ if (jUrl != NULL)
     {
- return NULL;
- }
- //JNIUtil::logMessage("DeleteLocalRef(clazz)");
- env->DeleteLocalRef(jPath);
+ env->DeleteLocalRef(jUrl);
     if(JNIUtil::isJavaExceptionThrown())
     {
         return NULL;
     }
- //JNIUtil::logMessage("DeleteLocalRef(jPath)");
+ }
     if(jLastCommitAuthor != NULL)
     {
         env->DeleteLocalRef(jLastCommitAuthor);
@@ -1091,7 +1119,6 @@
         {
             return NULL;
         }
- //JNIUtil::logMessage("DeleteLocalRef(jLastCommitAuthor)");
     }
     if(jConflictNew != NULL)
     {
@@ -1100,7 +1127,6 @@
         {
             return NULL;
         }
- //JNIUtil::logMessage("DeleteLocalRef(jConflictNew)");
     }
     if(jConflictOld != NULL)
     {
@@ -1109,7 +1135,6 @@
         {
             return NULL;
         }
- //JNIUtil::logMessage("DeleteLocalRef(jConflictOld)");
     }
     if(jConflictWorking != NULL)
     {
@@ -1118,28 +1143,10 @@
         {
             return NULL;
         }
- //JNIUtil::logMessage("DeleteLocalRef(jConflictWorking");
     }
- if(jURL != NULL)
- {
- env->DeleteLocalRef(jURL);
- if(JNIUtil::isJavaExceptionThrown())
- {
- return NULL;
- }
- //JNIUtil::logMessage("DeleteLocalRef(jURL");
- }
- if(jURLCopiedFrom != NULL)
- {
- env->DeleteLocalRef(jURLCopiedFrom);
- if(JNIUtil::isJavaExceptionThrown())
- {
- return NULL;
- }
- //JNIUtil::logMessage("DeleteLocalRef(jURLCopiedFrom");
- }
     return ret;
 }
+
 jint SVNClient::mapStatusKind(int svnKind)
 {
     switch(svnKind)
@@ -1165,8 +1172,12 @@
         return org_tigris_subversion_javahl_Status_Kind_merged;
     case svn_wc_status_conflicted:
         return org_tigris_subversion_javahl_Status_Kind_conflicted;
+ case svn_wc_status_ignored:
+ return org_tigris_subversion_javahl_Status_Kind_ignored;
     case svn_wc_status_obstructed:
         return org_tigris_subversion_javahl_Status_Kind_obstructed;
+ case svn_wc_status_incomplete:
+ return org_tigris_subversion_javahl_Status_Kind_incomplete;
     }
 }
 svn_error_t *SVNClient::messageReceiver (void *baton, apr_hash_t *
changed_paths,
@@ -1318,7 +1329,7 @@
   svn_error_t * error = svn_client_propset (name, value, path,
                                 recurse,
JNIUtil::getRequestPool()->pool());
   if(error != NULL)
- JNIUtil::handleSVNError(error, NULL);
+ JNIUtil::handleSVNError(error);
 }
 
 jbyteArray SVNClient::fileContent(const char *path, Revision &revision)
@@ -1338,7 +1349,7 @@
                                pool.pool());
         if(err != NULL)
         {
- JNIUtil::handleSVNError(err, NULL);
+ JNIUtil::handleSVNError(err);
             return NULL;
         }
         apr_file_t *file = NULL;
@@ -1372,7 +1383,7 @@
                 path, revision.revision(), ctx, pool.pool());
         if(err != NULL)
         {
- JNIUtil::handleSVNError(err, NULL);
+ JNIUtil::handleSVNError(err);
             return NULL;
         }
         size = buf->len;
@@ -1399,7 +1410,7 @@
     if(err != NULL)
     {
         env->ReleaseByteArrayElements(ret, retdata, 0);
- JNIUtil::handleSVNError(err, NULL);
+ JNIUtil::handleSVNError(err);
         return NULL;
     }
     env->ReleaseByteArrayElements(ret, retdata, 0);
@@ -1412,6 +1423,9 @@
     return ret;
 }
 
+/**
+ * create a DirEntry java object from svn_dirent_t structure
+ */
 jobject SVNClient::createJavaDirEntry(const char *path, svn_dirent_t
*dirent)
 {
     JNIEnv *env = JNIUtil::getEnv();
@@ -1489,14 +1503,14 @@
 
   if(error != SVN_NO_ERROR)
   {
- JNIUtil::handleSVNError(error, NULL);
+ JNIUtil::handleSVNError(error);
     return NULL;
   }
    
   if(URL == NULL)
   {
       
JNIUtil::handleSVNError(svn_error_create(SVN_ERR_UNVERSIONED_RESOURCE, NULL,
- "Either a URL or versioned item is
required."), NULL);
+ "Either a URL or versioned item is
required."));
       return NULL;
   }
       
@@ -1505,7 +1519,7 @@
                                        &set_rev, ctx, apr_pool);
   if(error != SVN_NO_ERROR)
   {
- JNIUtil::handleSVNError(error, NULL);
+ JNIUtil::handleSVNError(error);
     return NULL;
   }
 
Index: native/JNIUtil.h
===================================================================
--- native/JNIUtil.h (revision 6771)
+++ native/JNIUtil.h (working copy)
@@ -56,7 +56,7 @@
     static bool isExceptionThrown();
     static void handleAPRError(int error, const char *op);
     static void putFinalizedClient(SVNClient *cl);
- static void handleSVNError(svn_error *err, const char *message);
+ static void handleSVNError(svn_error *err);
     static void throwError(const char *message);
     static apr_pool_t * getPool();
     static bool JNIInit(JNIEnv *env);
Index: native/svnjavahl.dsp
===================================================================
--- native/svnjavahl.dsp (revision 6771)
+++ native/svnjavahl.dsp (working copy)
@@ -55,7 +55,12 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
odbc32.lib odbccp32.lib /nologo /dll /machine:I386
-# ADD LINK32 "C:\program files\microsoft sdk\lib\shfolder.lib"
ws2_32.lib Rpcrt4.lib Mswsock.lib
../../../../../db4-win32\lib\libdb41.lib
../../../../../Release/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Release/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Release/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Release/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Release/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Release/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Release/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Release/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Release/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibR/apr.lib
../../../../../apr-iconv/LibR/apriconv.lib
../../../../../apr-util/LibR/aprutil.lib
../../../../../Release/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Release/subversion/libsvn_client/libsvn_client-1.lib
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /machine:I386
+# ADD LINK32 ../../../../../db4-win32\lib\libdb41.lib
../../../../../Release/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Release/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Release/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Release/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Release/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Release/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Release/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Release/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Release/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibR/apr.lib
../../../../../apr-iconv/LibR/apriconv.lib
../../../../../apr-util/LibR/aprutil.lib
../../../../../Release/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Release/subversion/libsvn_client/libsvn_client-1.lib
shfolder.lib Rpcrt4.lib Mswsock.lib ws2_32.lib kernel32.lib user32.lib
gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=createJar
+PostBuild_Cmds=jar cvf javahl.jar -C ../cls .
+# End Special Build Tool
 
 !ELSEIF "$(CFG)" == "svnjavahl - Win32 Debug"
 
@@ -81,7 +86,12 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib
comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib
odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 Rpcrt4.lib Mswsock.lib "C:\program files\microsoft
sdk\lib\shfolder.lib" ../../../../../db4-win32\lib\libdb41d.lib
../../../../../Debug/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Debug/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Debug/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Debug/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Debug/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Debug/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Debug/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Debug/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibD/apr.lib
../../../../../apr-iconv/LibD/apriconv.lib
../../../../../apr-util/LibD/aprutil.lib
../../../../../Debug/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Debug/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Debug/subversion/libsvn_client/libsvn_client-1.lib
ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ../../../../../db4-win32\lib\libdb41d.lib
../../../../../Debug/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Debug/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Debug/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Debug/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Debug/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Debug/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Debug/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Debug/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibD/apr.lib
../../../../../apr-iconv/LibD/apriconv.lib
../../../../../apr-util/LibD/aprutil.lib
../../../../../Debug/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Debug/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Debug/subversion/libsvn_client/libsvn_client-1.lib
shfolder.lib Rpcrt4.lib Mswsock.lib ws2_32.lib kernel32.lib user32.lib
gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug
/machine:I386 /pdbtype:sept
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=createJar
+PostBuild_Cmds=jar cvf javahl.jar -C ../cls .
+# End Special Build Tool
 
 !ELSEIF "$(CFG)" == "svnjavahl - Win32 Release DB40"
 
@@ -108,8 +118,13 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 ws2_32.lib Rpcrt4.lib Mswsock.lib
../../../../../db4-win32\lib\libdb41.lib
../../../../../Release/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Release/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Release/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Release/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Release/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Release/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Release/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Release/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Release/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibR/apr.lib
../../../../../apr-iconv/LibR/apriconv.lib
../../../../../apr-util/LibR/aprutil.lib
../../../../../Release/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Release/subversion/libsvn_client/libsvn_client-1.lib
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /machine:I386
-# ADD LINK32 "C:\program files\microsoft sdk\lib\shfolder.lib"
ws2_32.lib Rpcrt4.lib Mswsock.lib
../../../../../db4-win32\lib\libdb40.lib
../../../../../Release/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Release/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Release/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Release/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Release/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Release/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Release/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Release/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Release/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibR/apr.lib
../../../../../apr-iconv/LibR/apriconv.lib
../../../../../apr-util/LibR/aprutil.lib
../../../../../Release/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Release/subversion/libsvn_client/libsvn_client-1.lib
kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib
shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
/nologo /dll /machine:I386
+# ADD LINK32 ../../../../../db4-win32\lib\libdb40.lib
../../../../../Release/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Release/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Release/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Release/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Release/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Release/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Release/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Release/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Release/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibR/apr.lib
../../../../../apr-iconv/LibR/apriconv.lib
../../../../../apr-util/LibR/aprutil.lib
../../../../../Release/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Release/subversion/libsvn_client/libsvn_client-1.lib
shfolder.lib Rpcrt4.lib Mswsock.lib ws2_32.lib kernel32.lib user32.lib
gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
 # SUBTRACT LINK32 /pdb:none
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=createJar
+PostBuild_Cmds=jar cvf ../javahl.jar -C ../cls org/tigris/subversion/javahl
+# End Special Build Tool
 
 !ELSEIF "$(CFG)" == "svnjavahl - Win32 Debug DB40"
 
@@ -136,8 +151,13 @@
 # ADD BSC32 /nologo
 LINK32=link.exe
 # ADD BASE LINK32 Rpcrt4.lib Mswsock.lib
../../../../../db4-win32\lib\libdb41d.lib
../../../../../Debug/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Debug/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Debug/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Debug/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Debug/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Debug/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Debug/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Debug/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibD/apr.lib
../../../../../apr-iconv/LibD/apriconv.lib
../../../../../apr-util/LibD/aprutil.lib
../../../../../Debug/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Debug/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Debug/subversion/libsvn_client/libsvn_client-1.lib
ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
-# ADD LINK32 "C:\program files\microsoft sdk\lib\shfolder.lib"
Rpcrt4.lib Mswsock.lib ../../../../../db4-win32\lib\libdb40d.lib
../../../../../Debug/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Debug/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Debug/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Debug/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Debug/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Debug/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Debug/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Debug/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibD/apr.lib
../../../../../apr-iconv/LibD/apriconv.lib
../../../../../apr-util/LibD/aprutil.lib
../../../../../Debug/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Debug/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Debug/subversion/libsvn_client/libsvn_client-1.lib
ws2_32.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib
advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib
odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
+# ADD LINK32 ../../../../../db4-win32\lib\libdb40d.lib
../../../../../Debug/subversion/libsvn_fs/libsvn_fs-1.lib
../../../../../Debug/subversion/libsvn_repos/libsvn_repos-1.lib
../../../../../Debug/subversion/libsvn_delta/libsvn_delta-1.lib
../../../../../Debug/subversion/libsvn_ra_dav/libsvn_ra_dav-1.lib
../../../../../Debug/subversion/libsvn_ra_svn/libsvn_ra_svn-1.lib
../../../../../Debug/subversion/libsvn_ra_local/libsvn_ra_local-1.lib
../../../../../Debug/subversion/libsvn_ra/libsvn_ra-1.lib
../../../../../Debug/subversion/libsvn_wc/libsvn_wc-1.lib
../../../../../apr/LibD/apr.lib
../../../../../apr-iconv/LibD/apriconv.lib
../../../../../apr-util/LibD/aprutil.lib
../../../../../Debug/subversion/libsvn_subr/libsvn_subr-1.lib
../../../../../Debug/subversion/libsvn_diff/libsvn_diff-1.lib
../../../../../Debug/subversion/libsvn_client/libsvn_client-1.lib
shfolder.lib Rpcrt4.lib Mswsock.lib ws2_32.lib kernel32.lib user32.lib
gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib
oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug
/machine:I386 /pdbtype:sept
 # SUBTRACT LINK32 /pdb:none
+# Begin Special Build Tool
+SOURCE="$(InputPath)"
+PostBuild_Desc=createJar
+PostBuild_Cmds=jar cvf javahl.jar -C ../cls .
+# End Special Build Tool
 
 !ENDIF
 
Index: native/org_tigris_subversion_javahl_SVNClient.cpp
===================================================================
--- native/org_tigris_subversion_javahl_SVNClient.cpp (revision 6771)
+++ native/org_tigris_subversion_javahl_SVNClient.cpp (working copy)
@@ -332,7 +332,7 @@
  * Signature: (Ljava/lang/String;Ljava/lang/String;Z)V
  */
 JNIEXPORT void JNICALL Java_org_tigris_subversion_javahl_SVNClient_remove
- (JNIEnv *env, jobject jthis, jstring jpath, jstring jmessage,
jboolean jforce)
+ (JNIEnv* env, jobject jthis, jobjectArray jtargets, jstring jmessage,
jboolean jforce)
 {
     JNIEntry(SVNClient, remove);
     SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -341,17 +341,13 @@
         JNIUtil::throwError("bad c++ this");
         return;
     }
- JNIStringHolder path(jpath);
- if(JNIUtil::isExceptionThrown())
- {
- return;
- }
+ Targets targets(jtargets);
     JNIStringHolder message(jmessage);
     if(JNIUtil::isExceptionThrown())
     {
         return;
     }
- cl->remove(path, message, jforce ? true : false);
+ cl->remove(targets, message, jforce ? true : false);
 }
 
 /*
@@ -534,7 +530,7 @@
  * Signature: (Ljava/lang/String;Ljava/lang/String;)V
  */
 JNIEXPORT void JNICALL Java_org_tigris_subversion_javahl_SVNClient_mkdir
- (JNIEnv* env, jobject jthis, jstring jpath, jstring jmessage)
+ (JNIEnv* env, jobject jthis, jobjectArray jtargets, jstring jmessage)
 {
     JNIEntry(SVNClient, mkdir);
     SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -543,17 +539,13 @@
         JNIUtil::throwError("bad c++ this");
         return;
     }
- JNIStringHolder path(jpath);
- if(JNIUtil::isExceptionThrown())
- {
- return;
- }
+ Targets targets(jtargets);
     JNIStringHolder message(jmessage);
     if(JNIUtil::isExceptionThrown())
     {
         return;
     }
- cl->mkdir(path, message);
+ cl->mkdir(targets, message);
 }
 
 /*
@@ -608,7 +600,7 @@
  * Signature:
(Ljava/lang/String;Ljava/lang/String;Lorg/tigris/subversion/javahl/Revision;)V
  */
 JNIEXPORT void JNICALL Java_org_tigris_subversion_javahl_SVNClient_doExport
- (JNIEnv* env, jobject jthis, jstring jsrcPath, jstring jdestPath,
jobject jrevision)
+ (JNIEnv* env, jobject jthis, jstring jsrcPath, jstring jdestPath,
jobject jrevision,jboolean jforce)
 {
     JNIEntry(SVNClient, doExport);
     SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -632,7 +624,7 @@
     {
         return;
     }
- cl->doExport(srcPath, destPath, revision);
+ cl->doExport(srcPath, destPath, revision, jforce ? true : false);
 }
 
 /*
@@ -674,7 +666,7 @@
  * Signature:
(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Z)V
  */
 JNIEXPORT void JNICALL Java_org_tigris_subversion_javahl_SVNClient_doImport
- (JNIEnv* env, jobject jthis, jstring jpath, jstring jurl, jstring
jnewEntry, jstring jmessage, jboolean jrecurse)
+ (JNIEnv* env, jobject jthis, jstring jpath, jstring jurl, jstring
jmessage, jboolean jrecurse)
 {
     JNIEntry(SVNClient, doImport);
     SVNClient *cl = SVNClient::getCppObject(jthis);
@@ -693,17 +685,12 @@
     {
         return;
     }
- JNIStringHolder newEntry(jnewEntry);
- if(JNIUtil::isExceptionThrown())
- {
- return;
- }
     JNIStringHolder message(jmessage);
     if(JNIUtil::isExceptionThrown())
     {
         return;
     }
- cl->doImport(path, url, newEntry, message, jrecurse ? true : false);
+ cl->doImport(path, url, message, jrecurse ? true : false);
 }
 
 /*
@@ -899,6 +886,7 @@
     cl->propertyCreate(path, name, value, jrecurse ? true:false);
 }
 
+
 /*
  * Class: org_tigris_subversion_javahl_SVNClient
  * Method: propertyCreate
@@ -965,6 +953,34 @@
 }
   /*
  * Class: org_tigris_subversion_javahl_SVNClient
+ * Method: propertyGet
+ * Signature:
(Ljava/lang/String;Ljava/lang/String;)Lorg/tigris/subversion/javahl/PropertyData;
+ */
+JNIEXPORT jobject JNICALL
Java_org_tigris_subversion_javahl_SVNClient_propertyGet
+ (JNIEnv *env, jobject jthis, jstring jpath, jstring jname)
+{
+ JNIEntry(SVNClient, propertyGet);
+ SVNClient *cl = SVNClient::getCppObject(jthis);
+ if(cl == NULL)
+ {
+ JNIUtil::throwError("bad c++ this");
+ return NULL;
+ }
+ JNIStringHolder path(jpath);
+ if(JNIUtil::isExceptionThrown())
+ {
+ return NULL;
+ }
+ JNIStringHolder name(jname);
+ if(JNIUtil::isExceptionThrown())
+ {
+ return NULL;
+ }
+ return cl->propertyGet(jthis, path, name);
+}
+
+ /*
+ * Class: org_tigris_subversion_javahl_SVNClient
  * Method: fileContent
  * Signature: (Ljava/lang/String;Lorg/tigris/subversion/javahl/Revision;)[B
  */
Index: native/SVNClient.h
===================================================================
--- native/SVNClient.h (revision 6771)
+++ native/SVNClient.h (working copy)
@@ -38,8 +38,6 @@
 class SVNClient
 {
 public:
- jobject revProperty(jobject jthis, const char *path, const char
*name, Revision &rev);
- jobjectArray list(const char *url, Revision &revision, bool force);
     jbyteArray fileContent(const char *path, Revision &revision);
     void propertyCreate(const char *path, const char *name,
JNIByteArray &value, bool recurse);
     void propertyCreate(const char *path, const char *name, const char
*value, bool recurse);
@@ -48,19 +46,19 @@
     void propertySet(const char *path, const char *name, const char
*value, bool recurse);
     jobjectArray properties(jobject jthis, const char *path);
     void merge(const char *path1, Revision &revision1, const char
*path2, Revision &revision2,const char *localPath, bool force, bool
recurse);
- void doImport(const char *path, const char *url, const char
*newEntry, const char *message, bool recurse);
+ void doImport(const char *path, const char *url, const char
*message, bool recurse);
     void doSwitch(const char *path, const char *url, Revision
&revision, bool recurse);
- void doExport(const char *srcPath, const char *destPath, Revision
&revision);
+ void doExport(const char *srcPath, const char *destPath, Revision
&revision, bool force);
     void resolved(const char *path, bool recurse);
     void cleanup(const char *path);
- void mkdir(const char *path, const char *message);
+ void mkdir(Targets &targets, const char *message);
     void move(const char *srcPath, const char *destPath, const char
*message, Revision &revision, bool force);
     void copy(const char *srcPath, const char *destPath, const char
*message, Revision &revision);
     jlong commit(Targets &targets, const char *message, bool recurse);
     void update(const char *path, Revision &revision, bool recurse);
     void add(const char *path, bool recurse);
     void revert(const char *path, bool recurse);
- void remove(const char *path, const char *message, bool force);
+ void remove(Targets &targets, const char *message,bool force);
     void notification(Notify *notify);
     void checkout(const char *moduleName, const char *destPath,
Revision &revision, bool recurse);
     jobjectArray logMessages(const char *path, Revision &revisionStart,
Revision &revisionEnd);
@@ -69,6 +67,9 @@
     void username(const char *username);
     jobject singleStatus(const char *path, bool onServer);
     jobjectArray status(const char *path, bool descend, bool onServer);
+ jobjectArray list(const char *url, Revision &revision, bool recurse);
+ jobject revProperty(jobject jthis, const char *path, const char
*name, Revision &rev);
+ jobject propertyGet(jobject jthis, const char *path, const char *name);
     const char * getLastPath();
     void finalize();
     void dispose(jobject jthis);
Index: native/JNIUtil.cpp
===================================================================
--- native/JNIUtil.cpp (revision 6771)
+++ native/JNIUtil.cpp (working copy)
@@ -100,11 +100,11 @@
     /* Create our top-level pool. */
     g_pool = svn_pool_create (NULL);
 
- svn_error *err = svn_config_ensure (g_pool);
+ svn_error *err = svn_config_ensure (NULL, g_pool); // we use the
default directory for config files
     if (err)
     {
         svn_pool_destroy (g_pool);
- handleSVNError(err, 0);
+ handleSVNError(err);
         return false;
     }
 
@@ -159,14 +159,14 @@
     env->DeleteLocalRef(clazz);
 }
 
-void JNIUtil::handleSVNError(svn_error *err, const char *message)
+void JNIUtil::handleSVNError(svn_error *err)
 {
     JNIEnv *env = getEnv();
     jclass clazz = env->FindClass(JAVA_PACKAGE"/ClientException");
     if(getLogLevel() >= exceptionLog)
     {
         JNICriticalSection cs(*g_logMutex);
- g_logStream << "Error SVN exception thrown message:<" <<
(message ? message : "#")<< "> description:<";
+ g_logStream << "Error SVN exception thrown message:<";
         g_logStream << err->message << "> file:<" << err->file << ">
apr-err:<" << err->apr_err;
         g_logStream << ">" << std::endl;
     }
@@ -178,15 +178,10 @@
     std::string buffer;
     assembleErrorMessage(err, 0, APR_SUCCESS, buffer);
     jstring jmessage = makeJString(buffer.c_str());
- jstring jdescription = NULL;
     if(isJavaExceptionThrown())
     {
         return;
     }
- if(message)
- {
- jdescription = makeJString(message);
- }
     if(isJavaExceptionThrown())
     {
         return;
@@ -196,12 +191,12 @@
     {
         return;
     }
- jmethodID mid = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;I)V");
+ jmethodID mid = env->GetMethodID(clazz, "<init>",
"(Ljava/lang/String;Ljava/lang/String;I)V");
     if(isJavaExceptionThrown())
     {
         return;
     }
- jobject error = env->NewObject(clazz, mid, jmessage, jdescription,
jfile, static_cast<jint>(err->apr_err));
+ jobject error = env->NewObject(clazz, mid, jmessage, jfile,
static_cast<jint>(err->apr_err));
     if(isJavaExceptionThrown())
     {
         return;
@@ -216,11 +211,6 @@
     {
         return;
     }
- env->DeleteLocalRef(jdescription);
- if(isJavaExceptionThrown())
- {
- return;
- }
     env->DeleteLocalRef(jfile);
     if(isJavaExceptionThrown())
     {
Index: src/org/tigris/subversion/javahl/DirEntry.java
===================================================================
--- src/org/tigris/subversion/javahl/DirEntry.java (revision 6771)
+++ src/org/tigris/subversion/javahl/DirEntry.java (working copy)
@@ -66,9 +66,9 @@
     /**
      * @return revision
      */
- public long getLastChangedRevision()
+ public Revision.Number getLastChangedRevision()
     {
- return lastChangedRevision;
+ return new Revision.Number(lastChangedRevision);
     }
 
     public boolean getHasProps()
Index: src/org/tigris/subversion/javahl/Status.java
===================================================================
--- src/org/tigris/subversion/javahl/Status.java (revision 6771)
+++ src/org/tigris/subversion/javahl/Status.java (working copy)
@@ -16,191 +16,241 @@
  * @endcopyright
  */
 package org.tigris.subversion.javahl;
+import java.net.MalformedURLException;
+import java.net.URL;
+import java.util.Date;
 
 
-
 /**
  * Subversion status API.
+ * @author Patrick Mayweg
+ * @author Cédric Chabanois
+ * <a
href="mailto:cchabanois@ifrance.com">cchabanois@ifrance.com</a>
  */
 public class Status
 {
- Status(String p, boolean id, long r, long lc, String lca, int tt,
int pt, boolean iv,
- boolean il, boolean ic, int rtt, int rpt, String
coo, String con, String cow, String ur, String urcf, long recf)
+ private String url; // url in repository
+ private String path;
+ private int nodeKind; // node kind (file, dir, ...)
+ private long revision; // base revision
+ private long lastChangedRevision;// last revision this was changed
+ private long lastChangedDate; // last date this was changed
+ private String lastCommitAuthor; // last commit author of this item
+ private int textStatus;
+ private int propStatus;
+ private boolean locked;
+ private boolean copied; // in a copied state
+ private int repositoryTextStatus;
+ private int repositoryPropStatus;
+ private String conflictNew; // new version of conflicted file
+ private String conflictOld; // old version of conflicted file
+ private String conflictWorking; // working version of conflicted file
+
+
+
+ public Status(String path, String url, int nodeKind, long revision,
+ long lastChangedRevision, long lastChangedDate, String
lastCommitAuthor,
+ int textStatus, int propStatus,
+ int repositoryTextStatus, int repositoryPropStatus,
+ boolean locked, boolean copied,
+ String conflictOld, String conflictNew, String conflictWorking)
     {
- pa = p;
- idi = id;
- re = r;
- lch = lc;
- lcoa = lca;
- tty = tt;
- pty = pt;
- ive = iv;
- ilo = il;
- ico = ic;
- rtty = rtt;
- rpty = rpt;
- co = coo;
- cn = con;
- cw = cow;
- u = ur;
- ucf = urcf;
- rcf = recf;
+ this.path = path;
+ this.url = url;
+ this.nodeKind = nodeKind;
+ this.revision = revision;
+ this.lastChangedRevision = lastChangedRevision;
+ this.lastChangedDate = lastChangedDate;
+ this.lastCommitAuthor = lastCommitAuthor;
+ this.textStatus = textStatus;
+ this.propStatus = propStatus;
+ this.locked = locked;
+ this.copied = copied;
+ this.repositoryTextStatus = repositoryTextStatus;
+ this.repositoryPropStatus = repositoryPropStatus;
+ this.conflictOld = conflictOld;
+ this.conflictNew = conflictNew;
+ this.conflictWorking = conflictWorking;
     }
- private String pa;
- private boolean idi;
- private long re;
- private long lch;
- private String lcoa;
- private int tty;
- private int pty;
- private boolean ive;
- private boolean ilo;
- private boolean ico;
- private int rtty;
- private int rpty;
- private String cn;
- private String co;
- private String cw;
- private String u;
- private String ucf;
- private long rcf;
+
     /**
      * @return path of status entry
      */
- public String path()
+ public String getPath()
     {
- return pa;
+ return path;
     }
+
     /**
- * @return true if entry is a dir
- */
- public boolean isDir()
- {
- return idi;
- }
- /**
      * @return revision if versioned, otherwise SVN_INVALID_REVNUM
      */
- public long revision()
+ public Revision.Number getRevision()
     {
- return re;
+ return new Revision.Number(revision);
     }
     /**
- * Returns the last time the file was changed revision number.
+ * @return the last time the file was changed revision number.
+ * or null if not available
      */
- public long lastChanged()
+ public Date getLastChangedDate()
     {
- return lch;
+ if (lastChangedDate == 0)
+ return null;
+ else
+ return new Date(lastChangedDate/1000);
     }
     /**
      * @return name of author if versioned, NULL otherwise
      */
- public String lastCommitAuthor()
+ public String getLastCommitAuthor()
     {
- return lcoa;
+ return lastCommitAuthor;
     }
+
     /**
- * @return file status of the "textual" component.
+ * @return file status property enum of the "textual" component.
      */
- public String textDescription()
+ public int getTextStatus()
     {
- return Kind.getDescription(tty);
+ return textStatus;
     }
+
     /**
- * @return file status property enum of the "textual" component.
+ * @return file status property enum of the "property" component.
      */
- public int textType()
+ public int getPropStatus()
     {
- return tty;
+ return propStatus;
     }
+
     /**
- * @return textual file status of the "property" component.
+ * @return file status property enum of the "textual" component im
the repository.
      */
- public String propDescription()
+ public int getRepositoryTextStatus()
     {
- return Kind.getDescription(pty);
+ return repositoryTextStatus;
     }
+
     /**
- * @return file status property enum of the "property" component.
+ * @return file status property enum of the "property" component im
the repository.
      */
- public int propType()
+ public int getRepositoryPropStatus()
     {
- return pty;
+ return repositoryPropStatus;
     }
+
     /**
- * @return file status of the "textual" component im the repository.
+ * @return true if locked
      */
- public String repositoryTextDescription()
+ public boolean isLocked()
     {
- return Kind.getDescription(rtty);
+ return locked;
     }
     /**
- * @return file status property enum of the "textual" component im
the repository.
+ * @return true if copied
      */
- public int repositoryTextType()
+ public boolean isCopied()
     {
- return rtty;
+ return copied;
     }
+ public String getConflictNew()
+ {
+ return conflictNew;
+ }
+ public String getConflictOld()
+ {
+ return conflictOld;
+ }
+ public String getConflictWorking()
+ {
+ return conflictWorking;
+ }
+
     /**
- * @return textual file status of the "property" component im the
repository.
+ * @return url in repository or null if not known
      */
- public String repositoryPropDescription()
+ public URL getUrl() {
+ if (url == null)
+ return null;
+ else
     {
- return Kind.getDescription(rpty);
+ try {
+ return new URL(url);
+ } catch (MalformedURLException e)
+ {
+ return null;
+ }
     }
+ }
+
+
     /**
- * @return file status property enum of the "property" component im
the repository.
+ * @return last changed revision
      */
- public int repositoryPropType()
- {
- return rpty;
+ public Revision.Number getLastChangedRevision() {
+ return new Revision.Number(lastChangedRevision);
     }
+
     /**
- * @return true if under version control
+ * @return the node kind
      */
- public boolean isVersioned()
- {
- return ive;
+ public int getNodeKind() {
+ return nodeKind;
     }
+
     /**
- * @return true if locked
+ * tells if is managed by svn (added, normal, modified ...)
+ * @return
      */
- public boolean isLocked()
- {
- return ilo;
+ public boolean isManaged() {
+ int textStatus = getTextStatus();
+ return ((textStatus != Status.Kind.unversioned) &&
+ (textStatus != Status.Kind.none) &&
+ (textStatus != Status.Kind.ignored));
     }
+
     /**
- * @return true if copied
+ * tells if the resource has a remote counter-part
+ * @return
      */
- public boolean isCopied()
- {
- return ico;
+ public boolean hasRemote() {
+ int textStatus = getTextStatus();
+ return ((isManaged()) && (textStatus != Status.Kind.added));
     }
- public String conflictNew()
- {
- return cn;
+
+ public boolean isAdded() {
+ int textStatus = getTextStatus();
+ return textStatus == Status.Kind.added;
     }
- public String conflictOld()
- {
- return co;
+
+ public boolean isDeleted() {
+ int textStatus = getTextStatus();
+ return textStatus == Status.Kind.deleted;
     }
- public String conflictWorking()
- {
- return cw;
+
+ public boolean isMerged() {
+ int textStatus = getTextStatus();
+ return textStatus == Status.Kind.merged;
     }
- public String url()
- {
- return u;
+
+ public boolean isIgnored() {
+ int textStatus = getTextStatus();
+ return textStatus == Status.Kind.ignored;
     }
- public String urlCopiedFrom()
- {
- return ucf;
+
+
+
+ /**
+ * tells if it is modified
+ * @return
+ */
+ public boolean isModified() {
+ int textStatus = getTextStatus();
+ return textStatus == Status.Kind.modified;
     }
- public long revisionCopiedFrom()
- {
- return rcf;
- }
 
+
+
     public static final class Kind
     {
         /** does not exist */
@@ -236,6 +286,12 @@
         /** an unversioned resource is in the way of the versioned
resource */
         public static final int obstructed = 10;
 
+ /** a resource marked as ignored */
+ public static final int ignored = 11;
+
+ /** a directory doesn't contain a complete entries list */
+ public static final int incomplete = 12;
+
         public static final String getDescription(int kind)
         {
             switch (kind)
@@ -258,10 +314,17 @@
               return "merged";
             case conflicted:
               return "conflicted";
+ case ignored:
+ return "ignored";
+ case incomplete:
+ return "incomplete";
             case unversioned:
             default:
               return "unversioned";
             }
         }
     }
+
+
 }
+
Index: src/org/tigris/subversion/javahl/SVNClient.java
===================================================================
--- src/org/tigris/subversion/javahl/SVNClient.java (revision 6771)
+++ src/org/tigris/subversion/javahl/SVNClient.java (working copy)
@@ -59,22 +59,24 @@
       */
      public native String getLastPath();
     /**
+ * List directory entries of a URL.
      *
+ * @param path Path to explore.
+ * @param descend Recurse into subdirectories if existant.
+ * @return Array of Status entries.
+ */
+ public native Status[]status(String path, boolean descend, boolean
onServer) throws ClientException;
+
+ /**
+ *
      * @param url
      * @param revision
      * @param recurse
      * @return
      */
     public native DirEntry[]list(String url, Revision revision, boolean
recurse) throws ClientException;
+
     /**
- * Enumerates all files/dirs at a given path.
- *
- * @param path Path to explore.
- * @param descend Recurse into subdirectories if existant.
- * @return Array of Status entries.
- */
- public native Status[]status(String path, boolean descend, boolean
onServer) throws ClientException;
- /**
      * Returns the status of a single file in the path.
      *
      * @param path File to gather status.
@@ -127,7 +129,7 @@
       * Sets a file for deletion.
       * @exception ClientException
       */
- public native void remove(String path, String message, boolean
force)throws ClientException;
+ public native void remove(String[] path, String message, boolean
force)throws ClientException;
     /**
       * Reverts a file to a pristine state.
       * @exception ClientException
@@ -168,7 +170,7 @@
      * Moves or renames a file.
      * @exception ClientException
      */
- public native void move(String srcPath, String destPath, String
Message, Revision revision, boolean force) throws ClientException;
+ public native void move(String srcPath, String destPath, String
message, Revision revision, boolean force) throws ClientException;
     /**
      * Creates a directory directly in a repository or creates a
      * directory on disk and schedules it for addition. If <i>path</i>
@@ -176,7 +178,7 @@
      * @param message log message.
      * @exception ClientException
      */
- public native void mkdir(String path, String message) throws
ClientException;
+ public native void mkdir(String[] path, String message) throws
ClientException;
     /**
      * Recursively cleans up a local directory, finishing any
      * incomplete operations, removing lockfiles, etc.
@@ -196,7 +198,7 @@
      * @exception ClientException
      * @param destPath a destination path that must not already exist.
      */
- public native void doExport(String srcPath, String destPath,
Revision revision) throws ClientException;
+ public native void doExport(String srcPath, String destPath,
Revision revision,boolean force) throws ClientException;
     /**
      * Update local copy to mirror a new url. This excapsulates the
      * svn_client_switch() client method.
@@ -207,11 +209,9 @@
      * Import file or directory PATH into repository directory URL at
      * head. This usually requires authentication, see Auth.
      * @param message log message.
- * @param newEntry new directory in which the contents of
<i>path</i> are
- * imported.
      * @exception ClientException
      */
- public native void doImport(String path, String url, String
newEntry, String message, boolean recurse) throws ClientException;
+ public native void doImport(String path, String url, String
message, boolean recurse) throws ClientException;
     /**
      * Merge changes from two paths into a new local path.
      * @exception ClientException
@@ -228,6 +228,12 @@
     public native void propertyCreate(String path, String name, byte[]
value, boolean recurse) throws ClientException;
     public native PropertyData revProperty(String path, String name,
Revision rev) throws ClientException;
 
+ /**
+ * get the given property
+ */
+ public native PropertyData propertyGet(String path, String name)
throws ClientException;
+
+
     public native byte[] fileContent(String path, Revision revision)
throws ClientException;
     public static native void enableLogging(int logLevel, String
logFilePath);
     public static native String version();
Index: src/org/tigris/subversion/javahl/LogMessage.java
===================================================================
--- src/org/tigris/subversion/javahl/LogMessage.java (revision 6771)
+++ src/org/tigris/subversion/javahl/LogMessage.java (working copy)
@@ -43,9 +43,9 @@
         return date;
     }
 
- public long getRevision()
+ public Revision.Number getRevision()
     {
- return revision;
+ return new Revision.Number(revision);
     }
 
     public String getAuthor()
Index: src/org/tigris/subversion/javahl/ClientException.java
===================================================================
--- src/org/tigris/subversion/javahl/ClientException.java (revision 6771)
+++ src/org/tigris/subversion/javahl/ClientException.java (working copy)
@@ -25,49 +25,42 @@
 {
     /**
      * The constructor is only used by the native library.
- * @param m message
- * @param d description
- * @param s source
- * @param a APR error code
+ * @param message message
+ * @param source source
+ * @param aprError APR error code
      */
- ClientException(String m, String d, String s, int a)
+ ClientException(String message, String source, int aprError)
     {
- super(m);
- de = d;
- so = s;
- ap = a;
+ super(message);
+ this.source = source;
+ this.aprError = aprError;
     }
     /**
- * the error message
+ * the exception message
      */
- private String de;
+ private String message;
+
     /**
      * the error source
      */
- private String so;
+ private String source;
     /**
      * the APR error id
      */
- private int ap;
+ private int aprError;
+
     /**
- * Returns the error message.
- */
- public String getDescription()
- {
- return de;
- }
- /**
      * Returns the error source.
      */
     public String getSource()
     {
- return so;
+ return source;
     }
     /**
      * Returns the APR error id.
      */
     public int getAprError()
     {
- return ap;
+ return aprError;
     }
 }
Index: src/org/tigris/subversion/javahl/Revision.java
===================================================================
--- src/org/tigris/subversion/javahl/Revision.java (revision 6771)
+++ src/org/tigris/subversion/javahl/Revision.java (working copy)
@@ -17,7 +17,9 @@
  */
 package org.tigris.subversion.javahl;
 
+import java.text.SimpleDateFormat;
 import java.util.Date;
+import java.util.Locale;
 
 /**
  * Class to specify a revision in a svn command.
@@ -38,29 +40,29 @@
 
     public String toString()
     {
- switch (revKind)
- {
- case Kind.unspecified:
- return "start revision";
- case Kind.committed:
- return "last commited revision";
- case Kind.previous:
- return "previous commited revision";
- case Kind.base:
- return "base of working revision";
- case Kind.working:
- return "working revision";
- case Kind.head:
- return "head revision";
- default:
- return "bad revision";
+ switch(revKind) {
+ case Kind.base : return "BASE";
+ case Kind.committed : return "COMMITTED";
+ case Kind.head : return "HEAD";
+ case Kind.previous : return "PREV";
+ case Kind.working : return "WORKING";
         }
+ return super.toString();
     }
 
+ public boolean equals(Object target) {
+ if (this == target)
+ return true;
+ if (!(target instanceof Revision))
+ return false;
+
+ return ((Revision)target).revKind == revKind;
+ }
+
     public static final Revision HEAD = new Revision(Kind.head);
     public static final Revision START = new Revision(Kind.unspecified);
     public static final Revision COMMITTED = new Revision(Kind.committed);
- public static final Revision PREVISIOUS = new Revision(Kind.previous);
+ public static final Revision PREVIOUS = new Revision(Kind.previous);
     public static final Revision BASE = new Revision(Kind.base);
     public static final Revision WORKING = new Revision(Kind.working);
     public static final int SVN_INVALID_REVNUM = -1;
@@ -80,31 +82,44 @@
             return revNumber;
         }
 
- public String toString()
- {
- return "Revision number " + revNumber;
+ public String toString() {
+ return Long.toString(revNumber);
         }
+
+ public boolean equals(Object target) {
+ if (!super.equals(target))
+ return false;
+
+ return ((Revision.Number)target).revNumber ==
revNumber;
+ }
     }
 
     public static class DateSpec extends Revision
     {
         protected Date revDate;
-
         public DateSpec(Date date)
         {
             super(Kind.date);
             revDate = date;
         }
-
         public Date getDate()
         {
             return revDate;
         }
 
- public String toString()
- {
- return "Revision date " + revDate.toString();
+ public String toString() {
+
+ SimpleDateFormat dateFormat = new SimpleDateFormat("EEE, d
MMM yyyy HH:mm:ss Z", Locale.US);
+ return '{'+dateFormat.format(revDate)+'}';
         }
+
+ public boolean equals(Object target) {
+ if (!super.equals(target))
+ return false;
+
+ return
((Revision.DateSpec)target).revDate.equals(revDate);
+ }
+
     }
 
     /** Various ways of specifying revisions.

_____________________________________________________________________
Envie de discuter en "live" avec vos amis ? Télécharger MSN Messenger
http://www.ifrance.com/_reloc/m la 1ère messagerie instantanée de France

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sun Aug 17 22:35:45 2003

This is an archived mail posted to the Subversion Dev mailing list.

This site is subject to the Apache Privacy Policy and the Apache Public Forum Archive Policy.