All pastes #815561 Raw Edit

Untitled

public text v1 · immutable
·published 2007-12-14 04:10 UTC
rendered paste body
[[[
Follow up to r28251: transmit the new include_descendents boolean over DAV.

* subversion/include/private/svn_dav_protocol.h
  (SVN_DAV__INCLUDE_DESCENDENTS): New child element.

* subversion/mod_dav_svn/reports/mergeinfo.c
  (dav_svn__get_mergeinfo_report): Read "include-descendents", pass
    along the resulting value to svn_repos_fs_get_mergeinfo().

* subversion/libsvn_ra_serf/mergeinfo.c
  (struct mergeinfo_context_t): New include_descendents member.
  (svn_ra_serf__get_mergeinfo): Set include_descendents in mergeinfo_ctx.
  (create_mergeinfo_body): Add include_descendents element iff
    mergeinfo_ctx->include_descendents is true.

* subversion/libsvn_ra_neon/mergeinfo.c
  (svn_ra_neon__get_mergeinfo): Send include_descendents.
]]]

Index: subversion/include/private/svn_dav_protocol.h
===================================================================
--- subversion/include/private/svn_dav_protocol.h	(revision 28474)
+++ subversion/include/private/svn_dav_protocol.h	(working copy)
@@ -38,6 +38,7 @@
 #define SVN_DAV__PATH "path"
 #define SVN_DAV__INHERIT "inherit"
 #define SVN_DAV__REVISION "revision"
+#define SVN_DAV__INCLUDE_DESCENDENTS "include-descendents"
 #define SVN_DAV__VERSION_NAME "version-name"
 
 #ifdef __cplusplus
Index: subversion/libsvn_ra_serf/mergeinfo.c
===================================================================
--- subversion/libsvn_ra_serf/mergeinfo.c	(revision 28474)
+++ subversion/libsvn_ra_serf/mergeinfo.c	(working copy)
@@ -57,6 +57,7 @@
   const apr_array_header_t *paths;
   svn_revnum_t revision;
   svn_mergeinfo_inheritance_t inherit;
+  svn_boolean_t include_descendents;
 } mergeinfo_context_t;
 
 static svn_error_t *
@@ -191,6 +192,13 @@
   svn_ra_serf__add_tag_buckets(body_bkt, "S:" SVN_DAV__INHERIT,
                                svn_inheritance_to_word(mergeinfo_ctx->inherit),
                                alloc);
+  if (mergeinfo_ctx->include_descendents)
+    {
+      svn_ra_serf__add_tag_buckets(body_bkt, "S:"
+                                   SVN_DAV__INCLUDE_DESCENDENTS,
+                                   "yes", alloc);
+    }
+
   if (mergeinfo_ctx->paths)
     {
       for (i = 0; i < mergeinfo_ctx->paths->nelts; i++)
@@ -221,7 +229,7 @@
                            const apr_array_header_t *paths,
                            svn_revnum_t revision,
                            svn_mergeinfo_inheritance_t inherit,
-                           svn_boolean_t include_descendents, /*### TODO(reint): implement*/
+                           svn_boolean_t include_descendents,
                            apr_pool_t *pool)
 {
   svn_error_t *err;
@@ -248,6 +256,7 @@
   mergeinfo_ctx->paths = paths;
   mergeinfo_ctx->revision = revision;
   mergeinfo_ctx->inherit = inherit;
+  mergeinfo_ctx->include_descendents = include_descendents;
 
   handler = apr_pcalloc(pool, sizeof(*handler));
 
Index: subversion/libsvn_ra_neon/mergeinfo.c
===================================================================
--- subversion/libsvn_ra_neon/mergeinfo.c	(revision 28474)
+++ subversion/libsvn_ra_neon/mergeinfo.c	(working copy)
@@ -157,7 +157,7 @@
                            const apr_array_header_t *paths,
                            svn_revnum_t revision,
                            svn_mergeinfo_inheritance_t inherit,
-                           svn_boolean_t include_descendents, /*### TODO(reint): implement*/
+                           svn_boolean_t include_descendents,
                            apr_pool_t *pool)
 {
   int i, status_code;
@@ -185,6 +185,16 @@
                                         "<S:inherit>%s"
                                         "</S:inherit>",
                                         svn_inheritance_to_word(inherit)));
+
+  if (include_descendents)
+    {
+      /* Send it only if true; server will default to "no". */
+      svn_stringbuf_appendcstr(request_body,
+                               apr_pstrdup(pool,
+                                           "<S:include-descendents>yes"
+                                           "</S:include-descendents>"));
+    }
+
   if (paths)
     {
       for (i = 0; i < paths->nelts; i++)
Index: subversion/mod_dav_svn/reports/mergeinfo.c
===================================================================
--- subversion/mod_dav_svn/reports/mergeinfo.c	(revision 28474)
+++ subversion/mod_dav_svn/reports/mergeinfo.c	(working copy)
@@ -45,6 +45,7 @@
   dav_error *derr = NULL;
   apr_xml_elem *child;
   apr_hash_t *mergeinfo;
+  svn_boolean_t include_descendents = FALSE;
   dav_svn__authz_read_baton arb;
   const dav_svn_repos *repos = resource->info->repos;
   const char *action;
@@ -93,6 +94,14 @@
                                  resource->pool);
           (*((const char **)(apr_array_push(paths)))) = target;
         }
+      else if (strcmp(child->name, SVN_DAV__INCLUDE_DESCENDENTS) == 0)
+        {
+          const char *word = dav_xml_get_cdata(child, resource->pool, 1);
+          if (strcmp(word, "yes") == 0)
+            include_descendents = TRUE;
+          /* Else the client isn't supposed to send anyway, so just
+             leave it false. */
+        }
       /* else unknown element; skip it */
     }
 
@@ -104,7 +113,7 @@
   bb = apr_brigade_create(resource->pool, output->c->bucket_alloc);
 
   serr = svn_repos_fs_get_mergeinfo(&mergeinfo, repos->repos, paths, rev,
-                                    inherit, FALSE, /* ### TODO(reint): get from client */
+                                    inherit, include_descendents,
                                     dav_svn__authz_read_func(&arb),
                                     &arb, resource->pool);
   if (serr)