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
};