You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by rh...@apache.org on 2011/08/05 17:54:34 UTC
svn commit: r1154278 - in /subversion/trunk/subversion/libsvn_ra_serf:
ra_serf.h serf.c
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 users@s.a.o 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. */