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

svn commit: r896226 - in /subversion/branches/issue-3242-dev: ./ subversion/include/private/svn_mergeinfo_private.h subversion/libsvn_client/merge.c subversion/libsvn_subr/mergeinfo.c subversion/libsvn_wc/props.c subversion/tests/cmdline/authz_tests.py

Author: cmpilato
Date: Tue Jan  5 21:27:21 2010
New Revision: 896226

URL: http://svn.apache.org/viewvc?rev=896226&view=rev
Log:
Sync the 'issue-3242-dev' branch up with the trunk.
(Merged /subversion/trunk:r896091-896219)

Modified:
    subversion/branches/issue-3242-dev/   (props changed)
    subversion/branches/issue-3242-dev/subversion/include/private/svn_mergeinfo_private.h
    subversion/branches/issue-3242-dev/subversion/libsvn_client/merge.c
    subversion/branches/issue-3242-dev/subversion/libsvn_subr/mergeinfo.c
    subversion/branches/issue-3242-dev/subversion/libsvn_wc/props.c
    subversion/branches/issue-3242-dev/subversion/tests/cmdline/authz_tests.py

Propchange: subversion/branches/issue-3242-dev/
------------------------------------------------------------------------------
--- svn:mergeinfo (original)
+++ svn:mergeinfo Tue Jan  5 21:27:21 2010
@@ -32,4 +32,4 @@
 /subversion/branches/tc_url_rev:874351-874483
 /subversion/branches/tree-conflicts:868291-873154
 /subversion/branches/tree-conflicts-notify:873926-874008
-/subversion/trunk:879653-896090
+/subversion/trunk:879653-896219

Modified: subversion/branches/issue-3242-dev/subversion/include/private/svn_mergeinfo_private.h
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3242-dev/subversion/include/private/svn_mergeinfo_private.h?rev=896226&r1=896225&r2=896226&view=diff
==============================================================================
--- subversion/branches/issue-3242-dev/subversion/include/private/svn_mergeinfo_private.h (original)
+++ subversion/branches/issue-3242-dev/subversion/include/private/svn_mergeinfo_private.h Tue Jan  5 21:27:21 2010
@@ -176,6 +176,20 @@
   svn_revnum_t oldest_rev,
   apr_pool_t *pool);
 
+/* If MERGEINFO is non-inheritable return TRUE, return FALSE otherwise.
+   MERGEINFO may be NULL or empty. */
+svn_boolean_t
+svn_mergeinfo__is_noninheritable(svn_mergeinfo_t mergeinfo,
+                                 apr_pool_t *scratch_pool);
+
+/* If MERGEINFO_STR is a string representation of non-inheritable mergeinfo
+   set *IS_NONINHERITABLE to TRUE, set it to FALSE otherwise.  MERGEINFO_STR
+   may be NULL or empty.  If MERGEINFO_STR cannot be parsed return
+   SVN_ERR_MERGEINFO_PARSE_ERROR. */
+svn_error_t *
+svn_mergeinfo__string_has_noninheritable(svn_boolean_t *is_noninheritable,
+                                         const char *mergeinfo_str,
+                                         apr_pool_t *scratch_pool);
 
 #ifdef __cplusplus
 }

Modified: subversion/branches/issue-3242-dev/subversion/libsvn_client/merge.c
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3242-dev/subversion/libsvn_client/merge.c?rev=896226&r1=896225&r2=896226&view=diff
==============================================================================
--- subversion/branches/issue-3242-dev/subversion/libsvn_client/merge.c (original)
+++ subversion/branches/issue-3242-dev/subversion/libsvn_client/merge.c Tue Jan  5 21:27:21 2010
@@ -5245,9 +5245,10 @@
       child->switched = switched;
       child->absent = absent;
       child->scheduled_for_deletion = deleted;
-      if (propval
-          && strstr(propval->data, SVN_MERGEINFO_NONINHERITABLE_STR))
-        child->has_noninheritable = TRUE;
+
+      if (propval)
+        SVN_ERR(svn_mergeinfo__string_has_noninheritable(
+          &(child->has_noninheritable), propval->data, scratch_pool));
 
       /* A little trickery: If PATH doesn't have any mergeinfo or has
          only inheritable mergeinfo, we still describe it as having
@@ -7069,25 +7070,21 @@
     {
       const char *added_abspath = svn_apr_hash_index_key(hi);
       const char *dir_abspath;
-      const svn_string_t *added_path_parent_propval;
+      svn_mergeinfo_t parent_mergeinfo;
+      svn_boolean_t inherited;
 
       apr_pool_clear(iterpool);
       dir_abspath = svn_dirent_dirname(added_abspath, iterpool);
 
-      /* Rather than using svn_client__get_wc_mergeinfo() and analyzing the
-         mergeinfo it returns to determine if ADDED_PATH's parent has
-         non-inheritable mergeinfo, it is much simpler to just get the
-         svn_string_t representation of the svn:mergeinfo prop and look for
-         the '*' non-inheritable marker. */
-      SVN_ERR(svn_wc_prop_get2(&added_path_parent_propval,
-                               merge_b->ctx->wc_ctx, dir_abspath,
-                               SVN_PROP_MERGEINFO, iterpool, iterpool));
-      if (added_path_parent_propval
-          && strstr(added_path_parent_propval->data,
-                    SVN_MERGEINFO_NONINHERITABLE_STR))
+      /* Does ADDED_ABSPATH's immediate parent have non-inheritable
+         mergeinfo? */
+      SVN_ERR(svn_client__get_wc_mergeinfo(&parent_mergeinfo, &inherited,
+                                           svn_mergeinfo_explicit,
+                                           dir_abspath, NULL, NULL,
+                                           merge_b->ctx,
+                                           iterpool, iterpool));
+      if (svn_mergeinfo__is_noninheritable(parent_mergeinfo, iterpool))
         {
-          /* ADDED_PATH's immediate parent has non-inheritable
-             mergeinfo. */
           svn_client__merge_path_t *target_merge_path =
             APR_ARRAY_IDX(notify_b->children_with_mergeinfo, 0,
                           svn_client__merge_path_t *);

Modified: subversion/branches/issue-3242-dev/subversion/libsvn_subr/mergeinfo.c
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3242-dev/subversion/libsvn_subr/mergeinfo.c?rev=896226&r1=896225&r2=896226&view=diff
==============================================================================
--- subversion/branches/issue-3242-dev/subversion/libsvn_subr/mergeinfo.c (original)
+++ subversion/branches/issue-3242-dev/subversion/libsvn_subr/mergeinfo.c Tue Jan  5 21:27:21 2010
@@ -2003,3 +2003,49 @@
     }
   return SVN_NO_ERROR;
 }
+
+svn_boolean_t
+svn_mergeinfo__is_noninheritable(svn_mergeinfo_t mergeinfo,
+                                 apr_pool_t *scratch_pool)
+{
+  if (mergeinfo)
+    {
+      apr_hash_index_t *hi;
+
+      for (hi = apr_hash_first(scratch_pool, mergeinfo);
+           hi;
+           hi = apr_hash_next(hi))
+        {
+          apr_array_header_t *rangelist = svn_apr_hash_index_val(hi);
+          int i;
+
+          for (i = 0; i < rangelist->nelts; i++)
+            {
+              svn_merge_range_t *range = APR_ARRAY_IDX(rangelist, i,
+                                                       svn_merge_range_t *);
+              if (!range->inheritable)
+                return TRUE;
+            }
+        }
+    }
+  return FALSE;
+}
+
+svn_error_t *
+svn_mergeinfo__string_has_noninheritable(svn_boolean_t *is_noninheritable,
+                                         const char *mergeinfo_str,
+                                         apr_pool_t *scratch_pool)
+{
+  *is_noninheritable = FALSE;
+
+  if (mergeinfo_str)
+    {
+      svn_mergeinfo_t mergeinfo;
+
+      SVN_ERR(svn_mergeinfo_parse(&mergeinfo, mergeinfo_str, scratch_pool));
+      *is_noninheritable = svn_mergeinfo__is_noninheritable(mergeinfo,
+                                                            scratch_pool);
+    }
+
+  return SVN_NO_ERROR;
+}

Modified: subversion/branches/issue-3242-dev/subversion/libsvn_wc/props.c
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3242-dev/subversion/libsvn_wc/props.c?rev=896226&r1=896225&r2=896226&view=diff
==============================================================================
--- subversion/branches/issue-3242-dev/subversion/libsvn_wc/props.c (original)
+++ subversion/branches/issue-3242-dev/subversion/libsvn_wc/props.c Tue Jan  5 21:27:21 2010
@@ -2444,16 +2444,16 @@
       apr_hash_t *mergeinfo;
       svn_string_t *new_value_str;
 
+      SVN_ERR(svn_mergeinfo_parse(&mergeinfo, propval->data, pool));
 
       /* Non-inheritable mergeinfo is only valid on directories. */
       if (kind != svn_node_dir
-          && strstr(propval->data, SVN_MERGEINFO_NONINHERITABLE_STR))
+          && svn_mergeinfo__is_noninheritable(mergeinfo, pool))
         return svn_error_createf(
           SVN_ERR_MERGEINFO_PARSE_ERROR, NULL,
           _("Cannot set non-inheritable mergeinfo on a non-directory ('%s')"),
           svn_dirent_local_style(path, pool));
 
-      SVN_ERR(svn_mergeinfo_parse(&mergeinfo, propval->data, pool));
       SVN_ERR(svn_mergeinfo_to_string(&new_value_str, mergeinfo, pool));
       new_value = svn_stringbuf_create_from_string(new_value_str, pool);
     }

Modified: subversion/branches/issue-3242-dev/subversion/tests/cmdline/authz_tests.py
URL: http://svn.apache.org/viewvc/subversion/branches/issue-3242-dev/subversion/tests/cmdline/authz_tests.py?rev=896226&r1=896225&r2=896226&view=diff
==============================================================================
--- subversion/branches/issue-3242-dev/subversion/tests/cmdline/authz_tests.py (original)
+++ subversion/branches/issue-3242-dev/subversion/tests/cmdline/authz_tests.py Tue Jan  5 21:27:21 2010
@@ -39,6 +39,7 @@
 XFail = svntest.testcase.XFail
 Skip = svntest.testcase.Skip
 SkipUnless = svntest.testcase.SkipUnless
+Wimp = svntest.testcase.Wimp
 
 ######################################################################
 # Tests
@@ -866,54 +867,42 @@
   "authz issue #3242 - access required at repo root"
 
   sbox.build(create_wc = False)
+  root_url = sbox.repo_url
+
+  # Create a copy-level copy of A, just so we have something to work with.
+  svntest.main.run_svn(None, 'cp', '-m', 'logmsg',
+                       root_url + '/A',
+                       root_url + '/A-copy')
 
+  # Now we get all restrictive.
   write_authz_file(sbox, {'/': '* =',
                           '/A': 'jrandom = rw',
                           '/A-copy': 'jrandom = rw'})
   write_restrictive_svnserve_conf(sbox.repo_dir)
 
-  root_url = sbox.repo_url
-
-  # Do some copies and moves where the common parents of the single
-  # source and single destination is an unreadable root.
+  # Do some copies and moves where the common parents of the source(s)
+  # and destination(s) are unreadable.  All we currently hope to support
+  # is the case where the sources are individually (and recursively)
+  # readable, and the destination tree is writable.
 
-  svntest.main.run_svn(None, 'cp', '-m', 'logmsg',
-                       root_url + '/A',
-                       root_url + '/A-copy')
-  svntest.main.run_svn(None, 'cp', '-m', 'logmsg',
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'copy in readable space',
                        root_url + '/A/B',
                        root_url + '/A/B-copy')
-  svntest.main.run_svn(None, 'mv', '-m', 'logmsg',
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'copy across disjoint readable spaces',
                        root_url + '/A/B',
                        root_url + '/A-copy/B-copy')
-  svntest.main.run_svn(None, 'mv', '-m', 'logmsg',
-                       root_url + '/A-copy/B-copy',
-                       root_url + '/A/B')
-  svntest.main.run_svn(None, 'rm', '-m', 'logmsg',
-                       root_url + '/A-copy',
-                       root_url + '/A/B-copy')
-
-  # Move the high-water-mark of readability down a level, and repeat.
-
-  write_authz_file(sbox, {'/': '* =',
-                          '/A/B': 'jrandom = rw',
-                          '/A/B-copy': 'jrandom = rw'})
-  
-  svntest.main.run_svn(None, 'cp', '-m', 'logmsg',
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'multi-copy across disjoint readable spaces',
                        root_url + '/A/B',
-                       root_url + '/A/B-copy')
-  svntest.main.run_svn(None, 'cp', '-m', 'logmsg',
-                       root_url + '/A/B/E',
-                       root_url + '/A/B/E-copy')
-  svntest.main.run_svn(None, 'mv', '-m', 'logmsg',
-                       root_url + '/A/B/E',
-                       root_url + '/A/B-copy/E-copy')
-  svntest.main.run_svn(None, 'mv', '-m', 'logmsg',
-                       root_url + '/A/B-copy/E-copy',
-                       root_url + '/A/B/E')
-  svntest.main.run_svn(None, 'rm', '-m', 'logmsg',
-                       root_url + '/A/B-copy',
-                       root_url + '/A/B/E-copy')
+                       root_url + '/A/mu',
+                       root_url + '/A-copy/C')
+  svntest.main.run_svn(None, 'cp',
+                       '-m', 'copy from disjoint readable spaces',
+                       root_url + '/A/B/E/alpha',
+                       root_url + '/A-copy/B/E/beta',
+                       root_url + '/A-copy/C')
 
 ########################################################################
 # Run the tests
@@ -938,7 +927,8 @@
                                svntest.main.is_ra_type_svn)),
               XFail(Skip(authz_switch_to_directory,
                          svntest.main.is_ra_type_file)),
-              Skip(authz_access_required_at_repo_root,
+              Skip(XFail(authz_access_required_at_repo_root,
+                         svntest.main.is_ra_type_dav),
                    svntest.main.is_ra_type_file),
              ]