blob: c6d3d6e027fe41a042dacb2e195967846f24729b [file] [log] [blame]
/**
* @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;
}