diff options
Diffstat (limited to 'subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp')
-rw-r--r-- | subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp | 206 |
1 files changed, 206 insertions, 0 deletions
diff --git a/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp new file mode 100644 index 0000000..c6d3d6e --- /dev/null +++ b/subversion/bindings/javahl/native/org_apache_subversion_javahl_util_DiffLib.cpp @@ -0,0 +1,206 @@ +/** + * @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 + * + * @file org_apache_subversion_javahl_util_DiffLib.cpp + * @brief Implementation of the native methods in the Java class DiffLib + */ + +#include "../include/org_apache_subversion_javahl_util_DiffLib.h" + +#include "JNIStackElement.h" +#include "JNIStringHolder.h" +#include "JNIUtil.h" +#include "OutputStream.h" +#include "Path.h" +#include "Pool.h" + +#include "svn_diff.h" + +JNIEXPORT jboolean JNICALL +Java_org_apache_subversion_javahl_util_DiffLib_nativeFileDiff( + JNIEnv* env, jobject jthis, + jstring joriginal_file, + jstring jmodified_file, + + jint jignore_space_ordinal, + jboolean jignore_eol_style, + jboolean jshow_c_function, + jint jcontext_size, + + jstring joriginal_header, + jstring jmodified_header, + jstring jheader_encoding, + jstring jrelative_to_dir, + + jobject jresult_stream) +{ + JNIEntry(DiffLib, nativeFileDiff); + + // Using a "global" request pool since we don't keep a context with + // its own pool around for these functions. + SVN::Pool pool; + + Path original(joriginal_file, pool); + if (JNIUtil::isJavaExceptionThrown()) + return false; + SVN_JNI_ERR(original.error_occurred(), false); + + Path modified(jmodified_file, pool); + if (JNIUtil::isJavaExceptionThrown()) + return false; + SVN_JNI_ERR(modified.error_occurred(), false); + + svn_diff_t* diff; + svn_diff_file_options_t* diff_options = + svn_diff_file_options_create(pool.getPool()); + diff_options->ignore_space = + svn_diff_file_ignore_space_t(jignore_space_ordinal); + diff_options->ignore_eol_style = svn_boolean_t(jignore_eol_style); + diff_options->show_c_function = svn_boolean_t(jshow_c_function); + SVN_JNI_ERR(svn_diff_file_diff_2(&diff, + original.c_str(), + modified.c_str(), + diff_options, + pool.getPool()), + false); + + const jboolean diffs = svn_diff_contains_diffs(diff); + + JNIStringHolder original_header(joriginal_header); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + JNIStringHolder modified_header(jmodified_header); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + JNIStringHolder header_encoding(jheader_encoding); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + JNIStringHolder relative_to_dir(jrelative_to_dir); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + OutputStream result_stream(jresult_stream); + + SVN_JNI_ERR(svn_diff_file_output_unified4( + result_stream.getStream(pool), diff, + original.c_str(), modified.c_str(), + original_header.c_str(), modified_header.c_str(), + header_encoding.c_str(), relative_to_dir.c_str(), + diff_options->show_c_function, int(jcontext_size), + NULL, NULL, pool.getPool()), + false); + + return diffs; +} + +JNIEXPORT jboolean JNICALL +Java_org_apache_subversion_javahl_util_DiffLib_nativeFileMerge( + JNIEnv* env, jobject jthis, + jstring joriginal_file, + jstring jmodified_file, + jstring jlatest_file, + + jint jignore_space_ordinal, + jboolean jignore_eol_style, + jboolean jshow_c_function, + + jstring jconflict_original, + jstring jconflict_modified, + jstring jconflict_latest, + jstring jconflict_separator, + jint jconflict_style_ordinal, + + jobject jresult_stream) +{ + JNIEntry(DiffLib, nativeFileMerge); + + // Using a "global" request pool since we don't keep a context with + // its own pool around for these functions. + SVN::Pool pool; + + Path original(joriginal_file, pool); + if (JNIUtil::isJavaExceptionThrown()) + return false; + SVN_JNI_ERR(original.error_occurred(), false); + + Path modified(jmodified_file, pool); + if (JNIUtil::isJavaExceptionThrown()) + return false; + SVN_JNI_ERR(modified.error_occurred(), false); + + Path latest(jlatest_file, pool); + if (JNIUtil::isJavaExceptionThrown()) + return false; + SVN_JNI_ERR(latest.error_occurred(), false); + + svn_diff_t* diff; + svn_diff_file_options_t* diff_options = + svn_diff_file_options_create(pool.getPool()); + diff_options->ignore_space = + svn_diff_file_ignore_space_t(jignore_space_ordinal); + diff_options->ignore_eol_style = svn_boolean_t(jignore_eol_style); + diff_options->show_c_function = svn_boolean_t(jshow_c_function); + SVN_JNI_ERR(svn_diff_file_diff3_2(&diff, + original.c_str(), + modified.c_str(), + latest.c_str(), + diff_options, + pool.getPool()), + false); + + const jboolean conflicts = svn_diff_contains_conflicts(diff); + + JNIStringHolder conflict_original(jconflict_original); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + JNIStringHolder conflict_modified(jconflict_modified); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + JNIStringHolder conflict_latest(jconflict_latest); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + JNIStringHolder conflict_separator(jconflict_separator); + if (JNIUtil::isJavaExceptionThrown()) + return false; + + OutputStream result_stream(jresult_stream); + + SVN_JNI_ERR(svn_diff_file_output_merge3( + result_stream.getStream(pool), diff, + original.c_str(), modified.c_str(), latest.c_str(), + conflict_original.c_str(), + conflict_modified.c_str(), + conflict_latest.c_str(), + conflict_separator.c_str(), + svn_diff_conflict_display_style_t(jconflict_style_ordinal), + NULL, NULL, + pool.getPool()), + false); + + return conflicts; +} |