You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2010/08/01 19:46:05 UTC
svn commit: r981275 - in /subversion/trunk/subversion:
libsvn_ra_neon/props.c libsvn_ra_serf/commit.c
Author: danielsh
Date: Sun Aug 1 17:46:05 2010
New Revision: 981275
URL: http://svn.apache.org/viewvc?rev=981275&view=rev
Log:
Refactor the way ra_neon and ra_serf generate the PROPPATCH <D:prop/> tags.
* subversion/libsvn_ra_neon/props.c
(get_encoding_and_cdata): New helper, factored out from...
(append_setprop): ...here. Change return type.
(svn_ra_neon__do_proppatch): Track changed return type.
* subversion/libsvn_ra_serf/commit.c
(get_encoding_and_cdata): New helper, factored out from...
(proppatch_walker): Use new helper, simplifying logic.
Modified:
subversion/trunk/subversion/libsvn_ra_neon/props.c
subversion/trunk/subversion/libsvn_ra_serf/commit.c
Modified: subversion/trunk/subversion/libsvn_ra_neon/props.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_neon/props.c?rev=981275&r1=981274&r2=981275&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_neon/props.c (original)
+++ subversion/trunk/subversion/libsvn_ra_neon/props.c Sun Aug 1 17:46:05 2010
@@ -1031,36 +1031,22 @@ svn_error_t *svn_ra_neon__get_baseline_i
}
-/* Helper function for svn_ra_neon__do_proppatch() below. */
-static void
-append_setprop(svn_stringbuf_t *body,
- const char *name,
- const svn_string_t *value,
- apr_pool_t *pool)
+/* Helper function for append_setprop() below. */
+static svn_error_t *
+get_encoding_and_cdata(const char **encoding_p,
+ const char **cdata_p,
+ const svn_string_t *value,
+ apr_pool_t *pool)
{
- const char *encoding = "";
+ const char *encoding;
const char *xml_safe;
- const char *xml_tag_name;
- /* Map property names to namespaces */
-#define NSLEN (sizeof(SVN_PROP_PREFIX) - 1)
- if (strncmp(name, SVN_PROP_PREFIX, NSLEN) == 0)
- {
- xml_tag_name = apr_pstrcat(pool, "S:", name + NSLEN, NULL);
- }
-#undef NSLEN
- else
+ /* Easy out. */
+ if (value == NULL)
{
- xml_tag_name = apr_pstrcat(pool, "C:", name, NULL);
- }
-
- /* If there is no value, just generate an empty tag and get outta
- here. */
- if (! value)
- {
- svn_stringbuf_appendcstr(body,
- apr_psprintf(pool, "<%s />", xml_tag_name));
- return;
+ *encoding_p = "";
+ *cdata_p = "";
+ return SVN_NO_ERROR;
}
/* If a property is XML-safe, XML-encode it. Else, base64-encode
@@ -1070,6 +1056,7 @@ append_setprop(svn_stringbuf_t *body,
svn_stringbuf_t *xml_esc = NULL;
svn_xml_escape_cdata_string(&xml_esc, value, pool);
xml_safe = xml_esc->data;
+ encoding = "";
}
else
{
@@ -1079,11 +1066,41 @@ append_setprop(svn_stringbuf_t *body,
xml_safe = base64ed->data;
}
+ *encoding_p = encoding;
+ *cdata_p = xml_safe;
+ return SVN_NO_ERROR;
+}
+
+/* Helper function for svn_ra_neon__do_proppatch() below. */
+static svn_error_t *
+append_setprop(svn_stringbuf_t *body,
+ const char *name,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ const char *encoding;
+ const char *xml_safe;
+ const char *xml_tag_name;
+
+ /* Map property names to namespaces */
+#define NSLEN (sizeof(SVN_PROP_PREFIX) - 1)
+ if (strncmp(name, SVN_PROP_PREFIX, NSLEN) == 0)
+ {
+ xml_tag_name = apr_pstrcat(pool, "S:", name + NSLEN, NULL);
+ }
+#undef NSLEN
+ else
+ {
+ xml_tag_name = apr_pstrcat(pool, "C:", name, NULL);
+ }
+
+ SVN_ERR(get_encoding_and_cdata(&encoding, &xml_safe, value, pool));
+
svn_stringbuf_appendcstr(body,
apr_psprintf(pool,"<%s %s>%s</%s>",
xml_tag_name, encoding,
xml_safe, xml_tag_name));
- return;
+ return SVN_NO_ERROR;
}
@@ -1124,7 +1141,7 @@ svn_ra_neon__do_proppatch(svn_ra_neon__s
void *val;
svn_pool_clear(subpool);
apr_hash_this(hi, &key, NULL, &val);
- append_setprop(body, key, val, subpool);
+ SVN_ERR(append_setprop(body, key, val, subpool));
}
svn_stringbuf_appendcstr(body, "</D:prop></D:set>");
}
@@ -1138,7 +1155,7 @@ svn_ra_neon__do_proppatch(svn_ra_neon__s
{
const char *name = APR_ARRAY_IDX(prop_deletes, n, const char *);
svn_pool_clear(subpool);
- append_setprop(body, name, NULL, subpool);
+ SVN_ERR(append_setprop(body, name, NULL, subpool));
}
svn_stringbuf_appendcstr(body, "</D:prop></D:remove>");
}
Modified: subversion/trunk/subversion/libsvn_ra_serf/commit.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/commit.c?rev=981275&r1=981274&r2=981275&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/commit.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/commit.c Sun Aug 1 17:46:05 2010
@@ -633,6 +633,46 @@ checkout_file(file_context_t *file)
return SVN_NO_ERROR;
}
+/* Helper function for proppatch_walker() below. */
+static svn_error_t *
+get_encoding_and_cdata(const char **encoding_p,
+ serf_bucket_t **cdata_bkt_p,
+ serf_bucket_alloc_t *alloc,
+ const svn_string_t *value,
+ apr_pool_t *pool)
+{
+ const char *encoding;
+ const char *cdata;
+ apr_size_t len; /* of cdata */
+
+ SVN_ERR_ASSERT(value);
+
+ /* If a property is XML-safe, XML-encode it. Else, base64-encode
+ it. */
+ if (svn_xml_is_xml_safe(value->data, value->len))
+ {
+ svn_stringbuf_t *xml_esc = NULL;
+ svn_xml_escape_cdata_string(&xml_esc, value, pool);
+ encoding = NULL;
+ cdata = xml_esc->data;
+ len = xml_esc->len;
+ }
+ else
+ {
+ const svn_string_t *base64ed = svn_base64_encode_string2(value, TRUE,
+ pool);
+ encoding = "base64";
+ cdata = base64ed->data;
+ len = base64ed->len;
+ }
+
+ /* ENCODING, CDATA, and LEN are now set. */
+
+ *encoding_p = encoding;
+ *cdata_bkt_p = SERF_BUCKET_SIMPLE_STRING_LEN(cdata, len, alloc);
+ return SVN_NO_ERROR;
+}
+
static svn_error_t *
proppatch_walker(void *baton,
const char *ns, apr_ssize_t ns_len,
@@ -641,15 +681,11 @@ proppatch_walker(void *baton,
apr_pool_t *pool)
{
serf_bucket_t *body_bkt = baton;
+ serf_bucket_t *cdata_bkt;
serf_bucket_alloc_t *alloc;
- svn_boolean_t binary_prop;
+ const char *encoding;
char *prop_name;
- if (svn_xml_is_xml_safe(val->data, val->len))
- binary_prop = FALSE;
- else
- binary_prop = TRUE;
-
/* Use the namespace prefix instead of adding the xmlns attribute to support
property names containing ':' */
if (strcmp(ns, SVN_DAV_PROP_NS_SVN) == 0)
@@ -660,24 +696,14 @@ proppatch_walker(void *baton,
alloc = body_bkt->allocator;
+ SVN_ERR(get_encoding_and_cdata(&encoding, &cdata_bkt, alloc, val, pool));
+
svn_ra_serf__add_open_tag_buckets(body_bkt, alloc, prop_name,
- "V:encoding", binary_prop ? "base64" : NULL,
+ "V:encoding", encoding,
NULL);
-
- if (binary_prop)
- {
- serf_bucket_t *tmp_bkt;
- val = svn_base64_encode_string2(val, TRUE, pool);
- tmp_bkt = SERF_BUCKET_SIMPLE_STRING_LEN(val->data, val->len, alloc);
- serf_bucket_aggregate_append(body_bkt, tmp_bkt);
- }
- else
- {
- svn_ra_serf__add_cdata_len_buckets(body_bkt, alloc, val->data, val->len);
- }
-
-
+ serf_bucket_aggregate_append(body_bkt, cdata_bkt);
svn_ra_serf__add_close_tag_buckets(body_bkt, alloc, prop_name);
+
return SVN_NO_ERROR;
}