Author: rhuijben
Date: Tue Feb  3 20:55:04 2015
New Revision: 1656911

URL: http://svn.apache.org/r1656911
Log:
Extend regression tests around svn_ra_get_file_revs2, and walking through
history with it. Add additional boolean to JavaHL api for this function.

* subversion/bindings/javahl/native/RemoteSession.cpp
  (callback): Pass information on whether there is a delta.
  (call): Pass boolean.

* subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
  (FileRevision.FileRevision): Add textDelta argument. Fill field.
  (FileRevision.hasTextDelta): New function.
  (FileRevision.textDelta): New field.

* 
subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
  (testGetFileRevisions): Extend test.

* subversion/libsvn_repos/rev_hunt.c
  (send_path_revision): Avoid doing work that is ignored.

* subversion/tests/libsvn_client/mtcc-test.c
  (handle_rev_baton): New struct.
  (handle_rev,
   test_file_revs_both_ways): New function.
  (test_funcs): Add test_file_revs_both_ways.

Modified:
    subversion/trunk/subversion/bindings/javahl/native/RemoteSession.cpp
    
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
    
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
    subversion/trunk/subversion/libsvn_repos/rev_hunt.c
    subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c

Modified: subversion/trunk/subversion/bindings/javahl/native/RemoteSession.cpp
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/RemoteSession.cpp?rev=1656911&r1=1656910&r2=1656911&view=diff
==============================================================================
--- subversion/trunk/subversion/bindings/javahl/native/RemoteSession.cpp 
(original)
+++ subversion/trunk/subversion/bindings/javahl/native/RemoteSession.cpp Tue 
Feb  3 20:55:04 2015
@@ -1174,7 +1174,9 @@ public:
         static_cast<FileRevisionHandler*>(baton);
       SVN_ERR_ASSERT(self->m_jcallback != NULL);
       self->call(path, revision, revision_props,
-                result_of_merge, prop_diffs, scratch_pool);
+                result_of_merge, prop_diffs,
+                (delta_handler != NULL),
+                scratch_pool);
       SVN_ERR(JNIUtil::checkJavaException(SVN_ERR_BASE));
       return SVN_NO_ERROR;
     }
@@ -1199,6 +1201,7 @@ private:
            apr_hash_t* revision_props,
            svn_boolean_t result_of_merge,
            apr_array_header_t* prop_diffs,
+           svn_boolean_t has_text_delta,
            apr_pool_t* scratch_pool)
     {
       JNIEnv* env = JNIUtil::getEnv();
@@ -1211,7 +1214,7 @@ private:
         {
           mid = env->GetMethodID(cls, "<init>",
                                  "(Ljava/lang/String;JZ"
-                                 "Ljava/util/Map;Ljava/util/Map;)V");
+                                 "Ljava/util/Map;Ljava/util/Map;Z)V");
           if (JNIUtil::isJavaExceptionThrown())
             return;
         }
@@ -1229,7 +1232,8 @@ private:
       env->CallVoidMethod(m_jcallback, m_call_mid,
                           env->NewObject(cls, mid, jpath, jlong(revision),
                                          jboolean(result_of_merge),
-                                         jrevprops, jpropdelta));
+                                         jrevprops, jpropdelta,
+                                         jboolean(has_text_delta)));
       if (JNIUtil::isJavaExceptionThrown())
         return;
       env->DeleteLocalRef(jpath);

Modified: 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java?rev=1656911&r1=1656910&r2=1656911&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNRemote.java
 Tue Feb  3 20:55:04 2015
@@ -599,13 +599,15 @@ public interface ISVNRemote
         private FileRevision(String path, long revision,
                              boolean resultOfMerge,
                              Map<String, byte[]> revisionProperties,
-                             Map<String, byte[]> propertiesDelta)
+                             Map<String, byte[]> propertiesDelta,
+                             boolean textDelta)
         {
             this.path = path;
             this.revision = revision;
             this.resultOfMerge = resultOfMerge;
             this.revisionProperties = revisionProperties;
             this.propertiesDelta = propertiesDelta;
+            this.textDelta = textDelta;
         }
 
         /**
@@ -643,11 +645,17 @@ public interface ISVNRemote
             return propertiesDelta;
         }
 
+        /**
+         * @return A flag indicating that this revision has a text delta.
+         */
+        public boolean hasTextDelta() { return textDelta; }
+
         private String path;
         private long revision;
         private boolean resultOfMerge;
         private Map<String, byte[]> revisionProperties;
         private Map<String, byte[]> propertiesDelta;
+        private boolean textDelta;
     }
 
     /**

Modified: 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java?rev=1656911&r1=1656910&r2=1656911&view=diff
==============================================================================
--- 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
 (original)
+++ 
subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/SVNRemoteTests.java
 Tue Feb  3 20:55:04 2015
@@ -1398,6 +1398,7 @@ public class SVNRemoteTests extends SVNT
         ISVNRemote.FileRevision rev = result.get(0);
         assertEquals("/iota", rev.getPath());
         assertFalse(rev.isResultOfMerge());
+        assertTrue(rev.hasTextDelta());
     }
 
     // This test is a result of a threading bug that was identified in

Modified: subversion/trunk/subversion/libsvn_repos/rev_hunt.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_repos/rev_hunt.c?rev=1656911&r1=1656910&r2=1656911&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_repos/rev_hunt.c (original)
+++ subversion/trunk/subversion/libsvn_repos/rev_hunt.c Tue Feb  3 20:55:04 2015
@@ -1386,7 +1386,7 @@ send_path_revision(struct path_revision
   /* Compute and send delta if client asked for it.
      Note that this was initialized to NULL, so if !contents_changed,
      no deltas will be computed. */
-  if (delta_handler)
+  if (delta_handler && delta_handler != svn_delta_noop_window_handler)
     {
       /* Get the content delta. */
       SVN_ERR(svn_fs_get_file_delta_stream(&delta_stream,

Modified: subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c?rev=1656911&r1=1656910&r2=1656911&view=diff
==============================================================================
--- subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c (original)
+++ subversion/trunk/subversion/tests/libsvn_client/mtcc-test.c Tue Feb  3 
20:55:04 2015
@@ -466,6 +466,158 @@ test_replace_tree(const svn_test_opts_t
   return SVN_NO_ERROR;
 }
 
+/* Baton for handle_rev */
+struct handle_rev_baton
+{
+  svn_revnum_t last;
+  svn_boolean_t up;
+  svn_boolean_t first;
+};
+
+/* Helper for test_file_revs_both_ways */
+static svn_error_t *
+handle_rev(void *baton,
+           const char *path,
+           svn_revnum_t rev,
+           apr_hash_t *rev_props,
+           svn_boolean_t result_of_merge,
+           svn_txdelta_window_handler_t *delta_handler,
+           void **delta_baton,
+           apr_array_header_t *prop_diffs,
+           apr_pool_t *pool)
+{
+  struct handle_rev_baton *hrb = baton;
+  svn_revnum_t expected_rev = hrb->up ? (hrb->last + 1) : (hrb->last - 1);
+
+  SVN_TEST_ASSERT(rev == expected_rev);
+  SVN_TEST_ASSERT(apr_hash_count(rev_props) >= 3);
+  SVN_TEST_STRING_ASSERT(path, (rev < 5) ? "/iota" : "/mu");
+
+  if (!hrb->first && rev == (hrb->up ? 5 : 4))
+    SVN_TEST_ASSERT(delta_handler == NULL);
+  else
+    SVN_TEST_ASSERT(delta_handler != NULL);
+
+  if (delta_handler)
+    {
+      *delta_handler = svn_delta_noop_window_handler;
+      *delta_baton = NULL;
+    }
+
+  hrb->last = rev;
+  hrb->first = FALSE;
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+test_file_revs_both_ways(const svn_test_opts_t *opts,
+                         apr_pool_t *pool)
+{
+  svn_client__mtcc_t *mtcc;
+  svn_client_ctx_t *ctx;
+  apr_pool_t *subpool = svn_pool_create(pool);
+  const char *repos_url;
+  svn_ra_session_t *ra;
+  struct handle_rev_baton hrb;
+
+  SVN_ERR(svn_test__create_repos2(NULL, &repos_url, NULL, "mtcc-file-revs",
+                                  opts, pool, subpool));
+
+  SVN_ERR(svn_client_create_context2(&ctx, NULL, pool));
+  SVN_ERR(svn_test__init_auth_baton(&ctx->auth_baton, pool));
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 0, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_add_file("iota",
+                                        cstr_stream("revision-1", subpool),
+                                        NULL /* src_checksum */,
+                                        mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 1, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 1, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_update_file("iota",
+                                           cstr_stream("revision-2", subpool),
+                                           NULL /* src_checksum */, NULL, NULL,
+                                           mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 2, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 2, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_update_file("iota",
+                                           cstr_stream("revision-3", subpool),
+                                           NULL /* src_checksum */, NULL, NULL,
+                                           mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 3, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 3, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_update_file("iota",
+                                           cstr_stream("revision-4", subpool),
+                                           NULL /* src_checksum */, NULL, NULL,
+                                           mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 4, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 4, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_move("iota", "mu", mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 5, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 5, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_update_file("mu",
+                                           cstr_stream("revision-6", subpool),
+                                           NULL /* src_checksum */, NULL, NULL,
+                                           mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 6, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client__mtcc_create(&mtcc, repos_url, 6, ctx, subpool, subpool));
+  SVN_ERR(svn_client__mtcc_add_delete("mu", mtcc, subpool));
+  SVN_ERR(verify_mtcc_commit(mtcc, 7, subpool));
+  svn_pool_clear(subpool);
+
+  SVN_ERR(svn_client_open_ra_session2(&ra, repos_url, NULL, ctx, pool, 
subpool));
+
+  svn_pool_clear(subpool);
+  hrb.up = FALSE;
+  hrb.last = 5;
+  hrb.first = TRUE;
+  SVN_ERR(svn_ra_get_file_revs2(ra, "iota", 4, 1, FALSE,
+                                handle_rev, &hrb,
+                                subpool));
+  SVN_TEST_ASSERT(hrb.last == 1);
+
+  svn_pool_clear(subpool);
+  hrb.up = TRUE;
+  hrb.last = 0;
+  hrb.first = TRUE;
+  SVN_ERR(svn_ra_get_file_revs2(ra, "iota", 1, 4, FALSE,
+                                handle_rev, &hrb,
+                                subpool));
+  SVN_TEST_ASSERT(hrb.last == 4);
+
+  svn_pool_clear(subpool);
+  hrb.up = FALSE;
+  hrb.last = 7;
+  hrb.first = TRUE;
+  SVN_ERR(svn_ra_get_file_revs2(ra, "mu", 6, 1, FALSE,
+                                handle_rev, &hrb,
+                                subpool));
+  SVN_TEST_ASSERT(hrb.last == 1);
+
+  svn_pool_clear(subpool);
+  hrb.up = TRUE;
+  hrb.last = 0;
+  hrb.first = TRUE;
+  SVN_ERR(svn_ra_get_file_revs2(ra, "mu", 1, 6, FALSE,
+                                handle_rev, &hrb,
+                                subpool));
+  SVN_TEST_ASSERT(hrb.last == 6);
+  
+  return SVN_NO_ERROR;
+}
+
 /* ========================================================================== 
*/
 
 
@@ -490,6 +642,8 @@ static struct svn_test_descriptor_t test
                        "test mtcc anchoring for root operations"),
     SVN_TEST_OPTS_PASS(test_replace_tree,
                        "test mtcc replace tree"),
+    SVN_TEST_OPTS_PASS(test_file_revs_both_ways,
+                       "test ra_get_file_revs2 both ways"),
     SVN_TEST_NULL
   };
 


Reply via email to