AnnotatedFile * Client::annotate(const Path & path, const Revision & revisionStart, const Revision & revisionEnd) throw(ClientException) { Pool pool; AnnotatedFile * entries = new AnnotatedFile; svn_error_t *error; error = svn_client_blame( path.c_str(), revisionStart.revision(), revisionEnd.revision(), annotateReceiver, entries, *m_context, // client ctx pool); if (error != NULL) { delete entries; throw ClientException(error); } return entries; }
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; }