Author: pburba
Date: Tue May 31 19:14:09 2011
New Revision: 1129858

URL: http://svn.apache.org/viewvc?rev=1129858&view=rev
Log:
A partial fix for issue #3896 'mergeinfo syntax errors should be treated
gracefully': Make mergeinfo elision tolerant of invalid mergeinfo.

* subversion/libsvn_client/mergeinfo.c
  (svn_client__elide_mergeinfo): If either the source or target of a
   mergeinfo elision attempt has syntactically invalid mergeinfo we
   obviously can't elide, so don't, but don't raise an error either, since
   that serves only to break the client.

Modified:
    subversion/trunk/subversion/libsvn_client/mergeinfo.c

Modified: subversion/trunk/subversion/libsvn_client/mergeinfo.c
URL: 
http://svn.apache.org/viewvc/subversion/trunk/subversion/libsvn_client/mergeinfo.c?rev=1129858&r1=1129857&r2=1129858&view=diff
==============================================================================
--- subversion/trunk/subversion/libsvn_client/mergeinfo.c (original)
+++ subversion/trunk/subversion/libsvn_client/mergeinfo.c Tue May 31 19:14:09 
2011
@@ -885,13 +885,29 @@ svn_client__elide_mergeinfo(const char *
       svn_mergeinfo_t mergeinfo = NULL;
       svn_boolean_t inherited;
       const char *walk_path;
+      svn_error_t *err;
 
       /* Get the TARGET_WCPATH's explicit mergeinfo. */
-      SVN_ERR(svn_client__get_wc_mergeinfo(&target_mergeinfo, &inherited,
-                                           svn_mergeinfo_inherited,
-                                           target_abspath,
-                                           limit_abspath,
-                                           &walk_path, ctx, pool, pool));
+      err = svn_client__get_wc_mergeinfo(&target_mergeinfo, &inherited,
+                                         svn_mergeinfo_inherited,
+                                         target_abspath,
+                                         limit_abspath,
+                                         &walk_path, ctx, pool, pool);
+      if (err)
+        {
+          if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+            {
+              /* Issue #3896: If we attempt elision because invalid
+                 mergeinfo is present on TARGET_WCPATH, then don't let
+                 the merge fail, just skip the elision attempt. */
+              svn_error_clear(err);
+              return SVN_NO_ERROR;
+            }
+          else
+            {
+              return svn_error_return(err);
+            }
+        }
 
      /* If TARGET_WCPATH has no explicit mergeinfo, there's nothing to
          elide, we're done. */
@@ -899,21 +915,48 @@ svn_client__elide_mergeinfo(const char *
         return SVN_NO_ERROR;
 
       /* Get TARGET_WCPATH's inherited mergeinfo from the WC. */
-      SVN_ERR(svn_client__get_wc_mergeinfo(&mergeinfo, &inherited,
-                                           svn_mergeinfo_nearest_ancestor,
-                                           target_abspath,
-                                           limit_abspath,
-                                           &walk_path, ctx, pool, pool));
+      err = svn_client__get_wc_mergeinfo(&mergeinfo, &inherited,
+                                         svn_mergeinfo_nearest_ancestor,
+                                         target_abspath,
+                                         limit_abspath,
+                                         &walk_path, ctx, pool, pool);
+      if (err)
+        {
+          if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+            {
+              /* Issue #3896 again, but invalid mergeinfo is inherited. */
+              svn_error_clear(err);
+              return SVN_NO_ERROR;
+            }
+          else
+            {
+              return svn_error_return(err);
+            }
+        }
 
       /* If TARGET_WCPATH inherited no mergeinfo from the WC and we are
          not limiting our search to the working copy then check if it
          inherits any from the repos. */
       if (!mergeinfo && !wc_elision_limit_path)
         {
-          SVN_ERR(svn_client__get_wc_or_repos_mergeinfo
-                  (&mergeinfo, &inherited, TRUE,
-                   svn_mergeinfo_nearest_ancestor,
-                   NULL, target_wcpath, ctx, pool));
+          err = svn_client__get_wc_or_repos_mergeinfo(
+            &mergeinfo, &inherited, TRUE,
+            svn_mergeinfo_nearest_ancestor,
+            NULL, target_wcpath, ctx, pool);
+          if (err)
+            {
+              if (err->apr_err == SVN_ERR_MERGEINFO_PARSE_ERROR)
+                {
+                  /* Issue #3896 again, but invalid mergeinfo is inherited
+                     from the repository. */
+                  svn_error_clear(err);
+                  return SVN_NO_ERROR;
+                }
+              else
+                {
+                  return svn_error_return(err);
+                }
+            }
         }
 
       /* If there is nowhere to elide TARGET_WCPATH's mergeinfo to and


Reply via email to