DirEntries Client::list(const char * pathOrUrl, svn_opt_revision_t * revision, bool recurse) throw(ClientException) { Pool pool; DirEntries entries; svn_error_t * error = svn_client_list2(pathOrUrl, revision, revision, recurse ? svn_depth_infinity : svn_depth_immediates, SVN_DIRENT_ALL, true, listEntriesFunc, &entries, *m_context, pool); if (error != 0) throw ClientException(error); return entries; }
apr_array_header_t *svn_support_list_call(char *rep_path, int rev,apr_pool_t *subpool) { svn_error_t *err; svn_opt_revision_t revision; // -- Initialisation de la revision -- if (rev != -1) { revision.kind = svn_opt_revision_number; revision.value.number = rev; } else{ revision.kind = svn_opt_revision_unspecified; } // -- Initialisation du tableau et du buffer de résultats -- apr_array_header_t *list_result = apr_array_make(subpool, 1, sizeof (const char *)); svn_stringbuf_t *res = svn_stringbuf_create("",subpool); // -- Appel de svn list -- err = svn_client_list2(rep_path, &revision, &revision, svn_depth_immediates, SVN_DIRENT_ALL, FALSE, list_callback, res, ctx, subpool); if (err) { svn_handle_error2(err, stderr, FALSE, "svn_support_list: "); svn_pool_destroy(subpool); return NULL; } svn_cstring_split_append(list_result,res->data,"\n",TRUE,subpool); svn_pool_destroy(subpool); return list_result; }
Py::Object pysvn_client::cmd_list( const Py::Tuple &a_args, const Py::Dict &a_kws ) { static argument_description args_desc[] = { { true, name_url_or_path }, { false, name_peg_revision }, { false, name_revision }, { false, name_recurse }, { false, name_dirent_fields }, { false, name_fetch_locks }, #if defined( PYSVN_HAS_CLIENT_LIST2 ) { false, name_depth }, #endif { false, NULL } }; FunctionArguments args( "list", args_desc, a_args, a_kws ); args.check(); std::string path( args.getUtf8String( name_url_or_path ) ); svn_opt_revision_t peg_revision = args.getRevision( name_peg_revision, svn_opt_revision_unspecified ); bool is_url = is_svn_url( path ); svn_opt_revision_t revision; if( is_url ) revision = args.getRevision( name_revision, svn_opt_revision_head ); else revision = args.getRevision( name_revision, svn_opt_revision_working ); #if defined( PYSVN_HAS_CLIENT_LIST2 ) svn_depth_t depth = args.getDepth( name_depth, name_recurse, svn_depth_immediates, svn_depth_infinity, svn_depth_immediates ); #else bool recurse = args.getBoolean( name_recurse, false ); #endif apr_uint32_t dirent_fields = args.getLong( name_dirent_fields, SVN_DIRENT_ALL ); bool fetch_locks = args.getBoolean( name_fetch_locks, false ); revisionKindCompatibleCheck( is_url, peg_revision, name_peg_revision, name_url_or_path ); revisionKindCompatibleCheck( is_url, revision, name_revision, name_url_or_path ); SvnPool pool( m_context ); std::string norm_path( svnNormalisedIfPath( path, pool ) ); Py::List list_list; try { checkThreadPermission(); PythonAllowThreads permission( m_context ); ListReceiveBaton list_baton( &permission, list_list ); list_baton.m_dirent_fields = dirent_fields; list_baton.m_is_url = is_url; list_baton.m_fetch_locks = fetch_locks; list_baton.m_url_or_path = norm_path; list_baton.m_wrapper_lock = &m_wrapper_lock; list_baton.m_wrapper_list = &m_wrapper_list; #if defined( PYSVN_HAS_CLIENT_LIST2 ) svn_error_t *error = svn_client_list2 ( norm_path.c_str(), &peg_revision, &revision, depth, dirent_fields, fetch_locks, list_receiver_c, reinterpret_cast<void *>( &list_baton ), m_context, pool ); #else svn_error_t *error = svn_client_list ( norm_path.c_str(), &peg_revision, &revision, recurse, dirent_fields, fetch_locks, list_receiver_c, reinterpret_cast<void *>( &list_baton ), m_context, pool ); #endif permission.allowThisThread(); if( error != 0 ) throw SvnException( error ); } catch( SvnException &e ) { // use callback error over ClientException m_context.checkForError( m_module.client_error ); throw_client_error( e ); } return list_list; }
/* This implements the `svn_opt_subcommand_t' interface. */ svn_error_t * svn_cl__list(apr_getopt_t *os, void *baton, apr_pool_t *pool) { svn_cl__opt_state_t *opt_state = ((svn_cl__cmd_baton_t *) baton)->opt_state; svn_client_ctx_t *ctx = ((svn_cl__cmd_baton_t *) baton)->ctx; apr_array_header_t *targets; int i; apr_pool_t *subpool = svn_pool_create(pool); apr_uint32_t dirent_fields; struct print_baton pb; svn_boolean_t seen_nonexistent_target = FALSE; svn_error_t *err; SVN_ERR(svn_cl__args_to_target_array_print_reserved(&targets, os, opt_state->targets, ctx, FALSE, pool)); /* Add "." if user passed 0 arguments */ svn_opt_push_implicit_dot_target(targets, pool); if (opt_state->xml) { /* The XML output contains all the information, so "--verbose" does not apply. */ if (opt_state->verbose) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("'verbose' option invalid in XML mode")); /* If output is not incremental, output the XML header and wrap everything in a top-level element. This makes the output in its entirety a well-formed XML document. */ if (! opt_state->incremental) SVN_ERR(svn_cl__xml_print_header("lists", pool)); } else { if (opt_state->incremental) return svn_error_create(SVN_ERR_CL_ARG_PARSING_ERROR, NULL, _("'incremental' option only valid in XML " "mode")); } if (opt_state->verbose || opt_state->xml) dirent_fields = SVN_DIRENT_ALL; else dirent_fields = SVN_DIRENT_KIND; /* the only thing we actually need... */ pb.ctx = ctx; pb.verbose = opt_state->verbose; if (opt_state->depth == svn_depth_unknown) opt_state->depth = svn_depth_immediates; /* For each target, try to list it. */ for (i = 0; i < targets->nelts; i++) { const char *target = APR_ARRAY_IDX(targets, i, const char *); const char *truepath; svn_opt_revision_t peg_revision; svn_pool_clear(subpool); SVN_ERR(svn_cl__check_cancel(ctx->cancel_baton)); /* Get peg revisions. */ SVN_ERR(svn_opt_parse_path(&peg_revision, &truepath, target, subpool)); if (opt_state->xml) { svn_stringbuf_t *sb = svn_stringbuf_create("", pool); svn_xml_make_open_tag(&sb, pool, svn_xml_normal, "list", "path", truepath[0] == '\0' ? "." : truepath, NULL); SVN_ERR(svn_cl__error_checked_fputs(sb->data, stdout)); } err = svn_client_list2(truepath, &peg_revision, &(opt_state->start_revision), opt_state->depth, dirent_fields, (opt_state->xml || opt_state->verbose), opt_state->xml ? print_dirent_xml : print_dirent, &pb, ctx, subpool); if (err) { /* If one of the targets is a non-existent URL or wc-entry, don't bail out. Just warn and move on to the next target. */ if (err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND || err->apr_err == SVN_ERR_FS_NOT_FOUND) svn_handle_warning2(stderr, err, "svn: "); else return svn_error_trace(err); svn_error_clear(err); err = NULL; seen_nonexistent_target = TRUE; } if (opt_state->xml) { svn_stringbuf_t *sb = svn_stringbuf_create("", pool); svn_xml_make_close_tag(&sb, pool, "list"); SVN_ERR(svn_cl__error_checked_fputs(sb->data, stdout)); } } svn_pool_destroy(subpool); if (opt_state->xml && ! opt_state->incremental) SVN_ERR(svn_cl__xml_print_footer("lists", pool)); if (seen_nonexistent_target) return svn_error_create( SVN_ERR_ILLEGAL_TARGET, NULL, _("Could not list all targets because some targets don't exist")); else return SVN_NO_ERROR; }