You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by pr...@apache.org on 2013/04/08 13:47:04 UTC

svn commit: r1465596 [2/5] - in /subversion/branches/verify-keep-going: ./ contrib/server-side/svncutter/ subversion/bindings/cxxhl/include/ subversion/bindings/cxxhl/include/svncxxhl/ subversion/bindings/cxxhl/src/ subversion/bindings/cxxhl/tests/ sub...

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/copy_foreign.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/copy_foreign.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/copy_foreign.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/copy_foreign.c Mon Apr  8 11:47:02 2013
@@ -428,10 +428,10 @@ copy_foreign_dir(svn_ra_session_t *ra_se
                                             &wrapped_editor, &wrapped_baton,
                                             scratch_pool));
 
-  SVN_ERR(svn_ra_do_update2(ra_session, &reporter, &reporter_baton,
+  SVN_ERR(svn_ra_do_update3(ra_session, &reporter, &reporter_baton,
                             location->rev, "", svn_depth_infinity,
-                            FALSE, wrapped_editor, wrapped_baton,
-                            scratch_pool));
+                            FALSE, FALSE, wrapped_editor, wrapped_baton,
+                            scratch_pool, scratch_pool));
 
   SVN_ERR(reporter->set_path(reporter_baton, "", location->rev, depth,
                              TRUE /* incomplete */,

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/delete.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/delete.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/delete.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/delete.c Mon Apr  8 11:47:02 2013
@@ -99,26 +99,23 @@ find_undeletables(void *baton,
   return SVN_NO_ERROR;
 }
 
-/* Verify that the path can be deleted without losing stuff,
-   i.e. ensure that there are no modified or unversioned resources
-   under PATH.  This is similar to checking the output of the status
-   command.  CTX is used for the client's config options.  POOL is
-   used for all temporary allocations. */
+/* Check whether LOCAL_ABSPATH is an external and raise an error if it is.
+  
+   A file external should not be deleted since the file external is
+   implemented as a switched file and it would delete the file the
+   file external is switched to, which is not the behavior the user
+   would probably want.
+   
+   A directory external should not be deleted since it is the root
+   of a different working copy. */
 static svn_error_t *
-can_delete_node(svn_boolean_t *target_missing,
-                const char *local_abspath,
-                svn_client_ctx_t *ctx,
-                apr_pool_t *scratch_pool)
+check_external(const char *local_abspath,
+               svn_client_ctx_t *ctx,
+               apr_pool_t *scratch_pool)
 {
   svn_node_kind_t external_kind;
   const char *defining_abspath;
-  apr_array_header_t *ignores;
-  struct can_delete_baton_t cdt;
 
-  /* A file external should not be deleted since the file external is
-     implemented as a switched file and it would delete the file the
-     file external is switched to, which is not the behavior the user
-     would probably want. */
   SVN_ERR(svn_wc__read_external_info(&external_kind, &defining_abspath, NULL,
                                      NULL, NULL,
                                      ctx->wc_ctx, local_abspath,
@@ -135,6 +132,22 @@ can_delete_node(svn_boolean_t *target_mi
                              svn_dirent_local_style(defining_abspath,
                                                     scratch_pool));
 
+  return SVN_NO_ERROR;
+}
+
+/* Verify that the path can be deleted without losing stuff,
+   i.e. ensure that there are no modified or unversioned resources
+   under PATH.  This is similar to checking the output of the status
+   command.  CTX is used for the client's config options.  POOL is
+   used for all temporary allocations. */
+static svn_error_t *
+can_delete_node(svn_boolean_t *target_missing,
+                const char *local_abspath,
+                svn_client_ctx_t *ctx,
+                apr_pool_t *scratch_pool)
+{
+  apr_array_header_t *ignores;
+  struct can_delete_baton_t cdt;
 
   /* Use an infinite-depth status check to see if there's anything in
      or under PATH which would make it unsafe for deletion.  The
@@ -409,6 +422,8 @@ svn_client__wc_delete(const char *local_
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
+  SVN_ERR(check_external(local_abspath, ctx, pool));
+
   if (!force && !keep_local)
     /* Verify that there are no "awkward" files */
     SVN_ERR(can_delete_node(&target_missing, local_abspath, ctx, pool));
@@ -444,6 +459,8 @@ svn_client__wc_delete_many(const apr_arr
 
       SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
 
+      SVN_ERR(check_external(local_abspath, ctx, pool));
+
       if (!force && !keep_local)
         {
           svn_boolean_t missing;

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/export.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/export.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/export.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/export.c Mon Apr  8 11:47:02 2013
@@ -1306,13 +1306,15 @@ export_directory(const char *from_path_o
                            scratch_pool, scratch_pool));
 
   /* Manufacture a basic 'report' to the update reporter. */
-  SVN_ERR(svn_ra_do_update2(ra_session,
+  SVN_ERR(svn_ra_do_update3(ra_session,
                             &reporter, &report_baton,
                             loc->rev,
                             "", /* no sub-target */
                             depth,
                             FALSE, /* don't want copyfrom-args */
-                            export_editor, edit_baton, scratch_pool));
+                            FALSE, /* don't want ignore_ancestry */
+                            export_editor, edit_baton,
+                            scratch_pool, scratch_pool));
 
   SVN_ERR(reporter->set_path(report_baton, "", loc->rev,
                              /* Depth is irrelevant, as we're

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/merge.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/merge.c Mon Apr  8 11:47:02 2013
@@ -11885,14 +11885,6 @@ typedef struct source_and_target_t
   svn_ra_session_t *target_ra_session;
   branch_history_t target_branch;
 
-  /* The complete mergeinfo on SOURCE.
-     That is, the explicit or inherited mergeinfo.  */
-  svn_mergeinfo_t source_mergeinfo;
-
-  /* The complete mergeinfo on (the current, working version of) TARGET.
-     That is, the explicit or inherited mergeinfo. */
-  svn_mergeinfo_t target_mergeinfo;
-
   /* Repos location of the youngest common ancestor of SOURCE and TARGET. */
   svn_client__pathrev_t *yca;
 } source_and_target_t;
@@ -11968,17 +11960,85 @@ branch_history_get_endpoints(svn_client_
   return SVN_NO_ERROR;
 }
 
+/* Implements the svn_log_entry_receiver_t interface.
+
+  Set *BATON to LOG_ENTRY->revision and return SVN_ERR_CEASE_INVOCATION. */
+static svn_error_t *
+operative_rev_receiver(void *baton,
+                       svn_log_entry_t *log_entry,
+                       apr_pool_t *pool)
+{
+  svn_revnum_t *operative_rev = baton;
+
+  *operative_rev = log_entry->revision;
+
+  /* We've found the youngest merged or oldest eligible revision, so
+     we're done. */
+  return svn_error_create(SVN_ERR_CEASE_INVOCATION, NULL, NULL);
+}
+
+/* Wrapper around svn_client_mergeinfo_log2. All arguments are as per
+   that API.  The discover_changed_paths, depth, and revprops args to
+   svn_client_mergeinfo_log2 are always TRUE, svn_depth_infinity_t,
+   and NULL respectively.
+
+   If RECEIVER raises a SVN_ERR_CEASE_INVOCATION error, but still sets
+   *REVISION to a valid revnum, then clear the error.  Otherwise return
+   any error. */
+static svn_error_t*
+short_circuit_mergeinfo_log(svn_boolean_t finding_merged,
+                            const char *target_path_or_url,
+                            const svn_opt_revision_t *target_peg_revision,
+                            const char *source_path_or_url,
+                            const svn_opt_revision_t *source_peg_revision,
+                            const svn_opt_revision_t *source_start_revision,
+                            const svn_opt_revision_t *source_end_revision,
+                            svn_log_entry_receiver_t receiver,
+                            svn_revnum_t *revision,
+                            svn_client_ctx_t *ctx,
+                            apr_pool_t *scratch_pool)
+{
+  svn_error_t *err = svn_client_mergeinfo_log2(finding_merged,
+                                               target_path_or_url,
+                                               target_peg_revision,
+                                               source_path_or_url,
+                                               source_peg_revision,
+                                               source_start_revision,
+                                               source_end_revision,
+                                               receiver, revision,
+                                               TRUE, svn_depth_infinity,
+                                               NULL, ctx, scratch_pool);
+
+  if (err)
+    {
+      /* We expect RECEIVER to short-circuit the (potentially expensive) log
+         by raising an SVN_ERR_CEASE_INVOCATION -- see operative_rev_receiver.
+         So we can ignore that error, but only as long as we actually found a
+         valid revision. */
+      if (SVN_IS_VALID_REVNUM(*revision)
+          && err->apr_err == SVN_ERR_CEASE_INVOCATION)
+        {
+          svn_error_clear(err);
+          err = NULL;
+        }
+      else
+        {
+          return svn_error_trace(err);
+        }
+    }
+  return SVN_NO_ERROR;
+}
+
 /* Set *BASE_P to the last location on SOURCE_BRANCH such that all changes
  * on SOURCE_BRANCH after YCA up to and including *BASE_P have already
- * been merged into the target branch -- or, specifically, are recorded in
- * TARGET_MERGEINFO.
+ * been fully merged into TARGET.
  *
  *               *BASE_P       TIP
  *          o-------o-----------o--- SOURCE_BRANCH
  *         /         \
  *   -----o     prev. \
  *     YCA \    merges \
- *          o-----------o-----------
+ *          o-----------o----------- TARGET branch
  *
  * In terms of mergeinfo:
  *
@@ -11988,7 +12048,10 @@ branch_history_get_endpoints(svn_client_
  *
  *     Eligible -.eee.eeeeeeeeeeeeeeeeeeee   .=not a source branch location
  *
- *     Tgt-mi   -.mmm.mm-mm-------m-------   m=merged, -=not merged
+ *     Tgt-mi   -.mmm.mm-mm-------m-------   m=merged to root of TARGET or
+ *                                           subtree of TARGET with no
+ *                                           operative changes outside of that
+ *                                           subtree, -=not merged
  *
  *     Eligible -.---.--e--eeeeeee-eeeeeee
  *
@@ -11999,90 +12062,84 @@ branch_history_get_endpoints(svn_client_
  *         YCA \    merges \
  *              o-----------o-------------
  *
- * If no locations on SOURCE_BRANCH are recorded in TARGET_MERGEINFO, set
- * *BASE_P to the YCA.
+ * If no revisions from SOURCE_BRANCH have been completely merged to TARGET,
+ * then set *BASE_P to the YCA.
  */
 static svn_error_t *
 find_last_merged_location(svn_client__pathrev_t **base_p,
                           svn_client__pathrev_t *yca,
                           const branch_history_t *source_branch,
-                          svn_mergeinfo_t target_mergeinfo,
+                          svn_client__pathrev_t *target,
                           svn_client_ctx_t *ctx,
                           apr_pool_t *result_pool,
                           apr_pool_t *scratch_pool)
 {
-  /*
-   To find the youngest location on BRANCH_A that is fully merged to BRANCH_B:
-
-     Find the longest set of locations in BRANCH_A, starting after YCA,
-     such that each location is (any of):
-       (a) in BRANCH_B's mergeinfo; or
-       (b) a merge onto BRANCH_A of logical changes that are all from the
-           target branch or already in BRANCH_B's mergeinfo; or
-       (c) inoperative on BRANCH_A.
-
-     Report the youngest such location, or the YCA if there are none.
-
-     Part (b) can perhaps, initially, be simplified to something like:
-     a merge onto BRANCH_A of (including? entirely?) revisions from
-     BRANCH_B's history.
-
-     Part (c) is only necessary if we want to allow sparse mergeinfo --
-     that is, if we don't want to do some partially- or completely-
-     inoperative merges to fill in mergeinfo gaps.
-   */
-  branch_history_t *eligible_locations;
+  svn_opt_revision_t source_peg_rev, source_start_rev, source_end_rev,
+    target_opt_rev;
+  svn_revnum_t youngest_merged_rev = SVN_INVALID_REVNUM;
+
+  source_peg_rev.kind = svn_opt_revision_number;
+  source_peg_rev.value.number = source_branch->tip->rev;
+  source_start_rev.kind = svn_opt_revision_number;
+  source_start_rev.value.number = yca->rev;
+  source_end_rev.kind = svn_opt_revision_number;
+  source_end_rev.value.number = source_branch->tip->rev;
+  target_opt_rev.kind = svn_opt_revision_number;
+  target_opt_rev.value.number = target->rev;
+
+  /* Find the youngest revision fully merged from SOURCE_BRANCH to TARGET,
+     if such a revision exists. */
+  SVN_ERR(short_circuit_mergeinfo_log(TRUE, /* Find merged */
+                                      target->url, &target_opt_rev,
+                                      source_branch->tip->url,
+                                      &source_peg_rev,
+                                      &source_end_rev, &source_start_rev,
+                                      operative_rev_receiver,
+                                      &youngest_merged_rev,
+                                      ctx, scratch_pool));
 
-  /* Start with a list of all source locations after YCA up to the tip. */
-  SVN_ERR(branch_history_intersect_range(
-            &eligible_locations,
-            source_branch, yca->rev + 1, source_branch->tip->rev,
-            scratch_pool, scratch_pool));
-
-  /* Remove any locations that match (a), (b) or (c). */
-  /* For (a), remove any locations that are in TARGET's mergeinfo. */
-  SVN_ERR(svn_mergeinfo_remove2(&eligible_locations->history,
-                                target_mergeinfo, eligible_locations->history,
-                                TRUE, scratch_pool, scratch_pool));
-  /* For (b) ... */
-
-  /* For (c) ... */
-
-  /* This leaves a list of source locations that are eligible to merge.
-     The location that we want is the source location just before oldest
-     eligible location remaining in this list; or the youngest source
-     location if there are none left in this list. */
-  if (apr_hash_count(eligible_locations->history) > 0)
+  if (!SVN_IS_VALID_REVNUM(youngest_merged_rev))
     {
-      /* Find the oldest eligible rev.
-       * Eligible -.---.--e--eeeeeee-eeeeeee
-       *                  ^
-       *                  BASE is just before here.
-       */
-
-      svn_client__pathrev_t *oldest_eligible;
+      /* No revisions have been completely merged from SOURCE_BRANCH to
+         TARGET so the base for the next merge is the YCA. */
+      *base_p = yca;
+    }
+  else
+    {
+      /* One or more revisions have already been completely merged from
+         SOURCE_BRANCH to TARGET, now find the oldest revision which is
+         still eligible to be merged, if such exists. */
       branch_history_t *contiguous_source;
+      svn_revnum_t base_rev;
+      svn_revnum_t oldest_eligible_rev = SVN_INVALID_REVNUM;
 
-      SVN_ERR(branch_history_get_endpoints(
-                &oldest_eligible, NULL,
-                eligible_locations, scratch_pool, scratch_pool));
+      SVN_ERR(short_circuit_mergeinfo_log(FALSE, /* Find eligible */
+                                          target->url, &target_opt_rev,
+                                          source_branch->tip->url,
+                                          &source_peg_rev,
+                                          &source_start_rev, &source_end_rev,
+                                          operative_rev_receiver,
+                                          &oldest_eligible_rev,
+                                          ctx, scratch_pool));
+
+      /* If there are revisions eligible for merging, use the oldest one
+         to calculate the base.  Otherwise there are no operative revisions
+         to merge and we can simple set the base to the youngest revision
+         already merged. */
+      if (SVN_IS_VALID_REVNUM(oldest_eligible_rev))
+        base_rev = oldest_eligible_rev - 1;
+      else
+        base_rev = youngest_merged_rev;
 
       /* Find the branch location just before the oldest eligible rev.
-       * (We can't just subtract 1 from the rev because the branch might
-       * have a gap there.) */
-      SVN_ERR(branch_history_intersect_range(
-                &contiguous_source,
-                source_branch, yca->rev, oldest_eligible->rev - 1,
-                scratch_pool, scratch_pool));
-      SVN_ERR(branch_history_get_endpoints(
-                NULL, base_p,
-                contiguous_source, result_pool, scratch_pool));
-    }
-  else
-    {
-      /* The whole source branch is merged already, so the base for
-       * the next merge is its tip. */
-      *base_p = source_branch->tip;
+         (We can't just use the base revs calculated above because the branch
+         might have a gap there.) */
+      SVN_ERR(branch_history_intersect_range(&contiguous_source,
+                                             source_branch, yca->rev,
+                                             base_rev,
+                                             scratch_pool, scratch_pool));
+      SVN_ERR(branch_history_get_endpoints(NULL, base_p, contiguous_source,
+                                           result_pool, scratch_pool));
     }
 
   return SVN_NO_ERROR;
@@ -12100,10 +12157,10 @@ find_last_merged_location(svn_client__pa
  *                                  S_T->target
  *
  * Set *BASE_P to BASE, the youngest location in the history of S_T->source
- * (at or after the YCA) at which all revisions up to BASE are recorded as
+ * (at or after the YCA) at which all revisions up to BASE are effectively
  * merged into S_T->target.
  *
- * If no locations on the history of S_T->source are recorded as merged to
+ * If no locations on the history of S_T->source are effectively merged to
  * S_T->target, set *BASE_P to the YCA.
  */
 static svn_error_t *
@@ -12116,7 +12173,7 @@ find_base_on_source(svn_client__pathrev_
   SVN_ERR(find_last_merged_location(base_p,
                                     s_t->yca,
                                     &s_t->source_branch,
-                                    s_t->target_mergeinfo,
+                                    s_t->target_branch.tip,
                                     ctx, result_pool, scratch_pool));
   return SVN_NO_ERROR;
 }
@@ -12133,10 +12190,10 @@ find_base_on_source(svn_client__pathrev_
  *                BASE              S_T->target
  *
  * Set *BASE_P to BASE, the youngest location in the history of S_T->target
- * (at or after the YCA) at which all revisions up to BASE are recorded as
+ * (at or after the YCA) at which all revisions up to BASE are effectively
  * merged into S_T->source.
  *
- * If no locations on the history of S_T->target are recorded as merged to
+ * If no locations on the history of S_T->target are effectively merged to
  * S_T->source, set *BASE_P to the YCA.
  */
 static svn_error_t *
@@ -12149,7 +12206,7 @@ find_base_on_target(svn_client__pathrev_
   SVN_ERR(find_last_merged_location(base_p,
                                     s_t->yca,
                                     &s_t->target_branch,
-                                    s_t->source_mergeinfo,
+                                    s_t->source,
                                     ctx, result_pool, scratch_pool));
 
   return SVN_NO_ERROR;
@@ -12167,32 +12224,6 @@ find_automatic_merge(svn_client__pathrev
 {
   svn_client__pathrev_t *base_on_source, *base_on_target;
 
-  /* Fetch mergeinfo of source branch (tip) and target branch (working). */
-  SVN_ERR(svn_client__get_repos_mergeinfo(&s_t->source_mergeinfo,
-                                          s_t->source_ra_session,
-                                          s_t->source->url,
-                                          s_t->source->rev,
-                                          svn_mergeinfo_inherited,
-                                          FALSE /* squelch_incapable */,
-                                          scratch_pool));
-  if (! s_t->target->abspath)
-    SVN_ERR(svn_client__get_repos_mergeinfo(&s_t->target_mergeinfo,
-                                            s_t->target_ra_session,
-                                            s_t->target->loc.url,
-                                            s_t->target->loc.rev,
-                                            svn_mergeinfo_inherited,
-                                            FALSE /* squelch_incapable */,
-                                            scratch_pool));
-  else
-    SVN_ERR(svn_client__get_wc_or_repos_mergeinfo(&s_t->target_mergeinfo,
-                                                  NULL /* inherited */,
-                                                  NULL /* from_repos */,
-                                                  FALSE /* repos_only */,
-                                                  svn_mergeinfo_inherited,
-                                                  s_t->target_ra_session,
-                                                  s_t->target->abspath,
-                                                  ctx, scratch_pool));
-
   /* Get the location-history of each branch. */
   s_t->source_branch.tip = s_t->source;
   SVN_ERR(svn_client__get_history_as_mergeinfo(

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/revert.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/revert.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/revert.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/revert.c Mon Apr  8 11:47:02 2013
@@ -183,18 +183,17 @@ svn_client_revert2(const apr_array_heade
 
  errorful:
 
-  if (!use_commit_times)
-    {
-      /* Sleep to ensure timestamp integrity. */
-      const char* sleep_path = NULL;
-
-      /* Only specify a path if we are certain all paths are on the
-         same filesystem */
-      if (paths->nelts == 1)
-        sleep_path = APR_ARRAY_IDX(paths, 0, const char *);
+  {
+    /* Sleep to ensure timestamp integrity. */
+    const char *sleep_path = NULL;
+
+    /* Only specify a path if we are certain all paths are on the
+       same filesystem */
+    if (paths->nelts == 1)
+      sleep_path = APR_ARRAY_IDX(paths, 0, const char *);
 
-      svn_io_sleep_for_timestamps(sleep_path, subpool);
-    }
+    svn_io_sleep_for_timestamps(sleep_path, subpool);
+  }
 
   svn_pool_destroy(subpool);
 

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/switch.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/switch.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/switch.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/switch.c Mon Apr  8 11:47:02 2013
@@ -337,8 +337,7 @@ switch_internal(svn_revnum_t *result_rev
 
   /* Past this point, we assume the WC is going to be modified so we will
    * need to sleep for timestamps. */
-  if (! use_commit_times)
-    *timestamp_sleep = TRUE;
+  *timestamp_sleep = TRUE;
 
   /* Drive the reporter structure, describing the revisions within
      PATH.  When we call reporter->finish_report, the update_editor

Modified: subversion/branches/verify-keep-going/subversion/libsvn_client/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_client/update.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_client/update.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_client/update.c Mon Apr  8 11:47:02 2013
@@ -440,17 +440,18 @@ update_internal(svn_revnum_t *result_rev
 
   /* Tell RA to do an update of URL+TARGET to REVISION; if we pass an
      invalid revnum, that means RA will use the latest revision.  */
-  SVN_ERR(svn_ra_do_update2(ra_session, &reporter, &report_baton,
+  SVN_ERR(svn_ra_do_update3(ra_session, &reporter, &report_baton,
                             revnum, target,
                             (!server_supports_depth || depth_is_sticky
                              ? depth
                              : svn_depth_unknown),
-                            FALSE, update_editor, update_edit_baton, pool));
+                            FALSE /* send_copyfrom_args */,
+                            FALSE /* ignore_ancestry */,
+                            update_editor, update_edit_baton, pool, pool));
 
   /* Past this point, we assume the WC is going to be modified so we will
    * need to sleep for timestamps. */
-  if (! use_commit_times)
-    *timestamp_sleep = TRUE;
+  *timestamp_sleep = TRUE;
 
   /* Drive the reporter structure, describing the revisions within
      PATH.  When we call reporter->finish_report, the

Modified: subversion/branches/verify-keep-going/subversion/libsvn_delta/path_driver.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_delta/path_driver.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_delta/path_driver.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_delta/path_driver.c Mon Apr  8 11:47:02 2013
@@ -96,7 +96,7 @@ pop_stack(apr_array_header_t *db_stack,
 
   /* Close the most recent directory pushed to the stack. */
   item = APR_ARRAY_IDX(db_stack, db_stack->nelts - 1, dir_stack_t *);
-  (void) apr_array_pop(db_stack);
+  apr_array_pop(db_stack);
   SVN_ERR(editor->close_directory(item->dir_baton, item->pool));
   svn_pool_destroy(item->pool);
 

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.c Mon Apr  8 11:47:02 2013
@@ -1307,6 +1307,29 @@ svn_fs_youngest_rev(svn_revnum_t *younge
 }
 
 svn_error_t *
+svn_fs_info_format(int *fs_format,
+                   svn_version_t **supports_version,
+                   svn_fs_t *fs,
+                   apr_pool_t *result_pool,
+                   apr_pool_t *scratch_pool)
+{
+  return svn_error_trace(fs->vtable->info_format(fs_format, supports_version,
+                                                 fs,
+                                                 result_pool, scratch_pool));
+}
+
+svn_error_t *
+svn_fs_info_config_files(apr_array_header_t **files,
+                         svn_fs_t *fs,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool)
+{
+  return svn_error_trace(fs->vtable->info_config_files(files, fs,
+                                                       result_pool,
+                                                       scratch_pool));
+}
+
+svn_error_t *
 svn_fs_deltify_revision(svn_fs_t *fs, svn_revnum_t revision, apr_pool_t *pool)
 {
   return svn_error_trace(fs->vtable->deltify(fs, revision, pool));
@@ -1590,3 +1613,24 @@ svn_fs_version(void)
 {
   SVN_VERSION_BODY;
 }
+
+
+/** info **/
+svn_error_t *
+svn_fs_info(const svn_fs_info_t **info,
+            svn_fs_t *fs,
+            apr_pool_t *result_pool,
+            apr_pool_t *scratch_pool)
+{
+  SVN__NOT_IMPLEMENTED();
+}
+
+svn_fs_info_t *
+svn_fs_info_dup(const svn_fs_info_t *info,
+                apr_pool_t *result_pool)
+{
+  /* Not implemented. */
+  SVN_ERR_MALFUNCTION_NO_RETURN();
+  return NULL;
+}
+

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.h?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs/fs-loader.h Mon Apr  8 11:47:02 2013
@@ -212,6 +212,15 @@ typedef struct fs_vtable_t
                             svn_fs_get_locks_callback_t get_locks_func,
                             void *get_locks_baton,
                             apr_pool_t *pool);
+  svn_error_t *(*info_format)(int *fs_format,
+                              svn_version_t **supports_version,
+                              svn_fs_t *fs,
+                              apr_pool_t *result_pool,
+                              apr_pool_t *scratch_pool);
+  svn_error_t *(*info_config_files)(apr_array_header_t **files,
+                                    svn_fs_t *fs,
+                                    apr_pool_t *result_pool,
+                                    apr_pool_t *scratch_pool);
   svn_error_t *(*verify_root)(svn_fs_root_t *root,
                               apr_pool_t *pool);
   svn_error_t *(*freeze)(svn_fs_t *fs,

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs_base/fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs_base/fs.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs_base/fs.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs_base/fs.c Mon Apr  8 11:47:02 2013
@@ -471,6 +471,59 @@ bdb_write_config(svn_fs_t *fs)
 }
 
 static svn_error_t *
+base_bdb_info_format(int *fs_format,
+                     svn_version_t **supports_version,
+                     svn_fs_t *fs,
+                     apr_pool_t *result_pool,
+                     apr_pool_t *scratch_pool)
+{
+  base_fs_data_t *bfd = fs->fsap_data;
+
+  *fs_format = bfd->format;
+  *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+  (*supports_version)->major = SVN_VER_MAJOR;
+  (*supports_version)->minor = 0;
+  (*supports_version)->patch = 0;
+  (*supports_version)->tag = "";
+
+  switch (bfd->format)
+    {
+    case 1:
+      break;
+    case 2:
+      (*supports_version)->minor = 4;
+      break;
+    case 3:
+      (*supports_version)->minor = 5;
+      break;
+    case 4:
+      (*supports_version)->minor = 6;
+      break;
+#ifdef SVN_DEBUG
+# if SVN_FS_BASE__FORMAT_NUMBER != 4
+#  error "Need to add a 'case' statement here"
+# endif
+#endif
+    }
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
+base_bdb_info_config_files(apr_array_header_t **files,
+                           svn_fs_t *fs,
+                           apr_pool_t *result_pool,
+                           apr_pool_t *scratch_pool)
+{
+  *files = apr_array_make(result_pool, 1, sizeof(const char *));
+  APR_ARRAY_PUSH(*files, const char *) = svn_dirent_join(fs->path,
+                                                         BDB_CONFIG_FILE,
+                                                         result_pool);
+  return SVN_NO_ERROR;
+}
+ 
+static svn_error_t *
 base_bdb_verify_root(svn_fs_root_t *root,
                      apr_pool_t *scratch_pool)
 {
@@ -507,6 +560,8 @@ static fs_vtable_t fs_vtable = {
   svn_fs_base__unlock,
   svn_fs_base__get_lock,
   svn_fs_base__get_locks,
+  base_bdb_info_format,
+  base_bdb_info_config_files,
   base_bdb_verify_root,
   base_bdb_freeze,
   base_bdb_set_errcall,

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs_base/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs_base/tree.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs_base/tree.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs_base/tree.c Mon Apr  8 11:47:02 2013
@@ -3730,8 +3730,7 @@ txn_body_apply_textdelta(void *baton, tr
          we're calculating both SHA1 and MD5 checksums somewhere in
          reps-strings.c.  Could we keep them both around somehow so this
          check could be more comprehensive? */
-      if (tb->base_checksum->kind == checksum->kind
-            && !svn_checksum_match(tb->base_checksum, checksum))
+      if (!svn_checksum_match(tb->base_checksum, checksum))
         return svn_checksum_mismatch_err(tb->base_checksum, checksum,
                             trail->pool,
                             _("Base checksum mismatch on '%s'"),

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs.c Mon Apr  8 11:47:02 2013
@@ -184,6 +184,8 @@ static fs_vtable_t fs_vtable = {
   svn_fs_fs__unlock,
   svn_fs_fs__get_lock,
   svn_fs_fs__get_locks,
+  svn_fs_fs__info_format,
+  svn_fs_fs__info_config_files,
   svn_fs_fs__verify_root,
   fs_freeze,
   fs_set_errcall

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs_fs.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/fs_fs.c Mon Apr  8 11:47:02 2013
@@ -49,6 +49,7 @@
 #include "svn_mergeinfo.h"
 #include "svn_config.h"
 #include "svn_ctype.h"
+#include "svn_version.h"
 
 #include "fs.h"
 #include "tree.h"
@@ -11466,3 +11467,57 @@ svn_fs_fs__hotcopy(svn_fs_t *src_fs,
 
   return SVN_NO_ERROR;
 }
+
+svn_error_t *
+svn_fs_fs__info_format(int *fs_format,
+                       svn_version_t **supports_version,
+                       svn_fs_t *fs,
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool)
+{
+  fs_fs_data_t *ffd = fs->fsap_data;
+  *fs_format = ffd->format;
+  *supports_version = apr_palloc(result_pool, sizeof(svn_version_t));
+
+  (*supports_version)->major = SVN_VER_MAJOR;
+  (*supports_version)->minor = 1;
+  (*supports_version)->patch = 0;
+  (*supports_version)->tag = "";
+
+  switch (ffd->format)
+    {
+    case 1:
+      break;
+    case 2:
+      (*supports_version)->minor = 4;
+      break;
+    case 3:
+      (*supports_version)->minor = 5;
+      break;
+    case 4:
+      (*supports_version)->minor = 6;
+      break;
+    case 6:
+      (*supports_version)->minor = 8;
+      break;
+#ifdef SVN_DEBUG
+# if SVN_FS_FS__FORMAT_NUMBER != 6
+#  error "Need to add a 'case' statement here"
+# endif
+#endif
+    }
+
+  return SVN_NO_ERROR;
+}
+
+svn_error_t *
+svn_fs_fs__info_config_files(apr_array_header_t **files,
+                             svn_fs_t *fs,
+                             apr_pool_t *result_pool,
+                             apr_pool_t *scratch_pool)
+{
+  *files = apr_array_make(result_pool, 1, sizeof(const char *));
+  APR_ARRAY_PUSH(*files, const char *) = svn_dirent_join(fs->path, PATH_CONFIG,
+                                                         result_pool);
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/tree.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/tree.h?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/tree.h (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_fs_fs/tree.h Mon Apr  8 11:47:02 2013
@@ -91,6 +91,20 @@ svn_error_t *
 svn_fs_fs__verify_root(svn_fs_root_t *root,
                        apr_pool_t *pool);
 
+svn_error_t *
+svn_fs_fs__info_format(int *fs_format,
+                       svn_version_t **supports_version,
+                       svn_fs_t *fs,
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool);
+
+
+svn_error_t *
+svn_fs_fs__info_config_files(apr_array_header_t **files,
+                             svn_fs_t *fs,
+                             apr_pool_t *result_pool,
+                             apr_pool_t *scratch_pool);
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra/deprecated.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra/deprecated.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra/deprecated.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra/deprecated.c Mon Apr  8 11:47:02 2013
@@ -349,6 +349,29 @@ svn_error_t *svn_ra_get_file_revs(svn_ra
                                handler2_baton, pool);
 }
 
+svn_error_t *
+svn_ra_do_update2(svn_ra_session_t *session,
+                  const svn_ra_reporter3_t **reporter,
+                  void **report_baton,
+                  svn_revnum_t revision_to_update_to,
+                  const char *update_target,
+                  svn_depth_t depth,
+                  svn_boolean_t send_copyfrom_args,
+                  const svn_delta_editor_t *update_editor,
+                  void *update_baton,
+                  apr_pool_t *pool)
+{
+  return svn_error_trace(
+            svn_ra_do_update3(session,
+                              reporter, report_baton,
+                              revision_to_update_to, update_target,
+                              depth,
+                              send_copyfrom_args,
+                              FALSE /* ignore_ancestry */,
+                              update_editor, update_baton,
+                              pool, pool));
+}
+
 svn_error_t *svn_ra_do_update(svn_ra_session_t *session,
                               const svn_ra_reporter2_t **reporter,
                               void **report_baton,
@@ -369,8 +392,9 @@ svn_error_t *svn_ra_do_update(svn_ra_ses
                                     revision_to_update_to, update_target,
                                     SVN_DEPTH_INFINITY_OR_FILES(recurse),
                                     FALSE, /* no copyfrom args */
+                                    FALSE /* ignore_ancestry */,
                                     update_editor, update_baton,
-                                    pool);
+                                    pool, pool);
 }
 
 

Propchange: subversion/branches/verify-keep-going/subversion/libsvn_ra/deprecated.h
------------------------------------------------------------------------------
    svn:eol-style = native

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.c Mon Apr  8 11:47:02 2013
@@ -783,16 +783,19 @@ svn_error_t *svn_ra_get_mergeinfo(svn_ra
                                         include_descendants, pool);
 }
 
-svn_error_t *svn_ra_do_update2(svn_ra_session_t *session,
-                               const svn_ra_reporter3_t **reporter,
-                               void **report_baton,
-                               svn_revnum_t revision_to_update_to,
-                               const char *update_target,
-                               svn_depth_t depth,
-                               svn_boolean_t send_copyfrom_args,
-                               const svn_delta_editor_t *update_editor,
-                               void *update_baton,
-                               apr_pool_t *pool)
+svn_error_t *
+svn_ra_do_update3(svn_ra_session_t *session,
+                  const svn_ra_reporter3_t **reporter,
+                  void **report_baton,
+                  svn_revnum_t revision_to_update_to,
+                  const char *update_target,
+                  svn_depth_t depth,
+                  svn_boolean_t send_copyfrom_args,
+                  svn_boolean_t ignore_ancestry,
+                  const svn_delta_editor_t *update_editor,
+                  void *update_baton,
+                  apr_pool_t *result_pool,
+                  apr_pool_t *scratch_pool)
 {
   SVN_ERR_ASSERT(svn_path_is_empty(update_target)
                  || svn_path_is_single_path_component(update_target));
@@ -800,8 +803,9 @@ svn_error_t *svn_ra_do_update2(svn_ra_se
                                     reporter, report_baton,
                                     revision_to_update_to, update_target,
                                     depth, send_copyfrom_args,
+                                    ignore_ancestry,
                                     update_editor, update_baton,
-                                    pool);
+                                    result_pool, scratch_pool);
 }
 
 svn_error_t *

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.h?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.h (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra/ra_loader.h Mon Apr  8 11:47:02 2013
@@ -135,7 +135,7 @@ typedef struct svn_ra__vtable_t {
                                 svn_mergeinfo_inheritance_t inherit,
                                 svn_boolean_t include_merged_revisions,
                                 apr_pool_t *pool);
-  /* See svn_ra_do_update2(). */
+  /* See svn_ra_do_update3(). */
   svn_error_t *(*do_update)(svn_ra_session_t *session,
                             const svn_ra_reporter3_t **reporter,
                             void **report_baton,
@@ -143,10 +143,12 @@ typedef struct svn_ra__vtable_t {
                             const char *update_target,
                             svn_depth_t depth,
                             svn_boolean_t send_copyfrom_args,
+                            svn_boolean_t ignore_ancestry,
                             const svn_delta_editor_t *update_editor,
                             void *update_baton,
-                            apr_pool_t *pool);
-  /* See svn_ra_do_switch2(). */
+                            apr_pool_t *result_pool,
+                            apr_pool_t *scratch_pool);
+  /* See svn_ra_do_switch3(). */
   svn_error_t *(*do_switch)(svn_ra_session_t *session,
                             const svn_ra_reporter3_t **reporter,
                             void **report_baton,

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra/wrapper_template.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra/wrapper_template.h?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra/wrapper_template.h (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra/wrapper_template.h Mon Apr  8 11:47:02 2013
@@ -291,8 +291,10 @@ static svn_error_t *compat_do_update(voi
 
   SVN_ERR(VTBL.do_update(session_baton, &reporter3, &baton3,
                          revision_to_update_to, update_target, depth,
-                         FALSE, /* no copyfrom args */
-                         editor, update_baton, pool));
+                         FALSE /* send_copyfrom_args */,
+                         FALSE /* ignore_ancestry */,
+                         editor, update_baton,
+                         pool, pool));
   compat_wrap_reporter(reporter, report_baton, reporter3, baton3, pool);
 
   return SVN_NO_ERROR;

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_local/ra_plugin.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_local/ra_plugin.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_local/ra_plugin.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_local/ra_plugin.c Mon Apr  8 11:47:02 2013
@@ -71,10 +71,13 @@ cleanup_access(void *data)
 }
 
 
-/* Fetch a username for use with SESS, and store it in SESS->username. */
+/* Fetch a username for use with SESSION, and store it in SESSION->username.
+ *
+ * Allocate the username in SESSION->pool.  Use SCRATCH_POOL for temporary
+ * allocations. */
 static svn_error_t *
 get_username(svn_ra_session_t *session,
-             apr_pool_t *pool)
+             apr_pool_t *scratch_pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
 
@@ -93,7 +96,7 @@ get_username(svn_ra_session_t *session,
                                              SVN_AUTH_CRED_USERNAME,
                                              sess->uuid, /* realmstring */
                                              sess->callbacks->auth_baton,
-                                             pool));
+                                             scratch_pool));
 
           /* No point in calling next_creds(), since that assumes that the
              first_creds() somehow failed to authenticate.  But there's no
@@ -104,7 +107,8 @@ get_username(svn_ra_session_t *session,
             {
               sess->username = apr_pstrdup(session->pool,
                                            username_creds->username);
-              svn_error_clear(svn_auth_save_credentials(iterstate, pool));
+              svn_error_clear(svn_auth_save_credentials(iterstate,
+                                                        scratch_pool));
             }
           else
             sess->username = "";
@@ -279,7 +283,9 @@ static const svn_ra_reporter3_t ra_local
  * they have already wrapped with the same cancellation editor, so it ends
  * up double-wrapped.
  *
- * ... */
+ * Allocate @a *reporter and @a *report_baton in @a result_pool.  Use
+ * @a scratch_pool for temporary allocations.
+ */
 static svn_error_t *
 make_reporter(svn_ra_session_t *session,
               const svn_ra_reporter3_t **reporter,
@@ -293,7 +299,8 @@ make_reporter(svn_ra_session_t *session,
               svn_boolean_t ignore_ancestry,
               const svn_delta_editor_t *editor,
               void *edit_baton,
-              apr_pool_t *pool)
+              apr_pool_t *result_pool,
+              apr_pool_t *scratch_pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;
   void *rbaton;
@@ -301,14 +308,14 @@ make_reporter(svn_ra_session_t *session,
 
   /* Get the HEAD revision if one is not supplied. */
   if (! SVN_IS_VALID_REVNUM(revision))
-    SVN_ERR(svn_fs_youngest_rev(&revision, sess->fs, pool));
+    SVN_ERR(svn_fs_youngest_rev(&revision, sess->fs, scratch_pool));
 
   /* If OTHER_URL was provided, validate it and convert it into a
      regular filesystem path. */
   if (other_url)
     {
       const char *other_relpath
-        = svn_uri_skip_ancestor(sess->repos_url, other_url, pool);
+        = svn_uri_skip_ancestor(sess->repos_url, other_url, scratch_pool);
 
       /* Sanity check:  the other_url better be in the same repository as
          the original session url! */
@@ -319,13 +326,14 @@ make_reporter(svn_ra_session_t *session,
              "is not the same repository as\n"
              "'%s'"), other_url, sess->repos_url);
 
-      other_fs_path = apr_pstrcat(pool, "/", other_relpath, (char *)NULL);
+      other_fs_path = apr_pstrcat(scratch_pool, "/", other_relpath,
+                                  (char *)NULL);
     }
 
   /* Pass back our reporter */
   *reporter = &ra_local_reporter;
 
-  SVN_ERR(get_username(session, pool));
+  SVN_ERR(get_username(session, scratch_pool));
 
   if (sess->callbacks)
     SVN_ERR(svn_delta_get_cancellation_editor(sess->callbacks->cancel_func,
@@ -334,7 +342,7 @@ make_reporter(svn_ra_session_t *session,
                                               edit_baton,
                                               &editor,
                                               &edit_baton,
-                                              pool));
+                                              result_pool));
 
   /* Build a reporter baton. */
   SVN_ERR(svn_repos_begin_report3(&rbaton,
@@ -353,11 +361,11 @@ make_reporter(svn_ra_session_t *session,
                                   NULL,
                                   1024 * 1024,  /* process-local transfers
                                                    should be fast */
-                                  pool));
+                                  result_pool));
 
   /* Wrap the report baton given us by the repos layer with our own
      reporter baton. */
-  *report_baton = make_reporter_baton(sess, rbaton, pool);
+  *report_baton = make_reporter_baton(sess, rbaton, result_pool);
 
   return SVN_NO_ERROR;
 }
@@ -810,9 +818,11 @@ svn_ra_local__do_update(svn_ra_session_t
                         const char *update_target,
                         svn_depth_t depth,
                         svn_boolean_t send_copyfrom_args,
+                        svn_boolean_t ignore_ancestry,
                         const svn_delta_editor_t *update_editor,
                         void *update_baton,
-                        apr_pool_t *pool)
+                        apr_pool_t *result_pool,
+                        apr_pool_t *scratch_pool)
 {
   return make_reporter(session,
                        reporter,
@@ -823,10 +833,10 @@ svn_ra_local__do_update(svn_ra_session_t
                        TRUE,
                        depth,
                        send_copyfrom_args,
-                       FALSE,
+                       ignore_ancestry,
                        update_editor,
                        update_baton,
-                       pool);
+                       result_pool, scratch_pool);
 }
 
 
@@ -857,7 +867,7 @@ svn_ra_local__do_switch(svn_ra_session_t
                        ignore_ancestry,
                        update_editor,
                        update_baton,
-                       result_pool);
+                       result_pool, scratch_pool);
 }
 
 
@@ -884,7 +894,7 @@ svn_ra_local__do_status(svn_ra_session_t
                        FALSE,
                        status_editor,
                        status_baton,
-                       pool);
+                       pool, pool);
 }
 
 
@@ -914,7 +924,7 @@ svn_ra_local__do_diff(svn_ra_session_t *
                        ignore_ancestry,
                        update_editor,
                        update_baton,
-                       pool);
+                       pool, pool);
 }
 
 

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_local/split_url.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_local/split_url.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_local/split_url.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_local/split_url.c Mon Apr  8 11:47:02 2013
@@ -73,7 +73,7 @@ svn_ra_local__split_URL(svn_repos_t **re
                                            pool));
 
   /* Configure hook script environment variables. */
-  SVN_ERR(svn_repos_hooks_setenv(*repos, NULL, pool, pool));
+  SVN_ERR(svn_repos_hooks_setenv(*repos, NULL, pool));
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/ra_serf.h
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/ra_serf.h?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/ra_serf.h (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/ra_serf.h Mon Apr  8 11:47:02 2013
@@ -1529,9 +1529,11 @@ svn_ra_serf__do_update(svn_ra_session_t 
                        const char *update_target,
                        svn_depth_t depth,
                        svn_boolean_t send_copyfrom_args,
+                       svn_boolean_t ignore_ancestry,
                        const svn_delta_editor_t *update_editor,
                        void *update_baton,
-                       apr_pool_t *pool);
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool);
 
 /* Implements svn_ra__vtable_t.do_switch(). */
 svn_error_t *

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/sb_bucket.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/sb_bucket.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/sb_bucket.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/sb_bucket.c Mon Apr  8 11:47:02 2013
@@ -124,7 +124,8 @@ sb_bucket_readline(serf_bucket_t *bucket
                    const char **data, apr_size_t *len)
 {
   /* ### for now, we know callers won't use this function.  */
-  (void)svn_error__malfunction(TRUE, __FILE__, __LINE__, "Not implemented.");
+  svn_error_clear(svn_error__malfunction(TRUE, __FILE__, __LINE__,
+                                         "Not implemented."));
   return APR_ENOTIMPL;
 }
 

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/update.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/update.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/update.c Mon Apr  8 11:47:02 2013
@@ -2885,6 +2885,15 @@ finish_report(void *report_baton,
           waittime_left = sess->timeout;
         }
 
+      if (status && handler->sline.code != 200)
+        {
+          return svn_error_trace(
+                    svn_error_compose_create(
+                        svn_ra_serf__error_on_status(handler->sline.code,
+                                                     handler->path,
+                                                     handler->location),
+                        err));
+        }
       SVN_ERR(err);
       if (status)
         {
@@ -3092,8 +3101,13 @@ finish_report(void *report_baton,
       err = report->update_editor->close_edit(report->update_baton, iterpool);
     }
   else
-    err = svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, NULL,
-                           _("Missing update-report close tag"));
+    {
+      /* Tell the editor that something failed */
+      err = report->update_editor->abort_edit(report->update_baton, iterpool);
+
+      err = svn_error_create(SVN_ERR_RA_DAV_MALFORMED_DATA, err,
+                             _("Missing update-report close tag"));
+    }
 
   svn_pool_destroy(iterpool);
   return svn_error_trace(err);
@@ -3138,10 +3152,9 @@ make_update_reporter(svn_ra_session_t *r
                      svn_boolean_t send_copyfrom_args,
                      const svn_delta_editor_t *update_editor,
                      void *update_baton,
-                     apr_pool_t *result_pool)
+                     apr_pool_t *result_pool,
+                     apr_pool_t *scratch_pool)
 {
-  /* ### would be nice to get a SCRATCH_POOL passed to us.  */
-  apr_pool_t *scratch_pool = svn_pool_create(result_pool);
   report_context_t *report;
   const svn_delta_editor_t *filter_editor;
   void *filter_baton;
@@ -3322,7 +3335,6 @@ make_update_reporter(svn_ra_session_t *r
   SVN_ERR(svn_io_file_write_full(report->body_file, buf->data, buf->len,
                                  NULL, scratch_pool));
 
-  svn_pool_destroy(scratch_pool);
   return SVN_NO_ERROR;
 }
 
@@ -3334,17 +3346,22 @@ svn_ra_serf__do_update(svn_ra_session_t 
                        const char *update_target,
                        svn_depth_t depth,
                        svn_boolean_t send_copyfrom_args,
+                       svn_boolean_t ignore_ancestry,
                        const svn_delta_editor_t *update_editor,
                        void *update_baton,
-                       apr_pool_t *pool)
+                       apr_pool_t *result_pool,
+                       apr_pool_t *scratch_pool)
 {
   svn_ra_serf__session_t *session = ra_session->priv;
 
-  return make_update_reporter(ra_session, reporter, report_baton,
-                              revision_to_update_to,
-                              session->session_url.path, NULL, update_target,
-                              depth, FALSE, TRUE, send_copyfrom_args,
-                              update_editor, update_baton, pool);
+  SVN_ERR(make_update_reporter(ra_session, reporter, report_baton,
+                               revision_to_update_to,
+                               session->session_url.path, NULL, update_target,
+                               depth, ignore_ancestry, TRUE /* text_deltas */,
+                               send_copyfrom_args,
+                               update_editor, update_baton,
+                               result_pool, scratch_pool));
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
@@ -3362,12 +3379,16 @@ svn_ra_serf__do_diff(svn_ra_session_t *r
                      apr_pool_t *pool)
 {
   svn_ra_serf__session_t *session = ra_session->priv;
+  apr_pool_t *scratch_pool = svn_pool_create(pool);
 
-  return make_update_reporter(ra_session, reporter, report_baton,
-                              revision,
-                              session->session_url.path, versus_url, diff_target,
-                              depth, ignore_ancestry, text_deltas, FALSE,
-                              diff_editor, diff_baton, pool);
+  SVN_ERR(make_update_reporter(ra_session, reporter, report_baton,
+                               revision,
+                               session->session_url.path, versus_url, diff_target,
+                               depth, ignore_ancestry, text_deltas, FALSE,
+                               diff_editor, diff_baton,
+                               pool, scratch_pool));
+  svn_pool_destroy(scratch_pool);
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
@@ -3382,12 +3403,16 @@ svn_ra_serf__do_status(svn_ra_session_t 
                        apr_pool_t *pool)
 {
   svn_ra_serf__session_t *session = ra_session->priv;
+  apr_pool_t *scratch_pool = svn_pool_create(pool);
 
-  return make_update_reporter(ra_session, reporter, report_baton,
-                              revision,
-                              session->session_url.path, NULL, status_target,
-                              depth, FALSE, FALSE, FALSE,
-                              status_editor, status_baton, pool);
+  SVN_ERR(make_update_reporter(ra_session, reporter, report_baton,
+                               revision,
+                               session->session_url.path, NULL, status_target,
+                               depth, FALSE, FALSE, FALSE,
+                               status_editor, status_baton,
+                               pool, scratch_pool));
+  svn_pool_destroy(scratch_pool);
+  return SVN_NO_ERROR;
 }
 
 svn_error_t *
@@ -3416,7 +3441,7 @@ svn_ra_serf__do_switch(svn_ra_session_t 
                               TRUE /* text_deltas */,
                               send_copyfrom_args,
                               switch_editor, switch_baton,
-                              result_pool);
+                              result_pool, scratch_pool);
 }
 
 /* Helper svn_ra_serf__get_file(). Attempts to fetch file contents

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/util.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/util.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_serf/util.c Mon Apr  8 11:47:02 2013
@@ -497,7 +497,7 @@ svn_ra_serf__conn_closed(serf_connection
 
   err = svn_error_trace(connection_closed(ra_conn, why, pool));
 
-  (void) save_error(ra_conn->session, err);
+  save_error(ra_conn->session, err);
 }
 
 
@@ -1490,7 +1490,7 @@ svn_ra_serf__process_pending(svn_ra_serf
 
       /* Tell the parser that no more content will be parsed. Ignore the
          return status. We just don't care.  */
-      (void) XML_Parse(parser->xmlp, NULL, 0, 1);
+      XML_Parse(parser->xmlp, NULL, 0, 1);
 
       apr_pool_cleanup_run(parser->pool, &parser->xmlp, xml_parser_cleanup);
       parser->xmlp = NULL;
@@ -1711,7 +1711,7 @@ svn_ra_serf__handle_xml_parser(serf_requ
               SVN_ERR_ASSERT(ctx->xmlp != NULL);
 
               /* Ignore the return status. We just don't care.  */
-              (void) XML_Parse(ctx->xmlp, NULL, 0, 1);
+              XML_Parse(ctx->xmlp, NULL, 0, 1);
 
               apr_pool_cleanup_run(ctx->pool, &ctx->xmlp, xml_parser_cleanup);
               add_done_item(ctx);
@@ -1763,7 +1763,7 @@ svn_ra_serf__credentials_callback(char *
 
       if (err)
         {
-          (void) save_error(session, err);
+          save_error(session, err);
           return err->apr_err;
         }
 
@@ -1772,8 +1772,8 @@ svn_ra_serf__credentials_callback(char *
       if (!creds || session->auth_attempts > 4)
         {
           /* No more credentials. */
-          (void) save_error(session,
-                            svn_error_create(
+          save_error(session,
+                     svn_error_create(
                               SVN_ERR_AUTHN_FAILED, NULL,
                               _("No more credentials or we tried too many "
                                 "times.\nAuthentication failed")));
@@ -1794,8 +1794,8 @@ svn_ra_serf__credentials_callback(char *
       if (!session->proxy_username || session->proxy_auth_attempts > 4)
         {
           /* No more credentials. */
-          (void) save_error(session, 
-                            svn_error_create(
+          save_error(session, 
+                     svn_error_create(
                               SVN_ERR_AUTHN_FAILED, NULL,
                               _("Proxy authentication failed")));
           return SVN_ERR_AUTHN_FAILED;
@@ -2217,8 +2217,8 @@ svn_ra_serf__request_create(svn_ra_serf_
 
   /* ### do we need to hold onto the returned request object, or just
      ### not worry about it (the serf ctx will manage it).  */
-  (void) serf_connection_request_create(handler->conn->conn,
-                                        setup_request_cb, handler);
+  serf_connection_request_create(handler->conn->conn,
+                                 setup_request_cb, handler);
 }
 
 
@@ -2446,7 +2446,7 @@ expat_start(void *userData, const char *
 
 #ifdef EXPAT_HAS_STOPPARSER
   if (ectx->inner_error)
-    (void) XML_StopParser(ectx->parser, 0 /* resumable */);
+    XML_StopParser(ectx->parser, 0 /* resumable */);
 #endif
 }
 
@@ -2465,7 +2465,7 @@ expat_end(void *userData, const char *ra
 
 #ifdef EXPAT_HAS_STOPPARSER
   if (ectx->inner_error)
-    (void) XML_StopParser(ectx->parser, 0 /* resumable */);
+    XML_StopParser(ectx->parser, 0 /* resumable */);
 #endif
 }
 
@@ -2484,7 +2484,7 @@ expat_cdata(void *userData, const char *
 
 #ifdef EXPAT_HAS_STOPPARSER
   if (ectx->inner_error)
-    (void) XML_StopParser(ectx->parser, 0 /* resumable */);
+    XML_StopParser(ectx->parser, 0 /* resumable */);
 #endif
 }
 
@@ -2570,7 +2570,7 @@ expat_response_handler(serf_request_t *r
         {
           /* Tell expat we've reached the end of the content. Ignore the
              return status. We just don't care.  */
-          (void) XML_Parse(ectx->parser, NULL, 0, 1 /* isFinal */);
+          XML_Parse(ectx->parser, NULL, 0, 1 /* isFinal */);
 
           svn_ra_serf__xml_context_destroy(ectx->xmlctx);
           apr_pool_cleanup_run(ectx->cleanup_pool, &ectx->parser,

Modified: subversion/branches/verify-keep-going/subversion/libsvn_ra_svn/client.c
URL: http://svn.apache.org/viewvc/subversion/branches/verify-keep-going/subversion/libsvn_ra_svn/client.c?rev=1465596&r1=1465595&r2=1465596&view=diff
==============================================================================
--- subversion/branches/verify-keep-going/subversion/libsvn_ra_svn/client.c (original)
+++ subversion/branches/verify-keep-going/subversion/libsvn_ra_svn/client.c Mon Apr  8 11:47:02 2013
@@ -259,10 +259,8 @@ static svn_error_t *ra_svn_set_path(void
 {
   ra_svn_reporter_baton_t *b = baton;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(b->conn, pool,
-                                         svn_ra_svn_cmd_set_path,
-                                         path, rev, start_empty, lock_token,
-                                         svn_depth_to_word(depth)));
+  SVN_ERR(svn_ra_svn_write_cmd_set_path(b->conn, pool, path, rev,
+                                        start_empty, lock_token, depth));
   return SVN_NO_ERROR;
 }
 
@@ -271,8 +269,7 @@ static svn_error_t *ra_svn_delete_path(v
 {
   ra_svn_reporter_baton_t *b = baton;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(b->conn, pool,
-                                         svn_ra_svn_cmd_delete_path, path));
+  SVN_ERR(svn_ra_svn_write_cmd_delete_path(b->conn, pool, path));
   return SVN_NO_ERROR;
 }
 
@@ -286,11 +283,8 @@ static svn_error_t *ra_svn_link_path(voi
 {
   ra_svn_reporter_baton_t *b = baton;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(b->conn, pool,
-                                         svn_ra_svn_cmd_link_path,
-                                         path, url, rev, start_empty,
-                                         lock_token,
-                                         svn_depth_to_word(depth)));
+  SVN_ERR(svn_ra_svn_write_cmd_link_path(b->conn, pool, path, url, rev,
+                                         start_empty, lock_token, depth));
   return SVN_NO_ERROR;
 }
 
@@ -299,8 +293,7 @@ static svn_error_t *ra_svn_finish_report
 {
   ra_svn_reporter_baton_t *b = baton;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(b->conn, b->pool,
-                                         svn_ra_svn_cmd_finish_report));
+  SVN_ERR(svn_ra_svn_write_cmd_finish_report(b->conn, b->pool));
   SVN_ERR(handle_auth_request(b->sess_baton, b->pool));
   SVN_ERR(svn_ra_svn_drive_editor2(b->conn, b->pool, b->editor, b->edit_baton,
                                    NULL, FALSE));
@@ -313,8 +306,7 @@ static svn_error_t *ra_svn_abort_report(
 {
   ra_svn_reporter_baton_t *b = baton;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(b->conn, b->pool,
-                                         svn_ra_svn_cmd_abort_report));
+  SVN_ERR(svn_ra_svn_write_cmd_abort_report(b->conn, b->pool));
   return SVN_NO_ERROR;
 }
 
@@ -494,7 +486,9 @@ static svn_error_t *make_tunnel(const ch
   if (status == APR_SUCCESS)
     status = apr_proc_create(proc, *args, args, NULL, attr, pool);
   if (status != APR_SUCCESS)
-    return svn_error_wrap_apr(status, _("Can't create tunnel"));
+    return svn_error_create(SVN_ERR_RA_CANNOT_CREATE_TUNNEL,
+                            svn_error_wrap_apr(status,
+                                               _("Can't create tunnel")), NULL);
 
   /* Arrange for the tunnel agent to get a SIGTERM on pool
    * cleanup.  This is a little extreme, but the alternatives
@@ -779,8 +773,7 @@ static svn_error_t *ra_svn_reparent(svn_
   svn_ra_svn__session_baton_t *new_sess;
   apr_uri_t uri;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_reparent, url));
+  SVN_ERR(svn_ra_svn_write_cmd_reparent(conn, pool, url));
   err = handle_auth_request(sess, pool);
   if (! err)
     {
@@ -829,8 +822,7 @@ static svn_error_t *ra_svn_get_latest_re
   svn_ra_svn__session_baton_t *sess_baton = session->priv;
   svn_ra_svn_conn_t *conn = sess_baton->conn;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_get_latest_rev));
+  SVN_ERR(svn_ra_svn_write_cmd_get_latest_rev(conn, pool));
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "r", rev));
   return SVN_NO_ERROR;
@@ -843,9 +835,7 @@ static svn_error_t *ra_svn_get_dated_rev
   svn_ra_svn__session_baton_t *sess_baton = session->priv;
   svn_ra_svn_conn_t *conn = sess_baton->conn;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_get_dated_rev,
-                               svn_time_to_cstring(tm, pool)));
+  SVN_ERR(svn_ra_svn_write_cmd_get_dated_rev(conn, pool, tm));
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "r", rev));
   return SVN_NO_ERROR;
@@ -888,14 +878,12 @@ static svn_error_t *ra_svn_change_rev_pr
     }
 
   if (has_atomic_revprops)
-    SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                           svn_ra_svn_cmd_change_rev_prop2,
-                                           rev, name, value, dont_care,
-                                           old_value));
+    SVN_ERR(svn_ra_svn_write_cmd_change_rev_prop2(conn, pool, rev, name,
+                                                  value, dont_care,
+                                                  old_value));
   else
-    SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                           svn_ra_svn_cmd_change_rev_prop,
-                                           rev, name, value));
+    SVN_ERR(svn_ra_svn_write_cmd_change_rev_prop(conn, pool, rev, name,
+                                                 value));
 
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, ""));
@@ -932,8 +920,7 @@ static svn_error_t *ra_svn_rev_proplist(
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   apr_array_header_t *proplist;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_rev_proplist, rev));
+  SVN_ERR(svn_ra_svn_write_cmd_rev_proplist(conn, pool, rev));
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "l", &proplist));
   SVN_ERR(svn_ra_svn_parse_proplist(proplist, pool, props));
@@ -947,8 +934,7 @@ static svn_error_t *ra_svn_rev_prop(svn_
   svn_ra_svn__session_baton_t *sess_baton = session->priv;
   svn_ra_svn_conn_t *conn = sess_baton->conn;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_rev_prop, rev, name));
+  SVN_ERR(svn_ra_svn_write_cmd_rev_prop(conn, pool, rev, name));
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "(?s)", value));
   return SVN_NO_ERROR;
@@ -1141,9 +1127,8 @@ static svn_error_t *ra_svn_get_file(svn_
   svn_checksum_ctx_t *checksum_ctx;
   apr_pool_t *iterpool;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_get_file, path, rev,
-                                         (props != NULL), (stream != NULL)));
+  SVN_ERR(svn_ra_svn_write_cmd_get_file(conn, pool, path, rev,
+                                        (props != NULL), (stream != NULL)));
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "(?c)rl",
                                        &expected_digest,
@@ -1364,18 +1349,20 @@ static svn_error_t *ra_svn_update(svn_ra
                                   void **report_baton, svn_revnum_t rev,
                                   const char *target, svn_depth_t depth,
                                   svn_boolean_t send_copyfrom_args,
+                                  svn_boolean_t ignore_ancestry,
                                   const svn_delta_editor_t *update_editor,
-                                  void *update_baton, apr_pool_t *pool)
+                                  void *update_baton,
+                                  apr_pool_t *pool,
+                                  apr_pool_t *scratch_pool)
 {
   svn_ra_svn__session_baton_t *sess_baton = session->priv;
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   svn_boolean_t recurse = DEPTH_TO_RECURSE(depth);
 
   /* Tell the server we want to start an update. */
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool, svn_ra_svn_cmd_update,
-                                         rev, target, recurse,
-                                         svn_depth_to_word(depth),
-                                         send_copyfrom_args));
+  SVN_ERR(svn_ra_svn_write_cmd_update(conn, pool, rev, target, recurse,
+                                      depth, send_copyfrom_args,
+                                      ignore_ancestry));
   SVN_ERR(handle_auth_request(sess_baton, pool));
 
   /* Fetch a reporter for the caller to drive.  The reporter will drive
@@ -1404,10 +1391,9 @@ ra_svn_switch(svn_ra_session_t *session,
   svn_boolean_t recurse = DEPTH_TO_RECURSE(depth);
 
   /* Tell the server we want to start a switch. */
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool, svn_ra_svn_cmd_switch,
-                                         rev, target, recurse, switch_url,
-                                         svn_depth_to_word(depth),
-                                         send_copyfrom_args, ignore_ancestry));
+  SVN_ERR(svn_ra_svn_write_cmd_switch(conn, pool, rev, target, recurse,
+                                      switch_url, depth,
+                                      send_copyfrom_args, ignore_ancestry));
   SVN_ERR(handle_auth_request(sess_baton, pool));
 
   /* Fetch a reporter for the caller to drive.  The reporter will drive
@@ -1430,9 +1416,8 @@ static svn_error_t *ra_svn_status(svn_ra
   svn_boolean_t recurse = DEPTH_TO_RECURSE(depth);
 
   /* Tell the server we want to start a status operation. */
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool, svn_ra_svn_cmd_status,
-                                         target, recurse, rev,
-                                         svn_depth_to_word(depth)));
+  SVN_ERR(svn_ra_svn_write_cmd_status(conn, pool, target, recurse, rev,
+                                      depth));
   SVN_ERR(handle_auth_request(sess_baton, pool));
 
   /* Fetch a reporter for the caller to drive.  The reporter will drive
@@ -1458,10 +1443,9 @@ static svn_error_t *ra_svn_diff(svn_ra_s
   svn_boolean_t recurse = DEPTH_TO_RECURSE(depth);
 
   /* Tell the server we want to start a diff. */
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool, svn_ra_svn_cmd_diff,
-                                         rev, target, recurse, ignore_ancestry,
-                                         versus_url, text_deltas,
-                                         svn_depth_to_word(depth)));
+  SVN_ERR(svn_ra_svn_write_cmd_diff(conn, pool, rev, target, recurse,
+                                    ignore_ancestry, versus_url,
+                                    text_deltas, depth));
   SVN_ERR(handle_auth_request(sess_baton, pool));
 
   /* Fetch a reporter for the caller to drive.  The reporter will drive
@@ -1693,9 +1677,7 @@ static svn_error_t *ra_svn_check_path(sv
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   const char *kind_word;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_check_path,
-                                         path, rev));
+  SVN_ERR(svn_ra_svn_write_cmd_check_path(conn, pool, path, rev));
   SVN_ERR(handle_auth_request(sess_baton, pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "w", &kind_word));
   *kind = svn_node_kind_from_word(kind_word);
@@ -1724,9 +1706,7 @@ static svn_error_t *ra_svn_stat(svn_ra_s
   apr_array_header_t *list = NULL;
   svn_dirent_t *the_dirent;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool, svn_ra_svn_cmd_stat,
-                                         path, rev));
-
+  SVN_ERR(svn_ra_svn_write_cmd_stat(conn, pool, path, rev));
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool),
                                  N_("'stat' not implemented")));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, pool, "(?l)", &list));
@@ -1903,10 +1883,9 @@ static svn_error_t *ra_svn_get_file_revs
   rev_pool = svn_pool_create(pool);
   chunk_pool = svn_pool_create(pool);
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(sess_baton->conn, pool,
-                                         svn_ra_svn_cmd_get_file_revs,
-                                         path, start, end,
-                                         include_merged_revisions));
+  SVN_ERR(svn_ra_svn_write_cmd_get_file_revs(sess_baton->conn, pool,
+                                             path, start, end,
+                                             include_merged_revisions));
 
   /* Servers before 1.1 don't support this command.  Check for this here. */
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool),
@@ -2035,10 +2014,8 @@ static svn_error_t *ra_svn_lock_compat(s
       path = key;
       revnum = val;
 
-      SVN_ERR(svn_ra_svn_write_templated_cmd(conn, iterpool,
-                                             svn_ra_svn_cmd_lock,
-                                             path, comment,
-                                             steal_lock, *revnum));
+      SVN_ERR(svn_ra_svn_write_cmd_lock(conn, iterpool, path, comment,
+                                        steal_lock, *revnum));
 
       /* Servers before 1.2 doesn't support locking.  Check this here. */
       SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool),
@@ -2101,9 +2078,8 @@ static svn_error_t *ra_svn_unlock_compat
       else
         token = NULL;
 
-      SVN_ERR(svn_ra_svn_write_templated_cmd(conn, iterpool,
-                                             svn_ra_svn_cmd_unlock,
-                                             path, token, break_lock));
+      SVN_ERR(svn_ra_svn_write_cmd_unlock(conn, iterpool, path, token,
+                                          break_lock));
 
       /* Servers before 1.2 don't support locking.  Check this here. */
       SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, iterpool),
@@ -2390,8 +2366,7 @@ static svn_error_t *ra_svn_get_lock(svn_
   svn_ra_svn_conn_t* conn = sess->conn;
   apr_array_header_t *list;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_get_lock, path));
+  SVN_ERR(svn_ra_svn_write_cmd_get_lock(conn, pool, path));
 
   /* Servers before 1.2 doesn't support locking.  Check this here. */
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool),
@@ -2443,9 +2418,7 @@ static svn_error_t *ra_svn_get_locks(svn
   SVN_ERR(path_relative_to_root(session, &abs_path, full_url, pool));
   abs_path = svn_fspath__canonicalize(abs_path, pool);
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_get_locks, path,
-                                         svn_depth_to_word(depth)));
+  SVN_ERR(svn_ra_svn_write_cmd_get_locks(conn, pool, path, depth));
 
   /* Servers before 1.2 doesn't support locking.  Check this here. */
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool),
@@ -2502,9 +2475,8 @@ static svn_error_t *ra_svn_replay(svn_ra
 {
   svn_ra_svn__session_baton_t *sess = session->priv;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(sess->conn, pool,
-                                         svn_ra_svn_cmd_replay, revision,
-                                         low_water_mark, send_deltas));
+  SVN_ERR(svn_ra_svn_write_cmd_replay(sess->conn, pool, revision,
+                                      low_water_mark, send_deltas));
 
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool),
                                  N_("Server doesn't support the replay "
@@ -2533,10 +2505,9 @@ ra_svn_replay_range(svn_ra_session_t *se
   svn_revnum_t rev;
   svn_boolean_t drive_aborted = FALSE;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(sess->conn, pool,
-                                         svn_ra_svn_cmd_replay_range,
-                                         start_revision, end_revision,
-                                         low_water_mark, send_deltas));
+  SVN_ERR(svn_ra_svn_write_cmd_replay_range(sess->conn, pool,
+                                            start_revision, end_revision,
+                                            low_water_mark, send_deltas));
 
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess, pool),
                                  N_("Server doesn't support the "
@@ -2642,9 +2613,8 @@ ra_svn_get_deleted_rev(svn_ra_session_t 
   svn_ra_svn_conn_t *conn = sess_baton->conn;
 
   /* Transmit the parameters. */
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, pool,
-                                         svn_ra_svn_cmd_get_deleted_rev,
-                                         path, peg_revision, end_revision));
+  SVN_ERR(svn_ra_svn_write_cmd_get_deleted_rev(conn, pool, path,
+                                               peg_revision, end_revision));
 
   /* Servers before 1.6 don't support this command.  Check for this here. */
   SVN_ERR(handle_unsupported_cmd(handle_auth_request(sess_baton, pool),
@@ -2677,9 +2647,8 @@ ra_svn_get_inherited_props(svn_ra_sessio
   svn_ra_svn_conn_t *conn = sess_baton->conn;
   apr_array_header_t *iproplist;
 
-  SVN_ERR(svn_ra_svn_write_templated_cmd(conn, scratch_pool,
-                                         svn_ra_svn_cmd_get_iprops,
-                                         path, revision));
+  SVN_ERR(svn_ra_svn_write_cmd_get_iprops(conn, scratch_pool,
+                                          path, revision));
   SVN_ERR(handle_auth_request(sess_baton, scratch_pool));
   SVN_ERR(svn_ra_svn_read_cmd_response(conn, scratch_pool, "l", &iproplist));
   SVN_ERR(parse_iproplist(iprops, iproplist, session, result_pool,