Author: rhuijben Date: Fri Aug 5 15:54:34 2011 New Revision: 1154278 URL: http://svn.apache.org/viewvc?rev=1154278&view=rev Log: Make it possible to run 'svn ls' against repositories of Subversion 1.3.x like 'svn.webdav.org'. This repository returns a deadprop-count, but without a value.
This doesn't fix the behavior of the request yet, but at least svn ls returns the list of nodes. (We probably need an additional request to fill has_props in a different way if we see a failure) Try svn ls http://svn.webdav.org/repos/projects/neon with serf to see the result. (This problem was reported on [email protected] some time ago, but without reproduction recipe) * subversion/libsvn_ra_serf/ra_serf.h (svn_ra_serf__session_t): Add tristate in preparation of real solution. * subversion/libsvn_ra_serf/serf.c (svn_ra_serf__open): Initialize new variable. (dirent_walker_baton_t): Add variable. (dirent_walker): Accept '' as valid deadprop count but store that the server doesn't support it. (path_dirent_visitor_t): Add deadprop tristate and result pool. (path_dirent_walker): Update caller. (svn_ra_serf__stat): Update caller. (svn_ra_serf__get_dir): Copy interesting values to session baton. Modified: subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h subversion/trunk/subversion/libsvn_ra_serf/serf.c Modified: subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h?rev=1154278&r1=1154277&r2=1154278&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h (original) +++ subversion/trunk/subversion/libsvn_ra_serf/ra_serf.h Fri Aug 5 15:54:34 2011 @@ -179,6 +179,9 @@ struct svn_ra_serf__session_t { /* Connection timeout value */ long timeout; + /* HTTPv1 flags */ + svn_tristate_t supports_deadprop_count; + /*** HTTP v2 protocol stuff. *** * * We assume that if mod_dav_svn sends one of the special v2 OPTIONs Modified: subversion/trunk/subversion/libsvn_ra_serf/serf.c URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/serf.c?rev=1154278&r1=1154277&r2=1154278&view=diff ============================================================================== --- subversion/trunk/subversion/libsvn_ra_serf/serf.c (original) +++ subversion/trunk/subversion/libsvn_ra_serf/serf.c Fri Aug 5 15:54:34 2011 @@ -386,6 +386,8 @@ svn_ra_serf__open(svn_ra_session_t *sess serf_sess->session_url_str = apr_pstrdup(serf_sess->pool, repos_URL); serf_sess->using_ssl = (svn_cstring_casecmp(url.scheme, "https") == 0); + serf_sess->supports_deadprop_count = svn_tristate_unknown; + serf_sess->capabilities = apr_hash_make(serf_sess->pool); SVN_ERR(load_config(serf_sess, config, serf_sess->pool)); @@ -660,6 +662,8 @@ struct dirent_walker_baton_t { /* Update the fields in this entry. */ svn_dirent_t *entry; + svn_tristate_t *supports_deadprop_count; + /* If allocations are necessary, then use this pool. */ apr_pool_t *result_pool; }; @@ -685,9 +689,16 @@ dirent_walker(void *baton, { if(strcmp(name, "deadprop-count") == 0) { - apr_int64_t deadprop_count; - SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data)); - dwb->entry->has_props = deadprop_count > 0; + if (*val->data) + { + apr_int64_t deadprop_count; + SVN_ERR(svn_cstring_atoi64(&deadprop_count, val->data)); + dwb->entry->has_props = deadprop_count > 0; + if (dwb->supports_deadprop_count) + *dwb->supports_deadprop_count = svn_tristate_true; + } + else if (dwb->supports_deadprop_count) + *dwb->supports_deadprop_count = svn_tristate_false; } } else if (strcmp(ns, "DAV:") == 0) @@ -734,6 +745,8 @@ struct path_dirent_visitor_t { apr_hash_t *full_paths; apr_hash_t *base_paths; const char *orig_path; + svn_tristate_t supports_deadprop_count; + apr_pool_t *result_pool; }; static svn_error_t * @@ -771,7 +784,8 @@ path_dirent_walker(void *baton, } dwb.entry = entry; - dwb.result_pool = pool; /* ### fix this! */ + dwb.supports_deadprop_count = &dirents->supports_deadprop_count; + dwb.result_pool = dirents->result_pool; return svn_error_trace(dirent_walker(&dwb, ns, name, val, pool)); } @@ -862,7 +876,8 @@ svn_ra_serf__stat(svn_ra_session_t *ra_s } dwb.entry = apr_pcalloc(pool, sizeof(*dwb.entry)); - dwb.result_pool = pool; /* ### fix this */ + dwb.supports_deadprop_count = NULL; + dwb.result_pool = pool; SVN_ERR(svn_ra_serf__walk_all_props(props, path, fetched_rev, dirent_walker, &dwb, pool)); @@ -956,11 +971,15 @@ svn_ra_serf__get_dir(svn_ra_session_t *r dirent_walk.full_paths = apr_hash_make(pool); dirent_walk.base_paths = apr_hash_make(pool); dirent_walk.orig_path = svn_urlpath__canonicalize(path, pool); + dirent_walk.supports_deadprop_count = svn_tristate_unknown; + dirent_walk.result_pool = pool; SVN_ERR(svn_ra_serf__walk_all_paths(props, revision, path_dirent_walker, &dirent_walk, pool)); *dirents = dirent_walk.base_paths; + if (dirent_walk.supports_deadprop_count != svn_tristate_unknown) + session->supports_deadprop_count = dirent_walk.supports_deadprop_count; } /* If we're asked for the directory properties, fetch them too. */
