Author: brane Date: Thu Jan 17 14:50:52 2019 New Revision: 1851536 URL: http://svn.apache.org/viewvc?rev=1851536&view=rev Log: Expose the output arguments of svn_client_blame6 in JavaHL.
[in subversion/bindings/javahl/src/org/apache/subversion] * callback/BlameRangeCallback.java: New callback for ISVNClient.blame. * callback/BlameLineCallback.java: Remove unused import. * ISVNClient.java (ISVNClient.blame): Add range callback parameter. Update docstring. * SVNClient.java (SVNClient.blame): Update wrapper and native method declaration. [in subversion/bindings/javahl/native] * BlameCallback.h (BlameCallback::BlameCallback): Change constructor signature. (BlameCallback::get_start_revnum_p, BlameCallback::get_end_revnum_p): New. (BlameCallback::setRange): New. (BlameCallback::m_start_revnum, BlameCallback::m_start_revnum, BlameCallback::m_range_callback_invoked, BlameCallback::m_range_callback): New. (BlameCallback::m_line_callback): Renamed from m_callback. * BlameCallback.cpp: Include svn_private_config.h. (BlameCallback::BlameCallback): Update constructor implementation. (BlameCallback::callback): Update static callback implementation. (BlameCallback::setRange): Implement. (BlameCallback::singleLine): Notice changed member variable name. * SVNClient.cpp (SVNClient::blame): Set blame output arguments from the callback. * org_apache_subversion_javahl_SVNClient.cpp (Java_org_apache_subversion_javahl_SVNClient_blame): Update native method. [in subversion/bindings/javahl/tests/org/apache/subversion/javahl] * BasicTests.java (BlameRangeCallbackImpl): New helper class. (testBinaryBlame): Also test the returned revision range. * ExceptionTests.java (testBlameCallback): Check that a null range callback doesn't cause exceptions. Added: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java (with props) Modified: subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java Modified: subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp (original) +++ subversion/trunk/subversion/bindings/javahl/native/BlameCallback.cpp Thu Jan 17 14:50:52 2019 @@ -28,14 +28,20 @@ #include "CreateJ.h" #include "JNIUtil.h" #include "svn_time.h" + +#include "svn_private_config.h" + /** * Create a BlameCallback object * @param jcallback the Java callback object. */ -BlameCallback::BlameCallback(jobject jcallback) -{ - m_callback = jcallback; -} +BlameCallback::BlameCallback(jobject jrangeCallback, jobject jlineCallback) + : m_start_revnum(SVN_INVALID_REVNUM), + m_end_revnum(SVN_INVALID_REVNUM), + m_range_callback_invoked(false), + m_range_callback(jrangeCallback), + m_line_callback(jlineCallback) +{} /** * Destroy a BlameCallback object */ @@ -58,14 +64,65 @@ BlameCallback::callback(void *baton, svn_boolean_t local_change, apr_pool_t *pool) { - if (baton) - return static_cast<BlameCallback *>(baton)->singleLine( - line_no, revision, rev_props, merged_revision, - merged_rev_props, merged_path, line, local_change, pool); + BlameCallback *const self = static_cast<BlameCallback *>(baton); + svn_error_t *err = SVN_NO_ERROR; + + if (self) + { + if (self->m_range_callback && !self->m_range_callback_invoked) + { + self->m_range_callback_invoked = true; + err = self->setRange(); + } + + if (self->m_line_callback && err == SVN_NO_ERROR) + { + err = self->singleLine( + line_no, revision, rev_props, merged_revision, + merged_rev_props, merged_path, line, local_change, pool); + } + } + + return err; +} + +svn_error_t * +BlameCallback::setRange() +{ + if (m_start_revnum == SVN_INVALID_REVNUM + || m_end_revnum == SVN_INVALID_REVNUM) + return svn_error_create(SVN_ERR_CLIENT_BAD_REVISION, NULL, + _("Blame revision range was not resolved")); + + JNIEnv *env = JNIUtil::getEnv(); + + // Create a local frame for our references + env->PushLocalFrame(LOCAL_FRAME_SIZE); + if (JNIUtil::isJavaExceptionThrown()) + return SVN_NO_ERROR; - return SVN_NO_ERROR; + // The method id will not change during the time this library is + // loaded, so it can be cached. + static jmethodID mid = 0; + if (mid == 0) + { + jclass clazz = env->FindClass(JAVAHL_CLASS("/callback/BlameRangeCallback")); + if (JNIUtil::isJavaExceptionThrown()) + POP_AND_RETURN(SVN_NO_ERROR); + + mid = env->GetMethodID(clazz, "setRange", "(JJ)V"); + if (JNIUtil::isJavaExceptionThrown() || mid == 0) + POP_AND_RETURN(SVN_NO_ERROR); + } + + // call the Java method + env->CallVoidMethod(m_range_callback, mid, + (jlong)m_start_revnum, (jlong)m_end_revnum); + + POP_AND_RETURN_EXCEPTION_AS_SVNERROR(); } + /** * Callback called for a single line in the file, for which the blame * information was requested. See the Java-doc for more information. @@ -122,7 +179,7 @@ BlameCallback::singleLine(apr_int64_t li POP_AND_RETURN(SVN_NO_ERROR); // call the Java method - env->CallVoidMethod(m_callback, mid, (jlong)line_no, (jlong)revision, + env->CallVoidMethod(m_line_callback, mid, (jlong)line_no, (jlong)revision, jrevProps, (jlong)mergedRevision, jmergedRevProps, jmergedPath, (jboolean)localChange, jline); Modified: subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h (original) +++ subversion/trunk/subversion/bindings/javahl/native/BlameCallback.h Thu Jan 17 14:50:52 2019 @@ -37,7 +37,7 @@ class BlameCallback { public: - BlameCallback(jobject jcallback); + BlameCallback(jobject jrangeCallback, jobject jlineCallback); ~BlameCallback(); static svn_error_t *callback(void *baton, @@ -51,7 +51,11 @@ class BlameCallback svn_boolean_t local_change, apr_pool_t *pool); + svn_revnum_t *get_start_revnum_p() { return &m_start_revnum; } + svn_revnum_t *get_end_revnum_p() { return &m_end_revnum; } + protected: + svn_error_t *setRange(); svn_error_t *singleLine(apr_int64_t line_no, svn_revnum_t revision, apr_hash_t *rev_props, @@ -63,10 +67,14 @@ class BlameCallback apr_pool_t *pool); private: - /** - * This a local reference to the Java object. - */ - jobject m_callback; + // Arguments for svn_client_blame6 + svn_revnum_t m_start_revnum; + svn_revnum_t m_end_revnum; + bool m_range_callback_invoked; + + // These are local references to the Java objects. + jobject m_range_callback; + jobject m_line_callback; }; #endif // BLAMECALLBACK_H Modified: subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp (original) +++ subversion/trunk/subversion/bindings/javahl/native/SVNClient.cpp Thu Jan 17 14:50:52 2019 @@ -1285,7 +1285,8 @@ void SVNClient::blame(const char *path, return; SVN_JNI_ERR(svn_client_blame6( - NULL, NULL, // TODO: start and end revision numbers + callback->get_start_revnum_p(), + callback->get_end_revnum_p(), intPath.c_str(), pegRevision.revision(), revisionStart.revision(), revisionEnd.revision(), options.fileOptions(subPool), ignoreMimeType, Modified: subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp (original) +++ subversion/trunk/subversion/bindings/javahl/native/org_apache_subversion_javahl_SVNClient.cpp Thu Jan 17 14:50:52 2019 @@ -1656,10 +1656,11 @@ Java_org_apache_subversion_javahl_SVNCli JNIEXPORT void JNICALL Java_org_apache_subversion_javahl_SVNClient_blame -(JNIEnv *env, jobject jthis, jstring jpath, jobject jpegRevision, +(JNIEnv *env, jobject jthis, + jstring jpath, jobject jpegRevision, jobject jrevisionStart, jobject jrevisionEnd, jboolean jignoreMimeType, jboolean jincludeMergedRevisions, jobject jdiffOptions, - jobject jblameCallback) + jobject jrangeCallback, jobject jlineCallback) { JNIEntry(SVNClient, blame); SVNClient *cl = SVNClient::getCppObject(jthis); @@ -1688,7 +1689,7 @@ Java_org_apache_subversion_javahl_SVNCli if (JNIUtil::isExceptionThrown()) return; - BlameCallback callback(jblameCallback); + BlameCallback callback(jrangeCallback, jlineCallback); cl->blame(path, pegRevision, revisionStart, revisionEnd, jignoreMimeType ? true : false, jincludeMergedRevisions ? true : false, &callback, Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java (original) +++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/ISVNClient.java Thu Jan 17 14:50:52 2019 @@ -1386,7 +1386,7 @@ public interface ISVNClient /** * Retrieve the content together with the author, the revision and the date - * of the last change of each line + * of the last change of each line. * @param path the path * @param pegRevision the revision to interpret the path * @param revisionStart the first revision to show @@ -1395,15 +1395,18 @@ public interface ISVNClient * @param includeMergedRevisions whether or not to include extra merge * information * @param options additional options for controlling the output - * @param callback callback to receive the file content and the other - * information + * @param rangeCallback receives the resolved revision range; called + * exactly once before #lineCallback + * @param lineCallback callback to receive the file content and the other + * information for every line in the file * @throws ClientException * @since 1.12 */ void blame(String path, Revision pegRevision, Revision revisionStart, Revision revisionEnd, boolean ignoreMimeType, - boolean includeMergedRevisions, - DiffOptions options, BlameLineCallback callback) + boolean includeMergedRevisions, DiffOptions options, + BlameRangeCallback rangeCallback, + BlameLineCallback lineCallback) throws ClientException; /** Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java (original) +++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/SVNClient.java Thu Jan 17 14:50:52 2019 @@ -729,7 +729,7 @@ public class SVNClient implements ISVNCl { blame(path, pegRevision, revisionStart, revisionEnd, ignoreMimeType, includeMergedRevisions, options, - new BlameCallbackAdapter(callback)); + null, new BlameCallbackAdapter(callback)); } public native void blame(String path, Revision pegRevision, @@ -737,7 +737,8 @@ public class SVNClient implements ISVNCl Revision revisionEnd, boolean ignoreMimeType, boolean includeMergedRevisions, DiffOptions options, - BlameLineCallback callback) + BlameRangeCallback rangeCallback, + BlameLineCallback lineCallback) throws ClientException; public native void setConfigDirectory(String configDir) Modified: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java (original) +++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameLineCallback.java Thu Jan 17 14:50:52 2019 @@ -26,7 +26,6 @@ package org.apache.subversion.javahl.cal import org.apache.subversion.javahl.ClientException; import java.util.Map; -import org.apache.subversion.javahl.ISVNClient; /** * This interface is used to receive every single line for a file on a Added: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java?rev=1851536&view=auto ============================================================================== --- subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java (added) +++ subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java Thu Jan 17 14:50:52 2019 @@ -0,0 +1,43 @@ +/** + * @copyright + * ==================================================================== + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + * ==================================================================== + * @endcopyright + */ + +package org.apache.subversion.javahl.callback; + +import org.apache.subversion.javahl.ClientException; + +/** + * This interface is used to the resolved revision range + * the {@link ISVNClient#blame} call. + * @since 1.12 + */ +public interface BlameRangeCallback +{ + /** + * This method will be called once before #{BlameLineCallback.singleLine} + * is called for the first time. + * @param startRevision the resolved start of the blame range. + * @param endRevision the resolved end of the blame range. + */ + public void setRange(long startRevision, long endRevision) + throws ClientException; +} Propchange: subversion/trunk/subversion/bindings/javahl/src/org/apache/subversion/javahl/callback/BlameRangeCallback.java ------------------------------------------------------------------------------ svn:eol-style = native Modified: subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java (original) +++ subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/BasicTests.java Thu Jan 17 14:50:52 2019 @@ -4185,13 +4185,16 @@ public class BasicTests extends SVNTests } // Test the current interface - BlameLineCallbackImpl callback = new BlameLineCallbackImpl(); + BlameRangeCallbackImpl rangeCallback = new BlameRangeCallbackImpl(); + BlameLineCallbackImpl lineCallback = new BlameLineCallbackImpl(); client.blame(thisTest.getWCPath() + "/iota", Revision.HEAD, Revision.getInstance(0), Revision.HEAD, - false, false, null, callback); - assertEquals(1, callback.numberOfLines()); + false, false, null, rangeCallback, lineCallback); + assertEquals(0, rangeCallback.startRevnum); + assertEquals(2, rangeCallback.endRevnum); + assertEquals(1, lineCallback.numberOfLines()); - BlameLineCallbackImpl.BlameLine line = callback.getBlameLine(0); + BlameLineCallbackImpl.BlameLine line = lineCallback.getBlameLine(0); assertNotNull(line); assertEquals(2, line.getRevision()); assertEquals("rayjandom", line.getAuthor()); @@ -5025,7 +5028,19 @@ public class BasicTests extends SVNTests } } - /* A blame callback implementation. */ + /* A blame range callback implementation. */ + protected class BlameRangeCallbackImpl implements BlameRangeCallback + { + public long startRevnum = -1; + public long endRevnum = -1; + public void setRange(long start, long end) + { + startRevnum = start; + endRevnum = end; + } + } + + /* A blame line callback implementation. */ protected class BlameLineCallbackImpl implements BlameLineCallback { Modified: subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java?rev=1851536&r1=1851535&r2=1851536&view=diff ============================================================================== --- subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java (original) +++ subversion/trunk/subversion/bindings/javahl/tests/org/apache/subversion/javahl/ExceptionTests.java Thu Jan 17 14:50:52 2019 @@ -206,7 +206,7 @@ public class ExceptionTests extends SVNT { client.blame(thisTest.getWorkingCopy() + "/iota", Revision.getInstance(1), Revision.getInstance(1), - Revision.getInstance(1), false, false, null, + Revision.getInstance(1), false, false, null, null, new BlameLineCallback() { public void singleLine(long lineNum, long revision, Map<String, byte[]> revProps, long mergedRevision,