Py::Object pysvn_client::cmd_import( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_path }, { true, name_url }, { true, name_log_message }, { false, name_recurse }, #if defined( PYSVN_HAS_CLIENT_IMPORT2 ) { false, name_ignore }, #endif #if defined( PYSVN_HAS_CLIENT_IMPORT3 ) { false, name_depth }, { false, name_ignore_unknown_node_types }, { false, name_revprops }, #endif { false, NULL } }; FunctionArguments args( "import_", args_desc, a_args, a_kws ); args.check(); std::string path( args.getUtf8String( name_path ) ); std::string url( args.getUtf8String( name_url ) ); std::string message( args.getUtf8String( name_log_message ) ); SvnPool pool( m_context ); #if defined( PYSVN_HAS_CLIENT_IMPORT3 ) svn_depth_t depth = args.getDepth( name_depth, name_recurse, svn_depth_infinity, svn_depth_infinity, svn_depth_files ); bool ignore_unknown_node_types = args.getBoolean( name_ignore_unknown_node_types, false ); apr_hash_t *revprops = NULL; if( args.hasArg( name_revprops ) ) { Py::Object py_revprop = args.getArg( name_revprops ); if( !py_revprop.isNone() ) { revprops = hashOfStringsFromDistOfStrings( py_revprop, pool ); } } #else bool recurse = args.getBoolean( name_recurse, true ); #endif #if defined( PYSVN_HAS_CLIENT_IMPORT2 ) bool ignore = args.getBoolean( name_ignore, false ); #endif pysvn_commit_info_t *commit_info = NULL; try { std::string norm_path( svnNormalisedIfPath( path, pool ) ); checkThreadPermission(); PythonAllowThreads permission( m_context ); m_context.setLogMessage( message.c_str() ); #if defined( PYSVN_HAS_CLIENT_IMPORT3 ) svn_error_t *error = svn_client_import3 ( &commit_info, // changed type norm_path.c_str(), url.c_str(), depth, !ignore, ignore_unknown_node_types, revprops, m_context, pool ); #elif defined( PYSVN_HAS_CLIENT_IMPORT2 ) svn_error_t *error = svn_client_import2 ( &commit_info, // changed type norm_path.c_str(), url.c_str(), !recurse, // non_recursive !ignore, m_context, pool ); #else svn_error_t *error = svn_client_import ( &commit_info, norm_path.c_str(), url.c_str(), !recurse, // non_recursive 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 ); } return toObject( commit_info, m_commit_info_style ); }
Py::Object pysvn_client::cmd_move2( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_sources }, { true, name_dest_url_or_path }, { false, name_force }, { false, name_move_as_child }, { false, name_make_parents }, { false, name_revprops }, { false, NULL } }; FunctionArguments args( "move2", args_desc, a_args, a_kws ); args.check(); SvnPool pool( m_context ); pysvn_commit_info_t *commit_info = NULL; std::string type_error_message; try { type_error_message = "expecting list for sources (arg 1)"; Py::List list_all_sources = args.getArg( name_sources ); apr_array_header_t *all_sources = apr_array_make( pool, list_all_sources.length(), sizeof(const char *) ); for( unsigned int index=0; index<list_all_sources.length(); index++ ) { type_error_message = "expecting string in sources list"; Py::String py_src_url_or_path( list_all_sources[ index ] ); std::string src_url_or_path; if( py_src_url_or_path.isUnicode() ) { Py::String utf8( py_src_url_or_path.encode( name_utf8 ) ); src_url_or_path = py_src_url_or_path.as_std_string(); } else { src_url_or_path = py_src_url_or_path.as_std_string(); } std::string norm_src_url_or_path( svnNormalisedIfPath( src_url_or_path, pool ) ); const char *src_path_copy = apr_pstrdup( pool, norm_src_url_or_path.c_str() ); APR_ARRAY_PUSH( all_sources, const char *) = src_path_copy; } type_error_message = "expecting string for dest_url_or_path"; Py::String dest_path( args.getUtf8String( name_dest_url_or_path ) ); type_error_message = "expecting boolean for keyword force"; bool force = args.getBoolean( name_force, false ); type_error_message = "expecting boolean for keyword move_as_child"; bool move_as_child = args.getBoolean( name_move_as_child, false ); type_error_message = "expecting boolean for keyword make_parents"; bool make_parents = args.getBoolean( name_make_parents, false ); apr_hash_t *revprops = NULL; if( args.hasArg( name_revprops ) ) { Py::Object py_revprop = args.getArg( name_revprops ); if( !py_revprop.isNone() ) { revprops = hashOfStringsFromDistOfStrings( py_revprop, pool ); } } try { std::string norm_dest_path( svnNormalisedIfPath( dest_path, pool ) ); checkThreadPermission(); PythonAllowThreads permission( m_context ); // behavior changed svn_error_t *error = svn_client_move5 ( &commit_info, all_sources, norm_dest_path.c_str(), force, move_as_child, make_parents, revprops, m_context, pool ); 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 ); } } catch( Py::TypeError & ) { throw Py::TypeError( type_error_message ); } return toObject( commit_info ); }
Py::Object pysvn_client::cmd_propset( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_prop_name }, { true, name_prop_value }, { true, name_url_or_path }, { false, name_revision }, { false, name_recurse }, #if defined( PYSVN_HAS_CLIENT_PROPSET2 ) { false, name_skip_checks }, #endif #if defined( PYSVN_HAS_CLIENT_PROPSET3 ) { false, name_depth }, { false, name_base_revision_for_url }, { false, name_changelists }, { false, name_revprops }, #endif { false, NULL } }; FunctionArguments args( "propset", args_desc, a_args, a_kws ); args.check(); std::string propname( args.getUtf8String( name_prop_name ) ); std::string propval( args.getUtf8String( name_prop_value ) ); std::string path( args.getUtf8String( name_url_or_path ) ); svn_opt_revision_t revision; if( is_svn_url( path ) ) revision = args.getRevision( name_revision, svn_opt_revision_head ); else revision = args.getRevision( name_revision, svn_opt_revision_working ); SvnPool pool( m_context ); #if defined( PYSVN_HAS_CLIENT_PROPSET3 ) apr_array_header_t *changelists = NULL; if( args.hasArg( name_changelists ) ) { changelists = arrayOfStringsFromListOfStrings( args.getArg( name_changelists ), pool ); } svn_revnum_t base_revision_for_url = args.getInteger( name_base_revision_for_url, 0 ); svn_depth_t depth = args.getDepth( name_depth, name_recurse, svn_depth_files, svn_depth_empty ); apr_hash_t *revprops = NULL; if( args.hasArg( name_revprops ) ) { Py::Object py_revprop = args.getArg( name_revprops ); if( !py_revprop.isNone() ) { revprops = hashOfStringsFromDistOfStrings( py_revprop, pool ); } } #else bool recurse = args.getBoolean( name_recurse, false ); #endif #if defined( PYSVN_HAS_CLIENT_PROPSET2 ) bool skip_checks = args.getBoolean( name_skip_checks, false ); #endif #if defined( PYSVN_HAS_CLIENT_PROPSET3 ) pysvn_commit_info_t *commit_info = NULL; #endif try { std::string norm_path( svnNormalisedIfPath( path, pool ) ); checkThreadPermission(); PythonAllowThreads permission( m_context ); const svn_string_t *svn_propval = svn_string_ncreate( propval.c_str(), propval.size(), pool ); #if defined( PYSVN_HAS_CLIENT_PROPSET3 ) svn_error_t *error = svn_client_propset3 ( &commit_info, propname.c_str(), svn_propval, norm_path.c_str(), depth, skip_checks, base_revision_for_url, changelists, revprops, m_context.ctx(), pool ); #elif defined( PYSVN_HAS_CLIENT_PROPSET2 ) svn_error_t *error = svn_client_propset2 ( propname.c_str(), svn_propval, norm_path.c_str(), recurse, skip_checks, m_context.ctx(), pool ); #else svn_error_t *error = svn_client_propset ( propname.c_str(), svn_propval, norm_path.c_str(), recurse, 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 ); } #if defined( PYSVN_HAS_CLIENT_PROPSET3 ) return toObject( commit_info ); #else return Py::None(); #endif }
Py::Object pysvn_client::cmd_copy2( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_sources }, { true, name_dest_url_or_path }, { false, name_copy_as_child }, { false, name_make_parents }, { false, name_revprops }, { false, NULL } }; FunctionArguments args( "copy2", args_desc, a_args, a_kws ); args.check(); SvnPool pool( m_context ); pysvn_commit_info_t *commit_info = NULL; std::string type_error_message; try { type_error_message = "expecting list for sources (arg 1)"; Py::List list_all_sources = args.getArg( name_sources ); apr_array_header_t *all_sources = apr_array_make( pool, list_all_sources.length(), sizeof(svn_client_copy_source_t *) ); for( unsigned int index=0; index<list_all_sources.length(); index++ ) { Py::Tuple tuple_src_rev_pegrev( list_all_sources[ index ] ); std::string src_url_or_path; svn_opt_revision_t *revision = reinterpret_cast<svn_opt_revision_t *>( apr_palloc( pool, sizeof( svn_opt_revision_t ) ) ); svn_opt_revision_t *peg_revision = reinterpret_cast<svn_opt_revision_t *>( apr_palloc( pool, sizeof( svn_opt_revision_t ) ) ); if( tuple_src_rev_pegrev.length() > 3 ) { std::string msg = "copy2() expecting tuple with 2 or 3 values in sources list"; throw Py::AttributeError( msg ); } type_error_message = "expecting string for 1st tuple value in sources list"; Py::String py_src_url_or_path( tuple_src_rev_pegrev[0] ); if( py_src_url_or_path.isUnicode() ) { Py::String utf8( py_src_url_or_path.encode( name_utf8 ) ); src_url_or_path = py_src_url_or_path.as_std_string(); } else { src_url_or_path = py_src_url_or_path.as_std_string(); } std::string norm_src_url_or_path( svnNormalisedIfPath( src_url_or_path, pool ) ); bool is_url = is_svn_url( norm_src_url_or_path ); if( tuple_src_rev_pegrev.length() >= 2 ) { Py::Object obj( tuple_src_rev_pegrev[1] ); if( pysvn_revision::check( obj ) ) { pysvn_revision *rev = static_cast<pysvn_revision *>( obj.ptr() ); *revision = rev->getSvnRevision(); revisionKindCompatibleCheck( is_url, *revision, "sources list 2nd tuple value", "sources list 1st tuple value" ); } else { std::string msg = "copy2() expecting revision for 2nd tuple value in sources list"; throw Py::AttributeError( msg ); } } else { if( is_url ) { revision->kind = svn_opt_revision_head; } else { revision->kind = svn_opt_revision_working; } } if( tuple_src_rev_pegrev.length() >= 3 ) { Py::Object obj( tuple_src_rev_pegrev[2] ); if( pysvn_revision::check( obj ) ) { pysvn_revision *rev = static_cast<pysvn_revision *>( obj.ptr() ); *peg_revision = rev->getSvnRevision(); revisionKindCompatibleCheck( is_url, *peg_revision, "sources list 2nd tuple value", "sources list 1st tuple value" ); } else { std::string msg = "copy2() expecting revision for 3rd tuple value in sources list"; throw Py::AttributeError( msg ); } } else { *peg_revision = *revision; } svn_client_copy_source_t *source = reinterpret_cast<svn_client_copy_source_t *>( apr_palloc( pool, sizeof(*source) ) ); source->path = apr_pstrdup( pool, norm_src_url_or_path.c_str() ); source->revision = revision; source->peg_revision = peg_revision; APR_ARRAY_PUSH( all_sources, svn_client_copy_source_t *) = source; } type_error_message = "expecting string for dest_url_or_path"; Py::String dest_path( args.getUtf8String( name_dest_url_or_path ) ); type_error_message = "expecting boolean for keyword copy_as_child"; bool copy_as_child = args.getBoolean( name_copy_as_child, false ); type_error_message = "expecting boolean for keyword make_parents"; bool make_parents = args.getBoolean( name_make_parents, false ); apr_hash_t *revprops = NULL; if( args.hasArg( name_revprops ) ) { Py::Object py_revprop = args.getArg( name_revprops ); if( !py_revprop.isNone() ) { revprops = hashOfStringsFromDistOfStrings( py_revprop, pool ); } } try { std::string norm_dest_path( svnNormalisedIfPath( dest_path, pool ) ); checkThreadPermission(); PythonAllowThreads permission( m_context ); // behavior changed svn_error_t *error = svn_client_copy4 ( &commit_info, all_sources, norm_dest_path.c_str(), copy_as_child, make_parents, revprops, m_context, pool ); 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 ); } } catch( Py::TypeError & ) { throw Py::TypeError( type_error_message ); } return toObject( commit_info ); }