subversion-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From s...@apache.org
Subject svn commit: r1205355 [2/2] - in /subversion/branches/moves-scan-log: ./ contrib/client-side/emacs/ notes/ subversion/libsvn_client/ subversion/libsvn_delta/ subversion/libsvn_fs_fs/ subversion/libsvn_ra_svn/ subversion/libsvn_subr/ subversion/libsvn_wc...
Date Wed, 23 Nov 2011 10:32:53 GMT
Modified: subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.c Wed Nov 23 10:32:50 2011
@@ -147,13 +147,56 @@ svn_client__record_wc_mergeinfo(const ch
   return SVN_NO_ERROR;
 }
 
+svn_error_t *
+svn_client__record_wc_mergeinfo_catalog(apr_hash_t *result_catalog,
+                                        svn_client_ctx_t *ctx,
+                                        apr_pool_t *scratch_pool)
+{
+  apr_pool_t *iterpool = svn_pool_create(scratch_pool);
+
+  if (apr_hash_count(result_catalog))
+    {
+      int i;
+      apr_array_header_t *sorted_cat =
+        svn_sort__hash(result_catalog, svn_sort_compare_items_as_paths,
+                       scratch_pool);
+      for (i = 0; i < sorted_cat->nelts; i++)
+        {
+          svn_sort__item_t elt = APR_ARRAY_IDX(sorted_cat, i,
+                                               svn_sort__item_t);
+          svn_error_t *err;
+
+          svn_pool_clear(iterpool);
+          err = svn_client__record_wc_mergeinfo(elt.key, elt.value, TRUE,
+                                                ctx, iterpool);
+
+          if (err && err->apr_err == SVN_ERR_ENTRY_NOT_FOUND)
+            {
+              /* PATH isn't just missing, it's not even versioned as far
+                 as this working copy knows.  But it was included in
+                 MERGES, which means that the server knows about it.
+                 Likely we don't have access to the source due to authz
+                 restrictions.  For now just clear the error and
+                 continue... */
+              svn_error_clear(err);
+            }
+          else
+            {
+              SVN_ERR(err);
+            }
+        }
+    }
+  svn_pool_destroy(iterpool);
+  return SVN_NO_ERROR;
+}
+
 /*-----------------------------------------------------------------------*/
 
 /*** Retrieving mergeinfo. ***/
 
 svn_error_t *
 svn_client__get_wc_mergeinfo(svn_mergeinfo_t *mergeinfo,
-                             svn_boolean_t *inherited,
+                             svn_boolean_t *inherited_p,
                              svn_mergeinfo_inheritance_t inherit,
                              const char *local_abspath,
                              const char *limit_abspath,
@@ -167,6 +210,7 @@ svn_client__get_wc_mergeinfo(svn_mergein
   svn_mergeinfo_t wc_mergeinfo;
   svn_revnum_t base_revision;
   apr_pool_t *iterpool;
+  svn_boolean_t inherited;
 
   SVN_ERR_ASSERT(svn_dirent_is_absolute(local_abspath));
   if (limit_abspath)
@@ -269,7 +313,7 @@ svn_client__get_wc_mergeinfo(svn_mergein
   if (svn_path_is_empty(walk_relpath))
     {
       /* Mergeinfo is explicit. */
-      *inherited = FALSE;
+      inherited = FALSE;
       *mergeinfo = wc_mergeinfo;
     }
   else
@@ -277,7 +321,7 @@ svn_client__get_wc_mergeinfo(svn_mergein
       /* Mergeinfo may be inherited. */
       if (wc_mergeinfo)
         {
-          *inherited = TRUE;
+          inherited = TRUE;
           SVN_ERR(svn_mergeinfo__add_suffix_to_mergeinfo(mergeinfo,
                                                          wc_mergeinfo,
                                                          walk_relpath,
@@ -286,7 +330,7 @@ svn_client__get_wc_mergeinfo(svn_mergein
         }
       else
         {
-          *inherited = FALSE;
+          inherited = FALSE;
           *mergeinfo = NULL;
         }
     }
@@ -296,7 +340,7 @@ svn_client__get_wc_mergeinfo(svn_mergein
 
   /* Remove non-inheritable mergeinfo and paths mapped to empty ranges
      which may occur if WCPATH's mergeinfo is not explicit. */
-  if (*inherited
+  if (inherited
       && apr_hash_count(*mergeinfo)) /* Nothing to do for empty mergeinfo. */
     {
       SVN_ERR(svn_mergeinfo_inheritable2(mergeinfo, *mergeinfo, NULL,
@@ -305,6 +349,9 @@ svn_client__get_wc_mergeinfo(svn_mergein
       svn_mergeinfo__remove_empty_rangelists(*mergeinfo, result_pool);
     }
 
+  if (inherited_p)
+    *inherited_p = inherited;
+
   return SVN_NO_ERROR;
 }
 
@@ -335,7 +382,8 @@ svn_client__get_wc_mergeinfo_catalog(svn
     {
       if (walked_path)
         *walked_path = "";
-      *inherited = FALSE;
+      if (inherited)
+        *inherited = FALSE;
       return SVN_NO_ERROR;
     }
 
@@ -545,7 +593,7 @@ svn_client__get_wc_or_repos_mergeinfo(sv
 svn_error_t *
 svn_client__get_wc_or_repos_mergeinfo_catalog(
   svn_mergeinfo_catalog_t *target_mergeinfo_catalog,
-  svn_boolean_t *inherited,
+  svn_boolean_t *inherited_p,
   svn_boolean_t *from_repos,
   svn_boolean_t include_descendants,
   svn_boolean_t repos_only,
@@ -587,8 +635,9 @@ svn_client__get_wc_or_repos_mergeinfo_ca
 
   if (!repos_only)
     {
+      svn_boolean_t inherited;
       SVN_ERR(svn_client__get_wc_mergeinfo_catalog(&target_mergeinfo_cat_wc,
-                                                   inherited,
+                                                   &inherited,
                                                    include_descendants,
                                                    inherit,
                                                    local_abspath,
@@ -597,11 +646,13 @@ svn_client__get_wc_or_repos_mergeinfo_ca
                                                    ctx,
                                                    result_pool,
                                                    scratch_pool));
+      if (inherited_p)
+        *inherited_p = inherited;
 
       /* If we want LOCAL_ABSPATH's inherited mergeinfo, were we able to
          get it from the working copy?  If not, then we must ask the
          repository. */
-      if (! ((*inherited)
+      if (! (inherited
              || (inherit == svn_mergeinfo_explicit)
              || (repos_relpath
                  && target_mergeinfo_cat_wc
@@ -659,7 +710,8 @@ svn_client__get_wc_or_repos_mergeinfo_ca
                                   repos_relpath,
                                   APR_HASH_KEY_STRING))
                 {
-                  *inherited = TRUE;
+                  if (inherited_p)
+                    *inherited_p = TRUE;
                   if (from_repos)
                     *from_repos = TRUE;
                 }
@@ -922,7 +974,7 @@ svn_client__elide_mergeinfo(const char *
         return SVN_NO_ERROR;
 
       /* Get TARGET_WCPATH's inherited mergeinfo from the WC. */
-      err = svn_client__get_wc_mergeinfo(&mergeinfo, &inherited,
+      err = svn_client__get_wc_mergeinfo(&mergeinfo, NULL,
                                          svn_mergeinfo_nearest_ancestor,
                                          target_abspath,
                                          limit_abspath,
@@ -947,7 +999,7 @@ svn_client__elide_mergeinfo(const char *
       if (!mergeinfo && !wc_elision_limit_path)
         {
           err = svn_client__get_wc_or_repos_mergeinfo(
-            &mergeinfo, &inherited, NULL, TRUE,
+            &mergeinfo, NULL, NULL, TRUE,
             svn_mergeinfo_nearest_ancestor,
             NULL, target_wcpath, ctx, pool);
           if (err)
@@ -1059,11 +1111,9 @@ get_mergeinfo(svn_mergeinfo_catalog_t *m
     }
   else /* ! svn_path_is_url() */
     {
-      svn_boolean_t inherited;
-
       /* Acquire return values. */
       SVN_ERR(svn_client__get_wc_or_repos_mergeinfo_catalog(
-        mergeinfo_catalog, &inherited, NULL, include_descendants, FALSE,
+        mergeinfo_catalog, NULL, NULL, include_descendants, FALSE,
         ignore_invalid_mergeinfo, svn_mergeinfo_inherited,
         ra_session, path_or_url, ctx,
         result_pool, scratch_pool));
@@ -1480,15 +1530,30 @@ filter_log_entry_with_rangelist(void *ba
                                                       iterpool));
                       if (intersection->nelts)
                         {
-                          SVN_ERR(svn_rangelist_intersect(&intersection,
-                                                          rangelist,
-                                                          this_rev_rangelist,
-                                                          TRUE, iterpool));
-                          if (intersection->nelts)
+                          if (ancestor_is_self)
                             {
+                              /* TARGET_PATH_AFFECTED has explicit mergeinfo,
+                                 so we don't need to worry if that mergeinfo
+                                 is inheritable or not. */
                               found_this_revision = TRUE;
                               break;
                             }
+                          else
+                            {
+                              /* TARGET_PATH_AFFECTED inherited its mergeinfo,
+                                 se we have to ignore non-inheritable
+                                 ranges. */
+                              SVN_ERR(svn_rangelist_intersect(
+                                &intersection,
+                                rangelist,
+                                this_rev_rangelist,
+                                TRUE, iterpool));
+                              if (intersection->nelts)
+                                {
+                                  found_this_revision = TRUE;
+                                  break;
+                                }
+                            }
                         }
                     }
                 }

Modified: subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.h
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.h?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.h (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_client/mergeinfo.h Wed Nov 23 10:32:50 2011
@@ -99,7 +99,8 @@ svn_client__merge_path_create(const char
 
 /* Find explicit or inherited WC mergeinfo for LOCAL_ABSPATH, and return it
    in *MERGEINFO (NULL if no mergeinfo is set).  Set *INHERITED to
-   whether the mergeinfo was inherited (TRUE or FALSE).
+   whether the mergeinfo was inherited (TRUE or FALSE), if INHERITED is
+   non-null.
 
    This function will search for inherited mergeinfo in the parents of
    LOCAL_ABSPATH only if the base revision of LOCAL_ABSPATH falls within
@@ -233,7 +234,7 @@ svn_client__get_repos_mergeinfo_catalog(
 
    If TARGET_WCPATH inherited its mergeinfo from a working copy ancestor
    or if it was obtained from the repository, set *INHERITED to TRUE, set it
-   to FALSE otherwise. */
+   to FALSE otherwise, if INHERITED is non-null. */
 svn_error_t *
 svn_client__get_wc_or_repos_mergeinfo(svn_mergeinfo_t *target_mergeinfo,
                                       svn_boolean_t *inherited,
@@ -320,6 +321,13 @@ svn_client__record_wc_mergeinfo(const ch
                                 svn_client_ctx_t *ctx,
                                 apr_pool_t *scratch_pool);
 
+/* Write mergeinfo into the WC.  RESULT_CATALOG maps (const char *) WC paths
+ * to (svn_mergeinfo_t) mergeinfo. */
+svn_error_t *
+svn_client__record_wc_mergeinfo_catalog(apr_hash_t *result_catalog,
+                                        svn_client_ctx_t *ctx,
+                                        apr_pool_t *scratch_pool);
+
 /* Elide any svn:mergeinfo set on TARGET_WCPATH to its nearest working
    copy (or possibly repository) ancestor with equivalent mergeinfo.
 

Modified: subversion/branches/moves-scan-log/subversion/libsvn_delta/compat.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_delta/compat.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_delta/compat.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_delta/compat.c Wed Nov 23 10:32:50 2011
@@ -99,11 +99,15 @@ typedef svn_error_t *(*start_edit_func_t
     apr_pool_t *result_pool,
     void **root_baton);
 
+typedef svn_error_t *(*target_revision_func_t)(
+    void *baton,
+    svn_revnum_t target_revision,
+    apr_pool_t *scratch_pool);
+
 struct ev2_edit_baton
 {
   svn_editor_t *editor;
   apr_hash_t *paths;
-  svn_revnum_t target_revision;
   apr_pool_t *edit_pool;
 
   svn_boolean_t *found_abs_paths; /* Did we strip an incoming '/' from the
@@ -116,6 +120,9 @@ struct ev2_edit_baton
 
   svn_delta_fetch_props_func_t fetch_props_func;
   void *fetch_props_baton;
+
+  target_revision_func_t target_revision_func;
+  void *target_revision_baton;
 };
 
 struct ev2_dir_baton
@@ -128,6 +135,7 @@ struct ev2_file_baton
 {
   struct ev2_edit_baton *eb;
   const char *path;
+  const char *delta_base;
 };
 
 enum action_code_t
@@ -138,7 +146,9 @@ enum action_code_t
   ACTION_PROPSET,
   ACTION_PUT,
   ACTION_ADD,
-  ACTION_DELETE
+  ACTION_DELETE,
+  ACTION_ADD_ABSENT,
+  ACTION_SET_TEXT
 };
 
 struct path_action
@@ -196,7 +206,7 @@ process_actions(void *edit_baton,
   apr_hash_t *props = NULL;
   svn_boolean_t need_add = FALSE;
   apr_array_header_t *children;
-  svn_stream_t *contents;
+  svn_stream_t *contents = NULL;
   svn_kind_t kind;
   int i;
 
@@ -258,12 +268,21 @@ process_actions(void *edit_baton,
                 }
               else
                 {
-                  /* ### Someday, we'll need the real contents here. */
+                  /* The default is an empty file. */
                   contents = svn_stream_empty(scratch_pool);
                 }
               break;
             }
 
+          case ACTION_SET_TEXT:
+            {
+              const char *src_path = action->args;
+
+              SVN_ERR(svn_stream_open_readonly(&contents, src_path,
+                                               scratch_pool, scratch_pool));
+              break;
+            }
+
           case ACTION_COPY:
             {
               struct copy_args *c_args = action->args;
@@ -274,6 +293,14 @@ process_actions(void *edit_baton,
               break;
             }
 
+          case ACTION_ADD_ABSENT:
+            {
+              kind = *((svn_kind_t *) action->args);
+              SVN_ERR(svn_editor_add_absent(eb->editor, path, kind,
+                                            SVN_INVALID_REVNUM));
+              break;
+            }
+
           default:
             SVN_ERR_MALFUNCTION();
         }
@@ -301,8 +328,15 @@ process_actions(void *edit_baton,
         {
           /* We fetched and modified the props in some way. Apply 'em now that
              we have the new set.  */
-          SVN_ERR(svn_editor_set_props(eb->editor, path, eb->target_revision,
-                                       props, TRUE));
+          SVN_ERR(svn_editor_set_props(eb->editor, path, SVN_INVALID_REVNUM,
+                                       props, contents == NULL));
+        }
+
+      if (contents)
+        {
+          /* If we have an content for this node, set it now. */
+          SVN_ERR(svn_editor_set_text(eb->editor, path, SVN_INVALID_REVNUM,
+                                      NULL, contents));
         }
     }
 
@@ -347,7 +381,8 @@ ev2_set_target_revision(void *edit_baton
 {
   struct ev2_edit_baton *eb = edit_baton;
 
-  eb->target_revision = target_revision;
+  SVN_ERR(eb->target_revision_func(eb->target_revision_baton, target_revision,
+                                   scratch_pool));
   return SVN_NO_ERROR;
 }
 
@@ -470,6 +505,11 @@ ev2_absent_directory(const char *path,
                      apr_pool_t *scratch_pool)
 {
   struct ev2_dir_baton *pb = parent_baton;
+  svn_kind_t *kind = apr_palloc(pb->eb->edit_pool, sizeof(*kind));
+  
+  *kind = svn_kind_dir;
+  SVN_ERR(add_action(pb->eb, path, ACTION_ADD_ABSENT, kind));
+
   return SVN_NO_ERROR;
 }
 
@@ -486,6 +526,7 @@ ev2_add_file(const char *path,
 
   fb->eb = pb->eb;
   fb->path = apr_pstrdup(result_pool, path);
+  fb->delta_base = NULL;
   *file_baton = fb;
 
   if (!copyfrom_path)
@@ -521,11 +562,35 @@ ev2_open_file(const char *path,
 
   fb->eb = pb->eb;
   fb->path = apr_pstrdup(result_pool, path);
+  fb->delta_base = NULL;
 
   *file_baton = fb;
   return SVN_NO_ERROR;
 }
 
+struct handler_baton
+{
+  svn_txdelta_window_handler_t apply_handler;
+  void *apply_baton;
+
+  apr_pool_t *pool;
+};
+
+static svn_error_t *
+window_handler(svn_txdelta_window_t *window, void *baton)
+{
+  struct handler_baton *hb = baton;
+  svn_error_t *err;
+
+  err = hb->apply_handler(window, hb->apply_baton);
+  if (window != NULL && !err)
+    return SVN_NO_ERROR;
+
+  svn_pool_destroy(hb->pool);
+
+  return SVN_NO_ERROR;
+}
+
 
 static svn_error_t *
 ev2_apply_textdelta(void *file_baton,
@@ -535,9 +600,31 @@ ev2_apply_textdelta(void *file_baton,
                     void **handler_baton)
 {
   struct ev2_file_baton *fb = file_baton;
+  apr_pool_t *handler_pool = svn_pool_create(fb->eb->edit_pool);
+  struct handler_baton *hb = apr_pcalloc(handler_pool, sizeof(*hb));
+  const char *target_path;
+  svn_stream_t *source;
+  svn_stream_t *target;
+
+  if (! fb->delta_base)
+    source = svn_stream_empty(handler_pool);
+
+  SVN_ERR(svn_stream_open_unique(&target, &target_path, NULL,
+                                 svn_io_file_del_on_pool_cleanup,
+                                 fb->eb->edit_pool, result_pool));
+
+  svn_txdelta_apply(source, target,
+                    NULL, NULL,
+                    handler_pool,
+                    &hb->apply_handler, &hb->apply_baton);
+
+  hb->pool = handler_pool;
+                    
+  *handler_baton = hb;
+  *handler = window_handler;
+
+  SVN_ERR(add_action(fb->eb, fb->path, ACTION_SET_TEXT, (void *)target_path));
 
-  *handler_baton = NULL;
-  *handler = svn_delta_noop_window_handler;
   return SVN_NO_ERROR;
 }
 
@@ -572,6 +659,11 @@ ev2_absent_file(const char *path,
                 apr_pool_t *scratch_pool)
 {
   struct ev2_dir_baton *pb = parent_baton;
+  svn_kind_t *kind = apr_palloc(pb->eb->edit_pool, sizeof(*kind));
+  
+  *kind = svn_kind_file;
+  SVN_ERR(add_action(pb->eb, path, ACTION_ADD_ABSENT, kind));
+
   return SVN_NO_ERROR;
 }
 
@@ -616,6 +708,19 @@ start_edit_func(void *baton,
 }
 
 static svn_error_t *
+target_revision_func(void *baton,
+                     svn_revnum_t target_revision,
+                     apr_pool_t *scratch_pool)
+{
+  struct start_edit_baton *seb = baton;
+
+  SVN_ERR(seb->deditor->set_target_revision(seb->dedit_baton, target_revision,
+                                            scratch_pool));
+
+  return SVN_NO_ERROR;
+}
+
+static svn_error_t *
 delta_from_editor(const svn_delta_editor_t **deditor,
                   void **dedit_baton,
                   svn_editor_t *editor,
@@ -624,6 +729,8 @@ delta_from_editor(const svn_delta_editor
                   void *fetch_props_baton,
                   start_edit_func_t start_edit,
                   void *start_edit_baton,
+                  target_revision_func_t target_revision,
+                  void *target_revision_baton,
                   apr_pool_t *pool)
 {
   /* Static 'cause we don't want it to be on the stack. */
@@ -649,7 +756,6 @@ delta_from_editor(const svn_delta_editor
 
   eb->editor = editor;
   eb->paths = apr_hash_make(pool);
-  eb->target_revision = SVN_INVALID_REVNUM;
   eb->edit_pool = pool;
   eb->found_abs_paths = found_abs_paths;
 
@@ -659,6 +765,9 @@ delta_from_editor(const svn_delta_editor
   eb->start_edit = start_edit;
   eb->start_edit_baton = start_edit_baton;
 
+  eb->target_revision_func = target_revision;
+  eb->target_revision_baton = target_revision_baton;
+
   *dedit_baton = eb;
   *deditor = &delta_editor;
 
@@ -675,6 +784,7 @@ struct operation {
     OP_DELETE,
     OP_ADD,
     OP_REPLACE,
+    OP_ADD_ABSENT,
     OP_PROPSET           /* only for files for which no other operation is
                             occuring; directories are OP_OPEN with non-empty
                             props */
@@ -790,8 +900,12 @@ build(struct editor_baton *eb,
       apr_hash_t *current_props;
       apr_array_header_t *propdiffs;
 
-      SVN_ERR(eb->fetch_kind_func(&operation->kind, eb->fetch_kind_baton,
-                                  relpath, scratch_pool));
+      if (kind == svn_kind_unknown)
+        SVN_ERR(eb->fetch_kind_func(&operation->kind, eb->fetch_kind_baton,
+                                    relpath, scratch_pool));
+      else
+        operation->kind = kind;
+
       SVN_ERR(eb->fetch_props_func(&current_props, eb->fetch_props_baton,
                                    relpath, scratch_pool, scratch_pool));
 
@@ -827,6 +941,9 @@ build(struct editor_baton *eb,
   if (action == ACTION_DELETE)
     operation->operation = OP_DELETE;
 
+  else if (action == ACTION_ADD_ABSENT)
+    operation->operation = OP_ADD_ABSENT;
+
   /* Handle copy operations (which can be adds or replacements). */
   else if (action == ACTION_COPY)
     {
@@ -907,6 +1024,11 @@ add_directory_cb(void *baton,
                 NULL, SVN_INVALID_REVNUM,
                 NULL, NULL, SVN_INVALID_REVNUM, scratch_pool));
 
+  if (props && apr_hash_count(props) > 0)
+    SVN_ERR(build(eb, ACTION_PROPSET, relpath, svn_kind_dir,
+                  NULL, SVN_INVALID_REVNUM, props,
+                  NULL, SVN_INVALID_REVNUM, scratch_pool));
+
   return SVN_NO_ERROR;
 }
 
@@ -937,6 +1059,11 @@ add_file_cb(void *baton,
                 NULL, SVN_INVALID_REVNUM,
                 NULL, tmp_filename, SVN_INVALID_REVNUM, scratch_pool));
 
+  if (props && apr_hash_count(props) > 0)
+    SVN_ERR(build(eb, ACTION_PROPSET, relpath, svn_kind_file,
+                  NULL, SVN_INVALID_REVNUM, props,
+                  NULL, SVN_INVALID_REVNUM, scratch_pool));
+
   return SVN_NO_ERROR;
 }
 
@@ -968,6 +1095,10 @@ add_absent_cb(void *baton,
 
   SVN_ERR(ensure_root_opened(eb));
 
+  SVN_ERR(build(eb, ACTION_ADD_ABSENT, relpath, kind,
+                NULL, SVN_INVALID_REVNUM,
+                NULL, NULL, SVN_INVALID_REVNUM, scratch_pool));
+
   return SVN_NO_ERROR;
 }
 
@@ -984,7 +1115,7 @@ set_props_cb(void *baton,
 
   SVN_ERR(ensure_root_opened(eb));
 
-  SVN_ERR(build(eb, ACTION_PROPSET, relpath, svn_kind_none,
+  SVN_ERR(build(eb, ACTION_PROPSET, relpath, svn_kind_unknown,
                 NULL, SVN_INVALID_REVNUM,
                 props, NULL, SVN_INVALID_REVNUM, scratch_pool));
 
@@ -1137,10 +1268,10 @@ change_props(const svn_delta_editor_t *e
 }
 
 static svn_error_t *
-drive(const struct operation *operation,
-      const svn_delta_editor_t *editor,
-      svn_boolean_t *make_abs_paths,
-      apr_pool_t *scratch_pool)
+drive_tree(const struct operation *operation,
+           const svn_delta_editor_t *editor,
+           svn_boolean_t *make_abs_paths,
+           apr_pool_t *scratch_pool)
 {
   apr_pool_t *iterpool = svn_pool_create(scratch_pool);
   apr_hash_index_t *hi;
@@ -1192,6 +1323,15 @@ drive(const struct operation *operation,
                                      &file_baton));
         }
 
+      if (child->operation == OP_ADD_ABSENT)
+        {
+          if (child->kind == svn_kind_dir)
+            SVN_ERR(editor->absent_directory(path, operation->baton,
+                                             iterpool));
+          else
+            SVN_ERR(editor->absent_file(path, operation->baton, iterpool));
+        }
+
       if (child->src_file && file_baton)
         {
           /* We need to change textual contents. */
@@ -1224,7 +1364,7 @@ drive(const struct operation *operation,
                     || child->operation == OP_PROPSET
                     || child->operation == OP_ADD))
         {
-          SVN_ERR(drive(child, editor, make_abs_paths, iterpool));
+          SVN_ERR(drive_tree(child, editor, make_abs_paths, iterpool));
           SVN_ERR(change_props(editor, child->baton, child, iterpool));
           SVN_ERR(editor->close_directory(child->baton, iterpool));
         }
@@ -1242,7 +1382,7 @@ complete_cb(void *baton,
   svn_error_t *err;
 
   /* Drive the tree we've created. */
-  err = drive(&eb->root, eb->deditor, eb->make_abs_paths, scratch_pool);
+  err = drive_tree(&eb->root, eb->deditor, eb->make_abs_paths, scratch_pool);
   if (!err)
      err = eb->deditor->close_edit(eb->dedit_baton, scratch_pool);
   if (err)
@@ -1264,7 +1404,7 @@ abort_cb(void *baton,
      point. */
 
   /* Drive the tree we've created. */
-  err = drive(&eb->root, eb->deditor, eb->make_abs_paths, scratch_pool);
+  err = drive_tree(&eb->root, eb->deditor, eb->make_abs_paths, scratch_pool);
 
   err2 = eb->deditor->abort_edit(eb->dedit_baton, scratch_pool);
 
@@ -1373,7 +1513,7 @@ svn_editor__insert_shims(const svn_delta
 
   /* The reason this is a pointer is that we don't know the appropriate
      value until we start receiving paths.  So process_actions() sets the
-     flag, which drive() later consumes. */
+     flag, which drive_tree() later consumes. */
   svn_boolean_t *found_abs_paths = apr_palloc(result_pool,
                                               sizeof(*found_abs_paths));
 
@@ -1392,6 +1532,7 @@ svn_editor__insert_shims(const svn_delta
                             shim_callbacks->fetch_props_func,
                             shim_callbacks->fetch_props_baton,
                             start_edit_func, seb,
+                            target_revision_func, seb,
                             result_pool));
 
 #endif

Modified: subversion/branches/moves-scan-log/subversion/libsvn_delta/editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_delta/editor.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_delta/editor.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_delta/editor.c Wed Nov 23 10:32:50 2011
@@ -605,7 +605,8 @@ svn_editor_complete(svn_editor_t *editor
 
   err = editor->funcs.cb_complete(editor->baton, editor->scratch_pool);
 #ifdef ENABLE_ORDERING_CHECK
-  editor->finished = TRUE;
+  if (!err)
+    editor->finished = TRUE;
 #endif
   svn_pool_clear(editor->scratch_pool);
   return err;

Modified: subversion/branches/moves-scan-log/subversion/libsvn_fs_fs/fs_fs.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_fs_fs/fs_fs.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_fs_fs/fs_fs.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_fs_fs/fs_fs.c Wed Nov 23 10:32:50 2011
@@ -5600,7 +5600,7 @@ rep_write_contents_close(void *baton)
           /* Something's wrong with the rep-sharing index.  We can continue
              without rep-sharing, but warn.
            */
-          (b->fs->warning)(b->fs->warning_baton, svn_error_root_cause(err));
+          (b->fs->warning)(b->fs->warning_baton, err);
           svn_error_clear(err);
           old_rep = NULL;
         }

Modified: subversion/branches/moves-scan-log/subversion/libsvn_ra_svn/client.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_ra_svn/client.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_ra_svn/client.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_ra_svn/client.c Wed Nov 23 10:32:50 2011
@@ -1166,15 +1166,12 @@ static svn_error_t *ra_svn_get_dir(svn_r
 static svn_tristate_t
 optbool_to_tristate(apr_uint64_t v)
 {
-  switch (v)
-  {
-    case TRUE:
-      return svn_tristate_true;
-    case FALSE:
-      return svn_tristate_false;
-    default: /* Contains SVN_RA_SVN_UNSPECIFIED_NUMBER */
-      return svn_tristate_unknown;
-  }
+  if (v == TRUE)
+    return svn_tristate_true;
+  if (v == FALSE)
+    return svn_tristate_false;
+
+  return svn_tristate_unknown; /* Contains SVN_RA_SVN_UNSPECIFIED_NUMBER */
 }
 
 /* If REVISION is SVN_INVALID_REVNUM, no value is sent to the

Modified: subversion/branches/moves-scan-log/subversion/libsvn_subr/io.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_subr/io.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_subr/io.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_subr/io.c Wed Nov 23 10:32:50 2011
@@ -2980,6 +2980,13 @@ svn_io_is_binary_data(const void *data, 
 {
   const unsigned char *buf = data;
 
+  if (len == 3 && buf[0] == 0xEF && buf[1] == 0xBB && buf[2] == 0xBF)
+    {
+      /* This is an empty UTF-8 file which only contains the UTF-8 BOM.
+       * Treat it as plain text. */
+      return FALSE;
+    }
+
   /* Right now, this function is going to be really stupid.  It's
      going to examine the block of data, and make sure that 15%
      of the bytes are such that their value is in the ranges 0x07-0x0D

Modified: subversion/branches/moves-scan-log/subversion/libsvn_wc/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_wc/status.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_wc/status.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_wc/status.c Wed Nov 23 10:32:50 2011
@@ -2455,6 +2455,7 @@ svn_wc_get_status_editor5(const svn_delt
   struct edit_baton *eb;
   svn_delta_editor_t *tree_editor = svn_delta_default_editor(result_pool);
   void *inner_baton;
+  struct svn_wc__shim_fetch_baton_t *sfb;
   const svn_delta_editor_t *inner_editor;
   svn_delta_shim_callbacks_t *shim_callbacks =
                                 svn_delta_shim_callbacks_default(result_pool);
@@ -2545,6 +2546,15 @@ svn_wc_get_status_editor5(const svn_delt
   if (set_locks_baton)
     *set_locks_baton = eb;
 
+  sfb = apr_palloc(result_pool, sizeof(*sfb));
+  sfb->db = wc_ctx->db;
+  sfb->base_abspath = eb->target_abspath;
+
+  shim_callbacks->fetch_kind_func = svn_wc__fetch_kind_func;
+  shim_callbacks->fetch_kind_baton = sfb;
+  shim_callbacks->fetch_props_func = svn_wc__fetch_props_func;
+  shim_callbacks->fetch_props_baton = sfb;
+
   SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton,
                                    shim_callbacks,
                                    result_pool, scratch_pool));

Modified: subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_wc/update_editor.c Wed Nov 23 10:32:50 2011
@@ -4768,55 +4768,6 @@ close_edit(void *edit_baton,
 
 /*** Returning editors. ***/
 
-struct fetch_baton
-{
-  svn_wc__db_t *db;
-  const char *target_abspath;
-};
-
-static svn_error_t *
-fetch_props_func(apr_hash_t **props,
-                 void *baton,
-                 const char *path,
-                 apr_pool_t *result_pool,
-                 apr_pool_t *scratch_pool)
-{
-  struct fetch_baton *fpb = baton;
-  const char *local_abspath = svn_dirent_join(fpb->target_abspath, path,
-                                              scratch_pool);
-  svn_error_t *err;
-
-  err = svn_wc__db_read_props(props, fpb->db, local_abspath,
-                              result_pool, scratch_pool);
-
-  /* If the path doesn't exist, just return an empty set of props. */
-  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
-    {
-      svn_error_clear(err);
-      *props = apr_hash_make(result_pool);
-    }
-  else if (err)
-    return svn_error_trace(err);
-
-  return SVN_NO_ERROR;
-}
-
-static svn_error_t *
-fetch_kind_func(svn_kind_t *kind,
-                void *baton,
-                const char *path,
-                apr_pool_t *scratch_pool)
-{
-  struct fetch_baton *fpb = baton;
-  const char *local_abspath = svn_dirent_join(fpb->target_abspath, path,
-                                              scratch_pool);
-
-  SVN_ERR(svn_wc__db_read_kind(kind, fpb->db, local_abspath, FALSE,
-                               scratch_pool));
-  
-  return SVN_NO_ERROR;
-}
-
 /* Helper for the three public editor-supplying functions. */
 static svn_error_t *
 make_editor(svn_revnum_t *target_revision,
@@ -4856,7 +4807,7 @@ make_editor(svn_revnum_t *target_revisio
   svn_delta_editor_t *tree_editor = svn_delta_default_editor(edit_pool);
   const svn_delta_editor_t *inner_editor;
   const char *repos_root, *repos_uuid;
-  struct fetch_baton *fpb;
+  struct svn_wc__shim_fetch_baton_t *sfb;
   svn_delta_shim_callbacks_t *shim_callbacks =
                                 svn_delta_shim_callbacks_default(edit_pool);
 
@@ -5089,14 +5040,14 @@ make_editor(svn_revnum_t *target_revisio
                                             edit_baton,
                                             result_pool));
 
-  fpb = apr_palloc(result_pool, sizeof(*fpb));
-  fpb->db = db;
-  fpb->target_abspath = eb->target_abspath;
-
-  shim_callbacks->fetch_kind_func = fetch_kind_func;
-  shim_callbacks->fetch_kind_baton = fpb;
-  shim_callbacks->fetch_props_func = fetch_props_func;
-  shim_callbacks->fetch_props_baton = fpb;
+  sfb = apr_palloc(result_pool, sizeof(*sfb));
+  sfb->db = db;
+  sfb->base_abspath = eb->target_abspath;
+
+  shim_callbacks->fetch_kind_func = svn_wc__fetch_kind_func;
+  shim_callbacks->fetch_kind_baton = sfb;
+  shim_callbacks->fetch_props_func = svn_wc__fetch_props_func;
+  shim_callbacks->fetch_props_baton = sfb;
 
   SVN_ERR(svn_editor__insert_shims(editor, edit_baton, *editor, *edit_baton,
                                    shim_callbacks, result_pool, scratch_pool));

Modified: subversion/branches/moves-scan-log/subversion/libsvn_wc/util.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_wc/util.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_wc/util.c (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_wc/util.c Wed Nov 23 10:32:50 2011
@@ -536,3 +536,48 @@ svn_wc__status2_from_3(svn_wc_status2_t 
 
   return SVN_NO_ERROR;
 }
+
+
+svn_error_t *
+svn_wc__fetch_kind_func(svn_kind_t *kind,
+                        void *baton,
+                        const char *path,
+                        apr_pool_t *scratch_pool)
+{
+  struct svn_wc__shim_fetch_baton_t *sfb = baton;
+  const char *local_abspath = svn_dirent_join(sfb->base_abspath, path,
+                                              scratch_pool);
+
+  SVN_ERR(svn_wc__db_read_kind(kind, sfb->db, local_abspath, FALSE,
+                               scratch_pool));
+  
+  return SVN_NO_ERROR;
+}
+
+
+svn_error_t *
+svn_wc__fetch_props_func(apr_hash_t **props,
+                         void *baton,
+                         const char *path,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool)
+{
+  struct svn_wc__shim_fetch_baton_t *sfb = baton;
+  const char *local_abspath = svn_dirent_join(sfb->base_abspath, path,
+                                              scratch_pool);
+  svn_error_t *err;
+
+  err = svn_wc__db_read_props(props, sfb->db, local_abspath,
+                              result_pool, scratch_pool);
+
+  /* If the path doesn't exist, just return an empty set of props. */
+  if (err && err->apr_err == SVN_ERR_WC_PATH_NOT_FOUND)
+    {
+      svn_error_clear(err);
+      *props = apr_hash_make(result_pool);
+    }
+  else if (err)
+    return svn_error_trace(err);
+
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/moves-scan-log/subversion/libsvn_wc/wc.h
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/libsvn_wc/wc.h?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/libsvn_wc/wc.h (original)
+++ subversion/branches/moves-scan-log/subversion/libsvn_wc/wc.h Wed Nov 23 10:32:50 2011
@@ -724,6 +724,30 @@ svn_wc__perform_file_merge(svn_skel_t **
                            apr_pool_t *scratch_pool);
 
 
+/* Couple of random helpers for the Ev2 shims.
+   ### These will eventually be obsoleted and removed. */
+struct svn_wc__shim_fetch_baton_t
+{
+  svn_wc__db_t *db;
+  const char *base_abspath;
+};
+
+/* Using a BATON of struct shim_fetch_baton, return KIND for PATH. */
+svn_error_t *
+svn_wc__fetch_kind_func(svn_kind_t *kind,
+                        void *baton,
+                        const char *path,
+                        apr_pool_t *scratch_pool);
+
+/* Using a BATON of struct shim_fetch_baton, return PROPS for PATH. */
+svn_error_t *
+svn_wc__fetch_props_func(apr_hash_t **props,
+                         void *baton,
+                         const char *path,
+                         apr_pool_t *result_pool,
+                         apr_pool_t *scratch_pool);
+
+
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */

Modified: subversion/branches/moves-scan-log/subversion/mod_dav_svn/mod_dav_svn.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/mod_dav_svn/mod_dav_svn.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/mod_dav_svn/mod_dav_svn.c (original)
+++ subversion/branches/moves-scan-log/subversion/mod_dav_svn/mod_dav_svn.c Wed Nov 23 10:32:50 2011
@@ -215,8 +215,15 @@ merge_dir_config(apr_pool_t *p, void *ba
   newconf->list_parentpath = INHERIT_VALUE(parent, child, list_parentpath);
   newconf->txdelta_cache = INHERIT_VALUE(parent, child, txdelta_cache);
   newconf->fulltext_cache = INHERIT_VALUE(parent, child, fulltext_cache);
-  /* Prefer our parent's value over our new one - hence the swap. */
-  newconf->root_dir = INHERIT_VALUE(child, parent, root_dir);
+  newconf->root_dir = INHERIT_VALUE(parent, child, root_dir);
+
+  if (parent->fs_path)
+    ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL,
+                 "mod_dav_svn: nested Location '%s' hinders access to '%s' "
+                 "in SVNPath Location '%s'",
+                 child->root_dir,
+                 svn_urlpath__skip_ancestor(parent->root_dir, child->root_dir),
+                 parent->root_dir);
 
   return newconf;
 }

Modified: subversion/branches/moves-scan-log/subversion/mod_dav_svn/repos.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/mod_dav_svn/repos.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/mod_dav_svn/repos.c (original)
+++ subversion/branches/moves-scan-log/subversion/mod_dav_svn/repos.c Wed Nov 23 10:32:50 2011
@@ -1161,6 +1161,7 @@ create_private_resource(const dav_resour
 static void log_warning(void *baton, svn_error_t *err)
 {
   request_rec *r = baton;
+  const char *continuation = "";
 
   /* ### hmm. the FS is cleaned up at request cleanup time. "r" might
      ### not really be valid. we should probably put the FS into a
@@ -1170,7 +1171,15 @@ static void log_warning(void *baton, svn
      ### of our functions ... ??
   */
 
-  ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_EGENERAL, r, "%s", err->message);
+  /* Not showing file/line so no point in tracing */
+  err = svn_error_purge_tracing(err);
+  while (err)
+    {
+      ap_log_rerror(APLOG_MARK, APLOG_ERR, APR_EGENERAL, r, "%s%s",
+                    continuation, err->message);
+      continuation = "-";
+      err = err->child;
+    }
 }
 
 

Modified: subversion/branches/moves-scan-log/subversion/svn/status.c
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/svn/status.c?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/svn/status.c (original)
+++ subversion/branches/moves-scan-log/subversion/svn/status.c Wed Nov 23 10:32:50 2011
@@ -548,9 +548,31 @@ svn_cl__print_status(const char *cwd_abs
           && status->repos_node_status == svn_wc_status_none))
     return SVN_NO_ERROR;
 
-  if (suppress_externals_placeholders
-      && status->node_status == svn_wc_status_external)
-    return SVN_NO_ERROR;
+  /* If we're trying not to print boring "X  /path/to/external"
+     lines..." */
+  if (suppress_externals_placeholders)
+    {
+      /* ... skip regular externals unmodified in the repository. */
+      if ((status->node_status == svn_wc_status_external)
+          && (status->repos_node_status == svn_wc_status_none)
+          && (! status->conflicted))
+        return SVN_NO_ERROR;
+
+      /* ... skip file externals that aren't modified locally or
+         remotely, changelisted, or locked (in either sense of the
+         word). */
+      if ((status->file_external)
+          && (status->repos_node_status == svn_wc_status_none)
+          && ((status->node_status == svn_wc_status_normal)
+              || (status->node_status == svn_wc_status_none))
+          && ((status->prop_status == svn_wc_status_normal)
+              || (status->prop_status == svn_wc_status_none))
+          && (! status->changelist)
+          && (! status->lock)
+          && (! status->wc_is_locked)
+          && (! status->conflicted))
+        return SVN_NO_ERROR;
+    }
 
   return print_status(cwd_abspath, svn_dirent_local_style(path, pool),
                       detailed, show_last_committed, repos_locks, status,

Modified: subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tests.py?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tests.py (original)
+++ subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tests.py Wed Nov 23 10:32:50 2011
@@ -12535,7 +12535,7 @@ def svn_copy(s_rev, path1, path2):
   svntest.actions.run_and_verify_svn(None, None, [], 'copy', '--parents',
                                      '-r', s_rev, path1, path2)
 
-def svn_merge(rev_range, source, target, lines=None,
+def svn_merge(rev_range, source, target, lines=None, elides=[],
               text_conflicts=0, prop_conflicts=0, tree_conflicts=0, args=[]):
   """Merge a single change from path SOURCE to path TARGET and verify the
   output and that there is no error.  (The changes made are not verified.)
@@ -12546,6 +12546,8 @@ def svn_merge(rev_range, source, target,
   LINES is a list of regular expressions to match other lines of output; if
   LINES is 'None' then match all normal (non-conflicting) merges.
 
+  ELIDES is a list of paths on which mergeinfo elision should be reported.
+
   TEXT_CONFLICTS, PROP_CONFLICTS and TREE_CONFLICTS specify the number of
   each kind of conflict to expect.
 
@@ -12553,6 +12555,7 @@ def svn_merge(rev_range, source, target,
 
   source = local_path(source)
   target = local_path(target)
+  elides = [local_path(p) for p in elides]
   if isinstance(rev_range, int):
     mi_rev_range = [rev_range]
     rev_arg = '-c' + str(rev_range)
@@ -12561,7 +12564,12 @@ def svn_merge(rev_range, source, target,
     rev_arg = '-r' + str(rev_range[0] - 1) + ':' + str(rev_range[1])
   if lines is None:
     lines = ["(A |D |[UG] | [UG]|[UG][UG])   " + target + ".*\n"]
+  else:
+    # Expect mergeinfo on the target; caller must supply matches for any
+    # subtree mergeinfo paths.
+    lines.append(" [UG]   " + target + "\n")
   exp_out = expected_merge_output([mi_rev_range], lines, target=target,
+                                  elides=elides,
                                   text_conflicts=text_conflicts,
                                   prop_conflicts=prop_conflicts,
                                   tree_conflicts=tree_conflicts)
@@ -12598,7 +12606,8 @@ def del_identical_file(sbox):
   svn_copy(s_rev_mod, source, target)
   sbox.simple_commit(target)
   # Should be deleted quietly.
-  svn_merge(s_rev_del, source, target, ['D ', ' U'])
+  svn_merge(s_rev_del, source, target,
+            ['D    %s\n' % local_path('A/D/G2/tau')])
 
   # Make a differing copy, locally modify it so it's the same,
   # and merge a deletion to it.
@@ -12607,7 +12616,8 @@ def del_identical_file(sbox):
   sbox.simple_commit(target)
   svn_modfile(target+"/tau")
   # Should be deleted quietly.
-  svn_merge(s_rev_del, source, target, ['D ', ' U'])
+  svn_merge(s_rev_del, source, target,
+            ['D    %s\n' % local_path('A/D/G3/tau')])
 
   os.chdir(saved_cwd)
 
@@ -12634,9 +12644,11 @@ def del_sched_add_hist_file(sbox):
   svn_copy(s_rev_orig, source, target)
   sbox.simple_commit(target)
   s_rev = 3
-  svn_merge(s_rev_add, source, target, ['A ', ' U'])
+  svn_merge(s_rev_add, source, target,
+            ['A    %s\n' % local_path('A/D/G2/file')])
   # Should be deleted quietly.
-  svn_merge(-s_rev_add, source, target, ['D ', ' U', ' G', '--- Eliding'])
+  svn_merge(-s_rev_add, source, target,
+            ['D    %s\n' % local_path('A/D/G2/file')], elides=['A/D/G2'])
 
   os.chdir(saved_cwd)
 
@@ -13093,7 +13105,6 @@ def merge_two_edits_to_same_prop(sbox):
   # Merge the two changes together to source.
   svn_merge([rev3, rev4], A_COPY_path, A_path, [
       " C   %s\n" % mu_path,
-      " U   A\n",
       ], prop_conflicts=1, args=['--allow-mixed-revisions'])
 
   # Revert changes to source wc, to test next scenario of #3250
@@ -13103,11 +13114,9 @@ def merge_two_edits_to_same_prop(sbox):
   # Merge the first change, then the second, to source.
   svn_merge(rev3, A_COPY_path, A_path, [
       " C   %s\n" % mu_path,
-      " U   A\n",
       ], prop_conflicts=1, args=['--allow-mixed-revisions'])
   svn_merge(rev4, A_COPY_path, A_path, [
       " C   %s\n" % mu_path,
-      " G   A\n",
       ], prop_conflicts=1, args=['--allow-mixed-revisions'])
 
   os.chdir(was_cwd)

Modified: subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tree_conflict_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tree_conflict_tests.py?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tree_conflict_tests.py (original)
+++ subversion/branches/moves-scan-log/subversion/tests/cmdline/merge_tree_conflict_tests.py Wed Nov 23 10:32:50 2011
@@ -681,18 +681,15 @@ def del_differing_file(sbox):
                                      'newprop', 'v', target+"/pi")
 
   dir_D = os.path.join('A','D')
-  dir_G2 = os.path.join(dir_D, 'G2')
   tau = os.path.join(dir_D,'G2','tau')
   pi = os.path.join(dir_D, 'G2', 'pi')
   # Should complain and "skip" it.
   svn_merge(s_rev_tau, source, target, [
       "   C %s\n" % tau,       # merge
-      " U   %s\n" % (dir_G2),  # mergeinfo
       ], tree_conflicts=1)
 
   svn_merge(s_rev_pi, source, target, [
       "   C %s\n" % pi,        # merge
-      " G   %s\n" % (dir_G2),  # mergeinfo
       ], tree_conflicts=1)
 
 
@@ -705,19 +702,16 @@ def del_differing_file(sbox):
   sbox.simple_commit(target)
 
 
-  dir_G3 = os.path.join(dir_D, 'G3')
   tau = os.path.join(dir_D,'G3','tau')
   pi = os.path.join(dir_D, 'G3', 'pi')
 
   # Should complain and "skip" it.
   svn_merge(s_rev_tau, source, target, [
-      "   C %s\n" % tau,       # merge
-      " U   %s\n" % (dir_G3),  # mergeinfo
+      "   C %s\n" % tau,
       ], tree_conflicts=1)
 
   svn_merge(s_rev_pi, source, target, [
-      "   C %s\n" % pi,        # merge
-      " G   %s\n" % (dir_G3),  # mergeinfo
+      "   C %s\n" % pi,
       ], tree_conflicts=1)
 
   os.chdir(saved_cwd)

Modified: subversion/branches/moves-scan-log/subversion/tests/cmdline/mergeinfo_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/tests/cmdline/mergeinfo_tests.py?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/tests/cmdline/mergeinfo_tests.py (original)
+++ subversion/branches/moves-scan-log/subversion/tests/cmdline/mergeinfo_tests.py Wed Nov 23 10:32:50 2011
@@ -683,7 +683,6 @@ def natural_history_is_not_eligible_nor_
 # A test for issue 4050 "'svn mergeinfo' always considers non-inheritable
 # ranges as partially merged".
 @Issue(4050)
-@XFail()
 @SkipUnless(server_has_mergeinfo)
 def noninheritabled_mergeinfo_not_always_eligible(sbox):
   "noninheritabled mergeinfo not always eligible"
@@ -693,11 +692,11 @@ def noninheritabled_mergeinfo_not_always
 
   A_path      = os.path.join(wc_dir, 'A')
   branch_path = os.path.join(wc_dir, 'branch')
-  
+
   # r2 - Branch ^/A to ^/branch.
   svntest.main.run_svn(None, 'copy', sbox.repo_url + '/A',
                        sbox.repo_url + '/branch', '-m', 'make a branch')
-  
+
   # r3 - Make prop edit to A.
   svntest.main.run_svn(None, 'ps', 'prop', 'val', A_path)
   svntest.main.run_svn(None, 'commit', '-m', 'file edit', wc_dir)
@@ -709,11 +708,15 @@ def noninheritabled_mergeinfo_not_always
                                      '-c3', '--depth=empty')
   svntest.main.run_svn(None, 'commit', '-m', 'shallow merge', wc_dir)
 
+  # A sanity check that we really have non-inheritable mergeinfo.
+  # If issue #4057 is ever fixed then the above merge will record
+  # inheritable mergeinfo and this test will spuriously pass.
+  svntest.actions.run_and_verify_svn(None, ["/A:3*\n"], [],
+                                     'propget', SVN_PROP_MERGEINFO,
+                                     branch_path)
+
   # Now check that r3 is reported as fully merged from ^/A to ^/branch
   # and does not show up all when asking for eligible revs.
-  #
-  # Currently this fails because r3 shows up as partially merged, even
-  # though it is fully merged to ^/branch.
   svntest.actions.run_and_verify_mergeinfo(
     adjust_error_for_server_version(''),
     ['3'], sbox.repo_url + '/A', sbox.repo_url + '/branch',

Modified: subversion/branches/moves-scan-log/subversion/tests/cmdline/resolve_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/moves-scan-log/subversion/tests/cmdline/resolve_tests.py?rev=1205355&r1=1205354&r2=1205355&view=diff
==============================================================================
--- subversion/branches/moves-scan-log/subversion/tests/cmdline/resolve_tests.py (original)
+++ subversion/branches/moves-scan-log/subversion/tests/cmdline/resolve_tests.py Wed Nov 23 10:32:50 2011
@@ -42,6 +42,7 @@ Issue = svntest.testcase.Issue_deco
 Wimp = svntest.testcase.Wimp_deco
 
 from merge_tests import set_up_branch
+from merge_tests import expected_merge_output
 
 # 'svn resolve --accept [ base | mine-full | theirs-full ]' was segfaulting
 # on 1.6.x.  Prior to this test, the bug was only caught by the Ruby binding
@@ -69,12 +70,10 @@ def automatic_conflict_resolution(sbox):
                                        'revert', '--recursive', A_COPY_path)
     svntest.actions.run_and_verify_svn(
       None,
-      "(--- Merging r3 into .*A_COPY':\n)|"
-      "(C    .*psi\n)|"
-      "(--- Recording mergeinfo for merge of r3 into .*A_COPY':\n)|"
-      "( U   .*A_COPY\n)|"
-      "(Summary of conflicts:\n)|"
-      "(  Text conflicts: 1\n)",
+      expected_merge_output([[3]], [
+        "C    %s\n" % psi_COPY_path,
+        " U   %s\n" % A_COPY_path],
+        target=A_COPY_path, text_conflicts=1),
       [], 'merge', '-c3', '--allow-mixed-revisions',
       sbox.repo_url + '/A',
       A_COPY_path)



Mime
View raw message