JNIEXPORT void 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; SVN_JNI_ERR(original.error_occurred(),); Path modified(jmodified_file, pool); if (JNIUtil::isJavaExceptionThrown()) return; SVN_JNI_ERR(modified.error_occurred(),); Path latest(jlatest_file, pool); if (JNIUtil::isJavaExceptionThrown()) return; SVN_JNI_ERR(latest.error_occurred(),); 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()),); JNIStringHolder conflict_original(jconflict_original); if (JNIUtil::isJavaExceptionThrown()) return; JNIStringHolder conflict_modified(jconflict_modified); if (JNIUtil::isJavaExceptionThrown()) return; JNIStringHolder conflict_latest(jconflict_latest); if (JNIUtil::isJavaExceptionThrown()) return; JNIStringHolder conflict_separator(jconflict_separator); if (JNIUtil::isJavaExceptionThrown()) return; OutputStream result_stream(jresult_stream); SVN_JNI_ERR(svn_diff_file_output_merge2( 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), pool.getPool()),); }
JNIEXPORT void 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, 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; SVN_JNI_ERR(original.error_occurred(),); Path modified(jmodified_file, pool); if (JNIUtil::isJavaExceptionThrown()) return; SVN_JNI_ERR(modified.error_occurred(),); 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()),); JNIStringHolder original_header(joriginal_header); if (JNIUtil::isJavaExceptionThrown()) return; JNIStringHolder modified_header(jmodified_header); if (JNIUtil::isJavaExceptionThrown()) return; JNIStringHolder header_encoding(jheader_encoding); if (JNIUtil::isJavaExceptionThrown()) return; JNIStringHolder relative_to_dir(jrelative_to_dir); if (JNIUtil::isJavaExceptionThrown()) return; OutputStream result_stream(jresult_stream); SVN_JNI_ERR(svn_diff_file_output_unified3( 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, pool.getPool()),); }
Py::Object pysvn_client::cmd_annotate( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_url_or_path }, { false, name_revision_start }, { false, name_revision_end }, #if defined( PYSVN_HAS_CLIENT_ANNOTATE2 ) { false, name_peg_revision }, #endif #if defined( PYSVN_HAS_CLIENT_ANNOTATE3 ) { false, name_ignore_space }, { false, name_ignore_eol_style }, { false, name_ignore_mime_type }, #endif #if defined( PYSVN_HAS_CLIENT_ANNOTATE4 ) { false, name_include_merged_revisions }, #endif { false, NULL } }; FunctionArguments args( "annotate", args_desc, a_args, a_kws ); args.check(); std::string path( args.getUtf8String( name_url_or_path, empty_string ) ); svn_opt_revision_t revision_start = args.getRevision( name_revision_start, svn_opt_revision_number ); svn_opt_revision_t revision_end = args.getRevision( name_revision_end, svn_opt_revision_head ); #if defined( PYSVN_HAS_CLIENT_ANNOTATE2 ) svn_opt_revision_t peg_revision = args.getRevision( name_peg_revision, revision_end ); #endif #if defined( PYSVN_HAS_CLIENT_ANNOTATE3 ) svn_diff_file_ignore_space_t ignore_space = svn_diff_file_ignore_space_none; if( args.hasArg( name_ignore_space ) ) { Py::ExtensionObject< pysvn_enum_value<svn_diff_file_ignore_space_t> > py_ignore_space( args.getArg( name_ignore_space ) ); ignore_space = svn_diff_file_ignore_space_t( py_ignore_space.extensionObject()->m_value ); } svn_boolean_t ignore_eol_style = args.getBoolean( name_ignore_eol_style, false ); svn_boolean_t ignore_mime_type = args.getBoolean( name_ignore_mime_type, false ); #endif #if defined( PYSVN_HAS_CLIENT_ANNOTATE4 ) svn_boolean_t include_merged_revisions = args.getBoolean( name_include_merged_revisions, false ); #endif SvnPool pool( m_context ); #if defined( PYSVN_HAS_CLIENT_ANNOTATE3 ) svn_diff_file_options_t *diff_options = svn_diff_file_options_create( pool ); diff_options->ignore_space = ignore_space; diff_options->ignore_eol_style = ignore_eol_style; #endif bool is_url = is_svn_url( path ); #if defined( PYSVN_HAS_CLIENT_ANNOTATE2 ) revisionKindCompatibleCheck( is_url, peg_revision, name_peg_revision, name_url_or_path ); #endif revisionKindCompatibleCheck( is_url, revision_start, name_revision_start, name_url_or_path ); revisionKindCompatibleCheck( is_url, revision_end, name_revision_end, name_url_or_path ); std::list<AnnotatedLineInfo> all_entries; try { std::string norm_path( svnNormalisedIfPath( path, pool ) ); checkThreadPermission(); PythonAllowThreads permission( m_context ); #if defined( PYSVN_HAS_CLIENT_ANNOTATE4 ) svn_error_t *error = svn_client_blame4 ( norm_path.c_str(), &peg_revision, &revision_start, &revision_end, diff_options, ignore_mime_type, include_merged_revisions, annotate_receiver, &all_entries, m_context, pool ); #elif defined( PYSVN_HAS_CLIENT_ANNOTATE3 ) svn_error_t *error = svn_client_blame3 ( norm_path.c_str(), &peg_revision, &revision_start, &revision_end, diff_options, ignore_mime_type, annotate_receiver, &all_entries, m_context, pool ); #elif defined( PYSVN_HAS_CLIENT_ANNOTATE2 ) svn_error_t *error = svn_client_blame2 ( norm_path.c_str(), &peg_revision, &revision_start, &revision_end, annotate_receiver, &all_entries, m_context, pool ); #else svn_error_t *error = svn_client_blame ( norm_path.c_str(), &revision_start, &revision_end, annotate_receiver, &all_entries, m_context, pool ); #endif permission.allowThisThread(); if( error != NULL ) { throw SvnException( error ); } } catch( SvnException &e ) { // use callback error over ClientException m_context.checkForError( m_module.client_error ); throw_client_error( e ); } // convert the entries into python objects Py::List entries_list; std::list<AnnotatedLineInfo>::const_iterator entry_it = all_entries.begin(); while( entry_it != all_entries.end() ) { const AnnotatedLineInfo &entry = *entry_it; ++entry_it; Py::Dict entry_dict; entry_dict[name_author] = Py::String( entry.m_author, name_utf8 ); entry_dict[name_date] = Py::String( entry.m_date ); entry_dict[name_line] = Py::String( entry.m_line ); entry_dict[name_number] = Py::Int( long( entry.m_line_no ) ); entry_dict[name_revision] = Py::asObject( new pysvn_revision( svn_opt_revision_number, 0, entry.m_revision ) ); entries_list.append( entry_dict ); } return entries_list; }