You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@subversion.apache.org by da...@apache.org on 2010/03/30 22:58:01 UTC

svn commit: r929279 [9/20] - in /subversion/branches/svn-patch-improvements: ./ build/ac-macros/ build/generator/ build/generator/templates/ contrib/client-side/emacs/ notes/feedback/ notes/meetings/ notes/wc-ng/ subversion/ subversion/bindings/javahl/...

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.c Tue Mar 30 20:57:53 2010
@@ -151,8 +151,8 @@ svn_client__adjust_mergeinfo_source_path
 
   for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
     {
-      const char *merge_source = svn_apr_hash_index_key(hi);
-      apr_array_header_t *rangelist = svn_apr_hash_index_val(hi);
+      const char *merge_source = svn__apr_hash_index_key(hi);
+      apr_array_header_t *rangelist = svn__apr_hash_index_val(hi);
 
       /* Copy inherited mergeinfo into our output hash, adjusting the
          merge source as appropriate. */
@@ -460,7 +460,7 @@ svn_client__get_repos_mergeinfo(svn_ra_s
          descendants.  So if there is anything in the catalog it is the
          mergeinfo for REL_PATH. */
       *target_mergeinfo =
-        svn_apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
+        svn__apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
 
     }
 
@@ -532,7 +532,7 @@ svn_client__get_wc_or_repos_mergeinfo(sv
          so we can peek into our catalog, but it ought to be the only
          thing in the catalog, so we'll just fetch the first hash item. */
       *target_mergeinfo =
-        svn_apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
+        svn__apr_hash_index_val(apr_hash_first(pool, tgt_mergeinfo_cat));
 
     }
 
@@ -654,7 +654,7 @@ svn_client__get_wc_or_repos_mergeinfo_ca
 
 svn_error_t *
 svn_client__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p,
-                                    apr_array_header_t *segments,
+                                    const apr_array_header_t *segments,
                                     apr_pool_t *pool)
 {
   svn_mergeinfo_t mergeinfo = apr_hash_make(pool);
@@ -1008,7 +1008,7 @@ get_mergeinfo(svn_mergeinfo_catalog_t *m
                                              result_pool, scratch_pool));
         }
 
-      
+
       if (peg_rev.kind == svn_opt_revision_date
           || peg_rev.kind == svn_opt_revision_head
           || peg_rev.kind == svn_opt_revision_previous
@@ -1236,7 +1236,7 @@ svn_client__elide_mergeinfo_catalog(svn_
    If DEPTH_FIRST_CATALOG_INDEX is NULL, empty, or no ancestor is found, then
    return NULL. */
 static svn_mergeinfo_t
-find_nearest_ancestor(apr_array_header_t *depth_first_catalog_index,
+find_nearest_ancestor(const apr_array_header_t *depth_first_catalog_index,
                       const char *abs_repos_path)
 {
   int i;
@@ -1270,7 +1270,7 @@ struct filter_log_entry_baton_t
 
   /* Unsorted array of repository relative paths representing the merge
      sources.  There will be more than one source  */
-  apr_array_header_t *merge_source_paths;
+  const apr_array_header_t *merge_source_paths;
 
   /* The repository-absolute path we are calling svn_client_log5() on. */
   const char *abs_repos_target_path;
@@ -1285,7 +1285,7 @@ struct filter_log_entry_baton_t
 
   /* A rangelist describing all the ranges merged to ABS_REPOS_TARGET_PATH
      from the */
-  apr_array_header_t *rangelist;
+  const apr_array_header_t *rangelist;
 
   /* The wrapped svn_log_entry_receiver_t callback and baton which
      filter_log_entry_with_rangelist() is acting as a filter for. */
@@ -1296,7 +1296,12 @@ struct filter_log_entry_baton_t
 };
 
 /* Implements the svn_log_entry_receiver_t interface.  BATON is a
-   `struct filter_log_entry_baton_t *' */
+   `struct filter_log_entry_baton_t *'.
+
+   Call the wrapped log receiver BATON->log_receiver (with
+   BATON->log_receiver_baton), only if the log entry falls within the
+   ranges in BATON->rangelist.
+ */
 static svn_error_t *
 filter_log_entry_with_rangelist(void *baton,
                                 svn_log_entry_t *log_entry,
@@ -1308,10 +1313,14 @@ filter_log_entry_with_rangelist(void *ba
   if (fleb->ctx->cancel_func)
     SVN_ERR(fleb->ctx->cancel_func(fleb->ctx->cancel_baton));
 
+  /* Ignore r0 because there can be no "change 0" in a merge range. */
+  if (log_entry->revision == 0)
+    return SVN_NO_ERROR;
+
   this_rangelist = svn_rangelist__initialize(log_entry->revision - 1,
                                              log_entry->revision,
                                              TRUE, pool);
-  
+
   /* Don't consider inheritance yet, see if LOG_ENTRY->REVISION is
      fully or partially represented in BATON->RANGELIST. */
   SVN_ERR(svn_rangelist_intersect(&intersection, fleb->rangelist,
@@ -1348,8 +1357,8 @@ filter_log_entry_with_rangelist(void *ba
            hi;
            hi = apr_hash_next(hi))
         {
-          const char *path = svn_apr_hash_index_key(hi);
-          svn_log_changed_path2_t *change = svn_apr_hash_index_val(hi);
+          const char *path = svn__apr_hash_index_key(hi);
+          svn_log_changed_path2_t *change = svn__apr_hash_index_val(hi);
           const char *target_path_affected;
           svn_mergeinfo_t nearest_ancestor_mergeinfo;
           apr_hash_index_t *hi2;
@@ -1397,7 +1406,7 @@ filter_log_entry_with_rangelist(void *ba
                    hi2;
                    hi2 = apr_hash_next(hi2))
                 {
-                  apr_array_header_t *rangelist = svn_apr_hash_index_val(hi2);
+                  apr_array_header_t *rangelist = svn__apr_hash_index_val(hi2);
                   SVN_ERR(svn_rangelist_intersect(&intersection, rangelist,
                                                   this_rev_rangelist, FALSE,
                                                   iterpool));
@@ -1436,15 +1445,15 @@ filter_log_entry_with_rangelist(void *ba
         }
     }
 
-  /* Call the wrapped log reveiver which this function is filtering for. */
+  /* Call the wrapped log receiver which this function is filtering for. */
   return fleb->log_receiver(fleb->log_receiver_baton, log_entry, pool);
 }
 
 static svn_error_t *
 logs_for_mergeinfo_rangelist(const char *source_url,
-                             apr_array_header_t *merge_source_paths,
+                             const apr_array_header_t *merge_source_paths,
                              svn_boolean_t filtering_merged,
-                             apr_array_header_t *rangelist,
+                             const apr_array_header_t *rangelist,
                              svn_mergeinfo_t target_mergeinfo_catalog,
                              const char *abs_repos_target_path,
                              svn_boolean_t discover_changed_paths,
@@ -1495,13 +1504,13 @@ logs_for_mergeinfo_rangelist(const char 
            hi;
            hi = apr_hash_next(hi))
         {
-          const char *path = svn_apr_hash_index_key(hi);
+          const char *path = svn__apr_hash_index_key(hi);
 
           if (!svn_dirent_is_absolute(path))
             apr_hash_set(rekeyed_catalog,
                          svn_dirent_join("/", path, scratch_pool),
                          APR_HASH_KEY_STRING,
-                         svn_apr_hash_index_val(hi));
+                         svn__apr_hash_index_val(hi));
         }
       target_mergeinfo_catalog = rekeyed_catalog;
     }
@@ -1633,8 +1642,8 @@ svn_client_mergeinfo_get_merged(apr_hash
       full_path_mergeinfo = apr_hash_make(pool);
       for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
         {
-          const char *key = svn_apr_hash_index_key(hi);
-          void *val = svn_apr_hash_index_val(hi);
+          const char *key = svn__apr_hash_index_key(hi);
+          void *val = svn__apr_hash_index_val(hi);
           const char *source_url;
 
           source_url = svn_path_uri_encode(key, pool);
@@ -1650,8 +1659,8 @@ svn_client_mergeinfo_get_merged(apr_hash
 
 
 svn_error_t *
-svn_client_mergeinfo_log(const char *path_or_url,
-                         svn_boolean_t finding_merged,
+svn_client_mergeinfo_log(svn_boolean_t finding_merged,
+                         const char *path_or_url,
                          const svn_opt_revision_t *peg_revision,
                          const char *merge_source_path_or_url,
                          const svn_opt_revision_t *src_peg_revision,
@@ -1772,14 +1781,14 @@ svn_client_mergeinfo_log(const char *pat
        hi_catalog = apr_hash_next(hi_catalog))
     {
       svn_mergeinfo_t subtree_mergeinfo =
-        svn_apr_hash_index_val(hi_catalog);
+        svn__apr_hash_index_val(hi_catalog);
       svn_mergeinfo_t subtree_history;
       svn_mergeinfo_t subtree_source_history;
       svn_mergeinfo_t subtree_inheritable_mergeinfo;
       svn_mergeinfo_t subtree_noninheritable_mergeinfo;
       svn_mergeinfo_t merged_noninheritable;
       svn_mergeinfo_t merged;
-      const char *subtree_path = svn_apr_hash_index_key(hi_catalog);
+      const char *subtree_path = svn__apr_hash_index_key(hi_catalog);
       svn_boolean_t is_subtree = strcmp(subtree_path,
                                         path_or_url_repos_rel) != 0;
       svn_pool_clear(iterpool);
@@ -1853,7 +1862,7 @@ svn_client_mergeinfo_log(const char *pat
                hi;
                hi = apr_hash_next(hi))
             {
-              apr_array_header_t *list = svn_apr_hash_index_val(hi);
+              apr_array_header_t *list = svn__apr_hash_index_val(hi);
               SVN_ERR(svn_rangelist_merge(
                 &master_noninheritable_rangelist,
                 svn_rangelist_dup(list, scratch_pool),
@@ -1881,7 +1890,7 @@ svn_client_mergeinfo_log(const char *pat
                hi;
                hi = apr_hash_next(hi))
             {
-              apr_array_header_t *list = svn_apr_hash_index_val(hi);
+              apr_array_header_t *list = svn__apr_hash_index_val(hi);
 
               SVN_ERR(svn_rangelist_merge(&master_inheritable_rangelist,
                                           svn_rangelist_dup(list,
@@ -1927,7 +1936,7 @@ svn_client_mergeinfo_log(const char *pat
           apr_array_header_t *deleted_rangelist;
           apr_array_header_t *added_rangelist;
           apr_array_header_t *subtree_merged_rangelist =
-            svn_apr_hash_index_val(hi);
+            svn__apr_hash_index_val(hi);
 
           svn_pool_clear(iterpool);
 
@@ -1970,7 +1979,7 @@ svn_client_mergeinfo_log(const char *pat
            hi = apr_hash_next(hi))
         {
           apr_array_header_t *subtree_merged_rangelist =
-            svn_apr_hash_index_val(hi);
+            svn__apr_hash_index_val(hi);
 
           SVN_ERR(svn_rangelist_merge(&source_master_rangelist,
                                       subtree_merged_rangelist,
@@ -2017,9 +2026,9 @@ svn_client_mergeinfo_log(const char *pat
            hi;
            hi = apr_hash_next(hi))
         {
-          const char *key = svn_apr_hash_index_key(hi);
+          const char *key = svn__apr_hash_index_key(hi);
           apr_array_header_t *subtree_merged_rangelist =
-            svn_apr_hash_index_val(hi);
+            svn__apr_hash_index_val(hi);
           apr_array_header_t *intersecting_rangelist;
           svn_pool_clear(iterpool);
           SVN_ERR(svn_rangelist_intersect(&intersecting_rangelist,
@@ -2099,7 +2108,7 @@ svn_client_suggest_merge_sources(apr_arr
       /* We asked only for the PATH_OR_URL's mergeinfo, not any of its
          descendants.  So if there is anything in the catalog it is the
          mergeinfo for PATH_OR_URL. */
-      mergeinfo = svn_apr_hash_index_val(apr_hash_first(pool, mergeinfo_cat));
+      mergeinfo = svn__apr_hash_index_val(apr_hash_first(pool, mergeinfo_cat));
     }
   else
     {
@@ -2119,7 +2128,7 @@ svn_client_suggest_merge_sources(apr_arr
     {
       for (hi = apr_hash_first(pool, mergeinfo); hi; hi = apr_hash_next(hi))
         {
-          const char *rel_path = svn_apr_hash_index_key(hi);
+          const char *rel_path = svn__apr_hash_index_key(hi);
 
           if (copyfrom_path == NULL || strcmp(rel_path, copyfrom_path) != 0)
             APR_ARRAY_PUSH(list, const char *) = \

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/mergeinfo.h Tue Mar 30 20:57:53 2010
@@ -258,7 +258,7 @@ svn_client__get_history_as_mergeinfo(svn
    *MERGEINFO_P, allocated in POOL. */
 svn_error_t *
 svn_client__mergeinfo_from_segments(svn_mergeinfo_t *mergeinfo_p,
-                                    apr_array_header_t *segments,
+                                    const apr_array_header_t *segments,
                                     apr_pool_t *pool);
 
 /* Parse any explicit mergeinfo on LOCAL_ABSPATH and store it in

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/patch.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/patch.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/patch.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/patch.c Tue Mar 30 20:57:53 2010
@@ -31,6 +31,7 @@
 #include <apr_fnmatch.h>
 #include "svn_client.h"
 #include "svn_dirent_uri.h"
+#include "svn_diff.h"
 #include "svn_io.h"
 #include "svn_path.h"
 #include "svn_pools.h"
@@ -40,7 +41,6 @@
 #include "client.h"
 
 #include "svn_private_config.h"
-#include "private/svn_diff_private.h"
 #include "private/svn_eol_private.h"
 #include "private/svn_wc_private.h"
 
@@ -325,18 +325,24 @@ resolve_target_path(patch_target_t *targ
  * which should be stripped from target paths in the patch.
  * Upon success, allocate the patch target structure in RESULT_POOL.
  * Else, set *target to NULL.
- * If a target matches a glob in FILTER_GLOBS, mark it as filtered.
+ * If a target does not match a glob in INCLUDE_PATTERNS, mark it as filtered.
+ * If a target matches a glob in EXCLUDE_PATTERNS, mark it as filtered.
+ * If PATCHED_TEMPFILES or REJECT_TEMPFILES are not NULL, add the path
+ * to temporary patched/reject files to them, keyed by the target's path
+ * as parsed from the patch file (after canonicalization).
  * Use SCRATCH_POOL for all other allocations. */
 static svn_error_t *
 init_patch_target(patch_target_t **patch_target,
                   const svn_patch_t *patch,
                   const char *base_dir,
                   svn_wc_context_t *wc_ctx, int strip_count,
-                  apr_array_header_t *filter_globs,
+                  const apr_array_header_t *include_patterns,
+                  const apr_array_header_t *exclude_patterns,
+                  apr_hash_t *patched_tempfiles,
+                  apr_hash_t *reject_tempfiles,
                   apr_pool_t *result_pool, apr_pool_t *scratch_pool)
 {
   patch_target_t *target;
-  int i;
 
   target = apr_pcalloc(result_pool, sizeof(*target));
 
@@ -345,13 +351,37 @@ init_patch_target(patch_target_t **patch
                               result_pool, scratch_pool));
 
   target->filtered = FALSE;
-  if (filter_globs)
+  if (include_patterns)
     {
-      for (i = 0; i < filter_globs->nelts; i++)
+      int i;
+      const char *glob;
+      svn_boolean_t match;
+
+      match = FALSE;
+      for (i = 0; i < include_patterns->nelts; i++)
         {
-          const char *glob;
+          glob = APR_ARRAY_IDX(include_patterns, i, const char *);
+          match = (apr_fnmatch(glob, target->canon_path_from_patchfile,
+                               APR_FNM_CASE_BLIND) == APR_SUCCESS);
+          if (match)
+            break;
+        }
 
-          glob = APR_ARRAY_IDX(filter_globs, i, const char *);
+      if (! match)
+        {
+          target->filtered = TRUE;
+          *patch_target = target;
+          return SVN_NO_ERROR;
+        }
+    }
+  if (exclude_patterns)
+    {
+      int i;
+      const char *glob;
+
+      for (i = 0; i < exclude_patterns->nelts; i++)
+        {
+          glob = APR_ARRAY_IDX(exclude_patterns, i, const char *);
           target->filtered = (apr_fnmatch(glob,
                                           target->canon_path_from_patchfile,
                                           APR_FNM_CASE_BLIND) == APR_SUCCESS);
@@ -381,7 +411,7 @@ init_patch_target(patch_target_t **patch
 
       if (target->kind == svn_node_file)
         {
-          /* Open the file. */ 
+          /* Open the file. */
           SVN_ERR(svn_io_file_open(&target->file, target->abs_path,
                                    APR_READ | APR_BINARY | APR_BUFFERED,
                                    APR_OS_DEFAULT, result_pool));
@@ -441,8 +471,14 @@ init_patch_target(patch_target_t **patch
       /* Create a temporary file to write the patched result to. */
       SVN_ERR(svn_stream_open_unique(&target->patched_raw,
                                      &target->patched_path, NULL,
-                                     svn_io_file_del_on_pool_cleanup,
+                                     patched_tempfiles ?
+                                       svn_io_file_del_none :
+                                       svn_io_file_del_on_pool_cleanup,
                                      result_pool, scratch_pool));
+      if (patched_tempfiles)
+        apr_hash_set(patched_tempfiles, target->canon_path_from_patchfile,
+                     APR_HASH_KEY_STRING, target->patched_path);
+
       /* Expand keywords in the patched file.
        * Repair newlines if svn:eol-style dictates a particular style. */
       repair_eol = (target->eol_style == svn_subst_eol_style_fixed ||
@@ -456,8 +492,13 @@ init_patch_target(patch_target_t **patch
        * in reject files. */
       SVN_ERR(svn_stream_open_unique(&target->reject,
                                      &target->reject_path, NULL,
-                                     svn_io_file_del_on_pool_cleanup,
+                                     reject_tempfiles ?
+                                       svn_io_file_del_none :
+                                       svn_io_file_del_on_pool_cleanup,
                                      result_pool, scratch_pool));
+      if (reject_tempfiles)
+        apr_hash_set(reject_tempfiles, target->canon_path_from_patchfile,
+                     APR_HASH_KEY_STRING, target->reject_path);
 
       /* The reject stream needs a diff header. */
       diff_header = apr_psprintf(scratch_pool, "--- %s%s+++ %s%s",
@@ -688,7 +729,7 @@ scan_for_match(svn_linenum_t *matched_li
           for (i = 0; i < target->hunks->nelts; i++)
             {
               const hunk_info_t *hi;
-              
+
               hi = APR_ARRAY_IDX(target->hunks, i, const hunk_info_t *);
               taken = (! hi->rejected &&
                        target->current_line >= hi->matched_line &&
@@ -1055,12 +1096,20 @@ send_patch_notification(const patch_targ
  * in RESULT_POOL. Use WC_CTX as the working copy context.
  * STRIP_COUNT specifies the number of leading path components
  * which should be stripped from target paths in the patch.
- * If a target matches a glob in FILTER_GLOBS, mark it as filtered.
+ * If a target does not match a glob in INCLUDE_PATTERNS, mark it as filtered.
+ * If a target matches a glob in EXCLUDE_PATTERNS, mark it as filtered.
+ * If PATCHED_TEMPFILES or REJECT_TEMPFILES are not NULL, add the path
+ * to temporary patched/reject files to them, keyed by the target's path
+ * as parsed from the patch file (after canonicalization).
  * Do temporary allocations in SCRATCH_POOL. */
 static svn_error_t *
 apply_one_patch(patch_target_t **patch_target, svn_patch_t *patch,
                 const char *abs_wc_path, svn_wc_context_t *wc_ctx,
-                int strip_count, apr_array_header_t *filter_globs,
+                int strip_count,
+                const apr_array_header_t *include_patterns,
+                const apr_array_header_t *exclude_patterns,
+                apr_hash_t *patched_tempfiles,
+                apr_hash_t *reject_tempfiles,
                 apr_pool_t *result_pool, apr_pool_t *scratch_pool)
 {
   patch_target_t *target;
@@ -1069,7 +1118,9 @@ apply_one_patch(patch_target_t **patch_t
   static const int MAX_FUZZ = 2;
 
   SVN_ERR(init_patch_target(&target, patch, abs_wc_path, wc_ctx, strip_count,
-                            filter_globs, result_pool, scratch_pool));
+                            include_patterns, exclude_patterns,
+                            patched_tempfiles, reject_tempfiles,
+                            result_pool, scratch_pool));
 
   if (target->skipped || target->filtered)
     {
@@ -1091,7 +1142,7 @@ apply_one_patch(patch_target_t **patch_t
 
       /* Determine the line the hunk should be applied at.
        * If no match is found initially, try with fuzz. */
-      do 
+      do
         {
           SVN_ERR(get_hunk_info(&hi, target, hunk, fuzz,
                                 result_pool, iterpool));
@@ -1267,7 +1318,7 @@ install_patched_target(patch_target_t *t
                   /* The WC_DB doesn't know much about this node.
                    * Check what's on disk. */
                   svn_node_kind_t disk_kind;
- 
+
                   SVN_ERR(svn_io_check_path(abs_path, &disk_kind, iterpool));
                   if (disk_kind != svn_node_none)
                     {
@@ -1295,7 +1346,7 @@ install_patched_target(patch_target_t *t
                     {
                       if (ctx->notify_func2)
                         {
-                          /* Just do notification. */ 
+                          /* Just do notification. */
                           svn_wc_notify_t *notify;
                           notify = svn_wc_create_notify(abs_path,
                                                         svn_wc_notify_add,
@@ -1378,8 +1429,18 @@ typedef struct {
   /* Whether to apply the patch in reverse. */
   svn_boolean_t reverse;
 
-  /* Glob patterns. Files matching any of these patterns won't be patched. */
-  apr_array_header_t *filter_globs;
+  /* Files not matching any of these patterns won't be patched. */
+  const apr_array_header_t *include_patterns;
+
+  /* Files matching any of these patterns won't be patched. */
+  const apr_array_header_t *exclude_patterns;
+
+  /* Mapping patch target path -> path to tempfile with patched result. */
+  apr_hash_t *patched_tempfiles;
+
+  /* Mapping patch target path -> path to tempfile with rejected hunks. */
+  apr_hash_t *reject_tempfiles;
+
 
   /* The client context. */
   svn_client_ctx_t *ctx;
@@ -1399,7 +1460,7 @@ apply_patches(void *baton,
   apr_array_header_t *targets;
   int i;
   apply_patches_baton_t *btn;
-  
+
   btn = (apply_patches_baton_t *)baton;
 
   /* Try to open the patch file. */
@@ -1425,17 +1486,19 @@ apply_patches(void *baton,
       if (btn->ctx->cancel_func)
         SVN_ERR(btn->ctx->cancel_func(btn->ctx->cancel_baton));
 
-      SVN_ERR(svn_diff__parse_next_patch(&patch, patch_file,
-                                         btn->reverse, scratch_pool, iterpool));
+      SVN_ERR(svn_diff_parse_next_patch(&patch, patch_file,
+                                        btn->reverse, scratch_pool, iterpool));
       if (patch)
         {
           patch_target_t *target;
 
           SVN_ERR(apply_one_patch(&target, patch, btn->abs_wc_path,
                                   btn->ctx->wc_ctx, btn->strip_count,
-                                  btn->filter_globs, scratch_pool, iterpool));
+                                  btn->include_patterns, btn->exclude_patterns,
+                                  btn->patched_tempfiles, btn->reject_tempfiles,
+                                  result_pool, iterpool));
           if (target->filtered)
-            SVN_ERR(svn_diff__close_patch(patch));
+            SVN_ERR(svn_diff_close_patch(patch));
           else
             APR_ARRAY_PUSH(targets, patch_target_t *) = target;
         }
@@ -1457,7 +1520,7 @@ apply_patches(void *baton,
         SVN_ERR(install_patched_target(target, btn->abs_wc_path,
                                        btn->ctx, btn->dry_run, iterpool));
       SVN_ERR(send_patch_notification(target, btn->ctx, iterpool));
-      SVN_ERR(svn_diff__close_patch(target->patch));
+      SVN_ERR(svn_diff_close_patch(target->patch));
     }
 
   SVN_ERR(svn_io_file_close(patch_file, iterpool));
@@ -1473,9 +1536,13 @@ svn_client_patch(const char *abs_patch_p
                  svn_boolean_t dry_run,
                  int strip_count,
                  svn_boolean_t reverse,
-                 apr_array_header_t *filter_globs,
+                 const apr_array_header_t *include_patterns,
+                 const apr_array_header_t *exclude_patterns,
+                 apr_hash_t **patched_tempfiles,
+                 apr_hash_t **reject_tempfiles,
                  svn_client_ctx_t *ctx,
-                 apr_pool_t *pool)
+                 apr_pool_t *result_pool,
+                 apr_pool_t *scratch_pool)
 {
   apply_patches_baton_t baton;
 
@@ -1489,11 +1556,26 @@ svn_client_patch(const char *abs_patch_p
   baton.ctx = ctx;
   baton.strip_count = strip_count;
   baton.reverse = reverse;
-  baton.filter_globs = filter_globs;
+  baton.include_patterns = include_patterns;
+  baton.exclude_patterns = exclude_patterns;
+  if (patched_tempfiles)
+    {
+      (*patched_tempfiles) = apr_hash_make(result_pool);
+      baton.patched_tempfiles = (*patched_tempfiles);
+    }
+  else
+    baton.patched_tempfiles = NULL;
+  if (reject_tempfiles)
+    {
+      (*reject_tempfiles) = apr_hash_make(result_pool);
+      baton.reject_tempfiles = (*reject_tempfiles);
+    }
+  else
+    baton.reject_tempfiles = NULL;
 
   SVN_ERR(svn_wc__call_with_write_lock(apply_patches, &baton,
                                        ctx->wc_ctx, local_abspath,
-                                       pool, pool));
+                                       result_pool, scratch_pool));
 
   return SVN_NO_ERROR;
 }

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/prop_commands.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/prop_commands.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/prop_commands.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/prop_commands.c Tue Mar 30 20:57:53 2010
@@ -711,8 +711,8 @@ remote_propget(apr_hash_t *props,
            hi;
            hi = apr_hash_next(hi))
         {
-          const char *this_name = svn_apr_hash_index_key(hi);
-          svn_dirent_t *this_ent = svn_apr_hash_index_val(hi);
+          const char *this_name = svn__apr_hash_index_key(hi);
+          svn_dirent_t *this_ent = svn__apr_hash_index_val(hi);
           const char *new_target_relative;
           svn_depth_t depth_below_here = depth;
 
@@ -1008,9 +1008,9 @@ remote_proplist(const char *target_prefi
        hi;
        hi = apr_hash_next(hi))
     {
-      const char *name = svn_apr_hash_index_key(hi);
-      apr_ssize_t klen = svn_apr_hash_index_klen(hi);
-      svn_string_t *value = svn_apr_hash_index_val(hi);
+      const char *name = svn__apr_hash_index_key(hi);
+      apr_ssize_t klen = svn__apr_hash_index_klen(hi);
+      svn_string_t *value = svn__apr_hash_index_val(hi);
       svn_prop_kind_t prop_kind;
 
       prop_kind = svn_property_kind(NULL, name);
@@ -1036,8 +1036,8 @@ remote_proplist(const char *target_prefi
            hi;
            hi = apr_hash_next(hi))
         {
-          const char *this_name = svn_apr_hash_index_key(hi);
-          svn_dirent_t *this_ent = svn_apr_hash_index_val(hi);
+          const char *this_name = svn__apr_hash_index_key(hi);
+          svn_dirent_t *this_ent = svn__apr_hash_index_val(hi);
           const char *new_target_relative;
 
           svn_pool_clear(subpool);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/ra.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/ra.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/ra.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/ra.c Tue Mar 30 20:57:53 2010
@@ -57,7 +57,7 @@ typedef struct
 
   /* An array of svn_client_commit_item3_t * structures, present only
      during working copy commits. */
-  apr_array_header_t *commit_items;
+  const apr_array_header_t *commit_items;
 
   /* A client context. */
   svn_client_ctx_t *ctx;
@@ -290,7 +290,7 @@ svn_error_t *
 svn_client__open_ra_session_internal(svn_ra_session_t **ra_session,
                                      const char *base_url,
                                      const char *base_dir,
-                                     apr_array_header_t *commit_items,
+                                     const apr_array_header_t *commit_items,
                                      svn_boolean_t use_admin,
                                      svn_boolean_t read_only_wc,
                                      svn_client_ctx_t *ctx,
@@ -754,9 +754,9 @@ svn_client__get_youngest_common_ancestor
      remembering the youngest matching location. */
   for (hi = apr_hash_first(pool, history1); hi; hi = apr_hash_next(hi))
     {
-      const char *path = svn_apr_hash_index_key(hi);
-      apr_ssize_t path_len = svn_apr_hash_index_klen(hi);
-      apr_array_header_t *ranges1 = svn_apr_hash_index_val(hi);
+      const char *path = svn__apr_hash_index_key(hi);
+      apr_ssize_t path_len = svn__apr_hash_index_klen(hi);
+      apr_array_header_t *ranges1 = svn__apr_hash_index_val(hi);
       apr_array_header_t *ranges2, *common;
 
       ranges2 = apr_hash_get(history2, path, path_len);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/repos_diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/repos_diff.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/repos_diff.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/repos_diff.c Tue Mar 30 20:57:53 2010
@@ -50,8 +50,9 @@ struct edit_baton {
      URL open in RA_SESSION below. */
   const char *target;
 
-  /* ADM_ACCESS is an access baton that includes the TARGET directory */
-  svn_wc_adm_access_t *adm_access;
+  /* A working copy context for TARGET, NULL if this is purely a
+     repository operation. */
+  svn_wc_context_t *wc_ctx;
 
   /* The callback and calback argument that implement the file comparison
      function */
@@ -321,56 +322,65 @@ get_dirprops_from_ra(struct dir_baton *b
 }
 
 
-/* Return in *LOCAL_DIR_ABSPATH the absolute path for the directory PATH by
-   searching the access baton set of ADM_ACCESS.  If ADM_ACCESS is NULL then
-   *LOCAL_DIR_ABSPATH will be NULL.  If LENIENT is TRUE then failure to find
-   an access baton will not return an error but will set *LOCAL_DIR_ABSPATH to
-   NULL instead. */
+/* If WC_CTX is NULL then set *LOCAL_DIR_ABSPATH to NULL otherwise
+   return in *LOCAL_DIR_ABSPATH the absolute path for the directory
+   PATH if PATH is a versioned directory. If PATH is not a versioned
+   directory and LENIENT is FALSE then return an error
+   SVN_ERR_WC_NOT_WORKING_COPY.  If LENIENT is TRUE then no error will
+   be returned but instead *LOCAL_DIR_ABSPATH will be set to NULL.
+
+   This rather odd interface was originally designed around searching
+   an access baton set. */
 static svn_error_t *
 get_dir_abspath(const char **local_dir_abspath,
-                svn_wc_adm_access_t *adm_access,
+                svn_wc_context_t *wc_ctx,
                 const char *path,
                 svn_boolean_t lenient,
                 apr_pool_t *pool)
 {
   *local_dir_abspath = NULL;
 
-  if (adm_access)
+  if (wc_ctx)
     {
-      svn_wc_adm_access_t *path_access;
-      svn_error_t *err = svn_wc_adm_retrieve(&path_access, adm_access, path,
-                                             pool);
+      svn_node_kind_t kind;
+      svn_error_t *err;
+      const char *local_abspath;
+      SVN_ERR(svn_dirent_get_absolute(&local_abspath, path, pool));
+      err = svn_wc__node_get_kind(&kind, wc_ctx, local_abspath, FALSE, pool);
       if (err)
         {
-          if (! lenient)
+          if (lenient)
+            kind = svn_node_none;
+          else
             return svn_error_return(err);
-          svn_error_clear(err);
         }
-      else if (path_access != NULL)
-        SVN_ERR(svn_dirent_get_absolute(local_dir_abspath,
-                                        svn_wc_adm_access_path(path_access),
-                                        pool));
-
+      svn_error_clear(err);
+      if (kind == svn_node_dir)
+        *local_dir_abspath = local_abspath;
+      else if (!lenient)
+        return svn_error_createf(SVN_ERR_WC_NOT_WORKING_COPY, NULL,
+                                 "'%s' is not a versioned directory",
+                                 svn_dirent_local_style(local_abspath, pool));
     }
 
   return SVN_NO_ERROR;
 }
 
-/* Like get_path_access except the returned access baton, in
-   *PARENT_ACCESS, is for the parent of PATH rather than for PATH
-   itself. */
+/* Like get_path_access except the returned path, in
+   *LOCAL_PARENT_DIR_ABSPATH, is for the parent of PATH rather than
+   for PATH itself.  As for get_path_access WC_CTX may be NULL. */
 static svn_error_t *
 get_parent_dir_abspath(const char **local_parent_dir_abspath,
-                       svn_wc_adm_access_t *adm_access,
+                       svn_wc_context_t *wc_ctx,
                        const char *path,
                        svn_boolean_t lenient,
-                      apr_pool_t *pool)
+                       apr_pool_t *pool)
 {
-  if (! adm_access)
+  if (!wc_ctx)
     *local_parent_dir_abspath = NULL;  /* Avoid messing around with paths */
   else
     {
-      SVN_ERR(get_dir_abspath(local_parent_dir_abspath, adm_access,
+      SVN_ERR(get_dir_abspath(local_parent_dir_abspath, wc_ctx,
                               svn_dirent_dirname(path, pool),
                               lenient, pool));
     }
@@ -450,9 +460,9 @@ delete_entry(const char *path,
 
   /* We need to know if this is a directory or a file */
   SVN_ERR(svn_ra_check_path(eb->ra_session, path, eb->revision, &kind, pool));
-  SVN_ERR(get_dir_abspath(&local_dir_abspath, eb->adm_access, pb->wcpath,
+  SVN_ERR(get_dir_abspath(&local_dir_abspath, eb->wc_ctx, pb->wcpath,
                           TRUE, pool));
-  if ((! eb->adm_access) || local_dir_abspath)
+  if ((! eb->wc_ctx) || local_dir_abspath)
     {
       switch (kind)
         {
@@ -554,7 +564,7 @@ add_directory(const char *path,
     }
 
 
-  SVN_ERR(get_dir_abspath(&local_dir_abspath, eb->adm_access, pb->wcpath, TRUE,
+  SVN_ERR(get_dir_abspath(&local_dir_abspath, eb->wc_ctx, pb->wcpath, TRUE,
                           pool));
 
   SVN_ERR(eb->diff_callbacks->dir_added
@@ -642,7 +652,7 @@ open_directory(const char *path,
 
   SVN_ERR(get_dirprops_from_ra(b, base_revision));
 
-  SVN_ERR(get_dir_abspath(&local_dir_abspath, eb->adm_access, pb->wcpath, TRUE,
+  SVN_ERR(get_dir_abspath(&local_dir_abspath, eb->wc_ctx, pb->wcpath, TRUE,
                           pool));
 
   SVN_ERR(eb->diff_callbacks->dir_opened
@@ -799,10 +809,10 @@ close_file(void *file_baton,
   if (b->skip)
     return SVN_NO_ERROR;
 
-  err = get_parent_dir_abspath(&local_dir_abspath, eb->adm_access,
+  err = get_parent_dir_abspath(&local_dir_abspath, eb->wc_ctx,
                                b->wcpath, eb->dry_run, b->pool);
 
-  if (err && err->apr_err == SVN_ERR_WC_NOT_LOCKED)
+  if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
     {
       /* ### maybe try to stat the local b->wcpath? */
       /* If the file path doesn't exist, then send a 'skipped' notification. */
@@ -934,10 +944,10 @@ close_directory(void *dir_baton,
   if (eb->dry_run)
     svn_hash__clear(svn_client__dry_run_deletions(eb->diff_cmd_baton), pool);
 
-  err = get_dir_abspath(&local_dir_abspath, eb->adm_access, b->wcpath,
+  err = get_dir_abspath(&local_dir_abspath, eb->wc_ctx, b->wcpath,
                         eb->dry_run, b->pool);
 
-  if (err && err->apr_err == SVN_ERR_WC_NOT_LOCKED)
+  if (err && err->apr_err == SVN_ERR_WC_NOT_WORKING_COPY)
     {
       /* ### maybe try to stat the local b->wcpath? */
       /* If the path doesn't exist, then send a 'skipped' notification.
@@ -991,8 +1001,8 @@ close_directory(void *dir_baton,
       for (hi = apr_hash_first(pool, eb->deleted_paths); hi;
            hi = apr_hash_next(hi))
         {
-          const char *deleted_path = svn_apr_hash_index_key(hi);
-          deleted_path_notify_t *dpn = svn_apr_hash_index_val(hi);
+          const char *deleted_path = svn__apr_hash_index_key(hi);
+          deleted_path_notify_t *dpn = svn__apr_hash_index_val(hi);
 
           notify = svn_wc_create_notify(deleted_path, dpn->action, pool);
           notify->kind = dpn->kind;
@@ -1161,8 +1171,7 @@ svn_client__get_diff_editor(const char *
   SVN_ERR(svn_dirent_get_absolute(&target_abspath, target, pool));
 
   eb->target = target;
-  SVN_ERR(svn_wc__adm_retrieve_from_context(&(eb->adm_access), wc_ctx,
-                                            target_abspath, pool));
+  eb->wc_ctx = wc_ctx;
   eb->diff_callbacks = diff_callbacks;
   eb->diff_cmd_baton = diff_cmd_baton;
   eb->dry_run = dry_run;

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/revert.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/revert.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/revert.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/revert.c Tue Mar 30 20:57:53 2010
@@ -50,7 +50,7 @@ struct revert_with_write_lock_baton {
 };
 
 /* (Note: All arguments are in the baton above.)
-  
+
    Attempt to revert LOCAL_ABSPATH.
 
    If DEPTH is svn_depth_empty, revert just the properties on the

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/switch.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/switch.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/switch.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/switch.c Tue Mar 30 20:57:53 2010
@@ -55,7 +55,7 @@
 */
 
 
-svn_error_t *
+static svn_error_t *
 switch_internal(svn_revnum_t *result_rev,
                 const char *path,
                 const char *local_abspath,
@@ -216,12 +216,12 @@ switch_internal(svn_revnum_t *result_rev
 
      We pass in an external_func for recording all externals. It
      shouldn't be needed for a switch if it wasn't for the relative
-     externals of type '../path'. All of those must be resolved to 
+     externals of type '../path'. All of those must be resolved to
      the new location.  */
   err = svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter,
                                 report_baton, TRUE, depth, (! depth_is_sticky),
                                 (! server_supports_depth),
-                                use_commit_times, 
+                                use_commit_times,
                                 svn_client__external_info_gatherer, &efb,
                                 ctx->notify_func2, ctx->notify_baton2, pool);
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/update.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/update.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/update.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/update.c Tue Mar 30 20:57:53 2010
@@ -222,7 +222,7 @@ update_internal(svn_revnum_t *result_rev
      the RA driver will call editor->set_target_revision later on. */
   SVN_ERR(svn_wc_get_update_editor4(&update_editor, &update_edit_baton,
                                     &revnum, ctx->wc_ctx, anchor_abspath,
-                                    target, use_commit_times, depth, 
+                                    target, use_commit_times, depth,
                                     depth_is_sticky, allow_unver_obstructions,
                                     diff3_cmd, preserved_exts,
                                     file_fetcher, ffb,
@@ -248,7 +248,7 @@ update_internal(svn_revnum_t *result_rev
   /* Drive the reporter structure, describing the revisions within
      PATH.  When we call reporter->finish_report, the
      update_editor will be driven by svn_repos_dir_delta2. */
-  err = svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter, 
+  err = svn_wc_crawl_revisions5(ctx->wc_ctx, local_abspath, reporter,
                                 report_baton, TRUE, depth, (! depth_is_sticky),
                                 (! server_supports_depth),
                                 use_commit_times,
@@ -271,7 +271,7 @@ update_internal(svn_revnum_t *result_rev
   if (SVN_DEPTH_IS_RECURSIVE(depth) && (! ignore_externals))
     {
       SVN_ERR(svn_client__handle_externals(efb.externals_old,
-                                           efb.externals_new, 
+                                           efb.externals_new,
                                            efb.ambient_depths,
                                            anchor_url, anchor,
                                            repos_root,

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_client/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_client/util.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_client/util.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_client/util.c Tue Mar 30 20:57:53 2010
@@ -50,9 +50,9 @@ string_hash_dup(apr_hash_t *hash, apr_po
 
   for (hi = apr_hash_first(pool, hash); hi; hi = apr_hash_next(hi))
     {
-      const char *key = apr_pstrdup(pool, svn_apr_hash_index_key(hi));
-      apr_ssize_t klen = svn_apr_hash_index_klen(hi);
-      svn_string_t *val = svn_string_dup(svn_apr_hash_index_val(hi), pool);
+      const char *key = apr_pstrdup(pool, svn__apr_hash_index_key(hi));
+      apr_ssize_t klen = svn__apr_hash_index_klen(hi);
+      svn_string_t *val = svn_string_dup(svn__apr_hash_index_val(hi), pool);
 
       apr_hash_set(new_hash, key, klen, val);
     }

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compat.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compat.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compat.c Tue Mar 30 20:57:53 2010
@@ -33,7 +33,7 @@ struct file_rev_handler_wrapper_baton {
   svn_file_rev_handler_old_t handler;
 };
 
-/* This implements svn_repos_file_rev_handler2_t. */
+/* This implements svn_file_rev_handler_t. */
 static svn_error_t *
 file_rev_handler_wrapper(void *baton,
                          const char *path,

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compose_delta.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compose_delta.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compose_delta.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_delta/compose_delta.c Tue Mar 30 20:57:53 2010
@@ -160,36 +160,49 @@ create_offset_index(const svn_txdelta_wi
 }
 
 /* Find the index of the delta op thet defines that data at OFFSET in
-   NDX. */
+   NDX. HINT is an arbitrary positin within NDX and doesn't even need 
+   to be valid. To effectively speed up the search, use the last result
+   as hint because most lookups come as a sequence of decreasing values
+   for OFFSET and they concentrate on the lower end of the array. */
 
 static int
-search_offset_index(const offset_index_t *ndx, apr_size_t offset)
+search_offset_index(const offset_index_t *ndx, apr_size_t offset, int hint)
 {
   int lo, hi, op;
 
   assert(offset < ndx->offs[ndx->length]);
 
-  for (lo = 0, hi = ndx->length, op = (lo + hi)/2;
-       lo < hi;
-       op = (lo + hi)/2)
-    {
-      const apr_size_t this_offset = ndx->offs[op];
-      const apr_size_t next_offset = ndx->offs[op + 1];
-      if (offset < this_offset)
-        hi = op;
-      else if (offset > next_offset)
-        lo = op;
+  lo = 0;
+  hi = ndx->length;
+
+  /* If we got a valid hint, use it to reduce the range to cover.
+     Note that this will only be useful if either the hint is a
+     hit (i.e. equals the desired result) or narrows the range
+     length by a factor larger than 2. */
+
+  if (hint < hi)
+    {
+      if (offset < ndx->offs[hint])
+        hi = hint;
+      else if (offset < ndx->offs[hint+1])
+        return hint;
       else
-        {
-          /* this_offset <= offset <= next_offset */
-          if (offset == next_offset)
-            ++op;
-          break;
-        }
+        lo = hint+1;
     }
 
-  assert(ndx->offs[op] <= offset && offset < ndx->offs[op + 1]);
-  return op;
+  /* ordinary binary search */
+
+  for (op = (lo + hi)/2; lo != hi; op = (lo + hi)/2)
+    {
+      if (offset < ndx->offs[op])
+        hi = op;
+      else 
+        lo = ++op;
+    }
+
+  --lo;
+  assert(ndx->offs[lo] <= offset && offset < ndx->offs[lo + 1]);
+  return lo;
 }
 
 
@@ -614,28 +627,33 @@ build_range_list(apr_size_t offset, apr_
 
 /* Copy the instructions from WINDOW that define the range [OFFSET,
    LIMIT) in WINDOW's target stream to TARGET_OFFSET in the window
-   represented by BUILD_BATON. Use NDX to find the instructions in
-   WINDOW. Allocate space in BUILD_BATON from POOL. */
+   represented by BUILD_BATON. HINT is a position in the instructions
+   array that helps finding the position for OFFSET. A safe default 
+   is 0. Use NDX to find the instructions in WINDOW. Allocate space 
+   in BUILD_BATON from POOL. */
 
 static void
-copy_source_ops(apr_size_t offset, apr_size_t limit,
+copy_source_ops(apr_size_t offset, apr_size_t limit,  
                 apr_size_t target_offset,
+                int hint,
                 svn_txdelta__ops_baton_t *build_baton,
                 const svn_txdelta_window_t *window,
                 const offset_index_t *ndx,
                 apr_pool_t *pool)
 {
-  const int first_op = search_offset_index(ndx, offset);
-  const int last_op = search_offset_index(ndx, limit - 1);
-  int op_ndx;
-
-  for (op_ndx = first_op; op_ndx <= last_op; ++op_ndx)
+  int op_ndx = search_offset_index(ndx, offset, hint);
+  for (;; ++op_ndx)
     {
       const svn_txdelta_op_t *const op = &window->ops[op_ndx];
       const apr_size_t *const off = &ndx->offs[op_ndx];
+      apr_size_t fix_offset;
+      apr_size_t fix_limit;
+
+      if (off[0] >= limit)
+          break;
 
-      const apr_size_t fix_offset = (offset > off[0] ? offset - off[0] : 0);
-      const apr_size_t fix_limit = (off[1] > limit ? off[1] - limit : 0);
+      fix_offset = (offset > off[0] ? offset - off[0] : 0);
+      fix_limit = (off[1] > limit ? off[1] - limit : 0);
 
       /* It would be extremely weird if the fixed-up op had zero length. */
       assert(fix_offset + fix_limit < op->length);
@@ -667,6 +685,7 @@ copy_source_ops(apr_size_t offset, apr_s
               copy_source_ops(op->offset + fix_offset,
                               op->offset + op->length - fix_limit,
                               target_offset,
+                              op_ndx,
                               build_baton, window, ndx, pool);
             }
           else
@@ -692,6 +711,7 @@ copy_source_ops(apr_size_t offset, apr_s
                   copy_source_ops(op->offset + ptn_overlap,
                                   op->offset + ptn_overlap + length,
                                   tgt_off,
+                                  op_ndx,
                                   build_baton, window, ndx, pool);
                   fix_off += length;
                   tgt_off += length;
@@ -707,6 +727,7 @@ copy_source_ops(apr_size_t offset, apr_s
                   copy_source_ops(op->offset,
                                   op->offset + length,
                                   tgt_off,
+                                  op_ndx,
                                   build_baton, window, ndx, pool);
                   fix_off += length;
                   tgt_off += length;
@@ -788,7 +809,7 @@ svn_txdelta_compose_windows(const svn_tx
                                        range->limit - range->offset,
                                        NULL, pool);
               else
-                copy_source_ops(range->offset, range->limit, tgt_off,
+                copy_source_ops(range->offset, range->limit, tgt_off, 0,
                                 &build_baton, window_A, offset_index,
                                 pool);
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_delta/path_driver.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_delta/path_driver.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_delta/path_driver.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_delta/path_driver.c Tue Mar 30 20:57:53 2010
@@ -133,7 +133,7 @@ svn_error_t *
 svn_delta_path_driver(const svn_delta_editor_t *editor,
                       void *edit_baton,
                       svn_revnum_t revision,
-                      apr_array_header_t *paths,
+                      const apr_array_header_t *paths,
                       svn_delta_path_driver_cb_func_t callback_func,
                       void *callback_baton,
                       apr_pool_t *pool)

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_diff/diff.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_diff/diff.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_diff/diff.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_diff/diff.h Tue Mar 30 20:57:53 2010
@@ -91,7 +91,7 @@ typedef enum svn_diff__normalize_state_t
 svn_diff__lcs_t *
 svn_diff__lcs(svn_diff__position_t *position_list1, /* pointer to tail (ring) */
               svn_diff__position_t *position_list2, /* pointer to tail (ring) */
-	      apr_pool_t *pool);
+              apr_pool_t *pool);
 
 
 /*

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_diff/parse-diff.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_diff/parse-diff.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_diff/parse-diff.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_diff/parse-diff.c Tue Mar 30 20:57:53 2010
@@ -31,9 +31,7 @@
 #include "svn_pools.h"
 #include "svn_utf.h"
 #include "svn_dirent_uri.h"
-
-#include "private/svn_diff_private.h"
-
+#include "svn_diff.h"
 
 /* Helper macro for readability */
 #define starts_with(str, start)  \
@@ -411,7 +409,7 @@ parse_next_hunk(svn_hunk_t **hunk,
 
   if (! eof)
     /* Rewind to the start of the line just read, so subsequent calls
-     * to this function or svn_diff__parse_next_patch() don't end
+     * to this function or svn_diff_parse_next_patch() don't end
      * up skipping the line -- it may contain a patch or hunk header. */
     SVN_ERR(svn_io_file_seek(patch->patch_file, APR_SET, &last_line,
                              scratch_pool));
@@ -499,11 +497,11 @@ close_hunk(const svn_hunk_t *hunk)
 }
 
 svn_error_t *
-svn_diff__parse_next_patch(svn_patch_t **patch,
-                           apr_file_t *patch_file,
-                           svn_boolean_t reverse,
-                           apr_pool_t *result_pool,
-                           apr_pool_t *scratch_pool)
+svn_diff_parse_next_patch(svn_patch_t **patch,
+                          apr_file_t *patch_file,
+                          svn_boolean_t reverse,
+                          apr_pool_t *result_pool,
+                          apr_pool_t *scratch_pool)
 {
   static const char * const minus = "--- ";
   static const char * const plus = "+++ ";
@@ -633,7 +631,7 @@ svn_diff__parse_next_patch(svn_patch_t *
 }
 
 svn_error_t *
-svn_diff__close_patch(const svn_patch_t *patch)
+svn_diff_close_patch(const svn_patch_t *patch)
 {
   int i;
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.c Tue Mar 30 20:57:53 2010
@@ -760,7 +760,7 @@ svn_fs_change_txn_prop(svn_fs_txn_t *txn
 }
 
 svn_error_t *
-svn_fs_change_txn_props(svn_fs_txn_t *txn, apr_array_header_t *props,
+svn_fs_change_txn_props(svn_fs_txn_t *txn, const apr_array_header_t *props,
                         apr_pool_t *pool)
 {
   return txn->vtable->change_props(txn, props, pool);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs/fs-loader.h Tue Mar 30 20:57:53 2010
@@ -214,7 +214,7 @@ typedef struct txn_vtable_t
                               const svn_string_t *value, apr_pool_t *pool);
   svn_error_t *(*root)(svn_fs_root_t **root_p, svn_fs_txn_t *txn,
                        apr_pool_t *pool);
-  svn_error_t *(*change_props)(svn_fs_txn_t *txn, apr_array_header_t *props,
+  svn_error_t *(*change_props)(svn_fs_txn_t *txn, const apr_array_header_t *props,
                                apr_pool_t *pool);
 } txn_vtable_t;
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/bdb/changes-table.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/bdb/changes-table.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/bdb/changes-table.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/bdb/changes-table.c Tue Mar 30 20:57:53 2010
@@ -168,6 +168,15 @@ fold_change(apr_hash_t *changes,
           (SVN_ERR_FS_CORRUPT, NULL,
            _("Invalid change ordering: non-add change on deleted path"));
 
+      /* Sanity check: an add can't follow anything except
+         a delete or reset.  */
+      if ((change->kind == svn_fs_path_change_add)
+          && (old_change->change_kind != svn_fs_path_change_delete)
+          && (old_change->change_kind != svn_fs_path_change_reset))
+        return svn_error_create
+          (SVN_ERR_FS_CORRUPT, NULL,
+           _("Invalid change ordering: add change on preexisting path"));
+
       /* Now, merge that change in. */
       switch (change->kind)
         {

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/obliterate.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/obliterate.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/obliterate.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/obliterate.c Tue Mar 30 20:57:53 2010
@@ -161,8 +161,8 @@ svn_fs_base__node_rev_dup(const svn_fs_i
           for (hi = apr_hash_first(scratch_pool, entries); hi;
                hi = apr_hash_next(hi))
             {
-              const char *child_name = svn_apr_hash_index_key(hi);
-              svn_fs_dirent_t *child_entry = svn_apr_hash_index_val(hi);
+              const char *child_name = svn__apr_hash_index_key(hi);
+              svn_fs_dirent_t *child_entry = svn__apr_hash_index_val(hi);
               const svn_fs_id_t *new_child_id;
 
               svn_pool_clear(iterpool);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/reps-strings.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/reps-strings.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/reps-strings.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/reps-strings.c Tue Mar 30 20:57:53 2010
@@ -132,7 +132,7 @@ delta_string_keys(apr_array_header_t **k
 
 /* Delete the strings associated with array KEYS in FS as part of TRAIL.  */
 static svn_error_t *
-delete_strings(apr_array_header_t *keys,
+delete_strings(const apr_array_header_t *keys,
                svn_fs_t *fs,
                trail_t *trail,
                apr_pool_t *pool)
@@ -323,7 +323,7 @@ get_one_window(struct compose_handler_ba
 
 static svn_error_t *
 rep_undeltify_range(svn_fs_t *fs,
-                    apr_array_header_t *deltas,
+                    const apr_array_header_t *deltas,
                     representation_t *fulltext,
                     int cur_chunk,
                     char *buf,

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.c Tue Mar 30 20:57:53 2010
@@ -637,7 +637,7 @@ svn_fs_base__change_txn_prop(svn_fs_txn_
 
 svn_error_t *
 svn_fs_base__change_txn_props(svn_fs_txn_t *txn,
-                              apr_array_header_t *props,
+                              const apr_array_header_t *props,
                               apr_pool_t *pool)
 {
   apr_pool_t *iterpool = svn_pool_create(pool);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/revs-txns.h Tue Mar 30 20:57:53 2010
@@ -226,7 +226,7 @@ svn_error_t *svn_fs_base__change_txn_pro
                                           apr_pool_t *pool);
 
 svn_error_t *svn_fs_base__change_txn_props(svn_fs_txn_t *txn,
-                                           apr_array_header_t *props,
+                                           const apr_array_header_t *props,
                                            apr_pool_t *pool);
 
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/tree.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/tree.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/tree.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/tree.h Tue Mar 30 20:57:53 2010
@@ -95,6 +95,13 @@ svn_error_t *svn_fs_base__get_path_creat
                                                trail_t *trail,
                                                apr_pool_t *pool);
 
+/* ### Experimental obliterate-like-deltify - see implementation. */
+svn_error_t *
+svn_fs_base__obliterate_rep(svn_fs_t *fs,
+                            const char *path,
+                            svn_revnum_t revision,
+                            apr_pool_t *pool);
+
 
 #ifdef __cplusplus
 }

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/util/fs_skels.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/util/fs_skels.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/util/fs_skels.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_base/util/fs_skels.c Tue Mar 30 20:57:53 2010
@@ -433,8 +433,9 @@ svn_fs_base__parse_transaction_skel(tran
     {
       /* Committed transactions have a revision number... */
       transaction->base_id = NULL;
-      transaction->revision = atoi(apr_pstrmemdup(pool, base_id_or_rev->data,
-                                                  base_id_or_rev->len));
+      transaction->revision =
+        SVN_STR_TO_REV(apr_pstrmemdup(pool, base_id_or_rev->data,
+                                      base_id_or_rev->len));
       if (! SVN_IS_VALID_REVNUM(transaction->revision))
         return skel_err("transaction");
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/caching.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/caching.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/caching.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/caching.c Tue Mar 30 20:57:53 2010
@@ -93,7 +93,7 @@ dup_dir_listing(void **out,
 
   for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
     {
-      svn_fs_dirent_t *dirent = svn_apr_hash_index_val(hi);
+      svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
       svn_fs_dirent_t *new_dirent;
 
       new_dirent = apr_palloc(pool, sizeof(*new_dirent));

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/dag.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/dag.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/dag.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/dag.c Tue Mar 30 20:57:53 2010
@@ -844,7 +844,7 @@ svn_fs_fs__dag_delete_if_mutable(svn_fs_
                hi;
                hi = apr_hash_next(hi))
             {
-              svn_fs_dirent_t *dirent = svn_apr_hash_index_val(hi);
+              svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
 
               SVN_ERR(svn_fs_fs__dag_delete_if_mutable(fs, dirent->id,
                                                        pool));

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs.h Tue Mar 30 20:57:53 2010
@@ -59,8 +59,8 @@ extern "C" {
 #define PATH_LOCKS_DIR        "locks"            /* Directory of locks */
 #define PATH_MIN_UNPACKED_REV "min-unpacked-rev" /* Oldest revision which
                                                     has not been packed. */
-#define PATH_MIN_UNPACKED_REVPROP "min-unpacked-revprop" /* Oldest revision 
-                                                            property which has 
+#define PATH_MIN_UNPACKED_REVPROP "min-unpacked-revprop" /* Oldest revision
+                                                            property which has
                                                             not been packed. */
 #define PATH_REVPROPS_DB "revprops.db"
 /* If you change this, look at tests/svn_test_fs.c(maybe_install_fsfs_conf) */

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.c Tue Mar 30 20:57:53 2010
@@ -1182,7 +1182,7 @@ static svn_error_t *
 update_min_unpacked_revprop(svn_fs_t *fs, apr_pool_t *pool)
 {
   fs_fs_data_t *ffd = fs->fsap_data;
-  
+
   return read_min_unpacked_rev(&ffd->min_unpacked_revprop,
                                path_min_unpacked_revprop(fs, pool),
                                pool);
@@ -1852,6 +1852,7 @@ get_packed_offset(apr_off_t *rev_offset,
       if (eof)
         break;
 
+      errno = 0; /* apr_atoi64() in APR-0.9 does not always set errno */
       APR_ARRAY_PUSH(manifest, apr_off_t) =
                 apr_atoi64(svn_string_create_from_buf(sb, iterpool)->data);
       if (errno == ERANGE)
@@ -2163,7 +2164,7 @@ svn_fs_fs__read_noderev(node_revision_t 
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                                 _("Malformed copyroot line in node-rev"));
 
-      noderev->copyroot_rev = atoi(str);
+      noderev->copyroot_rev = SVN_STR_TO_REV(str);
 
       if (last_str == NULL)
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
@@ -2187,7 +2188,7 @@ svn_fs_fs__read_noderev(node_revision_t 
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                                 _("Malformed copyfrom line in node-rev"));
 
-      noderev->copyfrom_rev = atoi(str);
+      noderev->copyfrom_rev = SVN_STR_TO_REV(str);
 
       if (last_str == NULL)
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
@@ -2419,7 +2420,7 @@ read_rep_line(struct rep_args **rep_args
 
   str = apr_strtok(NULL, " ", &last_str);
   if (! str) goto err;
-  rep_args->base_revision = atol(str);
+  rep_args->base_revision = SVN_STR_TO_REV(str);
 
   str = apr_strtok(NULL, " ", &last_str);
   if (! str) goto err;
@@ -2685,7 +2686,7 @@ set_revision_proplist(svn_fs_t *fs,
 
   SVN_ERR(ensure_revision_exists(fs, rev, pool));
 
-  if (ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT || 
+  if (ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT ||
       rev >= ffd->min_unpacked_revprop)
     {
       const char *final_path = path_revprops(fs, rev, pool);
@@ -2727,9 +2728,9 @@ revision_proplist(apr_hash_t **proplist_
 {
   fs_fs_data_t *ffd = fs->fsap_data;
   apr_hash_t *proplist;
- 
+
   SVN_ERR(ensure_revision_exists(fs, rev, pool));
- 
+
   if (ffd->format < SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT ||
       rev >= ffd->min_unpacked_revprop)
     {
@@ -2737,7 +2738,7 @@ revision_proplist(apr_hash_t **proplist_
       svn_error_t *err = SVN_NO_ERROR;
       int i;
       apr_pool_t *iterpool;
- 
+
       proplist = apr_hash_make(pool);
       iterpool = svn_pool_create(pool);
       for (i = 0; i < RECOVERABLE_RETRY_COUNT; i++)
@@ -3553,7 +3554,7 @@ unparse_dir_entries(apr_hash_t **str_ent
     {
       const void *key;
       apr_ssize_t klen;
-      svn_fs_dirent_t *dirent = svn_apr_hash_index_val(hi);
+      svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
       const char *new_val;
 
       apr_hash_this(hi, &key, &klen, NULL);
@@ -3601,8 +3602,8 @@ parse_dir_entries(apr_hash_t **entries_p
   /* Translate the string dir entries into real entries. */
   for (hi = apr_hash_first(pool, str_entries); hi; hi = apr_hash_next(hi))
     {
-      const char *name = svn_apr_hash_index_key(hi);
-      svn_string_t *str_val = svn_apr_hash_index_val(hi);
+      const char *name = svn__apr_hash_index_key(hi);
+      svn_string_t *str_val = svn__apr_hash_index_val(hi);
       char *str, *last_str;
       svn_fs_dirent_t *dirent = apr_pcalloc(pool, sizeof(*dirent));
 
@@ -3860,6 +3861,15 @@ fold_change(apr_hash_t *changes,
           (SVN_ERR_FS_CORRUPT, NULL,
            _("Invalid change ordering: non-add change on deleted path"));
 
+      /* Sanity check: an add can't follow anything except
+         a delete or reset.  */
+      if ((change->kind == svn_fs_path_change_add)
+          && (old_change->change_kind != svn_fs_path_change_delete)
+          && (old_change->change_kind != svn_fs_path_change_reset))
+        return svn_error_create
+          (SVN_ERR_FS_CORRUPT, NULL,
+           _("Invalid change ordering: add change on preexisting path"));
+
       /* Now, merge that change in. */
       switch (change->kind)
         {
@@ -4138,7 +4148,7 @@ read_change(change_t **change_p,
       if (! str)
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
                                 _("Invalid changes line in rev-file"));
-      change->copyfrom_rev = atol(str);
+      change->copyfrom_rev = SVN_STR_TO_REV(str);
 
       if (! last_str)
         return svn_error_create(SVN_ERR_FS_CORRUPT, NULL,
@@ -4198,8 +4208,8 @@ fetch_all_changes(apr_hash_t *changed_pa
                hi = apr_hash_next(hi))
             {
               /* KEY is the path. */
-              const char *path = svn_apr_hash_index_key(hi);
-              apr_ssize_t klen = svn_apr_hash_index_klen(hi);
+              const char *path = svn__apr_hash_index_key(hi);
+              apr_ssize_t klen = svn__apr_hash_index_klen(hi);
 
               /* If we come across our own path, ignore it. */
               if (strcmp(change->path, path) == 0)
@@ -4595,7 +4605,7 @@ svn_fs_fs__change_txn_prop(svn_fs_txn_t 
 
 svn_error_t *
 svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
-                            apr_array_header_t *props,
+                            const apr_array_header_t *props,
                             apr_pool_t *pool)
 {
   const char *txn_prop_filename;
@@ -5512,7 +5522,7 @@ write_final_rev(const svn_fs_id_t **new_
 
       for (hi = apr_hash_first(pool, entries); hi; hi = apr_hash_next(hi))
         {
-          svn_fs_dirent_t *dirent = svn_apr_hash_index_val(hi);
+          svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
 
           svn_pool_clear(subpool);
           SVN_ERR(write_final_rev(&new_id, file, rev, fs, dirent->id,
@@ -5662,8 +5672,8 @@ write_final_changed_path_info(apr_off_t 
 
       svn_pool_clear(iterpool);
 
-      change = svn_apr_hash_index_val(hi);
-      path = svn_apr_hash_index_key(hi);
+      change = svn__apr_hash_index_val(hi);
+      path = svn__apr_hash_index_key(hi);
 
       id = change->node_rev_id;
 
@@ -5798,7 +5808,7 @@ verify_locks(svn_fs_t *fs,
   changed_paths = apr_array_make(pool, apr_hash_count(changes) + 1,
                                  sizeof(const char *));
   for (hi = apr_hash_first(pool, changes); hi; hi = apr_hash_next(hi))
-    APR_ARRAY_PUSH(changed_paths, const char *) = svn_apr_hash_index_key(hi);
+    APR_ARRAY_PUSH(changed_paths, const char *) = svn__apr_hash_index_key(hi);
   qsort(changed_paths->elts, changed_paths->nelts,
         changed_paths->elt_size, svn_sort_compare_paths);
 
@@ -6144,7 +6154,7 @@ commit_obliteration_body(void *baton, ap
  * to the rep-cache database of FS. */
 static svn_error_t *
 write_reps_to_cache(svn_fs_t *fs,
-                    apr_array_header_t *reps_to_cache,
+                    const apr_array_header_t *reps_to_cache,
                     apr_pool_t *scratch_pool)
 {
   int i;
@@ -6354,7 +6364,7 @@ svn_fs_fs__create(svn_fs_t *fs,
                                                         PATH_REVPROPS_DIR,
                                                         pool),
                                         pool));
-  
+
   /* Create the revprops directory. */
   if (format >= SVN_FS_FS__MIN_PACKED_REVPROP_FORMAT)
     {
@@ -6605,7 +6615,7 @@ recover_find_max_ids(svn_fs_t *fs, svn_r
       svn_fs_id_t *id;
       const char *node_id, *copy_id;
       apr_off_t child_dir_offset;
-      const svn_string_t *path = svn_apr_hash_index_val(hi);
+      const svn_string_t *path = svn__apr_hash_index_val(hi);
 
       svn_pool_clear(iterpool);
 
@@ -7032,8 +7042,8 @@ svn_fs_fs__list_transactions(apr_array_h
   /* Loop through all the entries and return anything that ends with '.txn'. */
   for (hi = apr_hash_first(pool, dirents); hi; hi = apr_hash_next(hi))
     {
-      const char *name = svn_apr_hash_index_key(hi);
-      apr_ssize_t klen = svn_apr_hash_index_klen(hi);
+      const char *name = svn__apr_hash_index_key(hi);
+      apr_ssize_t klen = svn__apr_hash_index_klen(hi);
       const char *id;
 
       /* The name must end with ".txn" to be considered a transaction. */
@@ -7423,20 +7433,20 @@ pack_revprop_shard(svn_fs_t *fs,
   svn_sqlite__stmt_t *stmt;
   svn_stream_t *tmp_stream;
   apr_pool_t *iterpool;
-  
+
   shard_path = svn_dirent_join(revprops_dir,
                                apr_psprintf(pool, "%" APR_INT64_T_FMT, shard),
                                pool);
-  
+
   /* Notify caller we're starting to pack this shard. */
   if (notify_func)
     SVN_ERR(notify_func(notify_baton, shard, svn_fs_pack_notify_start,
                         pool));
-  
+
   start_rev = (svn_revnum_t) (shard * max_files_per_dir);
   end_rev = (svn_revnum_t) ((shard + 1) * (max_files_per_dir) - 1);
   iterpool = svn_pool_create(pool);
-  
+
   /* Iterate over the revisions in this shard, squashing them together. */
   SVN_ERR(svn_sqlite__get_statement(&stmt, ffd->revprop_db, STMT_SET_REVPROP));
   for (rev = start_rev; rev <= end_rev; rev++)
@@ -7449,7 +7459,7 @@ pack_revprop_shard(svn_fs_t *fs,
       SVN_ERR(svn_sqlite__bind_properties(stmt, 2, proplist, pool));
       SVN_ERR(svn_sqlite__insert(NULL, stmt));
     }
-  
+
   /* Update the min-unpacked-rev file to reflect our newly packed shard.
    * (ffd->min_unpacked_rev will be updated by open_pack_or_rev_file().)
    */
@@ -7461,16 +7471,16 @@ pack_revprop_shard(svn_fs_t *fs,
   SVN_ERR(svn_stream_close(tmp_stream));
   SVN_ERR(move_into_place(tmp_path, final_path, final_path, iterpool));
   svn_pool_destroy(iterpool);
-  
+
   /* Finally, remove the existing shard directory. */
   SVN_ERR(svn_io_remove_dir2(shard_path, TRUE, cancel_func, cancel_baton,
                              pool));
-  
+
   /* Notify caller we're starting to pack this shard. */
   if (notify_func)
     SVN_ERR(notify_func(notify_baton, shard, svn_fs_pack_notify_end,
                         pool));
-  
+
   return SVN_NO_ERROR;
 }
 
@@ -7533,7 +7543,7 @@ pack_body(void *baton,
   completed_shards = (youngest + 1) / max_files_per_dir;
 
   /* See if we've already completed all possible shards thus far. */
-  if (min_unpacked_rev == (completed_shards * max_files_per_dir) && 
+  if (min_unpacked_rev == (completed_shards * max_files_per_dir) &&
       min_unpacked_revprop == (completed_shards * max_files_per_dir))
     return SVN_NO_ERROR;
 

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/fs_fs.h Tue Mar 30 20:57:53 2010
@@ -207,7 +207,7 @@ svn_error_t *svn_fs_fs__change_txn_prop(
 /* Change transaction properties in transaction TXN based on PROPS.
    Perform temporary allocations from POOL. */
 svn_error_t *svn_fs_fs__change_txn_props(svn_fs_txn_t *txn,
-                                         apr_array_header_t *props,
+                                         const apr_array_header_t *props,
                                          apr_pool_t *pool);
 
 /* Return whether or not the given FS supports mergeinfo metadata. */

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/lock.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/lock.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/lock.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/lock.c Tue Mar 30 20:57:53 2010
@@ -190,8 +190,8 @@ write_digest_file(apr_hash_t *children,
       for (hi = apr_hash_first(pool, children); hi; hi = apr_hash_next(hi))
         {
           svn_stringbuf_appendbytes(children_list,
-                                    svn_apr_hash_index_key(hi),
-                                    svn_apr_hash_index_klen(hi));
+                                    svn__apr_hash_index_key(hi),
+                                    svn__apr_hash_index_klen(hi));
           svn_stringbuf_appendbytes(children_list, "\n", 1);
         }
       hash_store(hash, CHILDREN_KEY, sizeof(CHILDREN_KEY)-1,
@@ -559,7 +559,7 @@ walk_digest_files(svn_fs_t *fs,
   subpool = svn_pool_create(pool);
   for (hi = apr_hash_first(pool, children); hi; hi = apr_hash_next(hi))
     {
-      const char *digest = svn_apr_hash_index_key(hi);
+      const char *digest = svn__apr_hash_index_key(hi);
       svn_pool_clear(subpool);
       SVN_ERR(walk_digest_files
               (fs, digest_path_from_digest(fs, digest, subpool),

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/tree.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/tree.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/tree.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_fs_fs/tree.c Tue Mar 30 20:57:53 2010
@@ -1380,9 +1380,9 @@ merge(svn_stringbuf_t *conflict_p,
 
       svn_pool_clear(iterpool);
 
-      name = svn_apr_hash_index_key(hi);
-      klen = svn_apr_hash_index_klen(hi);
-      a_entry = svn_apr_hash_index_val(hi);
+      name = svn__apr_hash_index_key(hi);
+      klen = svn__apr_hash_index_klen(hi);
+      a_entry = svn__apr_hash_index_val(hi);
 
       s_entry = apr_hash_get(s_entries, name, klen);
       t_entry = apr_hash_get(t_entries, name, klen);
@@ -1510,13 +1510,13 @@ merge(svn_stringbuf_t *conflict_p,
        hi = apr_hash_next(hi))
     {
       svn_fs_dirent_t *s_entry, *t_entry;
-      const char *name = svn_apr_hash_index_key(hi);
-      apr_ssize_t klen = svn_apr_hash_index_klen(hi);
+      const char *name = svn__apr_hash_index_key(hi);
+      apr_ssize_t klen = svn__apr_hash_index_klen(hi);
       dag_node_t *s_ent_node;
 
       svn_pool_clear(iterpool);
 
-      s_entry = svn_apr_hash_index_val(hi);
+      s_entry = svn__apr_hash_index_val(hi);
       t_entry = apr_hash_get(t_entries, name, klen);
 
       /* If NAME exists in TARGET, declare a conflict. */
@@ -2188,7 +2188,7 @@ fs_copied_from(svn_revnum_t *rev_p,
           /* Parse the copyfrom string for our cached entry. */
           buf = apr_pstrdup(pool, copyfrom_str);
           str = apr_strtok(buf, " ", &last_str);
-          copyfrom_rev = atol(str);
+          copyfrom_rev = SVN_STR_TO_REV(str);
           copyfrom_path = last_str;
         }
     }
@@ -3410,7 +3410,7 @@ crawl_directory_dag_for_mergeinfo(svn_fs
        hi;
        hi = apr_hash_next(hi))
     {
-      svn_fs_dirent_t *dirent = svn_apr_hash_index_val(hi);
+      svn_fs_dirent_t *dirent = svn__apr_hash_index_val(hi);
       const char *kid_path;
       dag_node_t *kid_dag;
       svn_boolean_t has_mergeinfo, go_down;
@@ -3482,8 +3482,8 @@ append_to_merged_froms(svn_mergeinfo_t *
 
   for (hi = apr_hash_first(pool, input); hi; hi = apr_hash_next(hi))
     {
-      const char *path = svn_apr_hash_index_key(hi);
-      apr_array_header_t *rangelist = svn_apr_hash_index_val(hi);
+      const char *path = svn__apr_hash_index_key(hi);
+      apr_array_header_t *rangelist = svn__apr_hash_index_val(hi);
       char *newpath;
 
       newpath = svn_uri_join(path, path_piece, pool);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra/compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra/compat.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra/compat.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra/compat.c Tue Mar 30 20:57:53 2010
@@ -284,7 +284,7 @@ svn_ra__locations_from_log(svn_ra_sessio
                            apr_hash_t **locations_p,
                            const char *path,
                            svn_revnum_t peg_revision,
-                           apr_array_header_t *location_revisions,
+                           const apr_array_header_t *location_revisions,
                            apr_pool_t *pool)
 {
   apr_hash_t *locations = apr_hash_make(pool);

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.c Tue Mar 30 20:57:53 2010
@@ -880,7 +880,7 @@ svn_error_t *svn_ra_get_locations(svn_ra
                                   apr_hash_t **locations,
                                   const char *path,
                                   svn_revnum_t peg_revision,
-                                  apr_array_header_t *location_revisions,
+                                  const apr_array_header_t *location_revisions,
                                   apr_pool_t *pool)
 {
   svn_error_t *err;
@@ -971,7 +971,7 @@ svn_error_t *svn_ra_lock(svn_ra_session_
 
   for (hi = apr_hash_first(pool, path_revs); hi; hi = apr_hash_next(hi))
     {
-      const char *path = svn_apr_hash_index_key(hi);
+      const char *path = svn__apr_hash_index_key(hi);
 
       SVN_ERR_ASSERT(*path != '/');
     }
@@ -996,7 +996,7 @@ svn_error_t *svn_ra_unlock(svn_ra_sessio
 
   for (hi = apr_hash_first(pool, path_tokens); hi; hi = apr_hash_next(hi))
     {
-      const char *path = svn_apr_hash_index_key(hi);
+      const char *path = svn__apr_hash_index_key(hi);
 
       SVN_ERR_ASSERT(*path != '/');
     }

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.h
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.h?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.h (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra/ra_loader.h Tue Mar 30 20:57:53 2010
@@ -192,7 +192,7 @@ typedef struct svn_ra__vtable_t {
                                 apr_hash_t **locations,
                                 const char *path,
                                 svn_revnum_t peg_revision,
-                                apr_array_header_t *location_revisions,
+                                const apr_array_header_t *location_revisions,
                                 apr_pool_t *pool);
   svn_error_t *(*get_location_segments)(svn_ra_session_t *session,
                                         const char *path,
@@ -330,7 +330,7 @@ svn_ra__locations_from_log(svn_ra_sessio
                            apr_hash_t **locations_p,
                            const char *path,
                            svn_revnum_t peg_revision,
-                           apr_array_header_t *location_revisions,
+                           const apr_array_header_t *location_revisions,
                            apr_pool_t *pool);
 
 /**

Modified: subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/ra_plugin.c
URL: http://svn.apache.org/viewvc/subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/ra_plugin.c?rev=929279&r1=929278&r2=929279&view=diff
==============================================================================
--- subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/ra_plugin.c (original)
+++ subversion/branches/svn-patch-improvements/subversion/libsvn_ra_local/ra_plugin.c Tue Mar 30 20:57:53 2010
@@ -1160,7 +1160,7 @@ svn_ra_local__get_locations(svn_ra_sessi
                             apr_hash_t **locations,
                             const char *path,
                             svn_revnum_t peg_revision,
-                            apr_array_header_t *location_revisions,
+                            const apr_array_header_t *location_revisions,
                             apr_pool_t *pool)
 {
   svn_ra_local__session_baton_t *sess = session->priv;