You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by iv...@apache.org on 2010/06/13 15:21:41 UTC

svn commit: r954219 - /subversion/trunk/subversion/libsvn_ra_serf/log.c

Author: ivan
Date: Sun Jun 13 13:21:41 2010
New Revision: 954219

URL: http://svn.apache.org/viewvc?rev=954219&view=rev
Log:
Create request log report body buckets on demand.

* subversion/libsvn_ra_serf/log.c
  (log_context_t): Add members to access more parameters set by our callers.
  (create_log_body): New function. Mostly extracted from 
   svn_ra_serf__get_log().
  (svn_ra_serf__get_log): Copy parameters to log_ctx and setup 
   create body delegate.

Modified:
    subversion/trunk/subversion/libsvn_ra_serf/log.c

Modified: subversion/trunk/subversion/libsvn_ra_serf/log.c
URL: http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_ra_serf/log.c?rev=954219&r1=954218&r2=954219&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_ra_serf/log.c (original)
+++ subversion/trunk/subversion/libsvn_ra_serf/log.c Sun Jun 13 13:21:41 2010
@@ -86,10 +86,16 @@ typedef struct {
   apr_pool_t *pool;
 
   /* parameters set by our caller */
+  const apr_array_header_t *paths;
+  svn_revnum_t start;
+  svn_revnum_t end;
   int limit;
+  svn_boolean_t changed_paths;
+  svn_boolean_t strict_node_history;
+  svn_boolean_t include_merged_revisions;
+  const apr_array_header_t *revprops;
   int nest_level; /* used to track mergeinfo nesting levels */
   int count; /* only incremented when nest_level == 0 */
-  svn_boolean_t changed_paths;
 
   /* are we done? */
   svn_boolean_t done;
@@ -453,80 +459,137 @@ cdata_log(svn_ra_serf__xml_parser_t *par
   return SVN_NO_ERROR;
 }
 
-svn_error_t *
-svn_ra_serf__get_log(svn_ra_session_t *ra_session,
-                     const apr_array_header_t *paths,
-                     svn_revnum_t start,
-                     svn_revnum_t end,
-                     int limit,
-                     svn_boolean_t discover_changed_paths,
-                     svn_boolean_t strict_node_history,
-                     svn_boolean_t include_merged_revisions,
-                     const apr_array_header_t *revprops,
-                     svn_log_entry_receiver_t receiver,
-                     void *receiver_baton,
-                     apr_pool_t *pool)
+static serf_bucket_t *
+create_log_body(void *baton,
+                serf_bucket_alloc_t *alloc,
+                apr_pool_t *pool)
 {
-  log_context_t *log_ctx;
-  svn_ra_serf__session_t *session = ra_session->priv;
-  svn_ra_serf__handler_t *handler;
-  svn_ra_serf__xml_parser_t *parser_ctx;
   serf_bucket_t *buckets;
-  svn_boolean_t want_custom_revprops;
-  svn_revnum_t peg_rev;
-  const char *relative_url, *basecoll_url, *req_url;
+  log_context_t *log_ctx = baton;
 
-  log_ctx = apr_pcalloc(pool, sizeof(*log_ctx));
-  log_ctx->pool = pool;
-  log_ctx->receiver = receiver;
-  log_ctx->receiver_baton = receiver_baton;
-  log_ctx->limit = limit;
-  log_ctx->nest_level = 0;
-  log_ctx->changed_paths = discover_changed_paths;
-  log_ctx->done = FALSE;
+  buckets = serf_bucket_aggregate_create(alloc);
 
-  buckets = serf_bucket_aggregate_create(session->bkt_alloc);
-
-  svn_ra_serf__add_open_tag_buckets(buckets, session->bkt_alloc,
+  svn_ra_serf__add_open_tag_buckets(buckets, alloc,
                                     "S:log-report",
                                     "xmlns:S", SVN_XML_NAMESPACE,
                                     NULL);
 
   svn_ra_serf__add_tag_buckets(buckets,
-                               "S:start-revision", apr_ltoa(pool, start),
-                               session->bkt_alloc);
+                               "S:start-revision",
+                               apr_ltoa(pool, log_ctx->start),
+                               alloc);
   svn_ra_serf__add_tag_buckets(buckets,
-                               "S:end-revision", apr_ltoa(pool, end),
-                               session->bkt_alloc);
+                               "S:end-revision",
+                               apr_ltoa(pool, log_ctx->end),
+                               alloc);
 
-  if (limit)
+  if (log_ctx->limit)
     {
       svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:limit", apr_ltoa(pool, limit),
-                                   session->bkt_alloc);
+                                   "S:limit", apr_ltoa(pool, log_ctx->limit),
+                                   alloc);
     }
 
-  if (discover_changed_paths)
+  if (log_ctx->changed_paths)
     {
       svn_ra_serf__add_tag_buckets(buckets,
                                    "S:discover-changed-paths", NULL,
-                                   session->bkt_alloc);
+                                   alloc);
     }
 
-  if (strict_node_history)
+  if (log_ctx->strict_node_history)
     {
       svn_ra_serf__add_tag_buckets(buckets,
                                    "S:strict-node-history", NULL,
-                                   session->bkt_alloc);
+                                   alloc);
     }
 
-  if (include_merged_revisions)
+  if (log_ctx->include_merged_revisions)
     {
       svn_ra_serf__add_tag_buckets(buckets,
                                    "S:include-merged-revisions", NULL,
-                                   session->bkt_alloc);
+                                   alloc);
     }
 
+  if (log_ctx->revprops)
+    {
+      int i;
+      for (i = 0; i < log_ctx->revprops->nelts; i++)
+        {
+          char *name = APR_ARRAY_IDX(log_ctx->revprops, i, char *);
+          svn_ra_serf__add_tag_buckets(buckets,
+                                       "S:revprop", name,
+                                       alloc);
+        }
+      if (log_ctx->revprops->nelts == 0)
+        {
+          svn_ra_serf__add_tag_buckets(buckets,
+                                       "S:no-revprops", NULL,
+                                       alloc);
+        }
+    }
+  else
+    {
+      svn_ra_serf__add_tag_buckets(buckets,
+                                   "S:all-revprops", NULL,
+                                   alloc);
+    }
+
+  if (log_ctx->paths)
+    {
+      int i;
+      for (i = 0; i < log_ctx->paths->nelts; i++)
+        {
+          svn_ra_serf__add_tag_buckets(buckets,
+                                       "S:path", APR_ARRAY_IDX(log_ctx->paths, i,
+                                                               const char*),
+                                       alloc);
+        }
+    }
+
+  svn_ra_serf__add_close_tag_buckets(buckets, alloc,
+                                     "S:log-report");
+
+  return buckets;
+}
+
+svn_error_t *
+svn_ra_serf__get_log(svn_ra_session_t *ra_session,
+                     const apr_array_header_t *paths,
+                     svn_revnum_t start,
+                     svn_revnum_t end,
+                     int limit,
+                     svn_boolean_t discover_changed_paths,
+                     svn_boolean_t strict_node_history,
+                     svn_boolean_t include_merged_revisions,
+                     const apr_array_header_t *revprops,
+                     svn_log_entry_receiver_t receiver,
+                     void *receiver_baton,
+                     apr_pool_t *pool)
+{
+  log_context_t *log_ctx;
+  svn_ra_serf__session_t *session = ra_session->priv;
+  svn_ra_serf__handler_t *handler;
+  svn_ra_serf__xml_parser_t *parser_ctx;
+  svn_boolean_t want_custom_revprops;
+  svn_revnum_t peg_rev;
+  const char *relative_url, *basecoll_url, *req_url;
+
+  log_ctx = apr_pcalloc(pool, sizeof(*log_ctx));
+  log_ctx->pool = pool;
+  log_ctx->receiver = receiver;
+  log_ctx->receiver_baton = receiver_baton;
+  log_ctx->paths = paths;
+  log_ctx->start = start;
+  log_ctx->end = end;
+  log_ctx->limit = limit;
+  log_ctx->changed_paths = discover_changed_paths;
+  log_ctx->strict_node_history = strict_node_history;
+  log_ctx->include_merged_revisions = include_merged_revisions;
+  log_ctx->revprops = revprops;
+  log_ctx->nest_level = 0;
+  log_ctx->done = FALSE;
+
   want_custom_revprops = FALSE;
   if (revprops)
     {
@@ -534,9 +597,6 @@ svn_ra_serf__get_log(svn_ra_session_t *r
       for (i = 0; i < revprops->nelts; i++)
         {
           char *name = APR_ARRAY_IDX(revprops, i, char *);
-          svn_ra_serf__add_tag_buckets(buckets,
-                                       "S:revprop", name,
-                                       session->bkt_alloc);
           if (strcmp(name, SVN_PROP_REVISION_AUTHOR) == 0)
             log_ctx->want_author = TRUE;
           else if (strcmp(name, SVN_PROP_REVISION_DATE) == 0)
@@ -546,18 +606,9 @@ svn_ra_serf__get_log(svn_ra_session_t *r
           else
             want_custom_revprops = TRUE;
         }
-      if (revprops->nelts == 0)
-        {
-          svn_ra_serf__add_tag_buckets(buckets,
-                                       "S:no-revprops", NULL,
-                                       session->bkt_alloc);
-        }
     }
   else
     {
-      svn_ra_serf__add_tag_buckets(buckets,
-                                   "S:all-revprops", NULL,
-                                   session->bkt_alloc);
       log_ctx->want_author = log_ctx->want_date = log_ctx->want_message = TRUE;
       want_custom_revprops = TRUE;
     }
@@ -572,21 +623,6 @@ svn_ra_serf__get_log(svn_ra_session_t *r
                                 _("Server does not support custom revprops"
                                   " via log"));
     }
-
-  if (paths)
-    {
-      int i;
-      for (i = 0; i < paths->nelts; i++)
-        {
-          svn_ra_serf__add_tag_buckets(buckets,
-                                       "S:path", APR_ARRAY_IDX(paths, i,
-                                                               const char*),
-                                       session->bkt_alloc);
-        }
-    }
-
-  svn_ra_serf__add_close_tag_buckets(buckets, session->bkt_alloc,
-                                     "S:log-report");
   /* At this point, we may have a deleted file.  So, we'll match ra_neon's
    * behavior and use the larger of start or end as our 'peg' rev.
    */
@@ -601,7 +637,8 @@ svn_ra_serf__get_log(svn_ra_session_t *r
 
   handler->method = "REPORT";
   handler->path = req_url;
-  handler->body_buckets = buckets;
+  handler->body_delegate = create_log_body;
+  handler->body_delegate_baton = log_ctx;
   handler->body_type = "text/xml";
   handler->conn = session->conns[0];
   handler->session = session;