static int l_propget (lua_State *L) { apr_pool_t *pool; svn_error_t *err; svn_client_ctx_t *ctx; apr_hash_t *props; const char *propname_utf8; const void *key; void *val; apr_hash_index_t *hi; svn_opt_revision_t peg_revision; svn_opt_revision_t revision; const char *path = luaL_checkstring (L, 1); const char *propname = luaL_checkstring (L, 2); int itable = 4; svn_boolean_t recursive = FALSE; peg_revision.kind = svn_opt_revision_unspecified; if (lua_gettop (L) < 3 || lua_isnil (L, 3)) { revision.kind = svn_opt_revision_unspecified; } else { revision.kind = svn_opt_revision_number; revision.value.number = lua_tointeger (L, 3); } if (lua_gettop (L) >= itable && lua_istable (L, itable)) { lua_getfield (L, itable, "recursive"); if (lua_isboolean (L, -1)) { recursive = lua_toboolean (L, -1); } } init_function (&ctx, &pool, L); path = svn_path_canonicalize (path, pool); err = svn_utf_cstring_to_utf8 (&propname_utf8, propname, pool); IF_ERROR_RETURN (err, pool, L); err = svn_client_propget2 (&props, propname_utf8, path, &peg_revision, &revision, recursive, ctx, pool); IF_ERROR_RETURN (err, pool, L); lua_newtable (L); for (hi = apr_hash_first (pool, props); hi; hi = apr_hash_next (hi)) { svn_string_t *s; apr_hash_this (hi, &key, NULL, &val); s = (svn_string_t *) val; lua_pushstring (L, s->data); lua_setfield (L, -2, (char *) key); } svn_pool_destroy (pool); return 1; }
Py::Object pysvn_client::cmd_propget( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_prop_name }, { true, name_url_or_path }, { false, name_revision }, { false, name_recurse }, #if defined( PYSVN_HAS_CLIENT_PROPGET2 ) { false, name_peg_revision }, #endif #if defined( PYSVN_HAS_CLIENT_PROPGET3 ) { false, name_depth }, { false, name_changelists }, #endif { false, NULL } }; FunctionArguments args( "propget", args_desc, a_args, a_kws ); args.check(); std::string propname( args.getUtf8String( name_prop_name ) ); std::string path( args.getUtf8String( name_url_or_path ) ); SvnPool pool( m_context ); #if defined( PYSVN_HAS_CLIENT_PROPGET3 ) apr_array_header_t *changelists = NULL; if( args.hasArg( name_changelists ) ) { changelists = arrayOfStringsFromListOfStrings( args.getArg( name_changelists ), pool ); } svn_depth_t depth = args.getDepth( name_depth, name_recurse, svn_depth_files, svn_depth_empty ); #else bool recurse = args.getBoolean( name_recurse, false ); #endif 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 ); #if defined( PYSVN_HAS_CLIENT_PROPGET2 ) svn_opt_revision_t peg_revision = args.getRevision( name_peg_revision, revision ); #endif bool is_url = is_svn_url( path ); #if defined( PYSVN_HAS_CLIENT_PROPGET2 ) revisionKindCompatibleCheck( is_url, peg_revision, name_peg_revision, name_url_or_path ); #endif revisionKindCompatibleCheck( is_url, revision, name_revision, name_url_or_path ); apr_hash_t *props = NULL; #if defined( PYSVN_HAS_CLIENT_PROPGET3 ) svn_revnum_t actual_revnum = 0; #endif try { std::string norm_path( svnNormalisedIfPath( path, pool ) ); checkThreadPermission(); PythonAllowThreads permission( m_context ); #if defined( PYSVN_HAS_CLIENT_PROPGET3 ) svn_error_t *error = svn_client_propget3 ( &props, propname.c_str(), norm_path.c_str(), &peg_revision, &revision, &actual_revnum, depth, changelists, m_context, pool ); #elif defined( PYSVN_HAS_CLIENT_PROPGET2 ) svn_error_t *error = svn_client_propget2 ( &props, propname.c_str(), norm_path.c_str(), &peg_revision, &revision, recurse, m_context, pool ); #else svn_error_t *error = svn_client_propget ( &props, propname.c_str(), norm_path.c_str(), &revision, recurse, 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 propsToObject( props, pool ); }